From ef5064f5600e1c61eb1de72fa837a18e08cd6f0e Mon Sep 17 00:00:00 2001 From: wangshengjun Date: Thu, 1 Aug 2019 11:24:32 +0800 Subject: [PATCH 01/54] [build]: add the support of Apt-Cacher-NG proxy configuration to the slave docker build script (#3256) Signed-off-by: wangshengjun --- Makefile.work | 3 +++ dockers/docker-base-stretch/Dockerfile.j2 | 4 ++++ dockers/docker-base/Dockerfile.j2 | 4 ++++ slave.mk | 1 + sonic-slave-stretch/Dockerfile.j2 | 4 ++++ sonic-slave/Dockerfile.j2 | 3 +++ 6 files changed, 19 insertions(+) diff --git a/Makefile.work b/Makefile.work index 389f3f7c831f..4198f3135f3c 100644 --- a/Makefile.work +++ b/Makefile.work @@ -141,6 +141,7 @@ DOCKER_BASE_BUILD = docker build --no-cache \ -t $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) \ --build-arg http_proxy=$(http_proxy) \ --build-arg https_proxy=$(https_proxy) \ + --build-arg apt_cacher_ng_proxy=$(apt_cacher_ng_proxy) \ $(SLAVE_DIR) DOCKER_BUILD = docker build --no-cache \ @@ -149,6 +150,7 @@ DOCKER_BUILD = docker build --no-cache \ --build-arg guid=$(shell id -g) \ --build-arg hostname=$(shell echo $$HOSTNAME) \ --build-arg slave_base_tag_ref=$(SLAVE_BASE_TAG) \ + --build-arg apt_cacher_ng_proxy=$(apt_cacher_ng_proxy) \ -t $(SLAVE_IMAGE):$(SLAVE_TAG) \ -f $(SLAVE_DIR)/Dockerfile.user \ $(SLAVE_DIR) @@ -173,6 +175,7 @@ SONIC_BUILD_INSTRUCTION := make \ KERNEL_PROCURE_METHOD=$(KERNEL_PROCURE_METHOD) \ HTTP_PROXY=$(http_proxy) \ HTTPS_PROXY=$(https_proxy) \ + APT_CACHER_NG_PROXY=$(apt_cacher_ng_proxy) \ SONIC_ENABLE_SYSTEM_TELEMETRY=$(ENABLE_SYSTEM_TELEMETRY) \ EXTRA_JESSIE_TARGETS=$(EXTRA_JESSIE_TARGETS) \ $(SONIC_OVERRIDE_BUILD_VARS) diff --git a/dockers/docker-base-stretch/Dockerfile.j2 b/dockers/docker-base-stretch/Dockerfile.j2 index ed59c3298715..ec0aaac1bbef 100644 --- a/dockers/docker-base-stretch/Dockerfile.j2 +++ b/dockers/docker-base-stretch/Dockerfile.j2 @@ -21,6 +21,10 @@ RUN while [ -n "$(find /usr/share/doc -depth -type d -empty -print -exec rmdir { /var/cache/man/* \ /usr/share/locale/* +{% if APT_CACHER_NG_PROXY.strip() -%} + RUN echo 'Acquire::http::Proxy "{{APT_CACHER_NG_PROXY}}";' >> /etc/apt/apt.conf.d/02proxy +{%- endif %} + # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/dockers/docker-base/Dockerfile.j2 b/dockers/docker-base/Dockerfile.j2 index 74c9d6fd8ce3..7d482b0e2f19 100644 --- a/dockers/docker-base/Dockerfile.j2 +++ b/dockers/docker-base/Dockerfile.j2 @@ -23,6 +23,10 @@ RUN rm -rf \ /var/cache/man/* \ /usr/share/locale/* +{% if APT_CACHER_NG_PROXY.strip() -%} + RUN echo 'Acquire::http::Proxy "{{APT_CACHER_NG_PROXY}}";' >> /etc/apt/apt.conf.d/02proxy +{%- endif %} + # Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/slave.mk b/slave.mk index 162c167ebf82..af39497bf089 100644 --- a/slave.mk +++ b/slave.mk @@ -184,6 +184,7 @@ $(info "ENABLE_SYNCD_RPC" : "$(ENABLE_SYNCD_RPC)") $(info "ENABLE_ORGANIZATION_EXTENSIONS" : "$(ENABLE_ORGANIZATION_EXTENSIONS)") $(info "HTTP_PROXY" : "$(HTTP_PROXY)") $(info "HTTPS_PROXY" : "$(HTTPS_PROXY)") +$(info "APT_CACHER_NG_PROXY" : "$(APT_CACHER_NG_PROXY)") $(info "ENABLE_SYSTEM_TELEMETRY" : "$(ENABLE_SYSTEM_TELEMETRY)") $(info "SONIC_DEBUGGING_ON" : "$(SONIC_DEBUGGING_ON)") $(info "SONIC_PROFILING_ON" : "$(SONIC_PROFILING_ON)") diff --git a/sonic-slave-stretch/Dockerfile.j2 b/sonic-slave-stretch/Dockerfile.j2 index 5c1739c49d50..373e3d108b57 100644 --- a/sonic-slave-stretch/Dockerfile.j2 +++ b/sonic-slave-stretch/Dockerfile.j2 @@ -32,6 +32,10 @@ RUN echo "deb [arch=arm64] http://deb.debian.org/debian stretch main contrib non echo 'deb [arch=arm64] http://ftp.debian.org/debian stretch-backports main' >> /etc/apt/sources.list {%- endif %} + +ARG apt_cacher_ng_proxy +RUN echo "Acquire::http::Proxy \"$apt_cacher_ng_proxy\";" >> /etc/apt/apt.conf.d/02proxy + ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive diff --git a/sonic-slave/Dockerfile.j2 b/sonic-slave/Dockerfile.j2 index 91ed039a2d64..732b4c09cfaf 100644 --- a/sonic-slave/Dockerfile.j2 +++ b/sonic-slave/Dockerfile.j2 @@ -28,6 +28,9 @@ RUN echo "deb [arch=arm64] http://archive.debian.org/debian jessie main contrib echo "deb [arch=arm64] http://archive.debian.org/debian jessie-backports main contrib non-free" >> /etc/apt/sources.list {% endif %} +ARG apt_cacher_ng_proxy +RUN echo "Acquire::http::Proxy \"$apt_cacher_ng_proxy\";" >> /etc/apt/apt.conf.d/02proxy + ## Make apt-get non-interactive ENV DEBIAN_FRONTEND=noninteractive From 229ef4006256db0d2ab37f2b8100aa198eb0ed87 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Fri, 9 Aug 2019 10:29:16 -0700 Subject: [PATCH 02/54] Fix snmpd crash (#3312) * Enable debug image build for kvm image. * Fix a bug in cleaning up requests referring the netsmp_session being closed to avoid a crash, during netsnmp_session close/abort due to timeout. RCA: The netsnmp_agent_session requests use netsmp_subtree objects that matches the associated variable name. The netsnmp_subtrees created through a netsnmp_session are tied to that session. When a subagent connection is closed/dropped due to timeout, all associated netsnmp_subtree objects are fred. Hence during a netsnmp_session close, all the delegated netsnmp_agent_sessions are scanned for requets that could be using netsnmp_subtree objects associated with this netsnmp_sesssion or its subsession. For each of the found request, they are explicitly marked to fail and a call is made to complete them. But due to the bug in scanning, it leaves behind requests and hence later when the requests get processed, they refer the *now* freed netsnmp_subtree. As often these requests gets completed pretty soon, they escape crashing. But if it so happens that the freed memory happened to complete a memory unit, hence returned to kernel or it got reallocated & changed enough to crash, the snmpd crashes. * Revert the changes * Revert --- ...e-all-requests-that-use-this-session.patch | 26 +++++++++++++++++++ src/snmpd/patch-5.7.3+dfsg/series | 1 + 2 files changed, 27 insertions(+) create mode 100644 src/snmpd/patch-5.7.3+dfsg/0006-Release-all-requests-that-use-this-session.patch diff --git a/src/snmpd/patch-5.7.3+dfsg/0006-Release-all-requests-that-use-this-session.patch b/src/snmpd/patch-5.7.3+dfsg/0006-Release-all-requests-that-use-this-session.patch new file mode 100644 index 000000000000..66a18eb17245 --- /dev/null +++ b/src/snmpd/patch-5.7.3+dfsg/0006-Release-all-requests-that-use-this-session.patch @@ -0,0 +1,26 @@ +From 84846206c7ee230bd7b6274af98513952c4a7a7f Mon Sep 17 00:00:00 2001 +From: Renuka Manavalan +Date: Wed, 7 Aug 2019 21:48:33 +0000 +Subject: [PATCH] Release all requests that use this session. + +--- + agent/snmp_agent.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/agent/snmp_agent.c b/agent/snmp_agent.c +index b96d650..ee3b0da 100644 +--- a/agent/snmp_agent.c ++++ b/agent/snmp_agent.c +@@ -1542,7 +1542,8 @@ netsnmp_remove_delegated_requests_for_session(netsnmp_session *sess) + * check each request + */ + netsnmp_request_info *request; +- for(request = asp->requests; request; request = request->next) { ++ int i; ++ for(i = 0, request = asp->requests; i < asp->vbcount; ++i, ++request) { + /* + * check session + */ +-- +2.17.1 + diff --git a/src/snmpd/patch-5.7.3+dfsg/series b/src/snmpd/patch-5.7.3+dfsg/series index e3764c3aac59..04ee079ffe90 100644 --- a/src/snmpd/patch-5.7.3+dfsg/series +++ b/src/snmpd/patch-5.7.3+dfsg/series @@ -3,3 +3,4 @@ 0003-CHANGES-BUG-2743-snmpd-crashes-when-receiving-a-GetN.patch 0004-Disable-SNMPv1.patch 0005-Port-OpenSSL-1.1.0-with-support-for-1.0.2.patch +0006-Release-all-requests-that-use-this-session.patch From 53f8934deb018c1c41ca426fadf5dd7f97a28249 Mon Sep 17 00:00:00 2001 From: wangshengjun Date: Sat, 10 Aug 2019 02:28:15 +0800 Subject: [PATCH 03/54] [dhcp_relay] Only call 'wait_until_iface_ready' once for each interface (#3317) Signed-off-by: wangshengjun --- dockers/docker-dhcp-relay/wait_for_intf.sh.j2 | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 index bf50abe4f053..fd7c3ff95bc0 100644 --- a/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 +++ b/dockers/docker-dhcp-relay/wait_for_intf.sh.j2 @@ -29,12 +29,19 @@ function wait_until_iface_ready # Wait for all interfaces to be up and ready -{% for (name, prefix) in INTERFACE|pfx_filter %} +{% for name in PORT %} +{% if name in INTERFACE %} wait_until_iface_ready ${PORT_TABLE_PREFIX} {{ name }} +{% endif %} {% endfor %} -{% for (name, prefix) in VLAN_INTERFACE|pfx_filter %} +{% for name in VLAN %} +{% if name in VLAN_INTERFACE %} wait_until_iface_ready ${VLAN_TABLE_PREFIX} {{ name }} +{% endif %} {% endfor %} -{% for (name, prefix) in PORTCHANNEL_INTERFACE|pfx_filter %} +{% for name in PORTCHANNEL %} +{% if name in PORTCHANNEL_INTERFACE %} wait_until_iface_ready ${LAG_TABLE_PREFIX} {{ name }} +{% endif %} {% endfor %} + From 32686ccc1c15d410721ebe0da386728536b7972b Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Fri, 9 Aug 2019 11:46:46 -0700 Subject: [PATCH 04/54] Fix to ensure that tacacs servers are ordered (reverse) by priority in pam.d's config. (#3322) Present: Servers are listed in the same order as in redis-db Fix: Save the sort o/p, hence use sorted list to write into pam.d's conf. As well convert priority to integer for use by sort. --- files/image_config/hostcfgd/hostcfgd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/image_config/hostcfgd/hostcfgd b/files/image_config/hostcfgd/hostcfgd index 739c0baa4d66..b1ec2644e122 100755 --- a/files/image_config/hostcfgd/hostcfgd +++ b/files/image_config/hostcfgd/hostcfgd @@ -114,7 +114,7 @@ class AaaCfg(object): server['ip'] = addr server.update(self.tacplus_servers[addr]) servers_conf.append(server) - sorted(servers_conf, key=lambda t: t['priority'], reverse=True) + servers_conf = sorted(servers_conf, key=lambda t: int(t['priority']), reverse=True) template_file = os.path.abspath(PAM_AUTH_CONF_TEMPLATE) env = jinja2.Environment(loader=jinja2.FileSystemLoader('/'), trim_blocks=True) From 46585465d2b7d23886807914089582266aba5fab Mon Sep 17 00:00:00 2001 From: wangshengjun Date: Sun, 11 Aug 2019 03:26:14 +0800 Subject: [PATCH 05/54] [dhcp_relay] fix the compile error introduced by the fixed issue of '#3316', change the sample_output file of 'wait_for_intf.sh' (#3325) Signed-off-by: wangshengjun --- src/sonic-config-engine/tests/sample_output/wait_for_intf.sh | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh b/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh index 383f7cb389e9..5f50106ff556 100644 --- a/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh +++ b/src/sonic-config-engine/tests/sample_output/wait_for_intf.sh @@ -31,11 +31,7 @@ function wait_until_iface_ready # Wait for all interfaces to be up and ready wait_until_iface_ready ${VLAN_TABLE_PREFIX} Vlan1000 wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel01 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel01 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel02 wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel02 wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel03 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel03 -wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel04 wait_until_iface_ready ${LAG_TABLE_PREFIX} PortChannel04 From 67474f7dea47fcb04c189b00cbbc7c0611229427 Mon Sep 17 00:00:00 2001 From: Andriy Kokhan <43479230+akokhan@users.noreply.github.com> Date: Mon, 12 Aug 2019 23:34:41 -0700 Subject: [PATCH 06/54] [platform]: sfputil BFN platform module (#3324) Added sfputil.py for x86_64-accton_wedge100bf_32x-r0 and x86_64-accton_wedge100bf_65x-r0 devices. Signed-off-by: Andriy Kokhan --- .../montara/port_config.ini | 66 +++---- .../plugins/sfputil.py | 167 ++++++++++++++++++ .../mavericks/port_config.ini | 130 +++++++------- .../scripts/{sfputil => bf-sfputil} | 0 .../scripts/{sfputil => bf-sfputil} | 0 5 files changed, 265 insertions(+), 98 deletions(-) create mode 100644 device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py rename platform/barefoot/sonic-platform-modules-bfn-montara/scripts/{sfputil => bf-sfputil} (100%) rename platform/barefoot/sonic-platform-modules-bfn/scripts/{sfputil => bf-sfputil} (100%) diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/port_config.ini b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/port_config.ini index 37ed4b68986e..d98c55a4e882 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/port_config.ini +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/port_config.ini @@ -1,33 +1,33 @@ -# name lanes alias speed autoneg fec -Ethernet0 0,1,2,3 Ethernet0 100000 0 rs -Ethernet4 4,5,6,7 Ethernet4 100000 0 rs -Ethernet8 8,9,10,11 Ethernet8 100000 0 rs -Ethernet12 12,13,14,15 Ethernet12 100000 0 rs -Ethernet16 16,17,18,19 Ethernet16 100000 0 rs -Ethernet20 20,21,22,23 Ethernet20 100000 0 rs -Ethernet24 24,25,26,27 Ethernet24 100000 0 rs -Ethernet28 28,29,30,31 Ethernet28 100000 0 rs -Ethernet32 32,33,34,35 Ethernet32 100000 0 rs -Ethernet36 36,37,38,39 Ethernet36 100000 0 rs -Ethernet40 40,41,42,43 Ethernet40 100000 0 rs -Ethernet44 44,45,46,47 Ethernet44 100000 0 rs -Ethernet48 48,49,50,51 Ethernet48 100000 0 rs -Ethernet52 52,53,54,55 Ethernet52 100000 0 rs -Ethernet56 56,57,58,59 Ethernet56 100000 0 rs -Ethernet60 60,61,62,63 Ethernet60 100000 0 rs -Ethernet64 64,65,66,67 Ethernet64 100000 0 rs -Ethernet68 68,69,70,71 Ethernet68 100000 0 rs -Ethernet72 72,73,74,75 Ethernet72 100000 0 rs -Ethernet76 76,77,78,79 Ethernet76 100000 0 rs -Ethernet80 80,81,82,83 Ethernet80 100000 0 rs -Ethernet84 84,85,86,87 Ethernet84 100000 0 rs -Ethernet88 88,89,90,91 Ethernet88 100000 0 rs -Ethernet92 92,93,94,95 Ethernet92 100000 0 rs -Ethernet96 96,97,98,99 Ethernet96 100000 0 rs -Ethernet100 100,101,102,103 Ethernet100 100000 0 rs -Ethernet104 104,105,106,107 Ethernet104 100000 0 rs -Ethernet108 108,109,110,111 Ethernet108 100000 0 rs -Ethernet112 112,113,114,115 Ethernet112 100000 0 rs -Ethernet116 116,117,118,119 Ethernet116 100000 0 rs -Ethernet120 120,121,122,123 Ethernet120 100000 0 rs -Ethernet124 124,125,126,127 Ethernet124 100000 0 rs +# name lanes alias index speed autoneg fec +Ethernet0 0,1,2,3 Ethernet0 1 100000 0 rs +Ethernet4 4,5,6,7 Ethernet4 2 100000 0 rs +Ethernet8 8,9,10,11 Ethernet8 3 100000 0 rs +Ethernet12 12,13,14,15 Ethernet12 4 100000 0 rs +Ethernet16 16,17,18,19 Ethernet16 5 100000 0 rs +Ethernet20 20,21,22,23 Ethernet20 6 100000 0 rs +Ethernet24 24,25,26,27 Ethernet24 7 100000 0 rs +Ethernet28 28,29,30,31 Ethernet28 8 100000 0 rs +Ethernet32 32,33,34,35 Ethernet32 9 100000 0 rs +Ethernet36 36,37,38,39 Ethernet36 10 100000 0 rs +Ethernet40 40,41,42,43 Ethernet40 11 100000 0 rs +Ethernet44 44,45,46,47 Ethernet44 12 100000 0 rs +Ethernet48 48,49,50,51 Ethernet48 13 100000 0 rs +Ethernet52 52,53,54,55 Ethernet52 14 100000 0 rs +Ethernet56 56,57,58,59 Ethernet56 15 100000 0 rs +Ethernet60 60,61,62,63 Ethernet60 16 100000 0 rs +Ethernet64 64,65,66,67 Ethernet64 17 100000 0 rs +Ethernet68 68,69,70,71 Ethernet68 18 100000 0 rs +Ethernet72 72,73,74,75 Ethernet72 19 100000 0 rs +Ethernet76 76,77,78,79 Ethernet76 20 100000 0 rs +Ethernet80 80,81,82,83 Ethernet80 21 100000 0 rs +Ethernet84 84,85,86,87 Ethernet84 22 100000 0 rs +Ethernet88 88,89,90,91 Ethernet88 23 100000 0 rs +Ethernet92 92,93,94,95 Ethernet92 24 100000 0 rs +Ethernet96 96,97,98,99 Ethernet96 25 100000 0 rs +Ethernet100 100,101,102,103 Ethernet100 26 100000 0 rs +Ethernet104 104,105,106,107 Ethernet104 27 100000 0 rs +Ethernet108 108,109,110,111 Ethernet108 28 100000 0 rs +Ethernet112 112,113,114,115 Ethernet112 29 100000 0 rs +Ethernet116 116,117,118,119 Ethernet116 30 100000 0 rs +Ethernet120 120,121,122,123 Ethernet120 31 100000 0 rs +Ethernet124 124,125,126,127 Ethernet124 32 100000 0 rs diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py new file mode 100644 index 000000000000..c92bc4212123 --- /dev/null +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python + +try: + import os + import sys + import importlib + import time + + sys.path.append(os.path.dirname(__file__)) + import pltfm_mgr_rpc + from pltfm_mgr_rpc.ttypes import * + + from thrift.transport import TSocket + from thrift.transport import TTransport + from thrift.protocol import TBinaryProtocol + from thrift.protocol import TMultiplexedProtocol + + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +thrift_server = 'localhost' +transport = None +pltfm_mgr = None + +SFP_EEPROM_CACHE = "/var/run/platform/sfp/cache" + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 1 + PORT_END = 0 + PORTS_IN_BLOCK = 0 + QSFP_PORT_START = 1 + QSFP_PORT_END = 0 + EEPROM_OFFSET = 0 + + @property + def port_start(self): + self.update_port_info() + return self.PORT_START + + @property + def port_end(self): + self.update_port_info() + return self.PORT_END + + @property + def qsfp_ports(self): + self.update_port_info() + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + print "dependency on sysfs has been removed" + raise Exception() + + def __init__(self): + if not os.path.exists(os.path.dirname(SFP_EEPROM_CACHE)): + try: + os.makedirs(os.path.dirname(SFP_EEPROM_CACHE)) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + open(SFP_EEPROM_CACHE, 'ab').close() + + SfpUtilBase.__init__(self) + + def update_port_info(self): + global pltfm_mgr + + if self.QSFP_PORT_END == 0: + self.thrift_setup() + self.QSFP_PORT_END = pltfm_mgr.pltfm_mgr_qsfp_get_max_port(); + self.PORT_END = self.QSFP_PORT_END + self.PORTS_IN_BLOCK = self.QSFP_PORT_END + self.thrift_teardown() + + def thrift_setup(self): + global thrift_server, transport, pltfm_mgr + transport = TSocket.TSocket(thrift_server, 9090) + + transport = TTransport.TBufferedTransport(transport) + bprotocol = TBinaryProtocol.TBinaryProtocol(transport) + + pltfm_mgr_client_module = importlib.import_module(".".join(["pltfm_mgr_rpc", "pltfm_mgr_rpc"])) + pltfm_mgr_protocol = TMultiplexedProtocol.TMultiplexedProtocol(bprotocol, "pltfm_mgr_rpc") + pltfm_mgr = pltfm_mgr_client_module.Client(pltfm_mgr_protocol) + + transport.open() + + def thrift_teardown(self): + global transport + transport.close() + + 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 = False + + try: + self.thrift_setup() + presence = pltfm_mgr.pltfm_mgr_qsfp_presence_get(port_num) + self.thrift_teardown() + except Exception as e: + print e.__doc__ + print e.message + + return presence + + 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 + + self.thrift_setup() + lpmode = pltfm_mgr.pltfm_mgr_qsfp_lpmode_get(port_num) + self.thrift_teardown() + return lpmode + + 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 False + + self.thrift_setup() + status = pltfm_mgr.pltfm_mgr_qsfp_lpmode_set(port_num, lpmode) + self.thrift_teardown() + return status + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + self.thrift_setup() + status = pltfm_mgr.pltfm_mgr_qsfp_reset(port_num, True) + status = pltfm_mgr.pltfm_mgr_qsfp_reset(port_num, False) + self.thrift_teardown() + return status + + def get_transceiver_change_event(self, timeout=0): + phy_port_dict = {} + status = True + # TODO: Process transceiver plug-in/out event + time.sleep(1) + return status, phy_port_dict + + def _get_port_eeprom_path(self, port_num, devid): + eeprom_path = None + + self.thrift_setup() + presence = pltfm_mgr.pltfm_mgr_qsfp_presence_get(port_num) + if presence == True: + eeprom_cache = open(SFP_EEPROM_CACHE, 'wb') + eeprom_hex = pltfm_mgr.pltfm_mgr_qsfp_info_get(port_num) + eeprom_raw = bytearray.fromhex(eeprom_hex) + eeprom_cache.write(eeprom_raw) + eeprom_cache.close() + eeprom_path = SFP_EEPROM_CACHE + self.thrift_teardown() + + return eeprom_path + diff --git a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/port_config.ini b/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/port_config.ini index f81066d53bfe..7a3b600fe8de 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/port_config.ini +++ b/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/port_config.ini @@ -1,65 +1,65 @@ -# name lanes alias speed autoneg fec -Ethernet0 0,1,2,3 Ethernet0 100000 0 rs -Ethernet4 4,5,6,7 Ethernet4 100000 0 rs -Ethernet8 8,9,10,11 Ethernet8 100000 0 rs -Ethernet12 12,13,14,15 Ethernet12 100000 0 rs -Ethernet16 16,17,18,19 Ethernet16 100000 0 rs -Ethernet20 20,21,22,23 Ethernet20 100000 0 rs -Ethernet24 24,25,26,27 Ethernet24 100000 0 rs -Ethernet28 28,29,30,31 Ethernet28 100000 0 rs -Ethernet32 32,33,34,35 Ethernet32 100000 0 rs -Ethernet36 36,37,38,39 Ethernet36 100000 0 rs -Ethernet40 40,41,42,43 Ethernet40 100000 0 rs -Ethernet44 44,45,46,47 Ethernet44 100000 0 rs -Ethernet48 48,49,50,51 Ethernet48 100000 0 rs -Ethernet52 52,53,54,55 Ethernet52 100000 0 rs -Ethernet56 56,57,58,59 Ethernet56 100000 0 rs -Ethernet60 60,61,62,63 Ethernet60 100000 0 rs -Ethernet64 64,65,66,67 Ethernet64 100000 0 rs -Ethernet68 68,69,70,71 Ethernet68 100000 0 rs -Ethernet72 72,73,74,75 Ethernet72 100000 0 rs -Ethernet76 76,77,78,79 Ethernet76 100000 0 rs -Ethernet80 80,81,82,83 Ethernet80 100000 0 rs -Ethernet84 84,85,86,87 Ethernet84 100000 0 rs -Ethernet88 88,89,90,91 Ethernet88 100000 0 rs -Ethernet92 92,93,94,95 Ethernet92 100000 0 rs -Ethernet96 96,97,98,99 Ethernet96 100000 0 rs -Ethernet100 100,101,102,103 Ethernet100 100000 0 rs -Ethernet104 104,105,106,107 Ethernet104 100000 0 rs -Ethernet108 108,109,110,111 Ethernet108 100000 0 rs -Ethernet112 112,113,114,115 Ethernet112 100000 0 rs -Ethernet116 116,117,118,119 Ethernet116 100000 0 rs -Ethernet120 120,121,122,123 Ethernet120 100000 0 rs -Ethernet124 124,125,126,127 Ethernet124 100000 0 rs -Ethernet128 128,129,130,131 Ethernet128 100000 0 rs -Ethernet132 132,133,134,135 Ethernet132 100000 0 rs -Ethernet136 136,137,138,139 Ethernet136 100000 0 rs -Ethernet140 140,141,142,143 Ethernet140 100000 0 rs -Ethernet144 144,145,146,147 Ethernet144 100000 0 rs -Ethernet148 148,149,150,151 Ethernet148 100000 0 rs -Ethernet152 152,153,154,155 Ethernet152 100000 0 rs -Ethernet156 156,157,158,159 Ethernet156 100000 0 rs -Ethernet160 160,161,162,163 Ethernet169 100000 0 rs -Ethernet164 164,165,166,167 Ethernet164 100000 0 rs -Ethernet168 168,169,170,171 Ethernet168 100000 0 rs -Ethernet172 172,173,174,175 Ethernet172 100000 0 rs -Ethernet176 176,177,178,179 Ethernet176 100000 0 rs -Ethernet180 180,181,182,183 Ethernet180 100000 0 rs -Ethernet184 184,185,186,187 Ethernet184 100000 0 rs -Ethernet188 188,189,190,191 Ethernet188 100000 0 rs -Ethernet192 192,193,194,195 Ethernet192 100000 0 rs -Ethernet196 196,197,198,199 Ethernet196 100000 0 rs -Ethernet200 200,201,202,203 Ethernet200 100000 0 rs -Ethernet204 204,205,206,207 Ethernet204 100000 0 rs -Ethernet208 208,209,210,211 Ethernet208 100000 0 rs -Ethernet212 212,213,214,215 Ethernet212 100000 0 rs -Ethernet216 216,217,218,219 Ethernet216 100000 0 rs -Ethernet220 220,221,222,223 Ethernet220 100000 0 rs -Ethernet224 224,225,226,227 Ethernet224 100000 0 rs -Ethernet228 228,229,230,231 Ethernet228 100000 0 rs -Ethernet232 232,233,234,235 Ethernet232 100000 0 rs -Ethernet236 236,237,238,239 Ethernet236 100000 0 rs -Ethernet240 240,241,242,243 Ethernet240 100000 0 rs -Ethernet244 244,245,246,247 Ethernet244 100000 0 rs -Ethernet248 248,249,250,251 Ethernet248 100000 0 rs -Ethernet252 252,253,254,255 Etherner252 100000 0 rs +# name lanes alias index speed autoneg fec +Ethernet0 0,1,2,3 Ethernet0 1 100000 0 rs +Ethernet4 4,5,6,7 Ethernet4 2 100000 0 rs +Ethernet8 8,9,10,11 Ethernet8 3 100000 0 rs +Ethernet12 12,13,14,15 Ethernet12 4 100000 0 rs +Ethernet16 16,17,18,19 Ethernet16 5 100000 0 rs +Ethernet20 20,21,22,23 Ethernet20 6 100000 0 rs +Ethernet24 24,25,26,27 Ethernet24 7 100000 0 rs +Ethernet28 28,29,30,31 Ethernet28 8 100000 0 rs +Ethernet32 32,33,34,35 Ethernet32 9 100000 0 rs +Ethernet36 36,37,38,39 Ethernet36 10 100000 0 rs +Ethernet40 40,41,42,43 Ethernet40 11 100000 0 rs +Ethernet44 44,45,46,47 Ethernet44 12 100000 0 rs +Ethernet48 48,49,50,51 Ethernet48 13 100000 0 rs +Ethernet52 52,53,54,55 Ethernet52 14 100000 0 rs +Ethernet56 56,57,58,59 Ethernet56 15 100000 0 rs +Ethernet60 60,61,62,63 Ethernet60 16 100000 0 rs +Ethernet64 64,65,66,67 Ethernet64 17 100000 0 rs +Ethernet68 68,69,70,71 Ethernet68 18 100000 0 rs +Ethernet72 72,73,74,75 Ethernet72 19 100000 0 rs +Ethernet76 76,77,78,79 Ethernet76 20 100000 0 rs +Ethernet80 80,81,82,83 Ethernet80 21 100000 0 rs +Ethernet84 84,85,86,87 Ethernet84 22 100000 0 rs +Ethernet88 88,89,90,91 Ethernet88 23 100000 0 rs +Ethernet92 92,93,94,95 Ethernet92 24 100000 0 rs +Ethernet96 96,97,98,99 Ethernet96 25 100000 0 rs +Ethernet100 100,101,102,103 Ethernet100 26 100000 0 rs +Ethernet104 104,105,106,107 Ethernet104 27 100000 0 rs +Ethernet108 108,109,110,111 Ethernet108 28 100000 0 rs +Ethernet112 112,113,114,115 Ethernet112 29 100000 0 rs +Ethernet116 116,117,118,119 Ethernet116 30 100000 0 rs +Ethernet120 120,121,122,123 Ethernet120 31 100000 0 rs +Ethernet124 124,125,126,127 Ethernet124 32 100000 0 rs +Ethernet128 128,129,130,131 Ethernet128 33 100000 0 rs +Ethernet132 132,133,134,135 Ethernet132 34 100000 0 rs +Ethernet136 136,137,138,139 Ethernet136 35 100000 0 rs +Ethernet140 140,141,142,143 Ethernet140 36 100000 0 rs +Ethernet144 144,145,146,147 Ethernet144 37 100000 0 rs +Ethernet148 148,149,150,151 Ethernet148 38 100000 0 rs +Ethernet152 152,153,154,155 Ethernet152 39 100000 0 rs +Ethernet156 156,157,158,159 Ethernet156 40 100000 0 rs +Ethernet160 160,161,162,163 Ethernet169 41 100000 0 rs +Ethernet164 164,165,166,167 Ethernet164 42 100000 0 rs +Ethernet168 168,169,170,171 Ethernet168 43 100000 0 rs +Ethernet172 172,173,174,175 Ethernet172 44 100000 0 rs +Ethernet176 176,177,178,179 Ethernet176 45 100000 0 rs +Ethernet180 180,181,182,183 Ethernet180 46 100000 0 rs +Ethernet184 184,185,186,187 Ethernet184 47 100000 0 rs +Ethernet188 188,189,190,191 Ethernet188 48 100000 0 rs +Ethernet192 192,193,194,195 Ethernet192 49 100000 0 rs +Ethernet196 196,197,198,199 Ethernet196 50 100000 0 rs +Ethernet200 200,201,202,203 Ethernet200 51 100000 0 rs +Ethernet204 204,205,206,207 Ethernet204 52 100000 0 rs +Ethernet208 208,209,210,211 Ethernet208 53 100000 0 rs +Ethernet212 212,213,214,215 Ethernet212 54 100000 0 rs +Ethernet216 216,217,218,219 Ethernet216 55 100000 0 rs +Ethernet220 220,221,222,223 Ethernet220 56 100000 0 rs +Ethernet224 224,225,226,227 Ethernet224 57 100000 0 rs +Ethernet228 228,229,230,231 Ethernet228 58 100000 0 rs +Ethernet232 232,233,234,235 Ethernet232 59 100000 0 rs +Ethernet236 236,237,238,239 Ethernet236 60 100000 0 rs +Ethernet240 240,241,242,243 Ethernet240 61 100000 0 rs +Ethernet244 244,245,246,247 Ethernet244 62 100000 0 rs +Ethernet248 248,249,250,251 Ethernet248 63 100000 0 rs +Ethernet252 252,253,254,255 Etherner252 64 100000 0 rs diff --git a/platform/barefoot/sonic-platform-modules-bfn-montara/scripts/sfputil b/platform/barefoot/sonic-platform-modules-bfn-montara/scripts/bf-sfputil similarity index 100% rename from platform/barefoot/sonic-platform-modules-bfn-montara/scripts/sfputil rename to platform/barefoot/sonic-platform-modules-bfn-montara/scripts/bf-sfputil diff --git a/platform/barefoot/sonic-platform-modules-bfn/scripts/sfputil b/platform/barefoot/sonic-platform-modules-bfn/scripts/bf-sfputil similarity index 100% rename from platform/barefoot/sonic-platform-modules-bfn/scripts/sfputil rename to platform/barefoot/sonic-platform-modules-bfn/scripts/bf-sfputil From 12f0256509c019be6ecd56861edd4fa979297e27 Mon Sep 17 00:00:00 2001 From: simonJi2018 <37395146+simonJi2018@users.noreply.github.com> Date: Tue, 13 Aug 2019 15:24:32 +0800 Subject: [PATCH 07/54] platform/nephos:fix the compile error about device accton-as7116 because version wrong (#3329) --- platform/nephos/platform-modules-accton.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/nephos/platform-modules-accton.mk b/platform/nephos/platform-modules-accton.mk index 1d4788bc9a27..ebfd77f30fc8 100644 --- a/platform/nephos/platform-modules-accton.mk +++ b/platform/nephos/platform-modules-accton.mk @@ -1,6 +1,6 @@ # Accton AS7116 54X Platform modules -ACCTON_AS7116_54X_PLATFORM_MODULE_VERSION = 1.0.0 +ACCTON_AS7116_54X_PLATFORM_MODULE_VERSION = 1.0.1 export ACCTON_AS7116_54X_PLATFORM_MODULE_VERSION From 1052e78aa408ae4539e3843ebeb9e13a63cb2a83 Mon Sep 17 00:00:00 2001 From: sridhar-ravindran <45350577+sridhar-ravindran@users.noreply.github.com> Date: Tue, 13 Aug 2019 21:17:21 +0530 Subject: [PATCH 08/54] [DELL][Z9100,S6100,S6000] Platform 2.0 SFP Changes (#3229) * [DELL][Z9100,S6100,S6000] Platform 2.0 SFP Changes Added support in sfp.py file which will be generic. Send the eeprom path and sfp_control path from chassis.py --- .../s6000/sonic_platform/__init__.py | 2 +- .../s6000/sonic_platform/chassis.py | 19 +- .../s6000/sonic_platform/sfp.py | 1 + .../s6100/sonic_platform/__init__.py | 2 +- .../s6100/sonic_platform/chassis.py | 67 ++ .../s6100/sonic_platform/sfp.py | 851 ++++++++++++++++++ .../z9100/sonic_platform/__init__.py | 2 +- .../z9100/sonic_platform/chassis.py | 41 +- .../z9100/sonic_platform/sfp.py | 1 + 9 files changed, 981 insertions(+), 5 deletions(-) create mode 120000 platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/sfp.py create mode 100755 platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/sfp.py create mode 120000 platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/sfp.py diff --git a/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/__init__.py index d82f3749319c..1e26181263a5 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/__init__.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/__init__.py @@ -1,2 +1,2 @@ -__all__ = ["platform", "chassis"] +__all__ = ["platform", "chassis", "sfp"] from sonic_platform import * diff --git a/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/chassis.py index b1046d9310f8..a625a796ef53 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/chassis.py @@ -10,6 +10,7 @@ try: import os from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform.sfp import Sfp except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -26,7 +27,23 @@ class Chassis(ChassisBase): reset_reason_dict[0x6] = ChassisBase.REBOOT_CAUSE_NON_HARDWARE def __init__(self): - ChassisBase.__init__(self) + # Initialize SFP list + PORT_START = 0 + PORT_END = 31 + EEPROM_OFFSET = 20 + PORTS_IN_BLOCK = (PORT_END + 1) + + # 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 + eeprom_base = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + sfp_control = "/sys/devices/platform/dell-s6000-cpld.0/" + for index in range(0, PORTS_IN_BLOCK): + eeprom_path = eeprom_base.format(index + EEPROM_OFFSET) + sfp_node = Sfp(index, 'QSFP', eeprom_path, sfp_control, index) + self._sfp_list.append(sfp_node) def get_register(self, reg_name): rv = 'ERR' diff --git a/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/sfp.py new file mode 120000 index 000000000000..84af7963bb3d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s6000/sonic_platform/sfp.py @@ -0,0 +1 @@ +../../s6100/sonic_platform/sfp.py \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/__init__.py index 497c1429ad89..61b486d775b7 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/__init__.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/__init__.py @@ -1,3 +1,3 @@ -__all__ = ["platform", "chassis", "fan", "psu"] +__all__ = ["platform", "chassis", "fan", "psu", "sfp"] from sonic_platform import * diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py index bef591a6c528..53d4eadaec0a 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py @@ -11,6 +11,7 @@ try: import os 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 eeprom import Eeprom @@ -30,6 +31,39 @@ class Chassis(ChassisBase): HWMON_NODE = os.listdir(HWMON_DIR)[0] MAILBOX_DIR = HWMON_DIR + HWMON_NODE + PORT_START = 0 + PORT_END = 63 + PORTS_IN_BLOCK = (PORT_END + 1) + IOM1_PORT_START = 0 + IOM2_PORT_START = 16 + IOM3_PORT_START = 32 + IOM4_PORT_START = 48 + + PORT_I2C_MAPPING = {} + # 0th Index = i2cLine, 1st Index = EepromIdx in i2cLine + EEPROM_I2C_MAPPING = { + # IOM 1 + 0: [6, 66], 1: [6, 67], 2: [6, 68], 3: [6, 69], + 4: [6, 70], 5: [6, 71], 6: [6, 72], 7: [6, 73], + 8: [6, 74], 9: [6, 75], 10: [6, 76], 11: [6, 77], + 12: [6, 78], 13: [6, 79], 14: [6, 80], 15: [6, 81], + # IOM 2 + 16: [8, 50], 17: [8, 51], 18: [8, 52], 19: [8, 53], + 20: [8, 54], 21: [8, 55], 22: [8, 56], 23: [8, 57], + 24: [8, 58], 25: [8, 59], 26: [8, 60], 27: [8, 61], + 28: [8, 62], 29: [8, 63], 30: [8, 64], 31: [8, 65], + # IOM 3 + 32: [7, 34], 33: [7, 35], 34: [7, 36], 35: [7, 37], + 36: [7, 38], 37: [7, 39], 38: [7, 40], 39: [7, 41], + 40: [7, 42], 41: [7, 43], 42: [7, 44], 43: [7, 45], + 44: [7, 46], 45: [7, 47], 46: [7, 48], 47: [7, 49], + # IOM 4 + 48: [9, 18], 49: [9, 19], 50: [9, 20], 51: [9, 21], + 52: [9, 22], 53: [9, 23], 54: [9, 24], 55: [9, 25], + 56: [9, 26], 57: [9, 27], 58: [9, 28], 59: [9, 29], + 60: [9, 30], 61: [9, 31], 62: [9, 32], 63: [9, 33] + } + reset_reason_dict = {} reset_reason_dict[11] = ChassisBase.REBOOT_CAUSE_POWER_LOSS reset_reason_dict[33] = ChassisBase.REBOOT_CAUSE_WATCHDOG @@ -55,6 +89,39 @@ def __init__(self): psu = Psu(i) self._psu_list.append(psu) + self._populate_port_i2c_mapping() + + # 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 + eeprom_base = "/sys/class/i2c-adapter/i2c-{0}/i2c-{1}/{1}-0050/eeprom" + sfp_ctrl_base = "/sys/class/i2c-adapter/i2c-{0}/{0}-003e/" + for index in range(0, self.PORTS_IN_BLOCK): + eeprom_path = eeprom_base.format(self.EEPROM_I2C_MAPPING[index][0], + self.EEPROM_I2C_MAPPING[index][1]) + sfp_control = sfp_ctrl_base.format(self.PORT_I2C_MAPPING[index]) + sfp_node = Sfp(index, 'QSFP', eeprom_path, sfp_control, index) + self._sfp_list.append(sfp_node) + + def _populate_port_i2c_mapping(self): + # port_num and i2c match + for port_num in range(0, self.PORTS_IN_BLOCK): + if((port_num >= self.IOM1_PORT_START) and + (port_num < self.IOM2_PORT_START)): + i2c_line = 14 + elif((port_num >= self.IOM2_PORT_START) and + (port_num < self.IOM3_PORT_START)): + i2c_line = 16 + elif((port_num >= self.IOM3_PORT_START) and + (port_num = self.IOM4_PORT_START) and + (port_num < self.PORTS_IN_BLOCK)): + i2c_line = 17 + self.PORT_I2C_MAPPING[port_num] = i2c_line + def _get_pmc_register(self, reg_name): # On successful read, returns the value read from given # reg_name and on failure returns 'ERR' diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/sfp.py new file mode 100755 index 000000000000..b312a52c7b42 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/sfp.py @@ -0,0 +1,851 @@ +#!/usr/bin/env python + +############################################################################# +# DELLEMC +# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + import os + import time + from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +PAGE_OFFSET = 0 +KEY_OFFSET = 1 +KEY_WIDTH = 2 +FUNC_NAME = 3 + +INFO_OFFSET = 128 +DOM_OFFSET = 0 +DOM_OFFSET1 = 384 + +cable_length_tup = ('Length(km)', 'Length OM3(2m)', 'Length OM2(m)', + 'Length OM1(m)', 'Length Cable Assembly(m)') + +compliance_code_tup = ( + '10/40G Ethernet Compliance Code', + 'SONET Compliance codes', + 'SAS/SATA compliance codes', + 'Gigabit Ethernet Compliant codes', + 'Fibre Channel link length/Transmitter Technology', + 'Fibre Channel transmission media', + 'Fibre Channel Speed') + +info_dict_keys = ['type', 'hardwarerev', 'serialnum', + 'manufacturename', 'modelname', 'Connector', + 'encoding', 'ext_identifier', 'ext_rateselect_compliance', + 'cable_type', 'cable_length', 'nominal_bit_rate', + 'specification_compliance', 'vendor_date', 'vendor_oui'] + +dom_dict_keys = ['rx_los', 'tx_fault', 'reset_status', + 'power_lpmode', 'tx_disable', 'tx_disable_channel', + 'temperature', 'voltage', 'rx1power', + 'rx2power', 'rx3power', 'rx4power', + 'tx1bias', 'tx2bias', 'tx3bias', + 'tx4bias', 'tx1power', 'tx2power', + 'tx3power', 'tx4power'] + +threshold_dict_keys = ['temphighalarm', 'temphighwarning', + 'templowalarm', 'templowwarning', + 'vcchighalarm', 'vcchighwarning', + 'vcclowalarm', 'vcclowwarning', + 'rxpowerhighalarm', 'rxpowerhighwarning', + 'rxpowerlowalarm', 'rxpowerlowwarning', + 'txpowerhighalarm', 'txpowerhighwarning', + 'txpowerlowalarm', 'txpowerlowwarning', + 'txbiashighalarm', 'txbiashighwarning', + 'txbiaslowalarm', 'txbiaslowwarning'] + +sff8436_parser = { + 'reset_status': [DOM_OFFSET, 2, 1, 'parse_dom_status_indicator'], + 'rx_los': [DOM_OFFSET, 3, 1, 'parse_dom_tx_rx_los'], + 'tx_fault': [DOM_OFFSET, 4, 1, 'parse_dom_tx_fault'], + 'tx_disable': [DOM_OFFSET, 86, 1, 'parse_dom_tx_disable'], + 'power_lpmode': [DOM_OFFSET, 93, 1, 'parse_dom_power_control'], + 'power_override': [DOM_OFFSET, 93, 1, 'parse_dom_power_control'], + 'Temperature': [DOM_OFFSET, 22, 2, 'parse_temperature'], + 'Voltage': [DOM_OFFSET, 26, 2, 'parse_voltage'], + 'ChannelMonitor': [DOM_OFFSET, 34, 16, 'parse_channel_monitor_params'], + + 'cable_type': [INFO_OFFSET, -1, -1, 'parse_sfp_info_bulk'], + 'cable_length': [INFO_OFFSET, -1, -1, 'parse_sfp_info_bulk'], + 'Connector': [INFO_OFFSET, 0, 20, 'parse_sfp_info_bulk'], + 'type': [INFO_OFFSET, 0, 20, 'parse_sfp_info_bulk'], + 'encoding': [INFO_OFFSET, 0, 20, 'parse_sfp_info_bulk'], + 'ext_identifier': [INFO_OFFSET, 0, 20, 'parse_sfp_info_bulk'], + 'ext_rateselect_compliance': + [INFO_OFFSET, 0, 20, 'parse_sfp_info_bulk'], + 'nominal_bit_rate': [INFO_OFFSET, 0, 20, 'parse_sfp_info_bulk'], + 'specification_compliance': + [INFO_OFFSET, 0, 20, 'parse_sfp_info_bulk'], + 'manufacturename': [INFO_OFFSET, 20, 16, 'parse_vendor_name'], + 'vendor_oui': [INFO_OFFSET, 37, 3, 'parse_vendor_oui'], + 'modelname': [INFO_OFFSET, 40, 16, 'parse_vendor_pn'], + 'hardwarerev': [INFO_OFFSET, 56, 2, 'parse_vendor_rev'], + 'serialnum': [INFO_OFFSET, 68, 16, 'parse_vendor_sn'], + 'vendor_date': [INFO_OFFSET, 84, 8, 'parse_vendor_date'], + 'ModuleThreshold': [DOM_OFFSET1, 128, 24, 'parse_module_threshold_values'], + 'ChannelThreshold': [DOM_OFFSET1, 176, 16, 'parse_channel_threshold_values'], +} + + +class Sfp(SfpBase): + """ + DELLEMC Platform-specific Sfp class + """ + + def __init__(self, index, sfp_type, eeprom_path, + sfp_control, sfp_ctrl_idx): + SfpBase.__init__(self) + self.sfp_type = sfp_type + self.index = index + self.eeprom_path = eeprom_path + self.sfp_control = sfp_control + self.sfp_ctrl_idx = sfp_ctrl_idx + self.sfpInfo = sff8436InterfaceId() + self.sfpDomInfo = sff8436Dom() + + def _read_eeprom_bytes(self, eeprom_path, offset, num_bytes): + eeprom_raw = [] + try: + eeprom = open(eeprom_path, mode="rb", buffering=0) + except IOError: + return None + + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + try: + eeprom.seek(offset) + raw = eeprom.read(num_bytes) + except IOError: + eeprom.close() + return None + + try: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + except BaseException: + eeprom.close() + return None + + eeprom.close() + return eeprom_raw + + def _get_eeprom_data(self, eeprom_key): + eeprom_data = None + page_offset = None + + if (self.sfpInfo is None): + return None + + page_offset = sff8436_parser[eeprom_key][PAGE_OFFSET] + eeprom_data_raw = self._read_eeprom_bytes( + self.eeprom_path, + (sff8436_parser[eeprom_key][PAGE_OFFSET] + + sff8436_parser[eeprom_key][KEY_OFFSET]), + sff8436_parser[eeprom_key][KEY_WIDTH]) + if (eeprom_data_raw is not None): + # Offset 128 is used to retrieve sff8436InterfaceId Info + # Offset 0 is used to retrieve sff8436Dom Info + if (page_offset == 128): + eeprom_data = getattr( + self.sfpInfo, sff8436_parser[eeprom_key][FUNC_NAME])( + eeprom_data_raw, 0) + else: + eeprom_data = getattr( + self.sfpDomInfo, sff8436_parser[eeprom_key][FUNC_NAME])( + eeprom_data_raw, 0) + + return eeprom_data + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + """ + transceiver_info_dict = {} + compliance_code_dict = {} + transceiver_info_dict = dict.fromkeys(info_dict_keys, 'N/A') + + # BaseInformation + iface_data = self._get_eeprom_data('type') + if (iface_data is not None): + connector = iface_data['data']['Connector']['value'] + encoding = iface_data['data']['EncodingCodes']['value'] + ext_id = iface_data['data']['Extended Identifier']['value'] + rate_identifier = iface_data['data']['RateIdentifier']['value'] + identifier = iface_data['data']['type']['value'] + bit_rate = str( + iface_data['data']['Nominal Bit Rate(100Mbs)']['value']) + + for key in compliance_code_tup: + if key in iface_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = iface_data['data']['Specification compliance']['value'][key]['value'] + for key in cable_length_tup: + if key in iface_data['data']: + cable_type = key + cable_length = str(iface_data['data'][key]['value']) + else: + return None + + # Vendor Date + vendor_date_data = self._get_eeprom_data('vendor_date') + if (vendor_date_data is not None): + vendor_date = vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] + else: + return None + + # Vendor Name + vendor_name_data = self._get_eeprom_data('manufacturename') + if (vendor_name_data is not None): + vendor_name = vendor_name_data['data']['Vendor Name']['value'] + else: + return None + + # Vendor OUI + vendor_oui_data = self._get_eeprom_data('vendor_oui') + if (vendor_oui_data is not None): + vendor_oui = vendor_oui_data['data']['Vendor OUI']['value'] + else: + return None + + # Vendor PN + vendor_pn_data = self._get_eeprom_data('modelname') + if (vendor_pn_data is not None): + vendor_pn = vendor_pn_data['data']['Vendor PN']['value'] + else: + return None + + # Vendor Revision + vendor_rev_data = self._get_eeprom_data('hardwarerev') + if (vendor_rev_data is not None): + vendor_rev = vendor_rev_data['data']['Vendor Rev']['value'] + else: + return None + + # Vendor Serial Number + vendor_sn_data = self._get_eeprom_data('serialnum') + if (vendor_sn_data is not None): + vendor_sn = vendor_sn_data['data']['Vendor SN']['value'] + else: + return None + + # Fill The Dictionary and return + transceiver_info_dict['type'] = identifier + transceiver_info_dict['hardwarerev'] = vendor_rev + transceiver_info_dict['serialnum'] = vendor_sn + transceiver_info_dict['manufacturename'] = vendor_name + transceiver_info_dict['modelname'] = vendor_pn + transceiver_info_dict['Connector'] = connector + transceiver_info_dict['encoding'] = encoding + transceiver_info_dict['ext_identifier'] = ext_id + transceiver_info_dict['ext_rateselect_compliance'] = rate_identifier + transceiver_info_dict['cable_type'] = cable_type + transceiver_info_dict['cable_length'] = cable_length + transceiver_info_dict['nominal_bit_rate'] = bit_rate + transceiver_info_dict['specification_compliance'] = str( + compliance_code_dict) + transceiver_info_dict['vendor_date'] = vendor_date + transceiver_info_dict['vendor_oui'] = vendor_oui + + return transceiver_info_dict + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + """ + transceiver_dom_threshold_dict = {} + transceiver_dom_threshold_dict = dict.fromkeys( + threshold_dict_keys, 'N/A') + + # Module Threshold + module_threshold_data = self._get_eeprom_data('ModuleThreshold') + if (module_threshold_data is not None): + tempHighAlarm = module_threshold_data['data']['TempHighAlarm']['value'] + tempLowAlarm = module_threshold_data['data']['TempLowAlarm']['value'] + tempHighWarn = module_threshold_data['data']['TempHighWarning']['value'] + tempLowWarn = module_threshold_data['data']['TempLowWarning']['value'] + vccHighAlarm = module_threshold_data['data']['VccHighAlarm']['value'] + vccLowAlarm = module_threshold_data['data']['VccLowAlarm']['value'] + vccHighWarn = module_threshold_data['data']['VccHighWarning']['value'] + vccLowWarn = module_threshold_data['data']['VccLowWarning']['value'] + else: + return None + + # Channel Threshold + channel_threshold_data = self._get_eeprom_data('ChannelThreshold') + if (channel_threshold_data is not None): + rxPowerHighAlarm = channel_threshold_data['data']['RxPowerHighAlarm']['value'] + rxPowerLowAlarm = channel_threshold_data['data']['RxPowerLowAlarm']['value'] + rxPowerHighWarn = channel_threshold_data['data']['RxPowerHighWarning']['value'] + rxPowerLowWarn = channel_threshold_data['data']['RxPowerLowWarning']['value'] + txBiasHighAlarm = channel_threshold_data['data']['TxBiasHighAlarm']['value'] + txBiasLowAlarm = channel_threshold_data['data']['TxBiasLowAlarm']['value'] + txBiasHighWarn = channel_threshold_data['data']['TxBiasHighWarning']['value'] + txBiasLowWarn = channel_threshold_data['data']['TxBiasLowWarning']['value'] + else: + return None + + transceiver_dom_threshold_dict['temphighalarm'] = tempHighAlarm + transceiver_dom_threshold_dict['templowalarm'] = tempLowAlarm + transceiver_dom_threshold_dict['temphighwarning'] = tempHighWarn + transceiver_dom_threshold_dict['templowwarning'] = tempLowWarn + transceiver_dom_threshold_dict['vcchighalarm'] = vccHighAlarm + transceiver_dom_threshold_dict['vcclowalarm'] = vccLowAlarm + transceiver_dom_threshold_dict['vcchighwarning'] = vccHighWarn + transceiver_dom_threshold_dict['vcclowwarning'] = vccLowWarn + transceiver_dom_threshold_dict['rxpowerhighalarm'] = rxPowerHighAlarm + transceiver_dom_threshold_dict['rxpowerlowalarm'] = rxPowerLowAlarm + transceiver_dom_threshold_dict['rxpowerhighwarning'] = rxPowerHighWarn + transceiver_dom_threshold_dict['rxpowerlowwarning'] = rxPowerLowWarn + transceiver_dom_threshold_dict['txbiashighalarm'] = txBiasHighAlarm + transceiver_dom_threshold_dict['txbiaslowalarm'] = txBiasLowAlarm + transceiver_dom_threshold_dict['txbiashighwarning'] = txBiasHighWarn + transceiver_dom_threshold_dict['txbiaslowwarning'] = txBiasLowWarn + + return transceiver_dom_threshold_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + """ + tx_bias_list = [] + rx_power_list = [] + transceiver_dom_dict = {} + transceiver_dom_dict = dict.fromkeys(dom_dict_keys, 'N/A') + + # RxLos + rx_los = self.get_rx_los() + + # TxFault + tx_fault = self.get_tx_fault() + + # ResetStatus + reset_state = self.get_reset_status() + + # LowPower Mode + lp_mode = self.get_lpmode() + + # TxDisable + tx_disable = self.get_tx_disable() + + # TxDisable Channel + tx_disable_channel = self.get_tx_disable_channel() + + # Temperature + temperature = self.get_temperature() + + # Voltage + voltage = self.get_voltage() + + # Channel Monitor + channel_monitor_data = self._get_eeprom_data('ChannelMonitor') + if (channel_monitor_data is not None): + tx_bias = channel_monitor_data['data']['TX1Bias']['value'] + tx_bias_list.append(tx_bias) + tx_bias = channel_monitor_data['data']['TX2Bias']['value'] + tx_bias_list.append(tx_bias) + tx_bias = channel_monitor_data['data']['TX3Bias']['value'] + tx_bias_list.append(tx_bias) + tx_bias = channel_monitor_data['data']['TX4Bias']['value'] + tx_bias_list.append(tx_bias) + rx_power = channel_monitor_data['data']['RX1Power']['value'] + rx_power_list.append(rx_power) + rx_power = channel_monitor_data['data']['RX2Power']['value'] + rx_power_list.append(rx_power) + rx_power = channel_monitor_data['data']['RX3Power']['value'] + rx_power_list.append(rx_power) + rx_power = channel_monitor_data['data']['RX4Power']['value'] + rx_power_list.append(rx_power) + else: + return None + + transceiver_dom_dict['rx_los'] = rx_los + transceiver_dom_dict['tx_fault'] = tx_fault + transceiver_dom_dict['reset_status'] = reset_state + transceiver_dom_dict['power_lpmode'] = lp_mode + transceiver_dom_dict['tx_disable'] = tx_disable + transceiver_dom_dict['tx_disable_channel'] = tx_disable_channel + transceiver_dom_dict['temperature'] = temperature + transceiver_dom_dict['voltage'] = voltage + transceiver_dom_dict['tx1bias'] = tx_bias_list[0] + transceiver_dom_dict['tx2bias'] = tx_bias_list[1] + transceiver_dom_dict['tx3bias'] = tx_bias_list[2] + transceiver_dom_dict['tx4bias'] = tx_bias_list[3] + transceiver_dom_dict['rx1power'] = rx_power_list[0] + transceiver_dom_dict['rx2power'] = rx_power_list[1] + transceiver_dom_dict['rx3power'] = rx_power_list[2] + transceiver_dom_dict['rx4power'] = rx_power_list[3] + + return transceiver_dom_dict + + def get_name(self): + """ + Retrieves the name of the sfp + Returns : QSFP or QSFP+ or QSFP28 + """ + iface_data = self._get_eeprom_data('type') + if (iface_data is not None): + identifier = iface_data['data']['type']['value'] + else: + return None + + return identifier + + def get_presence(self): + """ + Retrieves the presence of the sfp + """ + presence_ctrl = self.sfp_control + 'qsfp_modprs' + try: + reg_file = open(presence_ctrl) + except IOError as e: + return False + + reg_hex = reg_file.readline().rstrip() + + # content is a string containing the hex + # representation of the register + reg_value = int(reg_hex, 16) + + # Mask off the bit corresponding to our port + mask = (1 << self.sfp_ctrl_idx) + + # ModPrsL is active low + if ((reg_value & mask) == 0): + return True + + return False + + def get_model(self): + """ + Retrieves the model number (or part number) of the sfp + """ + vendor_pn_data = self._get_eeprom_data('modelname') + if (vendor_pn_data is not None): + vendor_pn = vendor_pn_data['data']['Vendor PN']['value'] + else: + return None + + return vendor_pn + + def get_serial(self): + """ + Retrieves the serial number of the sfp + """ + vendor_sn_data = self._get_eeprom_data('serialnum') + if (vendor_sn_data is not None): + vendor_sn = vendor_sn_data['data']['Vendor SN']['value'] + else: + return None + + return vendor_sn + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + """ + reset_status = None + reset_ctrl = self.sfp_control + 'qsfp_reset' + try: + reg_file = open(reset_ctrl, "r+") + except IOError as e: + return False + + reg_hex = reg_file.readline().rstrip() + + # content is a string containing the hex + # representation of the register + reg_value = int(reg_hex, 16) + + # Mask off the bit corresponding to our port + if (self.sfp_ctrl_idx > 15): + index = self.sfp_ctrl_idx % 16 + else: + index = self.sfp_ctrl_idx + + mask = (1 << index) + + if ((reg_value & mask) == 0): + reset_status = True + else: + reset_status = False + + return reset_status + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + """ + rx_los = None + rx_los_list = [] + + rx_los_data = self._get_eeprom_data('rx_los') + if (rx_los_data is not None): + rx_los = rx_los_data['data']['Rx1LOS']['value'] + if (rx_los is 'On'): + rx_los_list.append(True) + else: + rx_los_list.append(False) + rx_los = rx_los_data['data']['Rx2LOS']['value'] + if (rx_los is 'On'): + rx_los_list.append(True) + else: + rx_los_list.append(False) + rx_los = rx_los_data['data']['Rx3LOS']['value'] + if (rx_los is 'On'): + rx_los_list.append(True) + else: + rx_los_list.append(False) + rx_los = rx_los_data['data']['Rx4LOS']['value'] + if (rx_los is 'On'): + rx_los_list.append(True) + else: + rx_los_list.append(False) + + if (rx_los_list[0] and rx_los_list[1] + and rx_los_list[2] and rx_los_list[3]): + rx_los = True + else: + rx_los = False + + return rx_los + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + """ + tx_fault = None + tx_fault_list = [] + + tx_fault_data = self._get_eeprom_data('tx_fault') + if (tx_fault_data is not None): + tx_fault = tx_fault_data['data']['Tx1Fault']['value'] + if (tx_fault is 'On'): + tx_fault_list.append(True) + else: + tx_fault_list.append(False) + tx_fault = tx_fault_data['data']['Tx2Fault']['value'] + if (tx_fault is 'On'): + tx_fault_list.append(True) + else: + tx_fault_list.append(False) + tx_fault = tx_fault_data['data']['Tx3Fault']['value'] + if (tx_fault is 'On'): + tx_fault_list.append(True) + else: + tx_fault_list.append(False) + tx_fault = tx_fault_data['data']['Tx4Fault']['value'] + if (tx_fault is 'On'): + tx_fault_list.append(True) + else: + tx_fault_list.append(False) + + if (tx_fault_list[0] and tx_fault_list[1] + and tx_fault_list[2] and tx_fault_list[3]): + tx_fault = True + else: + tx_fault = False + + return tx_fault + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + """ + tx_disable = None + tx_disable_list = [] + + tx_disable_data = self._get_eeprom_data('tx_disable') + if (tx_disable_data is not None): + tx_disable = tx_disable_data['data']['Tx1Disable']['value'] + if (tx_disable is 'On'): + tx_disable_list.append(True) + else: + tx_disable_list.append(False) + tx_disable = tx_disable_data['data']['Tx2Disable']['value'] + if (tx_disable is 'On'): + tx_disable_list.append(True) + else: + tx_disable_list.append(False) + tx_disable = tx_disable_data['data']['Tx3Disable']['value'] + if (tx_disable is 'On'): + tx_disable_list.append(True) + else: + tx_disable_list.append(False) + tx_disable = tx_disable_data['data']['Tx4Disable']['value'] + if (tx_disable is 'On'): + tx_disable_list.append(True) + else: + tx_disable_list.append(False) + + if (tx_disable_list[0] and tx_disable_list[1] + and tx_disable_list[2] and tx_disable_list[3]): + tx_disable = True + else: + tx_disable = False + + return tx_disable + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + """ + tx_disable = None + tx_disable_list = [] + + tx_disable_data = self._get_eeprom_data('tx_disable') + if (tx_disable_data is not None): + tx_disable = tx_disable_data['data']['Tx1Disable']['value'] + if (tx_disable is 'On'): + tx_disable_list.append(1) + else: + tx_disable_list.append(0) + tx_disable = tx_disable_data['data']['Tx2Disable']['value'] + if (tx_disable is 'On'): + tx_disable_list.append(1) + else: + tx_disable_list.append(0) + tx_disable = tx_disable_data['data']['Tx3Disable']['value'] + if (tx_disable is 'On'): + tx_disable_list.append(1) + else: + tx_disable_list.append(0) + tx_disable = tx_disable_data['data']['Tx4Disable']['value'] + if (tx_disable is 'On'): + tx_disable_list.append(1) + else: + tx_disable_list.append(0) + + bit4 = int(tx_disable_list[3]) * 8 + bit3 = int(tx_disable_list[2]) * 4 + bit2 = int(tx_disable_list[1]) * 2 + bit1 = int(tx_disable_list[0]) * 1 + + tx_disable_channel = hex(bit4 + bit3 + bit2 + bit1) + + return tx_disable_channel + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + """ + lpmode_ctrl = self.sfp_control + 'qsfp_lpmode' + try: + reg_file = open(lpmode_ctrl, "r+") + except IOError as e: + return False + + reg_hex = reg_file.readline().rstrip() + + # content is a string containing the hex + # representation of the register + reg_value = int(reg_hex, 16) + + # Mask off the bit corresponding to our port + if (self.sfp_ctrl_idx > 15): + index = self.sfp_ctrl_idx % 16 + else: + index = self.sfp_ctrl_idx + + mask = (1 << index) + + if ((reg_value & mask) == 0): + lpmode_state = False + else: + lpmode_state = True + + return lpmode_state + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + """ + power_override_state = None + + # Reset Status + power_override_data = self._get_eeprom_data('power_override') + if (power_override_data is not None): + power_override = power_override_data['data']['PowerOverRide']['value'] + if (power_override is 'On'): + power_override_state = True + else: + power_override_state = False + + return power_override_state + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + """ + temperature = None + + temperature_data = self._get_eeprom_data('Temperature') + if (temperature_data is not None): + temperature = temperature_data['data']['Temperature']['value'] + + return temperature + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + """ + voltage = None + + voltage_data = self._get_eeprom_data('Voltage') + if (voltage_data is not None): + voltage = voltage_data['data']['Vcc']['value'] + + return voltage + + def get_tx_bias(self): + """ + Retrieves the TX bias current of this SFP + """ + tx_bias = None + tx_bias_list = [] + + tx_bias_data = self._get_eeprom_data('ChannelMonitor') + if (tx_bias_data is not None): + tx_bias = tx_bias_data['data']['TX1Bias']['value'] + tx_bias_list.append(tx_bias) + tx_bias = tx_bias_data['data']['TX2Bias']['value'] + tx_bias_list.append(tx_bias) + tx_bias = tx_bias_data['data']['TX3Bias']['value'] + tx_bias_list.append(tx_bias) + tx_bias = tx_bias_data['data']['TX4Bias']['value'] + tx_bias_list.append(tx_bias) + + return tx_bias_list + + def get_rx_power(self): + """ + Retrieves the received optical power for this SFP + """ + rx_power = None + rx_power_list = [] + + rx_power_data = self._get_eeprom_data('ChannelMonitor') + if (rx_power_data is not None): + rx_power = rx_power_data['data']['RX1Power']['value'] + rx_power_list.append(rx_power) + rx_power = rx_power_data['data']['RX2Power']['value'] + rx_power_list.append(rx_power) + rx_power = rx_power_data['data']['RX3Power']['value'] + rx_power_list.append(rx_power) + rx_power = rx_power_data['data']['RX4Power']['value'] + rx_power_list.append(rx_power) + + return rx_power_list + + + def get_tx_power(self): + """ + Retrieves the TX power of this SFP + """ + tx_power = None + tx_power_list = [] + + tx_power_list.append('-infdBm') + tx_power_list.append('-infdBm') + tx_power_list.append('-infdBm') + tx_power_list.append('-infdBm') + + return tx_power_list + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + """ + reset_ctrl = self.sfp_control + 'qsfp_reset' + try: + # Open reset_ctrl in both read & write mode + reg_file = open(reset_ctrl, "r+") + except IOError as e: + return False + + reg_hex = reg_file.readline().rstrip() + reg_value = int(reg_hex, 16) + + # Mask off the bit corresponding to our port + if (self.sfp_ctrl_idx > 15): + index = self.sfp_ctrl_idx % 16 + else: + index = self.sfp_ctrl_idx + + # Mask off the bit corresponding to our port + mask = (1 << index) + + # ResetL is active low + reg_value = (reg_value & ~mask) + + # Convert our register value back to a + # hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the + # register to take port out of reset + try: + reg_file = open(reset_ctrl, "w") + except IOError as e: + return False + + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + return True + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + """ + lpmode_ctrl = self.sfp_control + 'qsfp_lpmode' + try: + reg_file = open(lpmode_ctrl, "r+") + except IOError as e: + return False + + reg_hex = reg_file.readline().rstrip() + + # content is a string containing the hex + # representation of the register + reg_value = int(reg_hex, 16) + + # Mask off the bit corresponding to our port + if (self.sfp_ctrl_idx > 15): + index = self.sfp_ctrl_idx % 16 + else: + index = self.sfp_ctrl_idx + + mask = (1 << index) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = (reg_value | mask) + else: + reg_value = (reg_value & ~mask) + + # Convert our register value back to a hex string and write back + content = hex(reg_value) + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True diff --git a/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/__init__.py b/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/__init__.py index 497c1429ad89..2be1c8f2588b 100755 --- a/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/__init__.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/__init__.py @@ -1,3 +1,3 @@ -__all__ = ["platform", "chassis", "fan", "psu"] +__all__ = ["platform", "chassis", "sfp"] from sonic_platform import * diff --git a/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/chassis.py index 654efa3cd26f..f912b806d081 100755 --- a/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/chassis.py @@ -11,6 +11,7 @@ try: import os from sonic_platform_base.chassis_base import ChassisBase + from sonic_platform.sfp import Sfp from sonic_platform.fan import Fan from eeprom import Eeprom except ImportError as e: @@ -29,6 +30,27 @@ class Chassis(ChassisBase): HWMON_DIR = "/sys/devices/platform/SMF.512/hwmon/" HWMON_NODE = os.listdir(HWMON_DIR)[0] MAILBOX_DIR = HWMON_DIR + HWMON_NODE + EEPROM_I2C_MAPPING = { + 0: [9, 18], 1: [9, 19], 2: [9, 20], 3: [9, 21], + 4: [9, 22], 5: [9, 23], 6: [9, 24], 7: [9, 25], + 8: [8, 26], 9: [8, 27], 10: [8, 28], 11: [8, 29], + 12: [8, 31], 13: [8, 30], 14: [8, 33], 15: [8, 32], # Remapped 4 entries + 16: [7, 34], 17: [7, 35], 18: [7, 36], 19: [7, 37], + 20: [7, 38], 21: [7, 39], 22: [7, 40], 23: [7, 41], + 24: [6, 42], 25: [6, 43], 26: [6, 44], 27: [6, 45], + 28: [6, 46], 29: [6, 47], 30: [6, 48], 31: [6, 49] + } + PORT_I2C_MAPPING = { + # 0th Index = i2cLine, 1st Index = portIdx in i2cLine + 0: [14, 0], 1: [14, 1], 2: [14, 2], 3: [14, 3], + 4: [14, 4], 5: [14, 5], 6: [14, 6], 7: [14, 7], + 8: [14, 8], 9: [14, 9], 10: [14, 10], 11: [14, 11], + 12: [15, 0], 13: [15, 1], 14: [15, 2], 15: [15, 3], + 16: [15, 4], 17: [15, 5], 18: [15, 6], 19: [15, 7], + 20: [15, 8], 21: [15, 9], 22: [16, 0], 23: [16, 1], + 24: [16, 2], 25: [16, 3], 26: [16, 4], 27: [16, 5], + 28: [16, 6], 29: [16, 7], 30: [16, 8], 31: [16, 9] + } reset_reason_dict = {} reset_reason_dict[11] = ChassisBase.REBOOT_CAUSE_POWER_LOSS @@ -43,6 +65,24 @@ class Chassis(ChassisBase): power_reason_dict[44] = ChassisBase.REBOOT_CAUSE_INSUFFICIENT_FAN_SPEED def __init__(self): + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = (PORT_END + 1) + + # 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 + eeprom_base = "/sys/class/i2c-adapter/i2c-{0}/i2c-{1}/{1}-0050/eeprom" + sfp_ctrl_base = "/sys/class/i2c-adapter/i2c-{0}/{0}-003e/" + for index in range(0, PORTS_IN_BLOCK): + eeprom_path = eeprom_base.format(self.EEPROM_I2C_MAPPING[index][0], + self.EEPROM_I2C_MAPPING[index][1]) + sfp_control = sfp_ctrl_base.format(self.PORT_I2C_MAPPING[index][0]) + sfp_node = Sfp(index, 'QSFP', eeprom_path, sfp_control, + self.PORT_I2C_MAPPING[index][1]) + self._sfp_list.append(sfp_node) ChassisBase.__init__(self) # Initialize EEPROM @@ -152,4 +192,3 @@ def get_reboot_cause(self): return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason") - diff --git a/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/sfp.py b/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/sfp.py new file mode 120000 index 000000000000..84af7963bb3d --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/z9100/sonic_platform/sfp.py @@ -0,0 +1 @@ +../../s6100/sonic_platform/sfp.py \ No newline at end of file From 9ad54b8b792ba4ad74ea2927e54e93a8563593ab Mon Sep 17 00:00:00 2001 From: brandonchuang Date: Wed, 14 Aug 2019 05:24:41 +0800 Subject: [PATCH 09/54] [as5835-54x] Implement get_transceiver_change_event() in sfputil.py (#3308) Signed-off-by: brandon_chuang --- .../plugins/sfputil.py | 109 ++++++++++++++++-- 1 file changed, 99 insertions(+), 10 deletions(-) diff --git a/device/accton/x86_64-accton_as5835_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as5835_54x-r0/plugins/sfputil.py index 9a9db688e7dc..ba8e6181ebe8 100644 --- a/device/accton/x86_64-accton_as5835_54x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as5835_54x-r0/plugins/sfputil.py @@ -11,6 +11,8 @@ except ImportError as e: raise ImportError("%s - required module not found" % str(e)) +SFP_STATUS_INSERTED = '1' +SFP_STATUS_REMOVED = '0' class SfpUtil(SfpUtilBase): """Platform-specific SfpUtil class""" @@ -216,7 +218,7 @@ def get_low_power_mode(self, port_num): try: eeprom = None - eeprom = open(self.port_to_eeprom_mapping[port_num], "rb") + eeprom = open(self.port_to_eeprom_mapping[port_num], mode="rb", buffering=0) eeprom.seek(93) lpmode = ord(eeprom.read(1)) @@ -251,7 +253,7 @@ def set_low_power_mode(self, port_num, lpmode): buffer[0] = chr(regval) # Write to eeprom - eeprom = open(self.port_to_eeprom_mapping[port_num], "r+b") + eeprom = open(self.port_to_eeprom_mapping[port_num], mode="r+b", buffering=0) eeprom.seek(93) eeprom.write(buffer[0]) return True @@ -273,7 +275,7 @@ def reset(self, port_num): path = "/sys/bus/i2c/devices/{0}/module_reset_{1}" port_ps = path.format(cpld_ps, cage_num) try: - reg_file = open(port_ps, 'w') + reg_file = open(port_ps, mode='w', buffering=0) except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -288,10 +290,97 @@ def reset(self, port_num): return True - 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 + @property + def _get_presence_bitmap(self): + nodes = [] + nodes.append("/sys/bus/i2c/devices/3-0061/module_present_all") + nodes.append("/sys/bus/i2c/devices/3-0062/module_present_all") + + bitmap = "" + for node in nodes: + try: + reg_file = open(node) + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + bitmap += reg_file.readline().rstrip() + " " + reg_file.close() + + rev = bitmap.split(" ") + rev.pop() # Remove the last useless character + + # Convert bitmap into continuously port order + rev[4] = hex((int(rev[4],16) | ((int(rev[5],16) & 0x3) << 6)))[2:] # Port 33-40 + rev[5] = hex((int(rev[5],16) >> 2) | ((int(rev[6],16) & 0x3) << 6))[2:] # Port 41-48 + + # Expand port 49-54 + tmp = rev.pop() + for i in range (2, 8): + val = (int(tmp,16) >> i) & 0x1 + rev.append(hex(val)[2:]) + + for i in range (0,6): + rev[i] = rev[i].zfill(2) + + rev = "".join(rev[::-1]) + return int(rev,16) + + data = {'valid':0, 'present':0} + def get_transceiver_change_event(self, timeout=0): + + start_time = time.time() + port_dict = {} + port = 0 + blocking = False + + if timeout == 0: + blocking = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print "get_transceiver_change_event:Invalid timeout value", timeout + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print 'get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + # Check for OIR events and return updated port_dict + + reg_value = self._get_presence_bitmap + changed_ports = self.data['present'] ^ reg_value + if changed_ports: + for port in range (self.port_start, self.port_end+1): + # Mask off the bit corresponding to our port + mask = (1 << (port - 1)) + if changed_ports & mask: + + if (reg_value & mask) == 0: + port_dict[port] = SFP_STATUS_REMOVED + else: + port_dict[port] = SFP_STATUS_INSERTED + + # Update cache + self.data['present'] = reg_value + self.data['valid'] = 1 + return True, port_dict + + if blocking: + 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, {} + print "get_transceiver_change_event: Should not reach here." + return False, {} + + From 03ec08b0820d1b315f9883739e0c4bd14d1fa65f Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Tue, 13 Aug 2019 17:31:25 -0700 Subject: [PATCH 10/54] [mmu] add mmu_init_config to HWSKU Arista-7260CX3-Q64 (#3334) Signed-off-by: Ying Xie --- .../Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm index f1a0e0d08971..0af841fe64fa 100644 --- a/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm +++ b/device/arista/x86_64-arista_7260cx3_64/Arista-7260CX3-Q64/th2-a7260cx3-64-64x40G.config.bcm @@ -1012,3 +1012,5 @@ serdes_preemphasis_114=0x61c01 serdes_preemphasis_115=0x61c01 serdes_preemphasis_116=0x105004 serdes_preemphasis_117=0x105004 + +mmu_init_config="MSFT-TH2-Tier0" From e78b7afd00fa33de782eff97e22292a3c125b2dd Mon Sep 17 00:00:00 2001 From: Andriy Kokhan <43479230+akokhan@users.noreply.github.com> Date: Tue, 13 Aug 2019 22:52:17 -0700 Subject: [PATCH 11/54] [swss][sairedis] advance sub-modules (#3326) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [sairedis]: ARM32 bit fixes, for 64bit printf format specifier (#490) fix wrong API type , add cmdline parse option , remove unuseful api call (#499) Use pointer to member function to reduce the footprint of collectCounters() (#488) [syncd] Add support for Innovium platform (#496) [saisdkdump]: Fix dump generation crash (#493) [swss]: Add scope attribute to VNET table. (#954) [portsyncd]: Fix portsyncd restart case (#1019) [vnet]: Enable "vnet_orch_1" VS test case (#1020) [vlan] Add pytest cases to validate the behavior about add LAG member to vlan. (#875) [policerorch]: Add the capability to update policer rate/size (#1017) [aclorch]: Add MIRRORv6 support for NPS platform (#1018) [orchagent]: Avoid crash by setting g_syncMode flag before create_switch (#1014) [orchagent] Add support for Innovium platform (#1005) Provide broadcast IP while configuring interface ip address (#1007) [VLAN] Add pytest cases to validate different use-case of tagging_mode. (#860) [vstest]: Add test_port_config.py which include breakout port test. (#866) [vstests]: change 'test_acl_egress_table.py' to UNIX format (#1010) [vlan] Add pytest cases to verify data in app db and state db. (#895) [vstest]: Add the CRM tests (#1013) [warm-reboot]: add bgp eoiu support to speed up route reconcile (#856) [fdborch] support mac update (#877) [vxlanorch] Fix Logic of Vxlan tunnel removal (#995) Fix VLAN error introduced with new 4.9 kernel behavior (#1001) Config DB manual is being moved from Wiki to SWSS repo (#1002) Trap DHCPv6 packets for supporting ZTP over in-band interfaces using … (#997) Signed-off-by: Andriy Kokhan --- src/sonic-sairedis | 2 +- src/sonic-swss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 80c7e8b11057..6bc64eedf16e 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 80c7e8b110571b9dfcf58bc15286beb1eda4195b +Subproject commit 6bc64eedf16e0dd377374e3c81ff179f996d459d diff --git a/src/sonic-swss b/src/sonic-swss index 5be3963793d5..252e12cf3a59 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 5be3963793d5d04807931f016faf1fcca87f6286 +Subproject commit 252e12cf3a592a287a102a3b74ad2152b36781f6 From e8ae50939af9782f6476b578c4aef521f8fc04d3 Mon Sep 17 00:00:00 2001 From: Tony Titus <49417625+tonytitus@users.noreply.github.com> Date: Wed, 14 Aug 2019 10:40:55 -0700 Subject: [PATCH 12/54] [innovium]: Initial commit (#3243) [build] Add ipmitool [dockers] Add innovium platform in orchagent + ipmitool in snmp [platform/innovium] Add innovium platform [device/celestica] Add x86_64-cel_midstone-r0 device for innovium [device/delta] Add x86_64-delta_et-c032if-r0 device for innovium [sonic-slave-stretch] Add texi2html Signed-off-by: Tony Titus ttitus@innovium.com --- build_debian.sh | 4 +- .../Midstone-200i/buffers.json.j2 | 120 + .../config_64x100G_midstone200i.yaml | 639 +++++ .../Midstone-200i/inno.config.yaml | 7 + .../Midstone-200i/innovium.77700_B | 59 + .../Midstone-200i/port_config.ini | 65 + .../Midstone-200i/qos.json.j2 | 120 + .../Midstone-200i/sai.profile | 1 + .../Midstone-200i_128x100/buffers.json.j2 | 120 + .../config_128x100G_midstone200i.yaml | 1100 +++++++++ .../Midstone-200i_128x100/inno.config.yaml | 7 + .../Midstone-200i_128x100/innovium.77700_B | 59 + .../Midstone-200i_128x100/port_config.ini | 131 + .../Midstone-200i_128x100/qos.json.j2 | 120 + .../Midstone-200i_128x100/sai.profile | 1 + .../Midstone-200i_32x400/buffers.json.j2 | 120 + .../config_32x400G_midstone200i.yaml | 429 ++++ .../Midstone-200i_32x400/inno.config.yaml | 7 + .../Midstone-200i_32x400/innovium.77700_A | 59 + .../Midstone-200i_32x400/port_config.ini | 35 + .../Midstone-200i_32x400/qos.json.j2 | 120 + .../Midstone-200i_32x400/sai.profile | 1 + .../Midstone-200i_64x100/buffers.json.j2 | 120 + .../config_64x100G_nrz_midstone200i.yaml | 785 ++++++ .../Midstone-200i_64x100/inno.config.yaml | 7 + .../Midstone-200i_64x100/innovium.77700_B | 59 + .../Midstone-200i_64x100/port_config.ini | 67 + .../Midstone-200i_64x100/qos.json.j2 | 120 + .../Midstone-200i_64x100/sai.profile | 1 + .../Midstone-200i_64x100nrz/buffers.json.j2 | 121 + .../config_64x100G_nrz_midstone200i.yaml | 767 ++++++ .../Midstone-200i_64x100nrz/inno.config.yaml | 7 + .../Midstone-200i_64x100nrz/innovium.77700_B | 59 + .../Midstone-200i_64x100nrz/port_config.ini | 65 + .../Midstone-200i_64x100nrz/qos.json.j2 | 102 + .../Midstone-200i_64x100nrz/sai.profile | 1 + .../Midstone-200i_64x200/buffers.json.j2 | 120 + .../config_64x200G_midstone200i.yaml | 653 +++++ .../Midstone-200i_64x200/inno.config.yaml | 7 + .../Midstone-200i_64x200/innovium.77700_B | 59 + .../Midstone-200i_64x200/port_config.ini | 67 + .../Midstone-200i_64x200/qos.json.j2 | 120 + .../Midstone-200i_64x200/sai.profile | 1 + .../x86_64-cel_midstone-r0/default_sku | 1 + .../x86_64-cel_midstone-r0/fancontrol | 0 .../x86_64-cel_midstone-r0/installer.conf | 3 + .../x86_64-cel_midstone-r0/plugins/eeprom.py | 22 + .../x86_64-cel_midstone-r0/plugins/psuutil.py | 61 + .../x86_64-cel_midstone-r0/plugins/sfputil.py | 205 ++ .../x86_64-cel_midstone-r0/sensors.conf | 2 + .../Delta-et-c032if/buffers.json.j2 | 120 + .../config_32x400G_Delta-et-c032if.yaml | 429 ++++ .../Delta-et-c032if/inno.config.yaml | 7 + .../Delta-et-c032if/innovium.77700_A | 59 + .../Delta-et-c032if/port_config.ini | 35 + .../Delta-et-c032if/qos.json.j2 | 120 + .../Delta-et-c032if/sai.profile | 1 + .../Delta-et-c032if_128x100/buffers.json.j2 | 120 + .../config_128x100G_Delta-et-c032if.yaml | 1102 +++++++++ .../Delta-et-c032if_128x100/inno.config.yaml | 7 + .../Delta-et-c032if_128x100/innovium.77700_B | 59 + .../Delta-et-c032if_128x100/port_config.ini | 131 + .../Delta-et-c032if_128x100/qos.json.j2 | 120 + .../Delta-et-c032if_128x100/sai.profile | 1 + .../Delta-et-c032if_32x100/buffers.json.j2 | 120 + .../config_32x100G_Delta-et-c032if.yaml | 415 ++++ .../Delta-et-c032if_32x100/inno.config.yaml | 7 + .../Delta-et-c032if_32x100/innovium.77700_A | 59 + .../Delta-et-c032if_32x100/innovium.77700_B | 59 + .../Delta-et-c032if_32x100/port_config.ini | 33 + .../Delta-et-c032if_32x100/qos.json.j2 | 120 + .../Delta-et-c032if_32x100/sai.profile | 1 + .../Delta-et-c032if_32x200/buffers.json.j2 | 120 + .../config_32x200G_Delta-et-c032if.yaml | 429 ++++ .../Delta-et-c032if_32x200/inno.config.yaml | 7 + .../Delta-et-c032if_32x200/innovium.77700_B | 59 + .../Delta-et-c032if_32x200/port_config.ini | 35 + .../Delta-et-c032if_32x200/qos.json.j2 | 120 + .../Delta-et-c032if_32x200/sai.profile | 1 + .../Delta-et-c032if_32x400/buffers.json.j2 | 120 + .../config_32x400G_Delta-et-c032if.yaml | 429 ++++ .../Delta-et-c032if_32x400/inno.config.yaml | 7 + .../Delta-et-c032if_32x400/innovium.77700_A | 59 + .../Delta-et-c032if_32x400/innovium.77700_B | 59 + .../Delta-et-c032if_32x400/port_config.ini | 35 + .../Delta-et-c032if_32x400/qos.json.j2 | 120 + .../Delta-et-c032if_32x400/sai.profile | 1 + .../Delta-et-c032if_64x100/buffers.json.j2 | 120 + .../config_64x100G_Delta-et-c032if.yaml | 653 +++++ .../Delta-et-c032if_64x100/inno.config.yaml | 7 + .../Delta-et-c032if_64x100/innovium.77700_B | 59 + .../Delta-et-c032if_64x100/port_config.ini | 67 + .../Delta-et-c032if_64x100/qos.json.j2 | 120 + .../Delta-et-c032if_64x100/sai.profile | 1 + .../Delta-et-c032if_64x200/buffers.json.j2 | 120 + .../config_64x200G_Delta-et-c032if.yaml | 653 +++++ .../Delta-et-c032if_64x200/inno.config.yaml | 7 + .../Delta-et-c032if_64x200/innovium.77700_B | 59 + .../Delta-et-c032if_64x200/port_config.ini | 67 + .../Delta-et-c032if_64x200/qos.json.j2 | 120 + .../Delta-et-c032if_64x200/sai.profile | 1 + .../x86_64-delta_et-c032if-r0/default_sku | 1 + .../x86_64-delta_et-c032if-r0/installer.conf | 3 + .../led_proc_init.soc | 10 + .../plugins/eeprom.py | 32 + .../plugins/psuutil.py | 78 + .../plugins/sfputil.py | 255 ++ .../x86_64-delta_et-c032if-r0/sensors.conf | 4 + dockers/docker-orchagent/orchagent.sh | 2 + dockers/docker-snmp-sv2/Dockerfile.j2 | 3 +- platform/innovium/docker-ptf-invm.mk | 7 + platform/innovium/docker-syncd-invm-rpc.mk | 17 + .../docker-syncd-invm-rpc/Dockerfile.j2 | 53 + .../docker-syncd-invm-rpc/ptf_nn_agent.conf | 10 + platform/innovium/docker-syncd-invm.mk | 13 + .../innovium/docker-syncd-invm/Dockerfile.j2 | 34 + platform/innovium/docker-syncd-invm/start.sh | 7 + .../docker-syncd-invm/supervisord.conf | 28 + platform/innovium/invm-sai.mk | 14 + platform/innovium/libsaithrift-dev.mk | 7 + platform/innovium/one-image.mk | 10 + platform/innovium/platform-modules-cel.mk | 12 + platform/innovium/platform-modules-delta.mk | 13 + platform/innovium/platform.conf | 0 platform/innovium/python-saithrift.mk | 6 + platform/innovium/rules.mk | 20 + .../sonic-platform-modules-cel/.gitignore | 33 + .../sonic-platform-modules-cel/LICENSE | 15 + .../sonic-platform-modules-cel/README.md | 1 + .../debian/changelog | 28 + .../sonic-platform-modules-cel/debian/compat | 1 + .../sonic-platform-modules-cel/debian/control | 11 + .../platform-modules-midstone-200i.init | 52 + .../platform-modules-midstone-200i.install | 2 + .../platform-modules-midstone-200i.postinst | 3 + .../sonic-platform-modules-cel/debian/rules | 32 + .../cfg/midstone-200i-modules.conf | 15 + .../midstone-200i/modules/200i_cpld.c | 854 +++++++ .../midstone-200i/modules/200i_wdt.c | 363 +++ .../midstone-200i/modules/Makefile | 1 + .../midstone-200i/modules/mc24lc64t.c | 142 ++ .../platform-modules-midstone-200i.service | 13 + .../sonic-platform-modules-delta/LICENSE | 16 + .../common/modules/dni_emc2305.c | 381 +++ .../debian/changelog | 5 + .../debian/compat | 1 + .../debian/control | 13 + .../debian/platform-modules-et-c032if.init | 39 + .../debian/platform-modules-et-c032if.install | 3 + .../sonic-platform-modules-delta/debian/rules | 33 + .../et-c032if/cfg/et-c032if-modules.conf | 13 + .../et-c032if/modules/Makefile | 2 + .../modules/delta_et-c032if_platform.c | 2100 +++++++++++++++++ .../scripts/et-c032if_platform_init.sh | 9 + .../platform-modules-et-c032if.service | 13 + sonic-slave-stretch/Dockerfile.j2 | 2 + 156 files changed, 18539 insertions(+), 2 deletions(-) create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers.json.j2 create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i/config_64x100G_midstone200i.yaml create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i/inno.config.yaml create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i/innovium.77700_B create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i/port_config.ini create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos.json.j2 create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i/sai.profile create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers.json.j2 create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/config_128x100G_midstone200i.yaml create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/inno.config.yaml create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/innovium.77700_B create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/port_config.ini create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos.json.j2 create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/sai.profile create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers.json.j2 create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/config_32x400G_midstone200i.yaml create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/inno.config.yaml create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/innovium.77700_A create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/port_config.ini create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos.json.j2 create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/sai.profile create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers.json.j2 create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/config_64x100G_nrz_midstone200i.yaml create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/inno.config.yaml create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/innovium.77700_B create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/port_config.ini create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos.json.j2 create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/sai.profile create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/buffers.json.j2 create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/config_64x100G_nrz_midstone200i.yaml create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/inno.config.yaml create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/innovium.77700_B create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/port_config.ini create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/qos.json.j2 create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/sai.profile create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers.json.j2 create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/config_64x200G_midstone200i.yaml create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/inno.config.yaml create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/innovium.77700_B create mode 100644 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/port_config.ini create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos.json.j2 create mode 100755 device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/sai.profile create mode 100755 device/celestica/x86_64-cel_midstone-r0/default_sku create mode 100755 device/celestica/x86_64-cel_midstone-r0/fancontrol create mode 100755 device/celestica/x86_64-cel_midstone-r0/installer.conf create mode 100755 device/celestica/x86_64-cel_midstone-r0/plugins/eeprom.py create mode 100644 device/celestica/x86_64-cel_midstone-r0/plugins/psuutil.py create mode 100755 device/celestica/x86_64-cel_midstone-r0/plugins/sfputil.py create mode 100755 device/celestica/x86_64-cel_midstone-r0/sensors.conf create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/config_32x400G_Delta-et-c032if.yaml create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/inno.config.yaml create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/innovium.77700_A create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/port_config.ini create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/sai.profile create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/config_128x100G_Delta-et-c032if.yaml create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/inno.config.yaml create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/innovium.77700_B create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/port_config.ini create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/sai.profile create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/config_32x100G_Delta-et-c032if.yaml create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/inno.config.yaml create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/innovium.77700_A create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/innovium.77700_B create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/port_config.ini create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/sai.profile create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/config_32x200G_Delta-et-c032if.yaml create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/inno.config.yaml create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/innovium.77700_B create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/port_config.ini create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/sai.profile create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/config_32x400G_Delta-et-c032if.yaml create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/inno.config.yaml create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/innovium.77700_A create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/innovium.77700_B create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/port_config.ini create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/sai.profile create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/config_64x100G_Delta-et-c032if.yaml create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/inno.config.yaml create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/innovium.77700_B create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/port_config.ini create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/sai.profile create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/config_64x200G_Delta-et-c032if.yaml create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/inno.config.yaml create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/innovium.77700_B create mode 100644 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/port_config.ini create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos.json.j2 create mode 100755 device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/sai.profile create mode 100644 device/delta/x86_64-delta_et-c032if-r0/default_sku create mode 100644 device/delta/x86_64-delta_et-c032if-r0/installer.conf create mode 100644 device/delta/x86_64-delta_et-c032if-r0/led_proc_init.soc create mode 100644 device/delta/x86_64-delta_et-c032if-r0/plugins/eeprom.py create mode 100644 device/delta/x86_64-delta_et-c032if-r0/plugins/psuutil.py create mode 100644 device/delta/x86_64-delta_et-c032if-r0/plugins/sfputil.py create mode 100644 device/delta/x86_64-delta_et-c032if-r0/sensors.conf create mode 100755 platform/innovium/docker-ptf-invm.mk create mode 100755 platform/innovium/docker-syncd-invm-rpc.mk create mode 100755 platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 create mode 100755 platform/innovium/docker-syncd-invm-rpc/ptf_nn_agent.conf create mode 100755 platform/innovium/docker-syncd-invm.mk create mode 100755 platform/innovium/docker-syncd-invm/Dockerfile.j2 create mode 100755 platform/innovium/docker-syncd-invm/start.sh create mode 100755 platform/innovium/docker-syncd-invm/supervisord.conf create mode 100755 platform/innovium/invm-sai.mk create mode 100755 platform/innovium/libsaithrift-dev.mk create mode 100755 platform/innovium/one-image.mk create mode 100755 platform/innovium/platform-modules-cel.mk create mode 100644 platform/innovium/platform-modules-delta.mk create mode 100755 platform/innovium/platform.conf create mode 100755 platform/innovium/python-saithrift.mk create mode 100755 platform/innovium/rules.mk create mode 100755 platform/innovium/sonic-platform-modules-cel/.gitignore create mode 100755 platform/innovium/sonic-platform-modules-cel/LICENSE create mode 100755 platform/innovium/sonic-platform-modules-cel/README.md create mode 100755 platform/innovium/sonic-platform-modules-cel/debian/changelog create mode 100755 platform/innovium/sonic-platform-modules-cel/debian/compat create mode 100755 platform/innovium/sonic-platform-modules-cel/debian/control create mode 100755 platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.init create mode 100644 platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.install create mode 100644 platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.postinst create mode 100755 platform/innovium/sonic-platform-modules-cel/debian/rules create mode 100755 platform/innovium/sonic-platform-modules-cel/midstone-200i/cfg/midstone-200i-modules.conf create mode 100755 platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/200i_cpld.c create mode 100755 platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/200i_wdt.c create mode 100755 platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/Makefile create mode 100755 platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/mc24lc64t.c create mode 100644 platform/innovium/sonic-platform-modules-cel/midstone-200i/systemd/platform-modules-midstone-200i.service create mode 100644 platform/innovium/sonic-platform-modules-delta/LICENSE create mode 100644 platform/innovium/sonic-platform-modules-delta/common/modules/dni_emc2305.c create mode 100644 platform/innovium/sonic-platform-modules-delta/debian/changelog create mode 100644 platform/innovium/sonic-platform-modules-delta/debian/compat create mode 100644 platform/innovium/sonic-platform-modules-delta/debian/control create mode 100755 platform/innovium/sonic-platform-modules-delta/debian/platform-modules-et-c032if.init create mode 100644 platform/innovium/sonic-platform-modules-delta/debian/platform-modules-et-c032if.install create mode 100755 platform/innovium/sonic-platform-modules-delta/debian/rules create mode 100644 platform/innovium/sonic-platform-modules-delta/et-c032if/cfg/et-c032if-modules.conf create mode 100644 platform/innovium/sonic-platform-modules-delta/et-c032if/modules/Makefile create mode 100644 platform/innovium/sonic-platform-modules-delta/et-c032if/modules/delta_et-c032if_platform.c create mode 100644 platform/innovium/sonic-platform-modules-delta/et-c032if/scripts/et-c032if_platform_init.sh create mode 100644 platform/innovium/sonic-platform-modules-delta/systemd/platform-modules-et-c032if.service diff --git a/build_debian.sh b/build_debian.sh index 9ff6fa019dfb..42d6a18fbffd 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -270,7 +270,9 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in tcptraceroute \ mtr-tiny \ locales \ - cgroup-tools + cgroup-tools \ + ipmitool + if [[ $CONFIGURED_ARCH == amd64 ]]; then ## Pre-install the fundamental packages for amd64 (x86) diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers.json.j2 new file mode 100644 index 000000000000..45cebf3b7144 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 64 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/config_64x100G_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/config_64x100G_midstone200i.yaml new file mode 100755 index 000000000000..0b7e1a2db9d6 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/config_64x100G_midstone200i.yaml @@ -0,0 +1,639 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "128" + type: "cpu" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "2" + lanes: "4:4" + serdes_group: "31" + speed: "100G" + sysport: "2" + type: "eth" + - fec: "KRFEC" + id: "3" + lanes: "4:4" + serdes_group: "30" + speed: "100G" + sysport: "3" + type: "eth" + - fec: "KRFEC" + id: "4" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "4" + type: "eth" + - fec: "KRFEC" + id: "5" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "5" + type: "eth" + - fec: "KRFEC" + id: "6" + lanes: "4:4" + serdes_group: "29" + speed: "100G" + sysport: "6" + type: "eth" + - fec: "KRFEC" + id: "7" + lanes: "4:4" + serdes_group: "28" + speed: "100G" + sysport: "7" + type: "eth" + - fec: "KRFEC" + id: "8" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "8" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KRFEC" + id: "10" + lanes: "4:4" + serdes_group: "27" + speed: "100G" + sysport: "10" + type: "eth" + - fec: "KRFEC" + id: "11" + lanes: "4:4" + serdes_group: "26" + speed: "100G" + sysport: "11" + type: "eth" + - fec: "KRFEC" + id: "12" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "12" + type: "eth" + - fec: "KRFEC" + id: "13" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "13" + type: "eth" + - fec: "KRFEC" + id: "14" + lanes: "4:4" + serdes_group: "25" + speed: "100G" + sysport: "14" + type: "eth" + - fec: "KRFEC" + id: "15" + lanes: "4:4" + serdes_group: "24" + speed: "100G" + sysport: "15" + type: "eth" + - fec: "KRFEC" + id: "16" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "16" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "18" + lanes: "4:4" + serdes_group: "23" + speed: "100G" + sysport: "18" + type: "eth" + - fec: "KRFEC" + id: "19" + lanes: "4:4" + serdes_group: "22" + speed: "100G" + sysport: "19" + type: "eth" + - fec: "KRFEC" + id: "20" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "20" + type: "eth" + - fec: "KRFEC" + id: "21" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "21" + type: "eth" + - fec: "KRFEC" + id: "22" + lanes: "4:4" + serdes_group: "21" + speed: "100G" + sysport: "22" + type: "eth" + - fec: "KRFEC" + id: "23" + lanes: "4:4" + serdes_group: "20" + speed: "100G" + sysport: "23" + type: "eth" + - fec: "KRFEC" + id: "24" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "24" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "26" + lanes: "4:4" + serdes_group: "19" + speed: "100G" + sysport: "26" + type: "eth" + - fec: "KRFEC" + id: "27" + lanes: "4:4" + serdes_group: "18" + speed: "100G" + sysport: "27" + type: "eth" + - fec: "KRFEC" + id: "28" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "28" + type: "eth" + - fec: "KRFEC" + id: "29" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "29" + type: "eth" + - fec: "KRFEC" + id: "30" + lanes: "4:4" + serdes_group: "17" + speed: "100G" + sysport: "30" + type: "eth" + - fec: "KRFEC" + id: "31" + lanes: "4:4" + serdes_group: "16" + speed: "100G" + sysport: "31" + type: "eth" + - fec: "KRFEC" + id: "32" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "32" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "34" + lanes: "4:4" + serdes_group: "15" + speed: "100G" + sysport: "34" + type: "eth" + - fec: "KRFEC" + id: "35" + lanes: "4:4" + serdes_group: "14" + speed: "100G" + sysport: "35" + type: "eth" + - fec: "KRFEC" + id: "36" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "36" + type: "eth" + - fec: "KRFEC" + id: "37" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "37" + type: "eth" + - fec: "KRFEC" + id: "38" + lanes: "4:4" + serdes_group: "13" + speed: "100G" + sysport: "38" + type: "eth" + - fec: "KRFEC" + id: "39" + lanes: "4:4" + serdes_group: "12" + speed: "100G" + sysport: "39" + type: "eth" + - fec: "KRFEC" + id: "40" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "40" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "42" + lanes: "4:4" + serdes_group: "11" + speed: "100G" + sysport: "42" + type: "eth" + - fec: "KRFEC" + id: "43" + lanes: "4:4" + serdes_group: "10" + speed: "100G" + sysport: "43" + type: "eth" + - fec: "KRFEC" + id: "44" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "44" + type: "eth" + - fec: "KRFEC" + id: "45" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "45" + type: "eth" + - fec: "KRFEC" + id: "46" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "46" + type: "eth" + - fec: "KRFEC" + id: "47" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "47" + type: "eth" + - fec: "KRFEC" + id: "48" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "48" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "50" + lanes: "4:4" + serdes_group: "7" + speed: "100G" + sysport: "50" + type: "eth" + - fec: "KRFEC" + id: "51" + lanes: "4:4" + serdes_group: "6" + speed: "100G" + sysport: "51" + type: "eth" + - fec: "KRFEC" + id: "52" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "52" + type: "eth" + - fec: "KRFEC" + id: "53" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "53" + type: "eth" + - fec: "KRFEC" + id: "54" + lanes: "4:4" + serdes_group: "5" + speed: "100G" + sysport: "54" + type: "eth" + - fec: "KRFEC" + id: "55" + lanes: "4:4" + serdes_group: "4" + speed: "100G" + sysport: "55" + type: "eth" + - fec: "KRFEC" + id: "56" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "56" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "58" + lanes: "4:4" + serdes_group: "3" + speed: "100G" + sysport: "58" + type: "eth" + - fec: "KRFEC" + id: "59" + lanes: "4:4" + serdes_group: "2" + speed: "100G" + sysport: "59" + type: "eth" + - fec: "KRFEC" + id: "60" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "60" + type: "eth" + - fec: "KRFEC" + id: "61" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "61" + type: "eth" + - fec: "KRFEC" + id: "62" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "62" + type: "eth" + - fec: "KRFEC" + id: "63" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "63" + type: "eth" + - fec: "KRFEC" + id: "64" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "64" + type: "eth" + isg: + - id: "0" + tx_polarity: "00101001" + rx_polarity: "01110001" + lane_swap: "01234567" + - id: "1" + tx_polarity: "10111111" + rx_polarity: "11100100" + lane_swap: "01234567" + - id: "2" + tx_polarity: "00100010" + rx_polarity: "00010001" + lane_swap: "01234567" + - id: "3" + tx_polarity: "00101010" + rx_polarity: "11011101" + lane_swap: "01234567" + - id: "4" + tx_polarity: "10111110" + rx_polarity: "10010101" + lane_swap: "01234567" + - id: "5" + tx_polarity: "01101000" + rx_polarity: "10111001" + lane_swap: "01234567" + - id: "6" + tx_polarity: "01110110" + rx_polarity: "01110011" + lane_swap: "01234567" + - id: "7" + tx_polarity: "01001000" + rx_polarity: "10111001" + lane_swap: "01234567" + - id: "8" + tx_polarity: "11000100" + rx_polarity: "01000000" + lane_swap: "01234567" + - id: "9" + tx_polarity: "10001010" + rx_polarity: "10100100" + lane_swap: "01234567" + - id: "10" + tx_polarity: "11000110" + rx_polarity: "00011101" + lane_swap: "01234567" + - id: "11" + tx_polarity: "01000111" + rx_polarity: "00000101" + lane_swap: "01234567" + - id: "12" + tx_polarity: "01111000" + rx_polarity: "11100000" + lane_swap: "01234567" + - id: "13" + tx_polarity: "10011111" + rx_polarity: "00101111" + lane_swap: "01234567" + - id: "14" + tx_polarity: "00101001" + rx_polarity: "00011000" + lane_swap: "01234567" + - id: "15" + tx_polarity: "10110111" + rx_polarity: "00110110" + lane_swap: "01234567" + - id: "16" + tx_polarity: "00101001" + rx_polarity: "00000111" + lane_swap: "01234567" + - id: "17" + tx_polarity: "10100111" + rx_polarity: "10001000" + lane_swap: "01234567" + - id: "18" + tx_polarity: "00011001" + rx_polarity: "11111110" + lane_swap: "01234567" + - id: "19" + tx_polarity: "10010101" + rx_polarity: "10011010" + lane_swap: "01234567" + - id: "20" + tx_polarity: "00101001" + rx_polarity: "01100000" + lane_swap: "01234567" + - id: "21" + tx_polarity: "10010111" + rx_polarity: "01111001" + lane_swap: "01234567" + - id: "22" + tx_polarity: "00101001" + rx_polarity: "11010011" + lane_swap: "01234567" + - id: "23" + tx_polarity: "10110111" + rx_polarity: "01111011" + lane_swap: "01234567" + - id: "24" + tx_polarity: "00101001" + rx_polarity: "11101011" + lane_swap: "01234567" + - id: "25" + tx_polarity: "10110111" + rx_polarity: "11010111" + lane_swap: "01234567" + - id: "26" + tx_polarity: "00100001" + rx_polarity: "00101101" + lane_swap: "01234567" + - id: "27" + tx_polarity: "11000111" + rx_polarity: "11011001" + lane_swap: "01234567" + - id: "28" + tx_polarity: "00100001" + rx_polarity: "01010011" + lane_swap: "01234567" + - id: "29" + tx_polarity: "10110111" + rx_polarity: "01111001" + lane_swap: "01234567" + - id: "30" + tx_polarity: "00101001" + rx_polarity: "00110001" + lane_swap: "01234567" + - id: "31" + tx_polarity: "10110101" + rx_polarity: "01101101" + lane_swap: "01234567" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/inno.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/inno.config.yaml new file mode 100755 index 000000000000..b2a079136abc --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x100G_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/innovium.77700_B b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/port_config.ini new file mode 100755 index 000000000000..c9b30d768d57 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/port_config.ini @@ -0,0 +1,65 @@ +# name lanes speed index mtu +Ethernet0 249,250,251,252 100000 1 9126 +Ethernet4 253,254,255,256 100000 2 9126 +Ethernet8 245,246,247,248 100000 3 9126 +Ethernet12 241,242,243,244 100000 4 9126 +Ethernet16 233,234,235,236 100000 5 9126 +Ethernet20 237,238,239,240 100000 6 9126 +Ethernet24 229,230,231,232 100000 7 9126 +Ethernet28 225,226,227,228 100000 8 9126 +Ethernet32 217,218,219,220 100000 9 9126 +Ethernet36 221,222,223,224 100000 10 9126 +Ethernet40 213,214,215,216 100000 11 9126 +Ethernet44 209,210,211,212 100000 12 9126 +Ethernet48 201,202,203,204 100000 13 9126 +Ethernet52 205,206,207,208 100000 14 9126 +Ethernet56 197,198,199,200 100000 15 9126 +Ethernet60 193,194,195,196 100000 16 9126 +Ethernet64 185,186,187,188 100000 17 9126 +Ethernet68 189,190,191,192 100000 18 9126 +Ethernet72 181,182,183,184 100000 19 9126 +Ethernet76 177,178,179,180 100000 20 9126 +Ethernet80 169,170,171,172 100000 21 9126 +Ethernet84 173,174,175,176 100000 22 9126 +Ethernet88 165,166,167,168 100000 23 9126 +Ethernet92 161,162,163,164 100000 24 9126 +Ethernet96 153,154,155,156 100000 25 9126 +Ethernet100 157,158,159,160 100000 26 9126 +Ethernet104 149,150,151,152 100000 27 9126 +Ethernet108 145,146,147,148 100000 28 9126 +Ethernet112 137,138,139,140 100000 29 9126 +Ethernet116 141,142,143,144 100000 30 9126 +Ethernet120 133,134,135,136 100000 31 9126 +Ethernet124 129,130,131,132 100000 32 9126 +Ethernet128 121,122,123,124 100000 33 9126 +Ethernet132 125,126,127,128 100000 34 9126 +Ethernet136 117,118,119,120 100000 35 9126 +Ethernet140 113,114,115,116 100000 36 9126 +Ethernet144 105,106,107,108 100000 37 9126 +Ethernet148 109,110,111,112 100000 38 9126 +Ethernet152 101,102,103,104 100000 39 9126 +Ethernet156 97,98,99,100 100000 40 9126 +Ethernet160 89,90,91,92 100000 41 9126 +Ethernet164 93,94,95,96 100000 42 9126 +Ethernet168 85,86,87,88 100000 43 9126 +Ethernet172 81,82,83,84 100000 44 9126 +Ethernet176 73,74,75,76 100000 45 9126 +Ethernet180 77,78,79,80 100000 46 9126 +Ethernet184 69,70,71,72 100000 47 9126 +Ethernet188 65,66,67,68 100000 48 9126 +Ethernet192 57,58,59,60 100000 49 9126 +Ethernet196 61,62,63,64 100000 50 9126 +Ethernet200 53,54,55,56 100000 51 9126 +Ethernet204 49,50,51,52 100000 52 9126 +Ethernet208 41,42,43,44 100000 53 9126 +Ethernet212 45,46,47,48 100000 54 9126 +Ethernet216 37,38,39,40 100000 55 9126 +Ethernet220 33,34,35,36 100000 56 9126 +Ethernet224 25,26,27,28 100000 57 9126 +Ethernet228 29,30,31,32 100000 58 9126 +Ethernet232 21,22,23,24 100000 59 9126 +Ethernet236 17,18,19,20 100000 60 9126 +Ethernet240 9,10,11,12 100000 61 9126 +Ethernet244 13,14,15,16 100000 62 9126 +Ethernet248 5,6,7,8 100000 63 9126 +Ethernet252 1,2,3,4 100000 64 9126 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos.json.j2 new file mode 100755 index 000000000000..16f9b42a2166 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 64 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers.json.j2 new file mode 100644 index 000000000000..9529fbf52fb5 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 128 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*2)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/config_128x100G_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/config_128x100G_midstone200i.yaml new file mode 100644 index 000000000000..342d223a96e1 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/config_128x100G_midstone200i.yaml @@ -0,0 +1,1100 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:2" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "251" + lanes: "2:2" + serdes_group: "31" + speed: "100G" + sysport: "251" + type: "eth" + - fec: "KPFEC" + id: "253" + lanes: "4:2" + serdes_group: "31" + speed: "100G" + sysport: "253" + type: "eth" + - fec: "KPFEC" + id: "255" + lanes: "6:2" + serdes_group: "31" + speed: "100G" + sysport: "255" + type: "eth" + - fec: "KPFEC" + id: "245" + lanes: "4:2" + serdes_group: "30" + speed: "100G" + sysport: "245" + type: "eth" + - fec: "KPFEC" + id: "247" + lanes: "6:2" + serdes_group: "30" + speed: "100G" + sysport: "247" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:2" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "243" + lanes: "2:2" + serdes_group: "30" + speed: "100G" + sysport: "243" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:2" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "235" + lanes: "2:2" + serdes_group: "29" + speed: "100G" + sysport: "235" + type: "eth" + - fec: "KPFEC" + id: "237" + lanes: "4:2" + serdes_group: "29" + speed: "100G" + sysport: "237" + type: "eth" + - fec: "KPFEC" + id: "239" + lanes: "6:2" + serdes_group: "29" + speed: "100G" + sysport: "239" + type: "eth" + - fec: "KPFEC" + id: "229" + lanes: "4:2" + serdes_group: "28" + speed: "100G" + sysport: "229" + type: "eth" + - fec: "KPFEC" + id: "231" + lanes: "6:2" + serdes_group: "28" + speed: "100G" + sysport: "231" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:2" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "227" + lanes: "2:2" + serdes_group: "28" + speed: "100G" + sysport: "227" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:2" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "219" + lanes: "2:2" + serdes_group: "27" + speed: "100G" + sysport: "219" + type: "eth" + - fec: "KPFEC" + id: "221" + lanes: "4:2" + serdes_group: "27" + speed: "100G" + sysport: "221" + type: "eth" + - fec: "KPFEC" + id: "223" + lanes: "6:2" + serdes_group: "27" + speed: "100G" + sysport: "223" + type: "eth" + - fec: "KPFEC" + id: "213" + lanes: "4:2" + serdes_group: "26" + speed: "100G" + sysport: "213" + type: "eth" + - fec: "KPFEC" + id: "215" + lanes: "6:2" + serdes_group: "26" + speed: "100G" + sysport: "215" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:2" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "211" + lanes: "2:2" + serdes_group: "26" + speed: "100G" + sysport: "211" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:2" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "203" + lanes: "2:2" + serdes_group: "25" + speed: "100G" + sysport: "203" + type: "eth" + - fec: "KPFEC" + id: "205" + lanes: "4:2" + serdes_group: "25" + speed: "100G" + sysport: "205" + type: "eth" + - fec: "KPFEC" + id: "207" + lanes: "6:2" + serdes_group: "25" + speed: "100G" + sysport: "207" + type: "eth" + - fec: "KPFEC" + id: "197" + lanes: "4:2" + serdes_group: "24" + speed: "100G" + sysport: "197" + type: "eth" + - fec: "KPFEC" + id: "199" + lanes: "6:2" + serdes_group: "24" + speed: "100G" + sysport: "199" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:2" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "195" + lanes: "2:2" + serdes_group: "24" + speed: "100G" + sysport: "195" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:2" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "187" + lanes: "2:2" + serdes_group: "23" + speed: "100G" + sysport: "187" + type: "eth" + - fec: "KPFEC" + id: "189" + lanes: "4:2" + serdes_group: "23" + speed: "100G" + sysport: "189" + type: "eth" + - fec: "KPFEC" + id: "191" + lanes: "6:2" + serdes_group: "23" + speed: "100G" + sysport: "191" + type: "eth" + - fec: "KPFEC" + id: "181" + lanes: "4:2" + serdes_group: "22" + speed: "100G" + sysport: "181" + type: "eth" + - fec: "KPFEC" + id: "183" + lanes: "6:2" + serdes_group: "22" + speed: "100G" + sysport: "183" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:2" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "179" + lanes: "2:2" + serdes_group: "22" + speed: "100G" + sysport: "179" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:2" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "171" + lanes: "2:2" + serdes_group: "21" + speed: "100G" + sysport: "171" + type: "eth" + - fec: "KPFEC" + id: "173" + lanes: "4:2" + serdes_group: "21" + speed: "100G" + sysport: "173" + type: "eth" + - fec: "KPFEC" + id: "175" + lanes: "6:2" + serdes_group: "21" + speed: "100G" + sysport: "175" + type: "eth" + - fec: "KPFEC" + id: "165" + lanes: "4:2" + serdes_group: "20" + speed: "100G" + sysport: "165" + type: "eth" + - fec: "KPFEC" + id: "167" + lanes: "6:2" + serdes_group: "20" + speed: "100G" + sysport: "167" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:2" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "163" + lanes: "2:2" + serdes_group: "20" + speed: "100G" + sysport: "163" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:2" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "155" + lanes: "2:2" + serdes_group: "19" + speed: "100G" + sysport: "155" + type: "eth" + - fec: "KPFEC" + id: "157" + lanes: "4:2" + serdes_group: "19" + speed: "100G" + sysport: "157" + type: "eth" + - fec: "KPFEC" + id: "159" + lanes: "6:2" + serdes_group: "19" + speed: "100G" + sysport: "159" + type: "eth" + - fec: "KPFEC" + id: "149" + lanes: "4:2" + serdes_group: "18" + speed: "100G" + sysport: "149" + type: "eth" + - fec: "KPFEC" + id: "151" + lanes: "6:2" + serdes_group: "18" + speed: "100G" + sysport: "151" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:2" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "147" + lanes: "2:2" + serdes_group: "18" + speed: "100G" + sysport: "147" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:2" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "139" + lanes: "2:2" + serdes_group: "17" + speed: "100G" + sysport: "139" + type: "eth" + - fec: "KPFEC" + id: "141" + lanes: "4:2" + serdes_group: "17" + speed: "100G" + sysport: "141" + type: "eth" + - fec: "KPFEC" + id: "143" + lanes: "6:2" + serdes_group: "17" + speed: "100G" + sysport: "143" + type: "eth" + - fec: "KPFEC" + id: "133" + lanes: "4:2" + serdes_group: "16" + speed: "100G" + sysport: "133" + type: "eth" + - fec: "KPFEC" + id: "135" + lanes: "6:2" + serdes_group: "16" + speed: "100G" + sysport: "135" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:2" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "131" + lanes: "2:2" + serdes_group: "16" + speed: "100G" + sysport: "131" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:2" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "123" + lanes: "2:2" + serdes_group: "15" + speed: "100G" + sysport: "123" + type: "eth" + - fec: "KPFEC" + id: "125" + lanes: "4:2" + serdes_group: "15" + speed: "100G" + sysport: "125" + type: "eth" + - fec: "KPFEC" + id: "127" + lanes: "6:2" + serdes_group: "15" + speed: "100G" + sysport: "127" + type: "eth" + - fec: "KPFEC" + id: "117" + lanes: "4:2" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + - fec: "KPFEC" + id: "119" + lanes: "6:2" + serdes_group: "14" + speed: "100G" + sysport: "119" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:2" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "115" + lanes: "2:2" + serdes_group: "14" + speed: "100G" + sysport: "115" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:2" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "107" + lanes: "2:2" + serdes_group: "13" + speed: "100G" + sysport: "107" + type: "eth" + - fec: "KPFEC" + id: "109" + lanes: "4:2" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + - fec: "KPFEC" + id: "111" + lanes: "6:2" + serdes_group: "13" + speed: "100G" + sysport: "111" + type: "eth" + - fec: "KPFEC" + id: "101" + lanes: "4:2" + serdes_group: "12" + speed: "100G" + sysport: "101" + type: "eth" + - fec: "KPFEC" + id: "103" + lanes: "6:2" + serdes_group: "12" + speed: "100G" + sysport: "103" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:2" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "99" + lanes: "2:2" + serdes_group: "12" + speed: "100G" + sysport: "99" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:2" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "91" + lanes: "2:2" + serdes_group: "11" + speed: "100G" + sysport: "91" + type: "eth" + - fec: "KPFEC" + id: "93" + lanes: "4:2" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + - fec: "KPFEC" + id: "95" + lanes: "6:2" + serdes_group: "11" + speed: "100G" + sysport: "95" + type: "eth" + - fec: "KPFEC" + id: "85" + lanes: "4:2" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + - fec: "KPFEC" + id: "87" + lanes: "6:2" + serdes_group: "10" + speed: "100G" + sysport: "87" + type: "eth" + - fec: "KPFEC" + id: "87" + lanes: "0:2" + serdes_group: "10" + speed: "100G" + sysport: "87" + type: "eth" + - fec: "KPFEC" + id: "83" + lanes: "2:2" + serdes_group: "10" + speed: "100G" + sysport: "83" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:2" + serdes_group: "9" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "75" + lanes: "2:2" + serdes_group: "9" + speed: "100G" + sysport: "75" + type: "eth" + - fec: "KPFEC" + id: "91" + lanes: "4:2" + serdes_group: "9" + speed: "100G" + sysport: "91" + type: "eth" + - fec: "KPFEC" + id: "79" + lanes: "6:2" + serdes_group: "9" + speed: "100G" + sysport: "79" + type: "eth" + - fec: "KPFEC" + id: "93" + lanes: "4:2" + serdes_group: "8" + speed: "100G" + sysport: "93" + type: "eth" + - fec: "KPFEC" + id: "71" + lanes: "6:2" + serdes_group: "8" + speed: "100G" + sysport: "71" + type: "eth" + - fec: "KPFEC" + id: "95" + lanes: "0:2" + serdes_group: "8" + speed: "100G" + sysport: "95" + type: "eth" + - fec: "KPFEC" + id: "67" + lanes: "2:2" + serdes_group: "8" + speed: "100G" + sysport: "67" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:2" + serdes_group: "7" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "59" + lanes: "2:2" + serdes_group: "7" + speed: "100G" + sysport: "59" + type: "eth" + - fec: "KPFEC" + id: "99" + lanes: "4:2" + serdes_group: "7" + speed: "100G" + sysport: "99" + type: "eth" + - fec: "KPFEC" + id: "63" + lanes: "6:2" + serdes_group: "7" + speed: "100G" + sysport: "63" + type: "eth" + - fec: "KPFEC" + id: "101" + lanes: "4:2" + serdes_group: "6" + speed: "100G" + sysport: "101" + type: "eth" + - fec: "KPFEC" + id: "55" + lanes: "6:2" + serdes_group: "6" + speed: "100G" + sysport: "55" + type: "eth" + - fec: "KPFEC" + id: "103" + lanes: "0:2" + serdes_group: "6" + speed: "100G" + sysport: "103" + type: "eth" + - fec: "KPFEC" + id: "51" + lanes: "2:2" + serdes_group: "6" + speed: "100G" + sysport: "51" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:2" + serdes_group: "5" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "43" + lanes: "2:2" + serdes_group: "5" + speed: "100G" + sysport: "43" + type: "eth" + - fec: "KPFEC" + id: "107" + lanes: "4:2" + serdes_group: "5" + speed: "100G" + sysport: "107" + type: "eth" + - fec: "KPFEC" + id: "47" + lanes: "6:2" + serdes_group: "5" + speed: "100G" + sysport: "47" + type: "eth" + - fec: "KPFEC" + id: "109" + lanes: "4:2" + serdes_group: "4" + speed: "100G" + sysport: "109" + type: "eth" + - fec: "KPFEC" + id: "39" + lanes: "6:2" + serdes_group: "4" + speed: "100G" + sysport: "39" + type: "eth" + - fec: "KPFEC" + id: "111" + lanes: "0:2" + serdes_group: "4" + speed: "100G" + sysport: "111" + type: "eth" + - fec: "KPFEC" + id: "35" + lanes: "2:2" + serdes_group: "4" + speed: "100G" + sysport: "35" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:2" + serdes_group: "3" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "27" + lanes: "2:2" + serdes_group: "3" + speed: "100G" + sysport: "27" + type: "eth" + - fec: "KPFEC" + id: "115" + lanes: "4:2" + serdes_group: "3" + speed: "100G" + sysport: "115" + type: "eth" + - fec: "KPFEC" + id: "31" + lanes: "6:2" + serdes_group: "3" + speed: "100G" + sysport: "31" + type: "eth" + - fec: "KPFEC" + id: "117" + lanes: "4:2" + serdes_group: "2" + speed: "100G" + sysport: "117" + type: "eth" + - fec: "KPFEC" + id: "23" + lanes: "6:2" + serdes_group: "2" + speed: "100G" + sysport: "23" + type: "eth" + - fec: "KPFEC" + id: "119" + lanes: "0:2" + serdes_group: "2" + speed: "100G" + sysport: "119" + type: "eth" + - fec: "KPFEC" + id: "19" + lanes: "2:2" + serdes_group: "2" + speed: "100G" + sysport: "19" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:2" + serdes_group: "1" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "11" + lanes: "2:2" + serdes_group: "1" + speed: "100G" + sysport: "11" + type: "eth" + - fec: "KPFEC" + id: "123" + lanes: "4:2" + serdes_group: "1" + speed: "100G" + sysport: "123" + type: "eth" + - fec: "KPFEC" + id: "15" + lanes: "6:2" + serdes_group: "1" + speed: "100G" + sysport: "15" + type: "eth" + - fec: "KPFEC" + id: "125" + lanes: "4:2" + serdes_group: "0" + speed: "100G" + sysport: "125" + type: "eth" + - fec: "KPFEC" + id: "7" + lanes: "6:2" + serdes_group: "0" + speed: "100G" + sysport: "7" + type: "eth" + - fec: "KPFEC" + id: "127" + lanes: "0:2" + serdes_group: "0" + speed: "100G" + sysport: "127" + type: "eth" + - fec: "KPFEC" + id: "3" + lanes: "2:2" + serdes_group: "0" + speed: "100G" + sysport: "3" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + lane_swap: "01234567" + rx_polarity: "01110001" + tx_polarity: "00101001" + - id: "1" + lane_swap: "01234567" + rx_polarity: "11100100" + tx_polarity: "10111111" + - id: "2" + lane_swap: "01234567" + rx_polarity: "00010001" + tx_polarity: "00100010" + - id: "3" + lane_swap: "01234567" + rx_polarity: "11011101" + tx_polarity: "00101010" + - id: "4" + lane_swap: "01234567" + rx_polarity: "10010101" + tx_polarity: "10111110" + - id: "5" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01101000" + - id: "6" + lane_swap: "01234567" + rx_polarity: "01110011" + tx_polarity: "01110110" + - id: "7" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01001000" + - id: "8" + lane_swap: "01234567" + rx_polarity: "01000000" + tx_polarity: "11000100" + - id: "9" + lane_swap: "01234567" + rx_polarity: "10100100" + tx_polarity: "10001010" + - id: "10" + lane_swap: "01234567" + rx_polarity: "00011101" + tx_polarity: "11000110" + - id: "11" + lane_swap: "01234567" + rx_polarity: "00000101" + tx_polarity: "01000111" + - id: "12" + lane_swap: "01234567" + rx_polarity: "11100000" + tx_polarity: "01111000" + - id: "13" + lane_swap: "01234567" + rx_polarity: "00101111" + tx_polarity: "10011111" + - id: "14" + lane_swap: "01234567" + rx_polarity: "00011000" + tx_polarity: "00101001" + - id: "15" + lane_swap: "01234567" + rx_polarity: "00110110" + tx_polarity: "10110111" + - id: "16" + lane_swap: "01234567" + rx_polarity: "00000111" + tx_polarity: "00101001" + - id: "17" + lane_swap: "01234567" + rx_polarity: "10001000" + tx_polarity: "10100111" + - id: "18" + lane_swap: "01234567" + rx_polarity: "11111110" + tx_polarity: "00011001" + - id: "19" + lane_swap: "01234567" + rx_polarity: "10011010" + tx_polarity: "10010101" + - id: "20" + lane_swap: "01234567" + rx_polarity: "01100000" + tx_polarity: "00101001" + - id: "21" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10010111" + - id: "22" + lane_swap: "01234567" + rx_polarity: "11010011" + tx_polarity: "00101001" + - id: "23" + lane_swap: "01234567" + rx_polarity: "01111011" + tx_polarity: "10110111" + - id: "24" + lane_swap: "01234567" + rx_polarity: "11101011" + tx_polarity: "00101001" + - id: "25" + lane_swap: "01234567" + rx_polarity: "11010111" + tx_polarity: "10110111" + - id: "26" + lane_swap: "01234567" + rx_polarity: "00101101" + tx_polarity: "00100001" + - id: "27" + lane_swap: "01234567" + rx_polarity: "11011001" + tx_polarity: "11000111" + - id: "28" + lane_swap: "01234567" + rx_polarity: "01010011" + tx_polarity: "00100001" + - id: "29" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10110111" + - id: "30" + lane_swap: "01234567" + rx_polarity: "00110001" + tx_polarity: "00101001" + - id: "31" + lane_swap: "01234567" + rx_polarity: "01101101" + tx_polarity: "10110101" + - id: "32" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "00000000" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/inno.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/inno.config.yaml new file mode 100755 index 000000000000..66e43d312efb --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_128x100G_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/innovium.77700_B b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/port_config.ini new file mode 100644 index 000000000000..9366905c4eba --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/port_config.ini @@ -0,0 +1,131 @@ +# name lanes speed index mtu +Ethernet0 249,250 100000 0 9126 +Ethernet2 251,252 100000 0 9126 +Ethernet4 253,254 100000 1 9126 +Ethernet6 255,256 100000 1 9126 +Ethernet8 245,246 100000 2 9126 +Ethernet10 247,248 100000 2 9126 +Ethernet12 241,242 100000 3 9126 +Ethernet14 243,244 100000 3 9126 +Ethernet16 233,234 100000 4 9126 +Ethernet18 235,236 100000 4 9126 +Ethernet20 237,238 100000 5 9126 +Ethernet22 239,240 100000 5 9126 +Ethernet24 229,230 100000 6 9126 +Ethernet26 231,232 100000 6 9126 +Ethernet28 225,226 100000 7 9126 +Ethernet30 227,228 100000 7 9126 +Ethernet32 217,218 100000 8 9126 +Ethernet34 219,220 100000 8 9126 +Ethernet36 221,222 100000 9 9126 +Ethernet38 223,224 100000 9 9126 +Ethernet40 213,214 100000 10 9126 +Ethernet42 215,216 100000 10 9126 +Ethernet44 209,210 100000 11 9126 +Ethernet46 211,212 100000 11 9126 +Ethernet48 201,202 100000 12 9126 +Ethernet50 203,204 100000 12 9126 +Ethernet52 205,206 100000 13 9126 +Ethernet54 207,208 100000 13 9126 +Ethernet56 197,198 100000 14 9126 +Ethernet58 199,200 100000 14 9126 +Ethernet60 193,194 100000 15 9126 +Ethernet62 195,196 100000 15 9126 +Ethernet64 185,186 100000 16 9126 +Ethernet66 187,188 100000 16 9126 +Ethernet68 189,190 100000 17 9126 +Ethernet70 191,192 100000 17 9126 +Ethernet72 181,182 100000 18 9126 +Ethernet74 183,184 100000 18 9126 +Ethernet76 177,178 100000 19 9126 +Ethernet78 179,180 100000 19 9126 +Ethernet80 169,170 100000 20 9126 +Ethernet82 171,172 100000 20 9126 +Ethernet84 173,174 100000 21 9126 +Ethernet86 175,176 100000 21 9126 +Ethernet88 165,166 100000 22 9126 +Ethernet90 167,168 100000 22 9126 +Ethernet92 161,162 100000 23 9126 +Ethernet94 163,164 100000 23 9126 +Ethernet96 153,154 100000 24 9126 +Ethernet98 155,156 100000 24 9126 +Ethernet100 157,158 100000 25 9126 +Ethernet102 159,160 100000 25 9126 +Ethernet104 149,150 100000 26 9126 +Ethernet106 151,152 100000 26 9126 +Ethernet108 145,146 100000 27 9126 +Ethernet110 147,148 100000 27 9126 +Ethernet112 137,138 100000 28 9126 +Ethernet114 139,140 100000 28 9126 +Ethernet116 141,142 100000 29 9126 +Ethernet118 143,144 100000 29 9126 +Ethernet120 133,134 100000 30 9126 +Ethernet122 135,136 100000 30 9126 +Ethernet124 129,130 100000 31 9126 +Ethernet126 131,132 100000 31 9126 +Ethernet128 121,122 100000 32 9126 +Ethernet130 123,124 100000 32 9126 +Ethernet132 125,126 100000 33 9126 +Ethernet134 127,128 100000 33 9126 +Ethernet136 117,118 100000 34 9126 +Ethernet138 119,120 100000 34 9126 +Ethernet140 113,114 100000 35 9126 +Ethernet142 115,116 100000 35 9126 +Ethernet144 105,106 100000 36 9126 +Ethernet146 107,108 100000 36 9126 +Ethernet148 109,110 100000 37 9126 +Ethernet150 111,112 100000 37 9126 +Ethernet152 101,102 100000 38 9126 +Ethernet154 103,104 100000 38 9126 +Ethernet156 97,98 100000 39 9126 +Ethernet158 99,100 100000 39 9126 +Ethernet160 89,90 100000 40 9126 +Ethernet162 91,92 100000 40 9126 +Ethernet164 93,94 100000 41 9126 +Ethernet166 95,96 100000 41 9126 +Ethernet168 85,86 100000 42 9126 +Ethernet170 87,88 100000 42 9126 +Ethernet172 81,82 100000 43 9126 +Ethernet174 83,84 100000 43 9126 +Ethernet176 73,74 100000 44 9126 +Ethernet178 75,76 100000 44 9126 +Ethernet180 77,78 100000 45 9126 +Ethernet182 79,80 100000 45 9126 +Ethernet184 69,70 100000 46 9126 +Ethernet186 71,72 100000 46 9126 +Ethernet188 65,66 100000 47 9126 +Ethernet190 67,68 100000 47 9126 +Ethernet192 57,58 100000 48 9126 +Ethernet194 59,60 100000 48 9126 +Ethernet196 61,62 100000 49 9126 +Ethernet198 63,64 100000 49 9126 +Ethernet200 53,54 100000 50 9126 +Ethernet202 55,56 100000 50 9126 +Ethernet204 49,50 100000 51 9126 +Ethernet206 51,52 100000 51 9126 +Ethernet208 41,42 100000 52 9126 +Ethernet210 43,44 100000 52 9126 +Ethernet212 45,46 100000 53 9126 +Ethernet214 47,48 100000 53 9126 +Ethernet216 37,38 100000 54 9126 +Ethernet218 39,40 100000 54 9126 +Ethernet220 33,34 100000 55 9126 +Ethernet222 35,36 100000 55 9126 +Ethernet224 25,26 100000 56 9126 +Ethernet226 27,28 100000 56 9126 +Ethernet228 29,30 100000 57 9126 +Ethernet230 31,32 100000 57 9126 +Ethernet232 21,22 100000 58 9126 +Ethernet234 23,24 100000 58 9126 +Ethernet236 17,18 100000 59 9126 +Ethernet238 19,20 100000 59 9126 +Ethernet240 9,10 100000 60 9126 +Ethernet242 11,12 100000 60 9126 +Ethernet244 13,14 100000 61 9126 +Ethernet246 15,16 100000 61 9126 +Ethernet248 5,6 100000 62 9126 +Ethernet250 7,8 100000 62 9126 +Ethernet252 1,2 100000 63 9126 +Ethernet254 3,4 100000 63 9126 +Ethernet256 257 10000 64 9126 +Ethernet257 258 10000 65 9126 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos.json.j2 new file mode 100755 index 000000000000..733bd51dc86f --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 128 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*2)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_128x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers.json.j2 new file mode 100644 index 000000000000..4fca9cbcd156 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 32 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/config_32x400G_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/config_32x400G_midstone200i.yaml new file mode 100644 index 000000000000..6c387ee17c23 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/config_32x400G_midstone200i.yaml @@ -0,0 +1,429 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "257" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + lane_swap: "01234567" + rx_polarity: "01110001" + tx_polarity: "00101001" + - id: "1" + lane_swap: "01234567" + rx_polarity: "11100100" + tx_polarity: "10111111" + - id: "2" + lane_swap: "01234567" + rx_polarity: "00010001" + tx_polarity: "00100010" + - id: "3" + lane_swap: "01234567" + rx_polarity: "11011101" + tx_polarity: "00101010" + - id: "4" + lane_swap: "01234567" + rx_polarity: "10010101" + tx_polarity: "10111110" + - id: "5" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01101000" + - id: "6" + lane_swap: "01234567" + rx_polarity: "01110011" + tx_polarity: "01110110" + - id: "7" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01001000" + - id: "8" + lane_swap: "01234567" + rx_polarity: "01000000" + tx_polarity: "11000100" + - id: "9" + lane_swap: "01234567" + rx_polarity: "10100100" + tx_polarity: "10001010" + - id: "10" + lane_swap: "01234567" + rx_polarity: "00011101" + tx_polarity: "11000110" + - id: "11" + lane_swap: "01234567" + rx_polarity: "00000101" + tx_polarity: "01000111" + - id: "12" + lane_swap: "01234567" + rx_polarity: "11100000" + tx_polarity: "01111000" + - id: "13" + lane_swap: "01234567" + rx_polarity: "00101111" + tx_polarity: "10011111" + - id: "14" + lane_swap: "01234567" + rx_polarity: "00011000" + tx_polarity: "00101001" + - id: "15" + lane_swap: "01234567" + rx_polarity: "00110110" + tx_polarity: "10110111" + - id: "16" + lane_swap: "01234567" + rx_polarity: "00000111" + tx_polarity: "00101001" + - id: "17" + lane_swap: "01234567" + rx_polarity: "10001000" + tx_polarity: "10100111" + - id: "18" + lane_swap: "01234567" + rx_polarity: "11111110" + tx_polarity: "00011001" + - id: "19" + lane_swap: "01234567" + rx_polarity: "10011010" + tx_polarity: "10010101" + - id: "20" + lane_swap: "01234567" + rx_polarity: "01100000" + tx_polarity: "00101001" + - id: "21" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10010111" + - id: "22" + lane_swap: "01234567" + rx_polarity: "11010011" + tx_polarity: "00101001" + - id: "23" + lane_swap: "01234567" + rx_polarity: "01111011" + tx_polarity: "10110111" + - id: "24" + lane_swap: "01234567" + rx_polarity: "11101011" + tx_polarity: "00101001" + - id: "25" + lane_swap: "01234567" + rx_polarity: "11010111" + tx_polarity: "10110111" + - id: "26" + lane_swap: "01234567" + rx_polarity: "00101101" + tx_polarity: "00100001" + - id: "27" + lane_swap: "01234567" + rx_polarity: "11011001" + tx_polarity: "11000111" + - id: "28" + lane_swap: "01234567" + rx_polarity: "01010011" + tx_polarity: "00100001" + - id: "29" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10110111" + - id: "30" + lane_swap: "01234567" + rx_polarity: "00110001" + tx_polarity: "00101001" + - id: "31" + lane_swap: "01234567" + rx_polarity: "01101101" + tx_polarity: "10110101" + - id: "32" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "00000000" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/inno.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/inno.config.yaml new file mode 100755 index 000000000000..bf1c8f41009f --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/innovium.77700_A b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/port_config.ini new file mode 100644 index 000000000000..c8ded273cca8 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/port_config.ini @@ -0,0 +1,35 @@ +# name lanes speed index mtu fec +Ethernet0 249,250,251,252 400000 0 9126 rs +Ethernet8 241,242,243,244 400000 2 9126 rs +Ethernet16 233,234,235,236 400000 4 9126 rs +Ethernet24 225,226,227,228 400000 6 9126 rs +Ethernet32 217,218,219,220 400000 8 9126 rs +Ethernet40 209,210,211,212 400000 10 9126 rs +Ethernet48 201,202,203,204 400000 12 9126 rs +Ethernet56 193,194,195,196 400000 14 9126 rs +Ethernet64 185,186,187,188 400000 16 9126 rs +Ethernet72 177,178,179,180 400000 18 9126 rs +Ethernet80 169,170,171,172 400000 20 9126 rs +Ethernet88 161,162,163,164 400000 22 9126 rs +Ethernet96 153,154,155,156 400000 24 9126 rs +Ethernet104 145,146,147,148 400000 26 9126 rs +Ethernet112 137,138,139,140 400000 28 9126 rs +Ethernet120 129,130,131,132 400000 30 9126 rs +Ethernet128 121,122,123,124 400000 32 9126 rs +Ethernet136 113,114,115,116 400000 34 9126 rs +Ethernet144 105,106,107,108 400000 36 9126 rs +Ethernet152 97,98,99,100 400000 38 9126 rs +Ethernet160 89,90,91,92 400000 40 9126 rs +Ethernet168 81,82,83,84 400000 42 9126 rs +Ethernet176 73,74,75,76 400000 44 9126 rs +Ethernet184 65,66,67,68 400000 46 9126 rs +Ethernet192 57,58,59,60 400000 48 9126 rs +Ethernet200 49,50,51,52 400000 50 9126 rs +Ethernet208 41,42,43,44 400000 52 9126 rs +Ethernet216 33,34,35,36 400000 54 9126 rs +Ethernet224 25,26,27,28 400000 56 9126 rs +Ethernet232 17,18,19,20 400000 58 9126 rs +Ethernet240 9,10,11,12 400000 60 9126 rs +Ethernet248 1,2,3,4 400000 62 9126 rs +Ethernet256 257 10000 64 9126 none +Ethernet257 258 10000 65 9126 none diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos.json.j2 new file mode 100755 index 000000000000..6c734d46ff2f --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 32 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_32x400/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers.json.j2 new file mode 100644 index 000000000000..45cebf3b7144 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 64 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/config_64x100G_nrz_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/config_64x100G_nrz_midstone200i.yaml new file mode 100644 index 000000000000..813d012ca3d5 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/config_64x100G_nrz_midstone200i.yaml @@ -0,0 +1,785 @@ +ifcs: + options: + log_level: "off" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "253" + lanes: "4:4" + serdes_group: "31" + speed: "100G" + sysport: "253" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "245" + lanes: "4:4" + serdes_group: "30" + speed: "100G" + sysport: "245" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "237" + lanes: "4:4" + serdes_group: "29" + speed: "100G" + sysport: "237" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "229" + lanes: "4:4" + serdes_group: "28" + speed: "100G" + sysport: "229" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "221" + lanes: "4:4" + serdes_group: "27" + speed: "100G" + sysport: "221" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "213" + lanes: "4:4" + serdes_group: "26" + speed: "100G" + sysport: "213" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "205" + lanes: "4:4" + serdes_group: "25" + speed: "100G" + sysport: "205" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "197" + lanes: "4:4" + serdes_group: "24" + speed: "100G" + sysport: "197" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "189" + lanes: "4:4" + serdes_group: "23" + speed: "100G" + sysport: "189" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "181" + lanes: "4:4" + serdes_group: "22" + speed: "100G" + sysport: "181" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "173" + lanes: "4:4" + serdes_group: "21" + speed: "100G" + sysport: "173" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "165" + lanes: "4:4" + serdes_group: "20" + speed: "100G" + sysport: "165" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "157" + lanes: "4:4" + serdes_group: "19" + speed: "100G" + sysport: "157" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "149" + lanes: "4:4" + serdes_group: "18" + speed: "100G" + sysport: "149" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "141" + lanes: "4:4" + serdes_group: "17" + speed: "100G" + sysport: "141" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "133" + lanes: "4:4" + serdes_group: "16" + speed: "100G" + sysport: "133" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "125" + lanes: "4:4" + serdes_group: "15" + speed: "100G" + sysport: "125" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "101" + lanes: "4:4" + serdes_group: "12" + speed: "100G" + sysport: "101" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "77" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "77" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "69" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "69" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "61" + lanes: "4:4" + serdes_group: "7" + speed: "100G" + sysport: "61" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "53" + lanes: "4:4" + serdes_group: "6" + speed: "100G" + sysport: "53" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "53" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "53" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "45" + lanes: "4:4" + serdes_group: "5" + speed: "100G" + sysport: "45" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "100G" + sysport: "37" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "57" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "100G" + sysport: "29" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "100G" + sysport: "21" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "61" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "61" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "13" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "13" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + admin_state: "true" + loopback: "none" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + admin_state: "true" + loopback: "none" + isg: + - id: "0" + lane_swap: "01234567" + rx_polarity: "01110001" + tx_polarity: "00101001" + - id: "1" + lane_swap: "01234567" + rx_polarity: "11100100" + tx_polarity: "10111111" + - id: "2" + lane_swap: "01234567" + rx_polarity: "00010001" + tx_polarity: "00100010" + - id: "3" + lane_swap: "01234567" + rx_polarity: "11011101" + tx_polarity: "00101010" + - id: "4" + lane_swap: "01234567" + rx_polarity: "10010101" + tx_polarity: "10111110" + - id: "5" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01101000" + - id: "6" + lane_swap: "01234567" + rx_polarity: "01110011" + tx_polarity: "01110110" + - id: "7" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01001000" + - id: "8" + lane_swap: "01234567" + rx_polarity: "01000000" + tx_polarity: "11000100" + - id: "9" + lane_swap: "01234567" + rx_polarity: "10100100" + tx_polarity: "10001010" + - id: "10" + lane_swap: "01234567" + rx_polarity: "00011101" + tx_polarity: "11000110" + - id: "11" + lane_swap: "01234567" + rx_polarity: "00000101" + tx_polarity: "01000111" + - id: "12" + lane_swap: "01234567" + rx_polarity: "11100000" + tx_polarity: "01111000" + - id: "13" + lane_swap: "01234567" + rx_polarity: "00101111" + tx_polarity: "10011111" + - id: "14" + lane_swap: "01234567" + rx_polarity: "00011000" + tx_polarity: "00101001" + - id: "15" + lane_swap: "01234567" + rx_polarity: "00110110" + tx_polarity: "10110111" + - id: "16" + lane_swap: "01234567" + rx_polarity: "00000111" + tx_polarity: "00101001" + - id: "17" + lane_swap: "01234567" + rx_polarity: "10001000" + tx_polarity: "10100111" + - id: "18" + lane_swap: "01234567" + rx_polarity: "11111110" + tx_polarity: "00011001" + - id: "19" + lane_swap: "01234567" + rx_polarity: "10011010" + tx_polarity: "10010101" + - id: "20" + lane_swap: "01234567" + rx_polarity: "01100000" + tx_polarity: "00101001" + - id: "21" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10010111" + - id: "22" + lane_swap: "01234567" + rx_polarity: "11010011" + tx_polarity: "00101001" + - id: "23" + lane_swap: "01234567" + rx_polarity: "01111011" + tx_polarity: "10110111" + - id: "24" + lane_swap: "01234567" + rx_polarity: "11101011" + tx_polarity: "00101001" + - id: "25" + lane_swap: "01234567" + rx_polarity: "11010111" + tx_polarity: "10110111" + - id: "26" + lane_swap: "01234567" + rx_polarity: "00101101" + tx_polarity: "00100001" + - id: "27" + lane_swap: "01234567" + rx_polarity: "11011001" + tx_polarity: "11000111" + - id: "28" + lane_swap: "01234567" + rx_polarity: "01010011" + tx_polarity: "00100001" + - id: "29" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10110111" + - id: "30" + lane_swap: "01234567" + rx_polarity: "00110001" + tx_polarity: "00101001" + - id: "31" + lane_swap: "01234567" + rx_polarity: "01101101" + tx_polarity: "10110101" + - id: "32" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "00000000" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/inno.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/inno.config.yaml new file mode 100755 index 000000000000..7dea4565d8e6 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x100G_nrz_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/innovium.77700_B b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/port_config.ini new file mode 100644 index 000000000000..cb862ff9b523 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/port_config.ini @@ -0,0 +1,67 @@ +# name lanes speed index mtu +Ethernet0 249,250,251,252 100000 0 9126 +Ethernet4 253,254,255,256 100000 1 9126 +Ethernet8 245,246,247,248 100000 2 9126 +Ethernet12 241,242,243,244 100000 3 9126 +Ethernet16 233,234,235,236 100000 4 9126 +Ethernet20 237,238,239,240 100000 5 9126 +Ethernet24 229,230,231,232 100000 6 9126 +Ethernet28 225,226,227,228 100000 7 9126 +Ethernet32 217,218,219,220 100000 8 9126 +Ethernet36 221,222,223,224 100000 9 9126 +Ethernet40 213,214,215,216 100000 10 9126 +Ethernet44 209,210,211,212 100000 11 9126 +Ethernet48 201,202,203,204 100000 12 9126 +Ethernet52 205,206,207,208 100000 13 9126 +Ethernet56 197,198,199,200 100000 14 9126 +Ethernet60 193,194,195,196 100000 15 9126 +Ethernet64 185,186,187,188 100000 16 9126 +Ethernet68 189,190,191,192 100000 17 9126 +Ethernet72 181,182,183,184 100000 18 9126 +Ethernet76 177,178,179,180 100000 19 9126 +Ethernet80 169,170,171,172 100000 20 9126 +Ethernet84 173,174,175,176 100000 21 9126 +Ethernet88 165,166,167,168 100000 22 9126 +Ethernet92 161,162,163,164 100000 23 9126 +Ethernet96 153,154,155,156 100000 24 9126 +Ethernet100 157,158,159,160 100000 25 9126 +Ethernet104 149,150,151,152 100000 26 9126 +Ethernet108 145,146,147,148 100000 27 9126 +Ethernet112 137,138,139,140 100000 28 9126 +Ethernet116 141,142,143,144 100000 29 9126 +Ethernet120 133,134,135,136 100000 30 9126 +Ethernet124 129,130,131,132 100000 31 9126 +Ethernet128 121,122,123,124 100000 32 9126 +Ethernet132 125,126,127,128 100000 33 9126 +Ethernet136 117,118,119,120 100000 34 9126 +Ethernet140 113,114,115,116 100000 35 9126 +Ethernet144 105,106,107,108 100000 36 9126 +Ethernet148 109,110,111,112 100000 37 9126 +Ethernet152 101,102,103,104 100000 38 9126 +Ethernet156 97,98,99,100 100000 39 9126 +Ethernet160 89,90,91,92 100000 40 9126 +Ethernet164 93,94,95,96 100000 41 9126 +Ethernet168 85,86,87,88 100000 42 9126 +Ethernet172 81,82,83,84 100000 43 9126 +Ethernet176 73,74,75,76 100000 44 9126 +Ethernet180 77,78,79,80 100000 45 9126 +Ethernet184 69,70,71,72 100000 46 9126 +Ethernet188 65,66,67,68 100000 47 9126 +Ethernet192 57,58,59,60 100000 48 9126 +Ethernet196 61,62,63,64 100000 49 9126 +Ethernet200 53,54,55,56 100000 50 9126 +Ethernet204 49,50,51,52 100000 51 9126 +Ethernet208 41,42,43,44 100000 52 9126 +Ethernet212 45,46,47,48 100000 53 9126 +Ethernet216 37,38,39,40 100000 54 9126 +Ethernet220 33,34,35,36 100000 55 9126 +Ethernet224 25,26,27,28 100000 56 9126 +Ethernet228 29,30,31,32 100000 57 9126 +Ethernet232 21,22,23,24 100000 58 9126 +Ethernet236 17,18,19,20 100000 59 9126 +Ethernet240 9,10,11,12 100000 60 9126 +Ethernet244 13,14,15,16 100000 61 9126 +Ethernet248 5,6,7,8 100000 62 9126 +Ethernet252 1,2,3,4 100000 63 9126 +Ethernet256 257 10000 64 9126 +Ethernet257 258 10000 65 9126 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos.json.j2 new file mode 100755 index 000000000000..16f9b42a2166 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 64 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/buffers.json.j2 new file mode 100644 index 000000000000..0285e389fd63 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/buffers.json.j2 @@ -0,0 +1,121 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_speed = '100G' %} +{% set default_ports_num = 32 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/config_64x100G_nrz_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/config_64x100G_nrz_midstone200i.yaml new file mode 100644 index 000000000000..8fb6a114a46c --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/config_64x100G_nrz_midstone200i.yaml @@ -0,0 +1,767 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "bootstrap_lossless" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "65" + type: "cpu" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "1" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "2" + lanes: "4:4" + serdes_group: "31" + speed: "100G" + sysport: "2" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "3" + lanes: "4:4" + serdes_group: "30" + speed: "100G" + sysport: "3" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "4" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "4" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "5" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "5" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "6" + lanes: "4:4" + serdes_group: "29" + speed: "100G" + sysport: "6" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "7" + lanes: "4:4" + serdes_group: "28" + speed: "100G" + sysport: "7" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "8" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "8" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "9" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "10" + lanes: "4:4" + serdes_group: "27" + speed: "100G" + sysport: "10" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "11" + lanes: "4:4" + serdes_group: "26" + speed: "100G" + sysport: "11" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "12" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "12" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "13" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "13" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "14" + lanes: "4:4" + serdes_group: "25" + speed: "100G" + sysport: "14" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "15" + lanes: "4:4" + serdes_group: "24" + speed: "100G" + sysport: "15" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "16" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "16" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "17" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "18" + lanes: "4:4" + serdes_group: "23" + speed: "100G" + sysport: "18" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "19" + lanes: "4:4" + serdes_group: "22" + speed: "100G" + sysport: "19" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "20" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "20" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "21" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "21" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "22" + lanes: "4:4" + serdes_group: "21" + speed: "100G" + sysport: "22" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "23" + lanes: "4:4" + serdes_group: "20" + speed: "100G" + sysport: "23" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "24" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "24" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "25" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "26" + lanes: "4:4" + serdes_group: "19" + speed: "100G" + sysport: "26" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "27" + lanes: "4:4" + serdes_group: "18" + speed: "100G" + sysport: "27" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "28" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "28" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "29" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "29" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "30" + lanes: "4:4" + serdes_group: "17" + speed: "100G" + sysport: "30" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "31" + lanes: "4:4" + serdes_group: "16" + speed: "100G" + sysport: "31" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "32" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "32" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "33" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "34" + lanes: "4:4" + serdes_group: "15" + speed: "100G" + sysport: "34" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "35" + lanes: "4:4" + serdes_group: "14" + speed: "100G" + sysport: "35" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "36" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "36" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "37" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "37" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "38" + lanes: "4:4" + serdes_group: "13" + speed: "100G" + sysport: "38" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "39" + lanes: "4:4" + serdes_group: "12" + speed: "100G" + sysport: "39" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "40" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "40" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "41" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "42" + lanes: "4:4" + serdes_group: "11" + speed: "100G" + sysport: "42" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "43" + lanes: "4:4" + serdes_group: "10" + speed: "100G" + sysport: "43" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "44" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "44" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "45" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "45" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "46" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "46" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "47" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "47" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "48" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "48" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "49" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "50" + lanes: "4:4" + serdes_group: "7" + speed: "100G" + sysport: "50" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "51" + lanes: "4:4" + serdes_group: "6" + speed: "100G" + sysport: "51" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "52" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "52" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "53" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "53" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "54" + lanes: "4:4" + serdes_group: "5" + speed: "100G" + sysport: "54" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "55" + lanes: "4:4" + serdes_group: "4" + speed: "100G" + sysport: "55" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "56" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "56" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "57" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "58" + lanes: "4:4" + serdes_group: "3" + speed: "100G" + sysport: "58" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "59" + lanes: "4:4" + serdes_group: "2" + speed: "100G" + sysport: "59" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "60" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "60" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "61" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "61" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "62" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "62" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "63" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "63" + type: "eth" + admin_state: "true" + loopback: "none" + - fec: "KRFEC" + id: "64" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "64" + type: "eth" + admin_state: "true" + loopback: "none" + isg: + - id: "0" + lane_swap: "01234567" + rx_polarity: "01110001" + tx_polarity: "00101001" + - id: "1" + lane_swap: "01234567" + rx_polarity: "11100100" + tx_polarity: "10111111" + - id: "2" + lane_swap: "01234567" + rx_polarity: "00010001" + tx_polarity: "00100010" + - id: "3" + lane_swap: "01234567" + rx_polarity: "11011101" + tx_polarity: "00101010" + - id: "4" + lane_swap: "01234567" + rx_polarity: "10010101" + tx_polarity: "10111110" + - id: "5" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01101000" + - id: "6" + lane_swap: "01234567" + rx_polarity: "01110011" + tx_polarity: "01110110" + - id: "7" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01001000" + - id: "8" + lane_swap: "01234567" + rx_polarity: "01000000" + tx_polarity: "11000100" + - id: "9" + lane_swap: "01234567" + rx_polarity: "10100100" + tx_polarity: "10001010" + - id: "10" + lane_swap: "01234567" + rx_polarity: "00011101" + tx_polarity: "11000110" + - id: "11" + lane_swap: "01234567" + rx_polarity: "00000101" + tx_polarity: "01000111" + - id: "12" + lane_swap: "01234567" + rx_polarity: "11100000" + tx_polarity: "01111000" + - id: "13" + lane_swap: "01234567" + rx_polarity: "00101111" + tx_polarity: "10011111" + - id: "14" + lane_swap: "01234567" + rx_polarity: "00011000" + tx_polarity: "00101001" + - id: "15" + lane_swap: "01234567" + rx_polarity: "00110110" + tx_polarity: "10110111" + - id: "16" + lane_swap: "01234567" + rx_polarity: "00000111" + tx_polarity: "00101001" + - id: "17" + lane_swap: "01234567" + rx_polarity: "10001000" + tx_polarity: "10100111" + - id: "18" + lane_swap: "01234567" + rx_polarity: "11111110" + tx_polarity: "00011001" + - id: "19" + lane_swap: "01234567" + rx_polarity: "10011010" + tx_polarity: "10010101" + - id: "20" + lane_swap: "01234567" + rx_polarity: "01100000" + tx_polarity: "00101001" + - id: "21" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10010111" + - id: "22" + lane_swap: "01234567" + rx_polarity: "11010011" + tx_polarity: "00101001" + - id: "23" + lane_swap: "01234567" + rx_polarity: "01111011" + tx_polarity: "10110111" + - id: "24" + lane_swap: "01234567" + rx_polarity: "11101011" + tx_polarity: "00101001" + - id: "25" + lane_swap: "01234567" + rx_polarity: "11010111" + tx_polarity: "10110111" + - id: "26" + lane_swap: "01234567" + rx_polarity: "00101101" + tx_polarity: "00100001" + - id: "27" + lane_swap: "01234567" + rx_polarity: "11011001" + tx_polarity: "11000111" + - id: "28" + lane_swap: "01234567" + rx_polarity: "01010011" + tx_polarity: "00100001" + - id: "29" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10110111" + - id: "30" + lane_swap: "01234567" + rx_polarity: "00110001" + tx_polarity: "00101001" + - id: "31" + lane_swap: "01234567" + rx_polarity: "01101101" + tx_polarity: "10110101" + - id: "32" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "00000000" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/inno.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/inno.config.yaml new file mode 100755 index 000000000000..490de1ca3fdc --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x100G_nrz_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/innovium.77700_B b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/port_config.ini new file mode 100644 index 000000000000..462950d390b6 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/port_config.ini @@ -0,0 +1,65 @@ +# name lanes speed mtu +Ethernet0 249,250,251,252 100000 9126 +Ethernet4 253,254,255,256 100000 9126 +Ethernet8 245,246,247,248 100000 9126 +Ethernet12 241,242,243,244 100000 9126 +Ethernet16 233,234,235,236 100000 9126 +Ethernet20 237,238,239,240 100000 9126 +Ethernet24 229,230,231,232 100000 9126 +Ethernet28 225,226,227,228 100000 9126 +Ethernet32 217,218,219,220 100000 9126 +Ethernet36 221,222,223,224 100000 9126 +Ethernet40 213,214,215,216 100000 9126 +Ethernet44 209,210,211,212 100000 9126 +Ethernet48 201,202,203,204 100000 9126 +Ethernet52 205,206,207,208 100000 9126 +Ethernet56 197,198,199,200 100000 9126 +Ethernet60 193,194,195,196 100000 9126 +Ethernet64 185,186,187,188 100000 9126 +Ethernet68 189,190,191,192 100000 9126 +Ethernet72 181,182,183,184 100000 9126 +Ethernet76 177,178,179,180 100000 9126 +Ethernet80 169,170,171,172 100000 9126 +Ethernet84 173,174,175,176 100000 9126 +Ethernet88 165,166,167,168 100000 9126 +Ethernet92 161,162,163,164 100000 9126 +Ethernet96 153,154,155,156 100000 9126 +Ethernet100 157,158,159,160 100000 9126 +Ethernet104 149,150,151,152 100000 9126 +Ethernet108 145,146,147,148 100000 9126 +Ethernet112 137,138,139,140 100000 9126 +Ethernet116 141,142,143,144 100000 9126 +Ethernet120 133,134,135,136 100000 9126 +Ethernet124 129,130,131,132 100000 9126 +Ethernet128 121,122,123,124 100000 9126 +Ethernet132 125,126,127,128 100000 9126 +Ethernet136 117,118,119,120 100000 9126 +Ethernet140 113,114,115,116 100000 9126 +Ethernet144 105,106,107,108 100000 9126 +Ethernet148 109,110,111,112 100000 9126 +Ethernet152 101,102,103,104 100000 9126 +Ethernet156 97,98,99,100 100000 9126 +Ethernet160 89,90,91,92 100000 9126 +Ethernet164 93,94,95,96 100000 9126 +Ethernet168 85,86,87,88 100000 9126 +Ethernet172 81,82,83,84 100000 9126 +Ethernet176 73,74,75,76 100000 9126 +Ethernet180 77,78,79,80 100000 9126 +Ethernet184 69,70,71,72 100000 9126 +Ethernet188 65,66,67,68 100000 9126 +Ethernet192 57,58,59,60 100000 9126 +Ethernet196 61,62,63,64 100000 9126 +Ethernet200 53,54,55,56 100000 9126 +Ethernet204 49,50,51,52 100000 9126 +Ethernet208 41,42,43,44 100000 9126 +Ethernet212 45,46,47,48 100000 9126 +Ethernet216 37,38,39,40 100000 9126 +Ethernet220 33,34,35,36 100000 9126 +Ethernet224 25,26,27,28 100000 9126 +Ethernet228 29,30,31,32 100000 9126 +Ethernet232 21,22,23,24 100000 9126 +Ethernet236 17,18,19,20 100000 9126 +Ethernet240 9,10,11,12 100000 9126 +Ethernet244 13,14,15,16 100000 9126 +Ethernet248 5,6,7,8 100000 9126 +Ethernet252 1,2,3,4 100000 9126 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/qos.json.j2 new file mode 100755 index 000000000000..b22aa6ef599b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/qos.json.j2 @@ -0,0 +1,102 @@ +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "Ethernet180,Ethernet8,Ethernet44,Ethernet184,Ethernet188,Ethernet0,Ethernet4,Ethernet108,Ethernet248,Ethernet100,Ethernet244,Ethernet128,Ethernet104,Ethernet240,Ethernet40,Ethernet228,Ethernet96,Ethernet168,Ethernet148,Ethernet204,Ethernet120,Ethernet220,Ethernet144,Ethernet208,Ethernet160,Ethernet224,Ethernet140,Ethernet56,Ethernet164,Ethernet76,Ethernet72,Ethernet32,Ethernet16,Ethernet36,Ethernet12,Ethernet196,Ethernet28,Ethernet192,Ethernet200,Ethernet124,Ethernet24,Ethernet116,Ethernet80,Ethernet112,Ethernet84,Ethernet152,Ethernet136,Ethernet156,Ethernet92,Ethernet132,Ethernet48,Ethernet232,Ethernet172,Ethernet216,Ethernet236,Ethernet176,Ethernet212,Ethernet64,Ethernet88,Ethernet60,Ethernet52,Ethernet20,Ethernet68,Ethernet252": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x100nrz/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers.json.j2 new file mode 100644 index 000000000000..45cebf3b7144 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 64 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/config_64x200G_midstone200i.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/config_64x200G_midstone200i.yaml new file mode 100644 index 000000000000..7133de54e493 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/config_64x200G_midstone200i.yaml @@ -0,0 +1,653 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "200G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "253" + lanes: "4:4" + serdes_group: "31" + speed: "200G" + sysport: "253" + type: "eth" + - fec: "KPFEC" + id: "245" + lanes: "4:4" + serdes_group: "30" + speed: "200G" + sysport: "245" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "200G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "200G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "237" + lanes: "4:4" + serdes_group: "29" + speed: "200G" + sysport: "237" + type: "eth" + - fec: "KPFEC" + id: "229" + lanes: "4:4" + serdes_group: "28" + speed: "200G" + sysport: "229" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "200G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "200G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "221" + lanes: "4:4" + serdes_group: "27" + speed: "200G" + sysport: "221" + type: "eth" + - fec: "KPFEC" + id: "213" + lanes: "4:4" + serdes_group: "26" + speed: "200G" + sysport: "213" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "200G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "200G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "205" + lanes: "4:4" + serdes_group: "25" + speed: "200G" + sysport: "205" + type: "eth" + - fec: "KPFEC" + id: "197" + lanes: "4:4" + serdes_group: "24" + speed: "200G" + sysport: "197" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "200G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "200G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "189" + lanes: "4:4" + serdes_group: "23" + speed: "200G" + sysport: "189" + type: "eth" + - fec: "KPFEC" + id: "181" + lanes: "4:4" + serdes_group: "22" + speed: "200G" + sysport: "181" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "200G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "200G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "173" + lanes: "4:4" + serdes_group: "21" + speed: "200G" + sysport: "173" + type: "eth" + - fec: "KPFEC" + id: "165" + lanes: "4:4" + serdes_group: "20" + speed: "200G" + sysport: "165" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "200G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "200G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "157" + lanes: "4:4" + serdes_group: "19" + speed: "200G" + sysport: "157" + type: "eth" + - fec: "KPFEC" + id: "149" + lanes: "4:4" + serdes_group: "18" + speed: "200G" + sysport: "149" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "200G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "200G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "141" + lanes: "4:4" + serdes_group: "17" + speed: "200G" + sysport: "141" + type: "eth" + - fec: "KPFEC" + id: "133" + lanes: "4:4" + serdes_group: "16" + speed: "200G" + sysport: "133" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "200G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "200G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "125" + lanes: "4:4" + serdes_group: "15" + speed: "200G" + sysport: "125" + type: "eth" + - fec: "KPFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "200G" + sysport: "117" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "200G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "200G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "200G" + sysport: "109" + type: "eth" + - fec: "KPFEC" + id: "101" + lanes: "4:4" + serdes_group: "12" + speed: "200G" + sysport: "101" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "200G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "200G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "200G" + sysport: "93" + type: "eth" + - fec: "KPFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "200G" + sysport: "85" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "200G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "200G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "77" + lanes: "4:4" + serdes_group: "9" + speed: "200G" + sysport: "77" + type: "eth" + - fec: "KPFEC" + id: "69" + lanes: "4:4" + serdes_group: "8" + speed: "200G" + sysport: "69" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "200G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "200G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "61" + lanes: "4:4" + serdes_group: "7" + speed: "200G" + sysport: "61" + type: "eth" + - fec: "KPFEC" + id: "53" + lanes: "4:4" + serdes_group: "6" + speed: "200G" + sysport: "53" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "200G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "200G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "45" + lanes: "4:4" + serdes_group: "5" + speed: "200G" + sysport: "45" + type: "eth" + - fec: "KPFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "200G" + sysport: "37" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "200G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "200G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "200G" + sysport: "29" + type: "eth" + - fec: "KPFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "200G" + sysport: "21" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "200G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "200G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "13" + lanes: "4:4" + serdes_group: "1" + speed: "200G" + sysport: "13" + type: "eth" + - fec: "KPFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "200G" + sysport: "5" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "200G" + sysport: "1" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 0" + isg: + - id: "0" + lane_swap: "01234567" + rx_polarity: "01110001" + tx_polarity: "00101001" + - id: "1" + lane_swap: "01234567" + rx_polarity: "11100100" + tx_polarity: "10111111" + - id: "2" + lane_swap: "01234567" + rx_polarity: "00010001" + tx_polarity: "00100010" + - id: "3" + lane_swap: "01234567" + rx_polarity: "11011101" + tx_polarity: "00101010" + - id: "4" + lane_swap: "01234567" + rx_polarity: "10010101" + tx_polarity: "10111110" + - id: "5" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01101000" + - id: "6" + lane_swap: "01234567" + rx_polarity: "01110011" + tx_polarity: "01110110" + - id: "7" + lane_swap: "01234567" + rx_polarity: "10111001" + tx_polarity: "01001000" + - id: "8" + lane_swap: "01234567" + rx_polarity: "01000000" + tx_polarity: "11000100" + - id: "9" + lane_swap: "01234567" + rx_polarity: "10100100" + tx_polarity: "10001010" + - id: "10" + lane_swap: "01234567" + rx_polarity: "00011101" + tx_polarity: "11000110" + - id: "11" + lane_swap: "01234567" + rx_polarity: "00000101" + tx_polarity: "01000111" + - id: "12" + lane_swap: "01234567" + rx_polarity: "11100000" + tx_polarity: "01111000" + - id: "13" + lane_swap: "01234567" + rx_polarity: "00101111" + tx_polarity: "10011111" + - id: "14" + lane_swap: "01234567" + rx_polarity: "00011000" + tx_polarity: "00101001" + - id: "15" + lane_swap: "01234567" + rx_polarity: "00110110" + tx_polarity: "10110111" + - id: "16" + lane_swap: "01234567" + rx_polarity: "00000111" + tx_polarity: "00101001" + - id: "17" + lane_swap: "01234567" + rx_polarity: "10001000" + tx_polarity: "10100111" + - id: "18" + lane_swap: "01234567" + rx_polarity: "11111110" + tx_polarity: "00011001" + - id: "19" + lane_swap: "01234567" + rx_polarity: "10011010" + tx_polarity: "10010101" + - id: "20" + lane_swap: "01234567" + rx_polarity: "01100000" + tx_polarity: "00101001" + - id: "21" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10010111" + - id: "22" + lane_swap: "01234567" + rx_polarity: "11010011" + tx_polarity: "00101001" + - id: "23" + lane_swap: "01234567" + rx_polarity: "01111011" + tx_polarity: "10110111" + - id: "24" + lane_swap: "01234567" + rx_polarity: "11101011" + tx_polarity: "00101001" + - id: "25" + lane_swap: "01234567" + rx_polarity: "11010111" + tx_polarity: "10110111" + - id: "26" + lane_swap: "01234567" + rx_polarity: "00101101" + tx_polarity: "00100001" + - id: "27" + lane_swap: "01234567" + rx_polarity: "11011001" + tx_polarity: "11000111" + - id: "28" + lane_swap: "01234567" + rx_polarity: "01010011" + tx_polarity: "00100001" + - id: "29" + lane_swap: "01234567" + rx_polarity: "01111001" + tx_polarity: "10110111" + - id: "30" + lane_swap: "01234567" + rx_polarity: "00110001" + tx_polarity: "00101001" + - id: "31" + lane_swap: "01234567" + rx_polarity: "01101101" + tx_polarity: "10110101" + - id: "32" + lane_swap: "01234567" + rx_polarity: "00000000" + tx_polarity: "00000000" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/inno.config.yaml b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/inno.config.yaml new file mode 100755 index 000000000000..970a5830339e --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x200G_midstone200i.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/innovium.77700_B b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/port_config.ini b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/port_config.ini new file mode 100644 index 000000000000..3dcbf72bc324 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/port_config.ini @@ -0,0 +1,67 @@ +# name lanes speed index mtu fec +Ethernet0 249,250,251,252 200000 0 9126 rs +Ethernet4 253,254,255,256 200000 1 9126 rs +Ethernet8 245,246,247,248 200000 2 9126 rs +Ethernet12 241,242,243,244 200000 3 9126 rs +Ethernet16 233,234,235,236 200000 4 9126 rs +Ethernet20 237,238,239,240 200000 5 9126 rs +Ethernet24 229,230,231,232 200000 6 9126 rs +Ethernet28 225,226,227,228 200000 7 9126 rs +Ethernet32 217,218,219,220 200000 8 9126 rs +Ethernet36 221,222,223,224 200000 9 9126 rs +Ethernet40 213,214,215,216 200000 10 9126 rs +Ethernet44 209,210,211,212 200000 11 9126 rs +Ethernet48 201,202,203,204 200000 12 9126 rs +Ethernet52 205,206,207,208 200000 13 9126 rs +Ethernet56 197,198,199,200 200000 14 9126 rs +Ethernet60 193,194,195,196 200000 15 9126 rs +Ethernet64 185,186,187,188 200000 16 9126 rs +Ethernet68 189,190,191,192 200000 17 9126 rs +Ethernet72 181,182,183,184 200000 18 9126 rs +Ethernet76 177,178,179,180 200000 19 9126 rs +Ethernet80 169,170,171,172 200000 20 9126 rs +Ethernet84 173,174,175,176 200000 21 9126 rs +Ethernet88 165,166,167,168 200000 22 9126 rs +Ethernet92 161,162,163,164 200000 23 9126 rs +Ethernet96 153,154,155,156 200000 24 9126 rs +Ethernet100 157,158,159,160 200000 25 9126 rs +Ethernet104 149,150,151,152 200000 26 9126 rs +Ethernet108 145,146,147,148 200000 27 9126 rs +Ethernet112 137,138,139,140 200000 28 9126 rs +Ethernet116 141,142,143,144 200000 29 9126 rs +Ethernet120 133,134,135,136 200000 30 9126 rs +Ethernet124 129,130,131,132 200000 31 9126 rs +Ethernet128 121,122,123,124 200000 32 9126 rs +Ethernet132 125,126,127,128 200000 33 9126 rs +Ethernet136 117,118,119,120 200000 34 9126 rs +Ethernet140 113,114,115,116 200000 35 9126 rs +Ethernet144 105,106,107,108 200000 36 9126 rs +Ethernet148 109,110,111,112 200000 37 9126 rs +Ethernet152 101,102,103,104 200000 38 9126 rs +Ethernet156 97,98,99,100 200000 39 9126 rs +Ethernet160 89,90,91,92 200000 40 9126 rs +Ethernet164 93,94,95,96 200000 41 9126 rs +Ethernet168 85,86,87,88 200000 42 9126 rs +Ethernet172 81,82,83,84 200000 43 9126 rs +Ethernet176 73,74,75,76 200000 44 9126 rs +Ethernet180 77,78,79,80 200000 45 9126 rs +Ethernet184 69,70,71,72 200000 46 9126 rs +Ethernet188 65,66,67,68 200000 47 9126 rs +Ethernet192 57,58,59,60 200000 48 9126 rs +Ethernet196 61,62,63,64 200000 49 9126 rs +Ethernet200 53,54,55,56 200000 50 9126 rs +Ethernet204 49,50,51,52 200000 51 9126 rs +Ethernet208 41,42,43,44 200000 52 9126 rs +Ethernet212 45,46,47,48 200000 53 9126 rs +Ethernet216 37,38,39,40 200000 54 9126 rs +Ethernet220 33,34,35,36 200000 55 9126 rs +Ethernet224 25,26,27,28 200000 56 9126 rs +Ethernet228 29,30,31,32 200000 57 9126 rs +Ethernet232 21,22,23,24 200000 58 9126 rs +Ethernet236 17,18,19,20 200000 59 9126 rs +Ethernet240 9,10,11,12 200000 60 9126 rs +Ethernet244 13,14,15,16 200000 61 9126 rs +Ethernet248 5,6,7,8 200000 62 9126 rs +Ethernet252 1,2,3,4 200000 63 9126 rs +Ethernet256 257 10000 64 9126 none +Ethernet257 258 10000 65 9126 none diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos.json.j2 b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos.json.j2 new file mode 100755 index 000000000000..16f9b42a2166 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 64 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/sai.profile b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/Midstone-200i_64x200/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/celestica/x86_64-cel_midstone-r0/default_sku b/device/celestica/x86_64-cel_midstone-r0/default_sku new file mode 100755 index 000000000000..6fe6e28064bd --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/default_sku @@ -0,0 +1 @@ +Midstone-200i t1 diff --git a/device/celestica/x86_64-cel_midstone-r0/fancontrol b/device/celestica/x86_64-cel_midstone-r0/fancontrol new file mode 100755 index 000000000000..e69de29bb2d1 diff --git a/device/celestica/x86_64-cel_midstone-r0/installer.conf b/device/celestica/x86_64-cel_midstone-r0/installer.conf new file mode 100755 index 000000000000..925a32fc0c3a --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/celestica/x86_64-cel_midstone-r0/plugins/eeprom.py b/device/celestica/x86_64-cel_midstone-r0/plugins/eeprom.py new file mode 100755 index 000000000000..86e7f1b2af15 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/plugins/eeprom.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica Midstone-200i +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/class/i2c-adapter/i2c-0/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/celestica/x86_64-cel_midstone-r0/plugins/psuutil.py b/device/celestica/x86_64-cel_midstone-r0/plugins/psuutil.py new file mode 100644 index 000000000000..4e6c5eec5d85 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/plugins/psuutil.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import os.path +import subprocess + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + status = 1 + return status == 1 + + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + + status = 1 + return status == 1 + diff --git a/device/celestica/x86_64-cel_midstone-r0/plugins/sfputil.py b/device/celestica/x86_64-cel_midstone-r0/plugins/sfputil.py new file mode 100755 index 000000000000..4d2a444c198b --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/plugins/sfputil.py @@ -0,0 +1,205 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 65 + QSFP_PORT_START = PORT_START + QSFP_PORT_END = 63 + + EEPROM_OFFSET = 1 + + _port_to_eeprom_mapping = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(self.QSFP_PORT_START, self.QSFP_PORT_END+1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + + if self.port_start == 1: + offset = self.EEPROM_OFFSET - 1 + else: + offset = self.EEPROM_OFFSET + + for x in range(self.port_start, self.port_end + 1): + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + offset) + + SfpUtilBase.__init__(self) + + 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 + + try: + reg_file = open("/sys/devices/platform/ms200i_cpld/qsfp_modprs") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Determind if port_num start from 1 or 0 + if self.port_start == 1: + bit_index = port_num - 1 + else: + bit_index = port_num + + # Mask off the bit corresponding to our port + mask = (1 << bit_index) + + # ModPrsL is active low + if reg_value & mask == 0: + return True + + 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 + + try: + reg_file = open("/sys/devices/platform/ms200i_cpld/qsfp_lpmode") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Determind if port_num start from 1 or 0 + if self.port_start == 1: + bit_index = port_num - 1 + else: + bit_index = port_num + + # Mask off the bit corresponding to our port + mask = (1 << bit_index) + + # LPMode is active high + if reg_value & mask == 0: + 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 False + + try: + reg_file = open("/sys/devices/platform/ms200i_cpld/qsfp_lpmode", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Determind if port_num start from 1 or 0 + if self.port_start == 1: + bit_index = port_num - 1 + else: + bit_index = port_num + + # Mask off the bit corresponding to our port + mask = (1 << bit_index) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value).strip('L') + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/ms200i_cpld/qsfp_reset" + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # File content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Determind if port_num start from 1 or 0 + if self.port_start == 1: + bit_index = port_num - 1 + else: + bit_index = port_num + + # Mask off the bit corresponding to our port + mask = (1 << bit_index) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value).rstrip('L')) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value).rstrip('L')) + reg_file.close() + + return True diff --git a/device/celestica/x86_64-cel_midstone-r0/sensors.conf b/device/celestica/x86_64-cel_midstone-r0/sensors.conf new file mode 100755 index 000000000000..7c9a6321dfc0 --- /dev/null +++ b/device/celestica/x86_64-cel_midstone-r0/sensors.conf @@ -0,0 +1,2 @@ +# libsensors configuration file for Celestica Midstone-200i. +# The i2c bus portion is omit because adapter name diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers.json.j2 new file mode 100644 index 000000000000..4fca9cbcd156 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 32 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/config_32x400G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/config_32x400G_Delta-et-c032if.yaml new file mode 100755 index 000000000000..2ba23d2a5a67 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/config_32x400G_Delta-et-c032if.yaml @@ -0,0 +1,429 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/inno.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/inno.config.yaml new file mode 100755 index 000000000000..360b5af8e602 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/innovium.77700_A b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/port_config.ini new file mode 100755 index 000000000000..360e363f485b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/port_config.ini @@ -0,0 +1,35 @@ +# name lanes speed index mtu fec +Ethernet0 249,250,251,252 400000 0 9126 rs +Ethernet8 241,242,243,244 400000 1 9126 rs +Ethernet16 233,234,235,236 400000 2 9126 rs +Ethernet24 225,226,227,228 400000 3 9126 rs +Ethernet32 217,218,219,220 400000 4 9126 rs +Ethernet40 209,210,211,212 400000 5 9126 rs +Ethernet48 201,202,203,204 400000 6 9126 rs +Ethernet56 193,194,195,196 400000 7 9126 rs +Ethernet64 185,186,187,188 400000 8 9126 rs +Ethernet72 177,178,179,180 400000 9 9126 rs +Ethernet80 169,170,171,172 400000 10 9126 rs +Ethernet88 161,162,163,164 400000 11 9126 rs +Ethernet96 153,154,155,156 400000 12 9126 rs +Ethernet104 145,146,147,148 400000 13 9126 rs +Ethernet112 137,138,139,140 400000 14 9126 rs +Ethernet120 129,130,131,132 400000 15 9126 rs +Ethernet128 121,122,123,124 400000 16 9126 rs +Ethernet136 113,114,115,116 400000 17 9126 rs +Ethernet144 97,98,99,100 400000 18 9126 rs +Ethernet152 105,106,107,108 400000 19 9126 rs +Ethernet160 81,82,83,84 400000 20 9126 rs +Ethernet168 89,90,91,92 400000 21 9126 rs +Ethernet176 65,66,67,68 400000 22 9126 rs +Ethernet184 73,74,75,76 400000 23 9126 rs +Ethernet192 49,50,51,52 400000 24 9126 rs +Ethernet200 57,58,59,60 400000 25 9126 rs +Ethernet208 33,34,35,36 400000 26 9126 rs +Ethernet216 41,42,43,44 400000 27 9126 rs +Ethernet224 17,18,19,20 400000 28 9126 rs +Ethernet232 25,26,27,28 400000 29 9126 rs +Ethernet240 1,2,3,4 400000 30 9126 rs +Ethernet248 9,10,11,12 400000 31 9126 rs +Ethernet256 257 10000 32 9126 none +Ethernet257 258 10000 33 9126 none diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos.json.j2 new file mode 100755 index 000000000000..6c734d46ff2f --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 32 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers.json.j2 new file mode 100644 index 000000000000..9529fbf52fb5 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 128 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*2)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/config_128x100G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/config_128x100G_Delta-et-c032if.yaml new file mode 100755 index 000000000000..ad50fd04c2a0 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/config_128x100G_Delta-et-c032if.yaml @@ -0,0 +1,1102 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:2" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "251" + lanes: "2:2" + serdes_group: "31" + speed: "100G" + sysport: "251" + type: "eth" + - fec: "KPFEC" + id: "253" + lanes: "4:2" + serdes_group: "31" + speed: "100G" + sysport: "253" + type: "eth" + - fec: "KPFEC" + id: "255" + lanes: "6:2" + serdes_group: "31" + speed: "100G" + sysport: "255" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:2" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "243" + lanes: "2:2" + serdes_group: "30" + speed: "100G" + sysport: "243" + type: "eth" + - fec: "KPFEC" + id: "245" + lanes: "4:2" + serdes_group: "30" + speed: "100G" + sysport: "245" + type: "eth" + - fec: "KPFEC" + id: "247" + lanes: "6:2" + serdes_group: "30" + speed: "100G" + sysport: "247" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:2" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "235" + lanes: "2:2" + serdes_group: "29" + speed: "100G" + sysport: "235" + type: "eth" + - fec: "KPFEC" + id: "237" + lanes: "4:2" + serdes_group: "29" + speed: "100G" + sysport: "237" + type: "eth" + - fec: "KPFEC" + id: "239" + lanes: "6:2" + serdes_group: "29" + speed: "100G" + sysport: "239" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:2" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "227" + lanes: "2:2" + serdes_group: "28" + speed: "100G" + sysport: "227" + type: "eth" + - fec: "KPFEC" + id: "229" + lanes: "4:2" + serdes_group: "28" + speed: "100G" + sysport: "229" + type: "eth" + - fec: "KPFEC" + id: "231" + lanes: "6:2" + serdes_group: "28" + speed: "100G" + sysport: "231" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:2" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "219" + lanes: "2:2" + serdes_group: "27" + speed: "100G" + sysport: "219" + type: "eth" + - fec: "KPFEC" + id: "221" + lanes: "4:2" + serdes_group: "27" + speed: "100G" + sysport: "221" + type: "eth" + - fec: "KPFEC" + id: "223" + lanes: "6:2" + serdes_group: "27" + speed: "100G" + sysport: "223" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:2" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "211" + lanes: "2:2" + serdes_group: "26" + speed: "100G" + sysport: "211" + type: "eth" + - fec: "KPFEC" + id: "213" + lanes: "4:2" + serdes_group: "26" + speed: "100G" + sysport: "213" + type: "eth" + - fec: "KPFEC" + id: "215" + lanes: "6:2" + serdes_group: "26" + speed: "100G" + sysport: "215" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:2" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "203" + lanes: "2:2" + serdes_group: "25" + speed: "100G" + sysport: "203" + type: "eth" + - fec: "KPFEC" + id: "205" + lanes: "4:2" + serdes_group: "25" + speed: "100G" + sysport: "205" + type: "eth" + - fec: "KPFEC" + id: "207" + lanes: "6:2" + serdes_group: "25" + speed: "100G" + sysport: "207" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:2" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "195" + lanes: "2:2" + serdes_group: "24" + speed: "100G" + sysport: "195" + type: "eth" + - fec: "KPFEC" + id: "197" + lanes: "4:2" + serdes_group: "24" + speed: "100G" + sysport: "197" + type: "eth" + - fec: "KPFEC" + id: "199" + lanes: "6:2" + serdes_group: "24" + speed: "100G" + sysport: "199" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:2" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "187" + lanes: "2:2" + serdes_group: "23" + speed: "100G" + sysport: "187" + type: "eth" + - fec: "KPFEC" + id: "189" + lanes: "4:2" + serdes_group: "23" + speed: "100G" + sysport: "189" + type: "eth" + - fec: "KPFEC" + id: "191" + lanes: "6:2" + serdes_group: "23" + speed: "100G" + sysport: "191" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:2" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "179" + lanes: "2:2" + serdes_group: "22" + speed: "100G" + sysport: "179" + type: "eth" + - fec: "KPFEC" + id: "181" + lanes: "4:2" + serdes_group: "22" + speed: "100G" + sysport: "181" + type: "eth" + - fec: "KPFEC" + id: "183" + lanes: "6:2" + serdes_group: "22" + speed: "100G" + sysport: "183" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:2" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "171" + lanes: "2:2" + serdes_group: "21" + speed: "100G" + sysport: "171" + type: "eth" + - fec: "KPFEC" + id: "173" + lanes: "4:2" + serdes_group: "21" + speed: "100G" + sysport: "173" + type: "eth" + - fec: "KPFEC" + id: "175" + lanes: "6:2" + serdes_group: "21" + speed: "100G" + sysport: "175" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:2" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "163" + lanes: "2:2" + serdes_group: "20" + speed: "100G" + sysport: "163" + type: "eth" + - fec: "KPFEC" + id: "165" + lanes: "4:2" + serdes_group: "20" + speed: "100G" + sysport: "165" + type: "eth" + - fec: "KPFEC" + id: "167" + lanes: "6:2" + serdes_group: "20" + speed: "100G" + sysport: "167" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:2" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "155" + lanes: "2:2" + serdes_group: "19" + speed: "100G" + sysport: "155" + type: "eth" + - fec: "KPFEC" + id: "157" + lanes: "4:2" + serdes_group: "19" + speed: "100G" + sysport: "157" + type: "eth" + - fec: "KPFEC" + id: "159" + lanes: "6:2" + serdes_group: "19" + speed: "100G" + sysport: "159" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:2" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "147" + lanes: "2:2" + serdes_group: "18" + speed: "100G" + sysport: "147" + type: "eth" + - fec: "KPFEC" + id: "149" + lanes: "4:2" + serdes_group: "18" + speed: "100G" + sysport: "149" + type: "eth" + - fec: "KPFEC" + id: "151" + lanes: "6:2" + serdes_group: "18" + speed: "100G" + sysport: "151" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:2" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "139" + lanes: "2:2" + serdes_group: "17" + speed: "100G" + sysport: "139" + type: "eth" + - fec: "KPFEC" + id: "141" + lanes: "4:2" + serdes_group: "17" + speed: "100G" + sysport: "141" + type: "eth" + - fec: "KPFEC" + id: "143" + lanes: "6:2" + serdes_group: "17" + speed: "100G" + sysport: "143" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:2" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "131" + lanes: "2:2" + serdes_group: "16" + speed: "100G" + sysport: "131" + type: "eth" + - fec: "KPFEC" + id: "133" + lanes: "4:2" + serdes_group: "16" + speed: "100G" + sysport: "133" + type: "eth" + - fec: "KPFEC" + id: "135" + lanes: "6:2" + serdes_group: "16" + speed: "100G" + sysport: "135" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:2" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "123" + lanes: "2:2" + serdes_group: "15" + speed: "100G" + sysport: "123" + type: "eth" + - fec: "KPFEC" + id: "125" + lanes: "4:2" + serdes_group: "15" + speed: "100G" + sysport: "125" + type: "eth" + - fec: "KPFEC" + id: "127" + lanes: "6:2" + serdes_group: "15" + speed: "100G" + sysport: "127" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:2" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "115" + lanes: "2:2" + serdes_group: "14" + speed: "100G" + sysport: "115" + type: "eth" + - fec: "KPFEC" + id: "117" + lanes: "4:2" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + - fec: "KPFEC" + id: "119" + lanes: "6:2" + serdes_group: "14" + speed: "100G" + sysport: "119" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:2" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "99" + lanes: "2:2" + serdes_group: "12" + speed: "100G" + sysport: "99" + type: "eth" + - fec: "KPFEC" + id: "101" + lanes: "4:2" + serdes_group: "12" + speed: "100G" + sysport: "101" + type: "eth" + - fec: "KPFEC" + id: "103" + lanes: "6:2" + serdes_group: "12" + speed: "100G" + sysport: "103" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:2" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "107" + lanes: "2:2" + serdes_group: "13" + speed: "100G" + sysport: "107" + type: "eth" + - fec: "KPFEC" + id: "109" + lanes: "4:2" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + - fec: "KPFEC" + id: "111" + lanes: "6:2" + serdes_group: "13" + speed: "100G" + sysport: "111" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:2" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "83" + lanes: "2:2" + serdes_group: "10" + speed: "100G" + sysport: "83" + type: "eth" + - fec: "KPFEC" + id: "85" + lanes: "4:2" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + - fec: "KPFEC" + id: "87" + lanes: "6:2" + serdes_group: "10" + speed: "100G" + sysport: "87" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:2" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "91" + lanes: "2:2" + serdes_group: "11" + speed: "100G" + sysport: "91" + type: "eth" + - fec: "KPFEC" + id: "93" + lanes: "4:2" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + - fec: "KPFEC" + id: "95" + lanes: "6:2" + serdes_group: "11" + speed: "100G" + sysport: "95" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:2" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "67" + lanes: "2:2" + serdes_group: "8" + speed: "100G" + sysport: "67" + type: "eth" + - fec: "KPFEC" + id: "69" + lanes: "4:2" + serdes_group: "8" + speed: "100G" + sysport: "69" + type: "eth" + - fec: "KPFEC" + id: "71" + lanes: "6:2" + serdes_group: "8" + speed: "100G" + sysport: "71" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:2" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "75" + lanes: "2:2" + serdes_group: "9" + speed: "100G" + sysport: "75" + type: "eth" + - fec: "KPFEC" + id: "77" + lanes: "4:2" + serdes_group: "9" + speed: "100G" + sysport: "77" + type: "eth" + - fec: "KPFEC" + id: "79" + lanes: "6:2" + serdes_group: "9" + speed: "100G" + sysport: "79" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:2" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "51" + lanes: "2:2" + serdes_group: "6" + speed: "100G" + sysport: "51" + type: "eth" + - fec: "KPFEC" + id: "53" + lanes: "4:2" + serdes_group: "6" + speed: "100G" + sysport: "53" + type: "eth" + - fec: "KPFEC" + id: "55" + lanes: "6:2" + serdes_group: "6" + speed: "100G" + sysport: "55" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:2" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "59" + lanes: "2:2" + serdes_group: "7" + speed: "100G" + sysport: "59" + type: "eth" + - fec: "KPFEC" + id: "61" + lanes: "4:2" + serdes_group: "7" + speed: "100G" + sysport: "61" + type: "eth" + - fec: "KPFEC" + id: "63" + lanes: "6:2" + serdes_group: "7" + speed: "100G" + sysport: "63" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:2" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "35" + lanes: "2:2" + serdes_group: "4" + speed: "100G" + sysport: "35" + type: "eth" + - fec: "KPFEC" + id: "37" + lanes: "4:2" + serdes_group: "4" + speed: "100G" + sysport: "37" + type: "eth" + - fec: "KPFEC" + id: "39" + lanes: "6:2" + serdes_group: "4" + speed: "100G" + sysport: "39" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:2" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "43" + lanes: "2:2" + serdes_group: "5" + speed: "100G" + sysport: "43" + type: "eth" + - fec: "KPFEC" + id: "45" + lanes: "4:2" + serdes_group: "5" + speed: "100G" + sysport: "45" + type: "eth" + - fec: "KPFEC" + id: "47" + lanes: "6:2" + serdes_group: "5" + speed: "100G" + sysport: "47" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:2" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "19" + lanes: "2:2" + serdes_group: "2" + speed: "100G" + sysport: "19" + type: "eth" + - fec: "KPFEC" + id: "21" + lanes: "4:2" + serdes_group: "2" + speed: "100G" + sysport: "21" + type: "eth" + - fec: "KPFEC" + id: "23" + lanes: "6:2" + serdes_group: "2" + speed: "100G" + sysport: "23" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:2" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "27" + lanes: "2:2" + serdes_group: "3" + speed: "100G" + sysport: "27" + type: "eth" + - fec: "KPFEC" + id: "29" + lanes: "4:2" + serdes_group: "3" + speed: "100G" + sysport: "29" + type: "eth" + - fec: "KPFEC" + id: "31" + lanes: "6:2" + serdes_group: "3" + speed: "100G" + sysport: "31" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:2" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "3" + lanes: "2:2" + serdes_group: "0" + speed: "100G" + sysport: "3" + type: "eth" + - fec: "KPFEC" + id: "5" + lanes: "4:2" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" + - fec: "KPFEC" + id: "7" + lanes: "6:2" + serdes_group: "0" + speed: "100G" + sysport: "7" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:2" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "11" + lanes: "2:2" + serdes_group: "1" + speed: "100G" + sysport: "11" + type: "eth" + - fec: "KPFEC" + id: "13" + lanes: "4:2" + serdes_group: "1" + speed: "100G" + sysport: "13" + type: "eth" + - fec: "KPFEC" + id: "15" + lanes: "6:2" + serdes_group: "1" + speed: "100G" + sysport: "15" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/inno.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/inno.config.yaml new file mode 100755 index 000000000000..17f3e060d712 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_128x100G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/innovium.77700_B b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/port_config.ini new file mode 100644 index 000000000000..cd4dbc611ec1 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/port_config.ini @@ -0,0 +1,131 @@ +# name lanes speed index mtu +Ethernet0 249,250 100000 0 9126 +Ethernet2 251,252 100000 0 9126 +Ethernet4 253,254 100000 0 9126 +Ethernet6 255,256 100000 0 9126 +Ethernet8 241,242 100000 1 9126 +Ethernet10 243,244 100000 1 9126 +Ethernet12 245,246 100000 1 9126 +Ethernet14 247,248 100000 1 9126 +Ethernet16 233,234 100000 2 9126 +Ethernet18 235,236 100000 2 9126 +Ethernet20 237,238 100000 2 9126 +Ethernet22 239,240 100000 2 9126 +Ethernet24 225,226 100000 3 9126 +Ethernet26 227,228 100000 3 9126 +Ethernet28 229,230 100000 3 9126 +Ethernet30 231,232 100000 3 9126 +Ethernet32 217,218 100000 4 9126 +Ethernet34 219,220 100000 4 9126 +Ethernet36 221,222 100000 4 9126 +Ethernet38 223,224 100000 4 9126 +Ethernet40 209,210 100000 5 9126 +Ethernet42 211,212 100000 5 9126 +Ethernet44 213,214 100000 5 9126 +Ethernet46 215,216 100000 5 9126 +Ethernet48 201,202 100000 6 9126 +Ethernet50 203,204 100000 6 9126 +Ethernet52 205,206 100000 6 9126 +Ethernet54 207,208 100000 6 9126 +Ethernet56 193,194 100000 7 9126 +Ethernet58 195,196 100000 7 9126 +Ethernet60 197,198 100000 7 9126 +Ethernet62 199,200 100000 7 9126 +Ethernet64 185,186 100000 8 9126 +Ethernet66 187,188 100000 8 9126 +Ethernet68 189,190 100000 8 9126 +Ethernet70 191,192 100000 8 9126 +Ethernet72 177,178 100000 9 9126 +Ethernet74 179,180 100000 9 9126 +Ethernet76 181,182 100000 9 9126 +Ethernet78 183,184 100000 9 9126 +Ethernet80 169,170 100000 10 9126 +Ethernet82 171,172 100000 10 9126 +Ethernet84 173,174 100000 10 9126 +Ethernet86 175,176 100000 10 9126 +Ethernet88 161,162 100000 11 9126 +Ethernet90 163,164 100000 11 9126 +Ethernet92 165,166 100000 11 9126 +Ethernet94 167,168 100000 11 9126 +Ethernet96 153,154 100000 12 9126 +Ethernet98 155,156 100000 12 9126 +Ethernet100 157,158 100000 12 9126 +Ethernet102 159,160 100000 12 9126 +Ethernet104 145,146 100000 13 9126 +Ethernet106 147,148 100000 13 9126 +Ethernet108 149,150 100000 13 9126 +Ethernet110 151,152 100000 13 9126 +Ethernet112 137,138 100000 14 9126 +Ethernet114 139,140 100000 14 9126 +Ethernet116 141,142 100000 14 9126 +Ethernet118 143,144 100000 14 9126 +Ethernet120 129,130 100000 15 9126 +Ethernet122 131,132 100000 15 9126 +Ethernet124 133,134 100000 15 9126 +Ethernet126 135,136 100000 15 9126 +Ethernet128 121,122 100000 16 9126 +Ethernet130 123,124 100000 16 9126 +Ethernet132 125,126 100000 16 9126 +Ethernet134 127,128 100000 16 9126 +Ethernet136 113,114 100000 17 9126 +Ethernet138 115,116 100000 17 9126 +Ethernet140 117,118 100000 17 9126 +Ethernet142 119,120 100000 17 9126 +Ethernet144 97,98 100000 18 9126 +Ethernet146 99,100 100000 18 9126 +Ethernet148 101,102 100000 18 9126 +Ethernet150 103,104 100000 18 9126 +Ethernet152 105,106 100000 19 9126 +Ethernet154 107,108 100000 19 9126 +Ethernet156 109,110 100000 19 9126 +Ethernet158 111,112 100000 19 9126 +Ethernet160 81,82 100000 20 9126 +Ethernet162 83,84 100000 20 9126 +Ethernet164 85,86 100000 20 9126 +Ethernet166 87,88 100000 20 9126 +Ethernet168 89,90 100000 21 9126 +Ethernet170 91,92 100000 21 9126 +Ethernet172 93,94 100000 21 9126 +Ethernet174 95,96 100000 21 9126 +Ethernet176 65,66 100000 22 9126 +Ethernet178 67,68 100000 22 9126 +Ethernet180 69,70 100000 22 9126 +Ethernet182 71,72 100000 22 9126 +Ethernet184 73,74 100000 23 9126 +Ethernet186 75,76 100000 23 9126 +Ethernet188 77,78 100000 23 9126 +Ethernet190 79,80 100000 23 9126 +Ethernet192 49,50 100000 24 9126 +Ethernet194 51,52 100000 24 9126 +Ethernet196 53,54 100000 24 9126 +Ethernet198 55,56 100000 24 9126 +Ethernet200 57,58 100000 25 9126 +Ethernet202 59,60 100000 25 9126 +Ethernet204 61,62 100000 25 9126 +Ethernet206 63,64 100000 25 9126 +Ethernet208 33,34 100000 26 9126 +Ethernet210 35,36 100000 26 9126 +Ethernet212 37,38 100000 26 9126 +Ethernet214 39,40 100000 26 9126 +Ethernet216 41,42 100000 27 9126 +Ethernet218 43,44 100000 27 9126 +Ethernet220 45,46 100000 27 9126 +Ethernet222 47,48 100000 27 9126 +Ethernet224 17,18 100000 28 9126 +Ethernet226 19,20 100000 28 9126 +Ethernet228 21,22 100000 28 9126 +Ethernet230 23,24 100000 28 9126 +Ethernet232 25,26 100000 29 9126 +Ethernet234 27,28 100000 29 9126 +Ethernet236 29,30 100000 29 9126 +Ethernet238 31,32 100000 29 9126 +Ethernet240 1,2 100000 30 9126 +Ethernet242 3,4 100000 30 9126 +Ethernet244 5,6 100000 30 9126 +Ethernet246 7,8 100000 30 9126 +Ethernet248 9,10 100000 31 9126 +Ethernet250 11,12 100000 31 9126 +Ethernet252 13,14 100000 31 9126 +Ethernet254 15,16 100000 31 9126 +Ethernet256 257 10000 32 9126 +Ethernet257 258 10000 33 9126 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos.json.j2 new file mode 100755 index 000000000000..733bd51dc86f --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 128 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*2)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_128x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers.json.j2 new file mode 100644 index 000000000000..4fca9cbcd156 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 32 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/config_32x100G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/config_32x100G_Delta-et-c032if.yaml new file mode 100755 index 000000000000..4b4f02da4895 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/config_32x100G_Delta-et-c032if.yaml @@ -0,0 +1,415 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KRFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KRFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + - fec: "KRFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/inno.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/inno.config.yaml new file mode 100755 index 000000000000..9350e166634e --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/innovium.77700_A b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/innovium.77700_B b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/port_config.ini new file mode 100755 index 000000000000..45fbfd346c9f --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes speed index mtu fec +Ethernet0 249,250,251,252 100000 0 9126 rs +Ethernet8 241,242,243,244 100000 1 9126 rs +Ethernet16 233,234,235,236 100000 2 9126 rs +Ethernet24 225,226,227,228 100000 3 9126 rs +Ethernet32 217,218,219,220 100000 4 9126 rs +Ethernet40 209,210,211,212 100000 5 9126 rs +Ethernet48 201,202,203,204 100000 6 9126 rs +Ethernet56 193,194,195,196 100000 7 9126 rs +Ethernet64 185,186,187,188 100000 8 9126 rs +Ethernet72 177,178,179,180 100000 9 9126 rs +Ethernet80 169,170,171,172 100000 10 9126 rs +Ethernet88 161,162,163,164 100000 11 9126 rs +Ethernet96 153,154,155,156 100000 12 9126 rs +Ethernet104 145,146,147,148 100000 13 9126 rs +Ethernet112 137,138,139,140 100000 14 9126 rs +Ethernet120 129,130,131,132 100000 15 9126 rs +Ethernet128 121,122,123,124 100000 16 9126 rs +Ethernet136 113,114,115,116 100000 17 9126 rs +Ethernet144 97,98,99,100 100000 18 9126 rs +Ethernet152 105,106,107,108 100000 19 9126 rs +Ethernet160 81,82,83,84 100000 20 9126 rs +Ethernet168 89,90,91,92 100000 21 9126 rs +Ethernet176 65,66,67,68 100000 22 9126 rs +Ethernet184 73,74,75,76 100000 23 9126 rs +Ethernet192 49,50,51,52 100000 24 9126 rs +Ethernet200 57,58,59,60 100000 25 9126 rs +Ethernet208 33,34,35,36 100000 26 9126 rs +Ethernet216 41,42,43,44 100000 27 9126 rs +Ethernet224 17,18,19,20 100000 28 9126 rs +Ethernet232 25,26,27,28 100000 29 9126 rs +Ethernet240 1,2,3,4 100000 30 9126 rs +Ethernet248 9,10,11,12 100000 31 9126 rs diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos.json.j2 new file mode 100755 index 000000000000..6c734d46ff2f --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 32 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers.json.j2 new file mode 100644 index 000000000000..4fca9cbcd156 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 32 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/config_32x200G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/config_32x200G_Delta-et-c032if.yaml new file mode 100755 index 000000000000..0a76811110e8 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/config_32x200G_Delta-et-c032if.yaml @@ -0,0 +1,429 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "200G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "200G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "200G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "200G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "200G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "200G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "200G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "200G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "200G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "200G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "200G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "200G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "200G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "200G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "200G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "200G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "200G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "200G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "200G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "200G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "200G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "200G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "200G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "200G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "200G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "200G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "200G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "200G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "200G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "200G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "200G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "200G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/inno.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/inno.config.yaml new file mode 100755 index 000000000000..9bc0114cf69b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x200G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/innovium.77700_B b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/port_config.ini new file mode 100755 index 000000000000..48091f5e3674 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/port_config.ini @@ -0,0 +1,35 @@ +# name lanes speed index mtu fec +Ethernet0 249,250,251,252 200000 0 9126 rs +Ethernet8 241,242,243,244 200000 1 9126 rs +Ethernet16 233,234,235,236 200000 2 9126 rs +Ethernet24 225,226,227,228 200000 3 9126 rs +Ethernet32 217,218,219,220 200000 4 9126 rs +Ethernet40 209,210,211,212 200000 5 9126 rs +Ethernet48 201,202,203,204 200000 6 9126 rs +Ethernet56 193,194,195,196 200000 7 9126 rs +Ethernet64 185,186,187,188 200000 8 9126 rs +Ethernet72 177,178,179,180 200000 9 9126 rs +Ethernet80 169,170,171,172 200000 10 9126 rs +Ethernet88 161,162,163,164 200000 11 9126 rs +Ethernet96 153,154,155,156 200000 12 9126 rs +Ethernet104 145,146,147,148 200000 13 9126 rs +Ethernet112 137,138,139,140 200000 14 9126 rs +Ethernet120 129,130,131,132 200000 15 9126 rs +Ethernet128 121,122,123,124 200000 16 9126 rs +Ethernet136 113,114,115,116 200000 17 9126 rs +Ethernet144 97,98,99,100 200000 18 9126 rs +Ethernet152 105,106,107,108 200000 19 9126 rs +Ethernet160 81,82,83,84 200000 20 9126 rs +Ethernet168 89,90,91,92 200000 21 9126 rs +Ethernet176 65,66,67,68 200000 22 9126 rs +Ethernet184 73,74,75,76 200000 23 9126 rs +Ethernet192 49,50,51,52 200000 24 9126 rs +Ethernet200 57,58,59,60 200000 25 9126 rs +Ethernet208 33,34,35,36 200000 26 9126 rs +Ethernet216 41,42,43,44 200000 27 9126 rs +Ethernet224 17,18,19,20 200000 28 9126 rs +Ethernet232 25,26,27,28 200000 29 9126 rs +Ethernet240 1,2,3,4 200000 30 9126 rs +Ethernet248 9,10,11,12 200000 31 9126 rs +Ethernet256 257 10000 32 9126 none +Ethernet257 258 10000 33 9126 none diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos.json.j2 new file mode 100755 index 000000000000..6c734d46ff2f --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 32 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x200/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers.json.j2 new file mode 100644 index 000000000000..4fca9cbcd156 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 32 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/config_32x400G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/config_32x400G_Delta-et-c032if.yaml new file mode 100755 index 000000000000..2ba23d2a5a67 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/config_32x400G_Delta-et-c032if.yaml @@ -0,0 +1,429 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/inno.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/inno.config.yaml new file mode 100755 index 000000000000..360b5af8e602 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/innovium.77700_A b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/innovium.77700_A new file mode 100644 index 000000000000..84aa41983606 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/innovium.77700_B b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/port_config.ini new file mode 100755 index 000000000000..360e363f485b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/port_config.ini @@ -0,0 +1,35 @@ +# name lanes speed index mtu fec +Ethernet0 249,250,251,252 400000 0 9126 rs +Ethernet8 241,242,243,244 400000 1 9126 rs +Ethernet16 233,234,235,236 400000 2 9126 rs +Ethernet24 225,226,227,228 400000 3 9126 rs +Ethernet32 217,218,219,220 400000 4 9126 rs +Ethernet40 209,210,211,212 400000 5 9126 rs +Ethernet48 201,202,203,204 400000 6 9126 rs +Ethernet56 193,194,195,196 400000 7 9126 rs +Ethernet64 185,186,187,188 400000 8 9126 rs +Ethernet72 177,178,179,180 400000 9 9126 rs +Ethernet80 169,170,171,172 400000 10 9126 rs +Ethernet88 161,162,163,164 400000 11 9126 rs +Ethernet96 153,154,155,156 400000 12 9126 rs +Ethernet104 145,146,147,148 400000 13 9126 rs +Ethernet112 137,138,139,140 400000 14 9126 rs +Ethernet120 129,130,131,132 400000 15 9126 rs +Ethernet128 121,122,123,124 400000 16 9126 rs +Ethernet136 113,114,115,116 400000 17 9126 rs +Ethernet144 97,98,99,100 400000 18 9126 rs +Ethernet152 105,106,107,108 400000 19 9126 rs +Ethernet160 81,82,83,84 400000 20 9126 rs +Ethernet168 89,90,91,92 400000 21 9126 rs +Ethernet176 65,66,67,68 400000 22 9126 rs +Ethernet184 73,74,75,76 400000 23 9126 rs +Ethernet192 49,50,51,52 400000 24 9126 rs +Ethernet200 57,58,59,60 400000 25 9126 rs +Ethernet208 33,34,35,36 400000 26 9126 rs +Ethernet216 41,42,43,44 400000 27 9126 rs +Ethernet224 17,18,19,20 400000 28 9126 rs +Ethernet232 25,26,27,28 400000 29 9126 rs +Ethernet240 1,2,3,4 400000 30 9126 rs +Ethernet248 9,10,11,12 400000 31 9126 rs +Ethernet256 257 10000 32 9126 none +Ethernet257 258 10000 33 9126 none diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos.json.j2 new file mode 100755 index 000000000000..6c734d46ff2f --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 32 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_32x400/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers.json.j2 new file mode 100644 index 000000000000..45cebf3b7144 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 64 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/config_64x100G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/config_64x100G_Delta-et-c032if.yaml new file mode 100755 index 000000000000..e5fbcc93543d --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/config_64x100G_Delta-et-c032if.yaml @@ -0,0 +1,653 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KRFEC" + id: "253" + lanes: "4:4" + serdes_group: "31" + speed: "100G" + sysport: "253" + type: "eth" + - fec: "KRFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KRFEC" + id: "245" + lanes: "4:4" + serdes_group: "30" + speed: "100G" + sysport: "245" + type: "eth" + - fec: "KRFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + - fec: "KRFEC" + id: "237" + lanes: "4:4" + serdes_group: "29" + speed: "100G" + sysport: "237" + type: "eth" + - fec: "KRFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KRFEC" + id: "229" + lanes: "4:4" + serdes_group: "28" + speed: "100G" + sysport: "229" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "221" + lanes: "4:4" + serdes_group: "27" + speed: "100G" + sysport: "221" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "213" + lanes: "4:4" + serdes_group: "26" + speed: "100G" + sysport: "213" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "205" + lanes: "4:4" + serdes_group: "25" + speed: "100G" + sysport: "205" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "197" + lanes: "4:4" + serdes_group: "24" + speed: "100G" + sysport: "197" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "189" + lanes: "4:4" + serdes_group: "23" + speed: "100G" + sysport: "189" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "181" + lanes: "4:4" + serdes_group: "22" + speed: "100G" + sysport: "181" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "173" + lanes: "4:4" + serdes_group: "21" + speed: "100G" + sysport: "173" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "165" + lanes: "4:4" + serdes_group: "20" + speed: "100G" + sysport: "165" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "157" + lanes: "4:4" + serdes_group: "19" + speed: "100G" + sysport: "157" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "149" + lanes: "4:4" + serdes_group: "18" + speed: "100G" + sysport: "149" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "141" + lanes: "4:4" + serdes_group: "17" + speed: "100G" + sysport: "141" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "133" + lanes: "4:4" + serdes_group: "16" + speed: "100G" + sysport: "133" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "125" + lanes: "4:4" + serdes_group: "15" + speed: "100G" + sysport: "125" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "100G" + sysport: "117" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "101" + lanes: "4:4" + serdes_group: "12" + speed: "100G" + sysport: "101" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "100G" + sysport: "109" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "100G" + sysport: "85" + type: "eth" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "100G" + sysport: "93" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "69" + lanes: "4:4" + serdes_group: "8" + speed: "100G" + sysport: "69" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "77" + lanes: "4:4" + serdes_group: "9" + speed: "100G" + sysport: "77" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "53" + lanes: "4:4" + serdes_group: "6" + speed: "100G" + sysport: "53" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "61" + lanes: "4:4" + serdes_group: "7" + speed: "100G" + sysport: "61" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "100G" + sysport: "37" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "45" + lanes: "4:4" + serdes_group: "5" + speed: "100G" + sysport: "45" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "100G" + sysport: "21" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "100G" + sysport: "29" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "100G" + sysport: "5" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KRFEC" + id: "13" + lanes: "4:4" + serdes_group: "1" + speed: "100G" + sysport: "13" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/inno.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/inno.config.yaml new file mode 100755 index 000000000000..d44c7bc0bc28 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x100G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/innovium.77700_B b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/port_config.ini new file mode 100644 index 000000000000..9999a677da49 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/port_config.ini @@ -0,0 +1,67 @@ +# name lanes speed index mtu +Ethernet0 249,250,251,252 100000 0 9126 +Ethernet4 253,254,255,256 100000 0 9126 +Ethernet8 241,242,243,244 100000 1 9126 +Ethernet12 245,246,247,248 100000 1 9126 +Ethernet16 233,234,235,236 100000 2 9126 +Ethernet20 237,238,239,240 100000 2 9126 +Ethernet24 225,226,227,228 100000 3 9126 +Ethernet28 229,230,231,232 100000 3 9126 +Ethernet32 217,218,219,220 100000 4 9126 +Ethernet36 221,222,223,224 100000 4 9126 +Ethernet40 209,210,211,212 100000 5 9126 +Ethernet44 213,214,215,216 100000 5 9126 +Ethernet48 201,202,203,204 100000 6 9126 +Ethernet52 205,206,207,208 100000 6 9126 +Ethernet56 193,194,195,196 100000 7 9126 +Ethernet60 197,198,199,200 100000 7 9126 +Ethernet64 185,186,187,188 100000 8 9126 +Ethernet68 189,190,191,192 100000 8 9126 +Ethernet72 177,178,179,180 100000 9 9126 +Ethernet76 181,182,183,184 100000 9 9126 +Ethernet80 169,170,171,172 100000 10 9126 +Ethernet84 173,174,175,176 100000 10 9126 +Ethernet88 161,162,163,164 100000 11 9126 +Ethernet92 165,166,167,168 100000 11 9126 +Ethernet96 153,154,155,156 100000 12 9126 +Ethernet100 157,158,159,160 100000 12 9126 +Ethernet104 145,146,147,148 100000 13 9126 +Ethernet108 149,150,151,152 100000 13 9126 +Ethernet112 137,138,139,140 100000 14 9126 +Ethernet116 141,142,143,144 100000 14 9126 +Ethernet120 129,130,131,132 100000 15 9126 +Ethernet124 133,134,135,136 100000 15 9126 +Ethernet128 121,122,123,124 100000 16 9126 +Ethernet132 125,126,127,128 100000 16 9126 +Ethernet136 113,114,115,116 100000 17 9126 +Ethernet140 117,118,119,120 100000 17 9126 +Ethernet144 97,98,99,100 100000 18 9126 +Ethernet148 101,102,103,104 100000 18 9126 +Ethernet152 105,106,107,108 100000 19 9126 +Ethernet156 109,110,111,112 100000 19 9126 +Ethernet160 81,82,83,84 100000 20 9126 +Ethernet164 85,86,87,88 100000 20 9126 +Ethernet168 89,90,91,92 100000 21 9126 +Ethernet172 93,94,95,96 100000 21 9126 +Ethernet176 65,66,67,68 100000 22 9126 +Ethernet180 69,70,71,72 100000 22 9126 +Ethernet184 73,74,75,76 100000 23 9126 +Ethernet188 77,78,79,80 100000 23 9126 +Ethernet192 49,50,51,52 100000 24 9126 +Ethernet196 53,54,55,56 100000 24 9126 +Ethernet200 57,58,59,60 100000 25 9126 +Ethernet204 61,62,63,64 100000 25 9126 +Ethernet208 33,34,35,36 100000 26 9126 +Ethernet212 37,38,39,40 100000 26 9126 +Ethernet216 41,42,43,44 100000 27 9126 +Ethernet220 45,46,47,48 100000 27 9126 +Ethernet224 17,18,19,20 100000 28 9126 +Ethernet228 21,22,23,24 100000 28 9126 +Ethernet232 25,26,27,28 100000 29 9126 +Ethernet236 29,30,31,32 100000 29 9126 +Ethernet240 1,2,3,4 100000 30 9126 +Ethernet244 5,6,7,8 100000 30 9126 +Ethernet248 9,10,11,12 100000 31 9126 +Ethernet252 13,14,15,16 100000 31 9126 +Ethernet256 257 10000 32 9126 +Ethernet257 258 10000 33 9126 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos.json.j2 new file mode 100755 index 000000000000..16f9b42a2166 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 64 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers.json.j2 new file mode 100644 index 000000000000..45cebf3b7144 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/buffers.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '300m' %} +{% set default_ports_num = 64 -%} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) -%} + {%- set cable_len = [] -%} + {%- for local_port in DEVICE_NEIGHBOR -%} + {%- if local_port == port_name -%} + {%- if DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] -%} + {%- set neighbor_role = neighbor.type -%} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role -%} + {%- set roles1 = roles1 | lower -%} + {%- set roles2 = roles2 | lower -%} + {%- if roles1 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles1]) -%}{%- endif -%} + {%- elif roles2 in ports2cable -%} + {%- if cable_len.append(ports2cable[roles2]) -%}{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif -%} +{% endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "egress_lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"1433600", + "size":"1518", + "dynamic_th":"-4", + "xon_offset":"6272" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"0", + "static_th":"9721600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|egress_lossy_pool]", + "size":"1518", + "dynamic_th":"3" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|4-5": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|0-3": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|6-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/config_64x200G_Delta-et-c032if.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/config_64x200G_Delta-et-c032if.yaml new file mode 100755 index 000000000000..4b75a205ab5c --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/config_64x200G_Delta-et-c032if.yaml @@ -0,0 +1,653 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "200G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "253" + lanes: "4:4" + serdes_group: "31" + speed: "200G" + sysport: "253" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "200G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "245" + lanes: "4:4" + serdes_group: "30" + speed: "200G" + sysport: "245" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "200G" + sysport: "233" + type: "eth" + - fec: "KPFEC" + id: "237" + lanes: "4:4" + serdes_group: "29" + speed: "200G" + sysport: "237" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "200G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "229" + lanes: "4:4" + serdes_group: "28" + speed: "200G" + sysport: "229" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "200G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "221" + lanes: "4:4" + serdes_group: "27" + speed: "200G" + sysport: "221" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "200G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "213" + lanes: "4:4" + serdes_group: "26" + speed: "200G" + sysport: "213" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "200G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "205" + lanes: "4:4" + serdes_group: "25" + speed: "200G" + sysport: "205" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "200G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "197" + lanes: "4:4" + serdes_group: "24" + speed: "200G" + sysport: "197" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "200G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "189" + lanes: "4:4" + serdes_group: "23" + speed: "200G" + sysport: "189" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "200G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "181" + lanes: "4:4" + serdes_group: "22" + speed: "200G" + sysport: "181" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "200G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "173" + lanes: "4:4" + serdes_group: "21" + speed: "200G" + sysport: "173" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "200G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "165" + lanes: "4:4" + serdes_group: "20" + speed: "200G" + sysport: "165" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "200G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "157" + lanes: "4:4" + serdes_group: "19" + speed: "200G" + sysport: "157" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "200G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "149" + lanes: "4:4" + serdes_group: "18" + speed: "200G" + sysport: "149" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "200G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "141" + lanes: "4:4" + serdes_group: "17" + speed: "200G" + sysport: "141" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "200G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "133" + lanes: "4:4" + serdes_group: "16" + speed: "200G" + sysport: "133" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "200G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "125" + lanes: "4:4" + serdes_group: "15" + speed: "200G" + sysport: "125" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "200G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "117" + lanes: "4:4" + serdes_group: "14" + speed: "200G" + sysport: "117" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "200G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "101" + lanes: "4:4" + serdes_group: "12" + speed: "200G" + sysport: "101" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "200G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "109" + lanes: "4:4" + serdes_group: "13" + speed: "200G" + sysport: "109" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "200G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "85" + lanes: "4:4" + serdes_group: "10" + speed: "200G" + sysport: "85" + type: "eth" + - fec: "KPFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "200G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "93" + lanes: "4:4" + serdes_group: "11" + speed: "200G" + sysport: "93" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "200G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "69" + lanes: "4:4" + serdes_group: "8" + speed: "200G" + sysport: "69" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "200G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "77" + lanes: "4:4" + serdes_group: "9" + speed: "200G" + sysport: "77" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "200G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "53" + lanes: "4:4" + serdes_group: "6" + speed: "200G" + sysport: "53" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "200G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "61" + lanes: "4:4" + serdes_group: "7" + speed: "200G" + sysport: "61" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "200G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "37" + lanes: "4:4" + serdes_group: "4" + speed: "200G" + sysport: "37" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "200G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "45" + lanes: "4:4" + serdes_group: "5" + speed: "200G" + sysport: "45" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "200G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "21" + lanes: "4:4" + serdes_group: "2" + speed: "200G" + sysport: "21" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "200G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "29" + lanes: "4:4" + serdes_group: "3" + speed: "200G" + sysport: "29" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "200G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "5" + lanes: "4:4" + serdes_group: "0" + speed: "200G" + sysport: "5" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "200G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "13" + lanes: "4:4" + serdes_group: "1" + speed: "200G" + sysport: "13" + type: "eth" + - fec: "NONE" + id: "257" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - fec: "NONE" + id: "258" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "0" + tx_polarity: "01010101" + rx_polarity: "01100000" + lane_swap: "23641075" + - id: "1" + tx_polarity: "10110000" + rx_polarity: "11111111" + lane_swap: "64317520" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000011" + lane_swap: "63147520" + - id: "3" + tx_polarity: "01101000" + rx_polarity: "00001110" + lane_swap: "31572046" + - id: "4" + tx_polarity: "00111000" + rx_polarity: "00001000" + lane_swap: "46105732" + - id: "5" + tx_polarity: "10111111" + rx_polarity: "11101000" + lane_swap: "27153604" + - id: "6" + tx_polarity: "01101110" + rx_polarity: "00001101" + lane_swap: "46503721" + - id: "7" + tx_polarity: "01000100" + rx_polarity: "10000101" + lane_swap: "03671245" + - id: "8" + tx_polarity: "01110101" + rx_polarity: "00010000" + lane_swap: "12640375" + - id: "9" + tx_polarity: "01011100" + rx_polarity: "11001111" + lane_swap: "02561347" + - id: "10" + tx_polarity: "01110110" + rx_polarity: "11000000" + lane_swap: "12740365" + - id: "11" + tx_polarity: "00111000" + rx_polarity: "00010111" + lane_swap: "01572436" + - id: "12" + tx_polarity: "00001111" + rx_polarity: "10111001" + lane_swap: "54320176" + - id: "13" + tx_polarity: "10011101" + rx_polarity: "00111011" + lane_swap: "26153704" + - id: "14" + tx_polarity: "00110000" + rx_polarity: "11010000" + lane_swap: "37452601" + - id: "15" + tx_polarity: "11100010" + rx_polarity: "01110011" + lane_swap: "51370462" + - id: "16" + tx_polarity: "10111010" + rx_polarity: "11010011" + lane_swap: "36152704" + - id: "17" + tx_polarity: "01011101" + rx_polarity: "00110001" + lane_swap: "45621073" + - id: "18" + tx_polarity: "11011111" + rx_polarity: "11001011" + lane_swap: "26143705" + - id: "19" + tx_polarity: "00100110" + rx_polarity: "00001001" + lane_swap: "42730165" + - id: "20" + tx_polarity: "10011011" + rx_polarity: "01101101" + lane_swap: "54217603" + - id: "21" + tx_polarity: "00101110" + rx_polarity: "10111111" + lane_swap: "26031745" + - id: "22" + tx_polarity: "01001110" + rx_polarity: "00111001" + lane_swap: "36024715" + - id: "23" + tx_polarity: "10101101" + rx_polarity: "01010011" + lane_swap: "45621370" + - id: "24" + tx_polarity: "11001110" + rx_polarity: "00011111" + lane_swap: "65234701" + - id: "25" + tx_polarity: "01110001" + rx_polarity: "01010111" + lane_swap: "37601452" + - id: "26" + tx_polarity: "01000100" + rx_polarity: "00001111" + lane_swap: "65034721" + - id: "27" + tx_polarity: "10111101" + rx_polarity: "11000101" + lane_swap: "34501672" + - id: "28" + tx_polarity: "01111000" + rx_polarity: "01110110" + lane_swap: "43061275" + - id: "29" + tx_polarity: "11110111" + rx_polarity: "11100111" + lane_swap: "57304621" + - id: "30" + tx_polarity: "10000100" + rx_polarity: "00101111" + lane_swap: "47125603" + - id: "31" + tx_polarity: "11111111" + rx_polarity: "11100010" + lane_swap: "13460275" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/inno.config.yaml b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/inno.config.yaml new file mode 100755 index 000000000000..f68930c37ef4 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/inno.config.yaml @@ -0,0 +1,7 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_64x200G_Delta-et-c032if.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +ULIMIT : "65536" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/innovium.77700_B b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/innovium.77700_B new file mode 100644 index 000000000000..27297b313959 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/port_config.ini b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/port_config.ini new file mode 100644 index 000000000000..726e1a377d83 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/port_config.ini @@ -0,0 +1,67 @@ +# name lanes speed index mtu +Ethernet0 249,250,251,252 200000 0 9126 +Ethernet4 253,254,255,256 200000 0 9126 +Ethernet8 241,242,243,244 200000 1 9126 +Ethernet12 245,246,247,248 200000 1 9126 +Ethernet16 233,234,235,236 200000 2 9126 +Ethernet20 237,238,239,240 200000 2 9126 +Ethernet24 225,226,227,228 200000 3 9126 +Ethernet28 229,230,231,232 200000 3 9126 +Ethernet32 217,218,219,220 200000 4 9126 +Ethernet36 221,222,223,224 200000 4 9126 +Ethernet40 209,210,211,212 200000 5 9126 +Ethernet44 213,214,215,216 200000 5 9126 +Ethernet48 201,202,203,204 200000 6 9126 +Ethernet52 205,206,207,208 200000 6 9126 +Ethernet56 193,194,195,196 200000 7 9126 +Ethernet60 197,198,199,200 200000 7 9126 +Ethernet64 185,186,187,188 200000 8 9126 +Ethernet68 189,190,191,192 200000 8 9126 +Ethernet72 177,178,179,180 200000 9 9126 +Ethernet76 181,182,183,184 200000 9 9126 +Ethernet80 169,170,171,172 200000 10 9126 +Ethernet84 173,174,175,176 200000 10 9126 +Ethernet88 161,162,163,164 200000 11 9126 +Ethernet92 165,166,167,168 200000 11 9126 +Ethernet96 153,154,155,156 200000 12 9126 +Ethernet100 157,158,159,160 200000 12 9126 +Ethernet104 145,146,147,148 200000 13 9126 +Ethernet108 149,150,151,152 200000 13 9126 +Ethernet112 137,138,139,140 200000 14 9126 +Ethernet116 141,142,143,144 200000 14 9126 +Ethernet120 129,130,131,132 200000 15 9126 +Ethernet124 133,134,135,136 200000 15 9126 +Ethernet128 121,122,123,124 200000 16 9126 +Ethernet132 125,126,127,128 200000 16 9126 +Ethernet136 113,114,115,116 200000 17 9126 +Ethernet140 117,118,119,120 200000 17 9126 +Ethernet144 97,98,99,100 200000 18 9126 +Ethernet148 101,102,103,104 200000 18 9126 +Ethernet152 105,106,107,108 200000 19 9126 +Ethernet156 109,110,111,112 200000 19 9126 +Ethernet160 81,82,83,84 200000 20 9126 +Ethernet164 85,86,87,88 200000 20 9126 +Ethernet168 89,90,91,92 200000 21 9126 +Ethernet172 93,94,95,96 200000 21 9126 +Ethernet176 65,66,67,68 200000 22 9126 +Ethernet180 69,70,71,72 200000 22 9126 +Ethernet184 73,74,75,76 200000 23 9126 +Ethernet188 77,78,79,80 200000 23 9126 +Ethernet192 49,50,51,52 200000 24 9126 +Ethernet196 53,54,55,56 200000 24 9126 +Ethernet200 57,58,59,60 200000 25 9126 +Ethernet204 61,62,63,64 200000 25 9126 +Ethernet208 33,34,35,36 200000 26 9126 +Ethernet212 37,38,39,40 200000 26 9126 +Ethernet216 41,42,43,44 200000 27 9126 +Ethernet220 45,46,47,48 200000 27 9126 +Ethernet224 17,18,19,20 200000 28 9126 +Ethernet228 21,22,23,24 200000 28 9126 +Ethernet232 25,26,27,28 200000 29 9126 +Ethernet236 29,30,31,32 200000 29 9126 +Ethernet240 1,2,3,4 200000 30 9126 +Ethernet244 5,6,7,8 200000 30 9126 +Ethernet248 9,10,11,12 200000 31 9126 +Ethernet252 13,14,15,16 200000 31 9126 +Ethernet256 257 10000 32 9126 +Ethernet257 258 10000 33 9126 diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos.json.j2 b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos.json.j2 new file mode 100755 index 000000000000..16f9b42a2166 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/qos.json.j2 @@ -0,0 +1,120 @@ +{# Default values which will be used if no actual configura available #} + +{% set default_ports_num = 64 -%} +{# Generate list of ports if not defined #} +{% if PORT is not defined %} + {% set PORT = [] %} + {% for port_idx in range(0,default_ports_num) %} + {% if PORT.append("Ethernet%d" % (port_idx*4)) %}{% endif %} + {% endfor %} +{% endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "1":"1", + "0":"0", + "3":"3", + "2":"2", + "5":"5", + "4":"4", + "7":"7", + "6":"6" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "1": "0", + "0": "0", + "3": "0", + "2": "0", + "4": "1", + "5": "2", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"4", + "5":"5", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP:AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP:AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP:AZURE]", + "pfc_enable": "4,5" + } + } +} diff --git a/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/sai.profile b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/sai.profile new file mode 100755 index 000000000000..0769b3063a12 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/Delta-et-c032if_64x200/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/inno.config.yaml diff --git a/device/delta/x86_64-delta_et-c032if-r0/default_sku b/device/delta/x86_64-delta_et-c032if-r0/default_sku new file mode 100644 index 000000000000..92740942d0e9 --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/default_sku @@ -0,0 +1 @@ +Delta-et-c032if t1 diff --git a/device/delta/x86_64-delta_et-c032if-r0/installer.conf b/device/delta/x86_64-delta_et-c032if-r0/installer.conf new file mode 100644 index 000000000000..925a32fc0c3a --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/delta/x86_64-delta_et-c032if-r0/led_proc_init.soc b/device/delta/x86_64-delta_et-c032if-r0/led_proc_init.soc new file mode 100644 index 000000000000..4173de277f6b --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/led_proc_init.soc @@ -0,0 +1,10 @@ +#ET_C032IF Port_Remap +# Vlan set and port enable + +# led0 port order remap + +#ET_C032IF_LED + +#-------------------------------------------------------------------------------------------------- +#LED Auto link/up + diff --git a/device/delta/x86_64-delta_et-c032if-r0/plugins/eeprom.py b/device/delta/x86_64-delta_et-c032if-r0/plugins/eeprom.py new file mode 100644 index 000000000000..1a624414637c --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/plugins/eeprom.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, 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): + self.eeprom_path = "/sys/devices/pci0000:00/0000:00:1f.3/i2c-0/i2c-10/10-0053/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/delta/x86_64-delta_et-c032if-r0/plugins/psuutil.py b/device/delta/x86_64-delta_et-c032if-r0/plugins/psuutil.py new file mode 100644 index 000000000000..80383aaffddf --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/plugins/psuutil.py @@ -0,0 +1,78 @@ +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# + +import os.path +import subprocess + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + self.psu_status = "ipmitool raw 0x38 0x1 {} 0x50" + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + status = 0 + try: + p = os.popen("ipmitool raw 0x38 0x2 7 0x32 0x28 1") + content = p.readline().rstrip() + reg_value = int(content, 16) + mask = (1 << (8 - index)) + if reg_value & mask == 0: + return False + status = 1 + p.close() + except IOError: + return False + return status == 1 + + + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + status = 0 + try: + p = os.popen(self.psu_status.format(index - 1)) + content = p.readline().rstrip() + reg_value = int(content, 16) + if reg_value != 0: + return False + status = 1 + p.close() + except IOError: + return False + return status == 1 + diff --git a/device/delta/x86_64-delta_et-c032if-r0/plugins/sfputil.py b/device/delta/x86_64-delta_et-c032if-r0/plugins/sfputil.py new file mode 100644 index 000000000000..4802c3a8f0ce --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/plugins/sfputil.py @@ -0,0 +1,255 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + import datetime + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_START_SFP = 32 + PORT_END = 33 + PORTS_IN_BLOCK = 34 + + EEPROM_OFFSET = 1 + + _port_to_eeprom_mapping = {} + port_dict = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_start_sfp(self): + return self.PORT_START_SFP + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(0, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + @property + def get_transceiver_status(self): + + try: + reg_file = open("/sys/devices/platform/delta-et-c032if-cpld.0/sfp_is_present") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + reg_file.close() + + return int(content, 16) + + + def __init__(self): + eeprom_path = "/sys/kernel/sfp/eeprom_sfp_{0}" + + for x in range(0, self.port_end + 1): + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + self.modprs_register = self.get_transceiver_status + SfpUtilBase.__init__(self) + + 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 + + try: + reg_file = open("/sys/devices/platform/delta-et-c032if-cpld.0/sfp_is_present") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (self.port_end - port_num + 6)) + + # ModPrsL is active low + if reg_value & mask == 0: + return True + + 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 - 2: + return False + + try: + reg_file = open("/sys/devices/platform/delta-et-c032if-cpld.0/sfp_lp_mode") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (self.port_end - port_num) - 2) + + # LPMode is active high + if reg_value & mask == 0: + 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 - 2: + return False + + try: + reg_file = open("/sys/devices/platform/delta-et-c032if-cpld.0/sfp_lp_mode", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (self.port_end - port_num) - 2) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = reg_value | mask + else: + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value).rstrip("L") or "0" + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/delta-et-c032if-cpld.0/sfp_reset" + + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end - 2: + return False + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # File content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Mask off the bit corresponding to our port + mask = (1 << (self.port_end - port_num) - 2) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "w") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value)) + reg_file.close() + + return True + + def get_transceiver_change_event(self, timeout=0): + start_time = time.time() + port_dict = {} + port = self.port_start + forever = False + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print "get_transceiver_change_event:Invalid timeout value", timeout + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print 'get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout + + return False, {} # Time wrap or possibly incorrect timeout + while timeout >= 0: + # Check for OIR events and return updated port_dict + reg_value = self.get_transceiver_status + if reg_value != self.modprs_register: + changed_ports = self.modprs_register ^ reg_value + while port >= self.port_start and port <= self.port_end: + + # Mask off the bit corresponding to our port + mask = (1 << (self.port_end - port + 6)) + + if changed_ports & mask: + # ModPrsL is active low + if reg_value & mask == 0: + port_dict[port] = '1' + else: + port_dict[port] = '0' + + port += 1 + + # Update reg value + self.modprs_register = reg_value + return True, port_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, {} + print "get_transceiver_change_event: Should not reach here." + return False, {} diff --git a/device/delta/x86_64-delta_et-c032if-r0/sensors.conf b/device/delta/x86_64-delta_et-c032if-r0/sensors.conf new file mode 100644 index 000000000000..db34a541b26f --- /dev/null +++ b/device/delta/x86_64-delta_et-c032if-r0/sensors.conf @@ -0,0 +1,4 @@ +# libsensors configuration file for DELTA-ET-C032IF +# ------------------------------------------------ +# + diff --git a/dockers/docker-orchagent/orchagent.sh b/dockers/docker-orchagent/orchagent.sh index a94916d351fa..5e01cd480f52 100755 --- a/dockers/docker-orchagent/orchagent.sh +++ b/dockers/docker-orchagent/orchagent.sh @@ -31,6 +31,8 @@ elif [ "$platform" == "vs" ]; then ORCHAGENT_ARGS+="-m $MAC_ADDRESS" elif [ "$platform" == "mellanox" ]; then ORCHAGENT_ARGS+="" +elif [ "$platform" == "innovium" ]; then + ORCHAGENT_ARGS+="-m $MAC_ADDRESS" else MAC_ADDRESS=`sonic-cfggen -d -v 'DEVICE_METADATA.localhost.mac'` ORCHAGENT_ARGS+="-m $MAC_ADDRESS" diff --git a/dockers/docker-snmp-sv2/Dockerfile.j2 b/dockers/docker-snmp-sv2/Dockerfile.j2 index 371bd17e2553..fd379c56d5cd 100644 --- a/dockers/docker-snmp-sv2/Dockerfile.j2 +++ b/dockers/docker-snmp-sv2/Dockerfile.j2 @@ -22,7 +22,8 @@ RUN apt-get update && \ ca-certificates \ gcc \ make \ - libdpkg-perl + libdpkg-perl \ + ipmitool {% if docker_snmp_sv2_debs.strip() -%} # Copy locally-built Debian package dependencies diff --git a/platform/innovium/docker-ptf-invm.mk b/platform/innovium/docker-ptf-invm.mk new file mode 100755 index 000000000000..6c81734676fd --- /dev/null +++ b/platform/innovium/docker-ptf-invm.mk @@ -0,0 +1,7 @@ +# docker image for docker-ptf-invm + +DOCKER_PTF_INVM = docker-ptf-invm.gz +$(DOCKER_PTF_INVM)_PATH = $(DOCKERS_PATH)/docker-ptf-saithrift +$(DOCKER_PTF_INVM)_DEPENDS += $(PYTHON_SAITHRIFT_INVM) +$(DOCKER_PTF_INVM)_LOAD_DOCKERS += $(DOCKER_PTF) +SONIC_DOCKER_IMAGES += $(DOCKER_PTF_INVM) diff --git a/platform/innovium/docker-syncd-invm-rpc.mk b/platform/innovium/docker-syncd-invm-rpc.mk new file mode 100755 index 000000000000..313f0d12ac20 --- /dev/null +++ b/platform/innovium/docker-syncd-invm-rpc.mk @@ -0,0 +1,17 @@ +# docker image for innovium syncd with rpc + +DOCKER_SYNCD_INVM_RPC = docker-syncd-invm-rpc.gz +$(DOCKER_SYNCD_INVM_RPC)_PATH = $(PLATFORM_PATH)/docker-syncd-invm-rpc +$(DOCKER_SYNCD_INVM_RPC)_DEPENDS += $(SYNCD_RPC) $(LIBTHRIFT) $(INVM_LIBSAI) +$(DOCKER_SYNCD_INVM_RPC)_LOAD_DOCKERS += $(DOCKER_SYNCD_BASE) +SONIC_DOCKER_IMAGES += $(DOCKER_SYNCD_INVM_RPC) +ifeq ($(ENABLE_SYNCD_RPC),y) +SONIC_INSTALL_DOCKER_IMAGES += $(DOCKER_SYNCD_INVM_RPC) +endif + +$(DOCKER_SYNCD_INVM_RPC)_CONTAINER_NAME = syncd +$(DOCKER_SYNCD_INVM_RPC)_RUN_OPT += --net=host --privileged -t +$(DOCKER_SYNCD_INVM_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_INVM_RPC)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd +$(DOCKER_SYNCD_INVM_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_SYNCD_INVM_RPC)_RUN_OPT += -v /host/warmboot:/var/warmboot diff --git a/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 b/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 new file mode 100755 index 000000000000..af31d587b90a --- /dev/null +++ b/platform/innovium/docker-syncd-invm-rpc/Dockerfile.j2 @@ -0,0 +1,53 @@ +FROM docker-syncd-invm + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +COPY \ +{% for deb in docker_syncd_invm_rpc_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +RUN dpkg -P syncd + +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; } ; \ +{% for deb in docker_syncd_invm_rpc_debs.split(' ') -%} +dpkg_apt debs/{{ deb }}{{'; '}} +{%- endfor %} + +## Pre-install the fundamental packages +RUN apt-get update \ + && apt-get -y install \ + net-tools \ + python-pip \ + build-essential \ + libssl-dev \ + libffi-dev \ + python-dev \ + libpython2.7 \ + libjansson4 \ + wget \ + cmake \ + && wget https://github.com/nanomsg/nanomsg/archive/1.0.0.tar.gz \ + && tar xvfz 1.0.0.tar.gz \ + && cd nanomsg-1.0.0 \ + && mkdir -p build \ + && cmake . \ + && make install \ + && ldconfig \ + && cd .. \ + && rm -fr nanomsg-1.0.0 \ + && rm -f 1.0.0.tar.gz \ + && pip install cffi==1.7.0 \ + && pip install --upgrade cffi==1.7.0 \ + && pip install nnpy \ + && mkdir -p /opt \ + && cd /opt \ + && wget https://raw.githubusercontent.com/p4lang/ptf/master/ptf_nn/ptf_nn_agent.py \ + && apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y \ + && rm -rf /root/deps + +COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"] + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/innovium/docker-syncd-invm-rpc/ptf_nn_agent.conf b/platform/innovium/docker-syncd-invm-rpc/ptf_nn_agent.conf new file mode 100755 index 000000000000..fa1ed0eb1622 --- /dev/null +++ b/platform/innovium/docker-syncd-invm-rpc/ptf_nn_agent.conf @@ -0,0 +1,10 @@ +[program:ptf_nn_agent] +command=/usr/bin/python /opt/ptf_nn_agent.py --device-socket 1@tcp://0.0.0.0:10900 -i 1-3@Ethernet12 --set-iface-rcv-buffer=109430400 +process_name=ptf_nn_agent +stdout_logfile=/tmp/ptf_nn_agent.out.log +stderr_logfile=/tmp/ptf_nn_agent.err.log +redirect_stderr=false +autostart=true +autorestart=true +startsecs=1 +numprocs=1 diff --git a/platform/innovium/docker-syncd-invm.mk b/platform/innovium/docker-syncd-invm.mk new file mode 100755 index 000000000000..3ba35c5edb97 --- /dev/null +++ b/platform/innovium/docker-syncd-invm.mk @@ -0,0 +1,13 @@ +# docker image for innovium syncd + +DOCKER_SYNCD_PLATFORM_CODE = invm +include $(PLATFORM_PATH)/../template/docker-syncd-base.mk + +$(DOCKER_SYNCD_BASE)_DEPENDS += $(SYNCD) $(PYTHON_SDK_API) $(INVM_LIBSAI) + +$(DOCKER_SYNCD_BASE)_DBG_DEPENDS += $(SYNCD_DBG) \ + $(LIBSWSSCOMMON_DBG) \ + $(LIBSAIMETADATA_DBG) \ + $(LIBSAIREDIS_DBG) + +$(DOCKER_SYNCD_BASE)_RUN_OPT += -v /host/warmboot:/var/warmboot diff --git a/platform/innovium/docker-syncd-invm/Dockerfile.j2 b/platform/innovium/docker-syncd-invm/Dockerfile.j2 new file mode 100755 index 000000000000..6f6f5eca9b60 --- /dev/null +++ b/platform/innovium/docker-syncd-invm/Dockerfile.j2 @@ -0,0 +1,34 @@ +FROM docker-config-engine-stretch + +ARG docker_container_name +RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf + +## Make apt-get non-interactive +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update + +COPY \ +{% for deb in docker_syncd_invm_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor -%} +debs/ + +# Needed for Innovium Debug Shell +RUN apt-get install -y net-tools +RUN apt-get install -y libpython2.7 +RUN apt-get install -y libjansson4 + +RUN dpkg -i \ +{% for deb in docker_syncd_invm_debs.split(' ') -%} +debs/{{ deb }}{{' '}} +{%- endfor %} + +COPY ["start.sh", "/usr/bin/"] +COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] + +## Clean up +RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y +RUN rm -rf /debs + +ENTRYPOINT ["/usr/bin/supervisord"] diff --git a/platform/innovium/docker-syncd-invm/start.sh b/platform/innovium/docker-syncd-invm/start.sh new file mode 100755 index 000000000000..623316050475 --- /dev/null +++ b/platform/innovium/docker-syncd-invm/start.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +rm -f /var/run/rsyslogd.pid + +supervisorctl start rsyslogd + +supervisorctl start syncd diff --git a/platform/innovium/docker-syncd-invm/supervisord.conf b/platform/innovium/docker-syncd-invm/supervisord.conf new file mode 100755 index 000000000000..1af5d70a1d0c --- /dev/null +++ b/platform/innovium/docker-syncd-invm/supervisord.conf @@ -0,0 +1,28 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:start.sh] +command=/usr/bin/start.sh +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:rsyslogd] +command=/usr/sbin/rsyslogd -n +priority=2 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +[program:syncd] +command=/usr/bin/syncd_start.sh +priority=3 +autostart=false +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog diff --git a/platform/innovium/invm-sai.mk b/platform/innovium/invm-sai.mk new file mode 100755 index 000000000000..31b7b82bf948 --- /dev/null +++ b/platform/innovium/invm-sai.mk @@ -0,0 +1,14 @@ +# INVM SAI + +INVM_SAI_ONLINE = https://github.com/Innovium/SONiC/tree/master/debian/master + +INVM_LIBSAI = isai.deb +INVM_HSAI = saihdr.deb +INVM_DRV = ipd.deb + +$(INVM_LIBSAI)_URL = $(INVM_SAI_ONLINE)/$(INVM_LIBSAI) +$(INVM_HSAI)_URL = $(INVM_SAI_ONLINE)/$(INVM_HSAI) +$(INVM_DRV)_URL = $(INVM_SAI_ONLINE)/$(INVM_DRV) + +SONIC_ONLINE_DEBS += $(INVM_LIBSAI) $(INVM_HSAI) $(INVM_DRV) +SONIC_STRETCH_DEBS += $(INVM_DRV) diff --git a/platform/innovium/libsaithrift-dev.mk b/platform/innovium/libsaithrift-dev.mk new file mode 100755 index 000000000000..5357705bac98 --- /dev/null +++ b/platform/innovium/libsaithrift-dev.mk @@ -0,0 +1,7 @@ +# libsaithrift-dev package + +LIBSAITHRIFT_DEV_INVM = libsaithrift-dev_0.9.4_$(CONFIGURED_ARCH).deb +$(LIBSAITHRIFT_DEV_INVM)_SRC_PATH = $(SRC_PATH)/sonic-sairedis/SAI +$(LIBSAITHRIFT_DEV_INVM)_DEPENDS += $(LIBTHRIFT) $(LIBTHRIFT_DEV) $(THRIFT_COMPILER) $(INVM_LIBSAI) $(INVM_HSAI) +$(LIBSAITHRIFT_DEV_INVM)_RDEPENDS += $(LIBTHRIFT) $(INVM_HSAI) +SONIC_DPKG_DEBS += $(LIBSAITHRIFT_DEV_INVM) diff --git a/platform/innovium/one-image.mk b/platform/innovium/one-image.mk new file mode 100755 index 000000000000..485f40c77652 --- /dev/null +++ b/platform/innovium/one-image.mk @@ -0,0 +1,10 @@ +# sonic innovium ONE image installer + +SONIC_ONE_IMAGE = sonic-innovium.bin +$(SONIC_ONE_IMAGE)_MACHINE = innovium +$(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(CEL_MIDSTONE_200I_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELTA_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_INSTALLS += $(INVM_DRV) +$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) +SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/innovium/platform-modules-cel.mk b/platform/innovium/platform-modules-cel.mk new file mode 100755 index 000000000000..b93bea758d71 --- /dev/null +++ b/platform/innovium/platform-modules-cel.mk @@ -0,0 +1,12 @@ +# Celestica platform modules + +CEL_PLATFORM_MODULE_VERSION = 0.2.2 + +export CEL_PLATFORM_MODULE_VERSION + +CEL_MIDSTONE_200I_PLATFORM_MODULE = platform-modules-midstone-200i_$(CEL_PLATFORM_MODULE_VERSION)_$(CONFIGURED_ARCH).deb +$(CEL_MIDSTONE_200I_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-cel +$(CEL_MIDSTONE_200I_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(CEL_MIDSTONE_200I_PLATFORM_MODULE)_PLATFORM = x86_64-cel_midstone-r0 +SONIC_DPKG_DEBS += $(CEL_MIDSTONE_200I_PLATFORM_MODULE) +SONIC_STRETCH_DEBS+= $(CEL_MIDSTONE_200I_PLATFORM_MODULE) diff --git a/platform/innovium/platform-modules-delta.mk b/platform/innovium/platform-modules-delta.mk new file mode 100644 index 000000000000..68e13fb8a8a4 --- /dev/null +++ b/platform/innovium/platform-modules-delta.mk @@ -0,0 +1,13 @@ +# Delta Platform modules + +DELTA_ETC032IF_PLATFORM_MODULE_VERSION = 1.1 + +export DELTA_ETC032IF_PLATFORM_MODULE_VERSION + +DELTA_PLATFORM_MODULE = platform-modules-et-c032if_$(DELTA_ETC032IF_PLATFORM_MODULE_VERSION)_$(CONFIGURED_ARCH).deb +$(DELTA_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-delta +$(DELTA_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(DELTA_PLATFORM_MODULE)_PLATFORM = x86_64-delta_et-c032if-r0 + +SONIC_DPKG_DEBS += $(DELTA_PLATFORM_MODULE) +SONIC_STRETCH_DEBS += $(DELTA_PLATFORM_MODULE) diff --git a/platform/innovium/platform.conf b/platform/innovium/platform.conf new file mode 100755 index 000000000000..e69de29bb2d1 diff --git a/platform/innovium/python-saithrift.mk b/platform/innovium/python-saithrift.mk new file mode 100755 index 000000000000..23d7df188346 --- /dev/null +++ b/platform/innovium/python-saithrift.mk @@ -0,0 +1,6 @@ +# python-saithrift package + +PYTHON_SAITHRIFT_INVM = python-saithrift_1.2.1_$(CONFIGURED_ARCH).deb +$(PYTHON_SAITHRIFT_INVM)_SRC_PATH = $(SRC_PATH)/SAI +$(PYTHON_SAITHRIFT_INVM)_DEPENDS += $(INVM_LIBSAI) $(INVM_HSAI) $(THRIFT_COMPILER) $(PYTHON_THRIFT) $(LIBTHRIFT_DEV) +SONIC_DPKG_DEBS += $(PYTHON_SAITHRIFT_INVM) diff --git a/platform/innovium/rules.mk b/platform/innovium/rules.mk new file mode 100755 index 000000000000..68a9dbb41040 --- /dev/null +++ b/platform/innovium/rules.mk @@ -0,0 +1,20 @@ +include $(PLATFORM_PATH)/invm-sai.mk +include $(PLATFORM_PATH)/platform-modules-cel.mk +include $(PLATFORM_PATH)/platform-modules-delta.mk +include $(PLATFORM_PATH)/docker-syncd-invm.mk +include $(PLATFORM_PATH)/docker-syncd-invm-rpc.mk +include $(PLATFORM_PATH)/one-image.mk +include $(PLATFORM_PATH)/libsaithrift-dev.mk +include $(PLATFORM_PATH)/python-saithrift.mk +include $(PLATFORM_PATH)/docker-ptf-invm.mk + +SONIC_ALL += $(SONIC_INVM_ONE_IMAGE) \ + $(DOCKER_FPM) \ + $(DOCKER_PTF_INVM) \ + $(DOCKER_SYNCD_INVM_RPC) + +# Inject invm sai into sairedis +$(LIBSAIREDIS)_DEPENDS += $(INVM_HSAI) $(INVM_LIBSAI) $(LIBSAITHRIFT_DEV_INVM) + +# Runtime dependency on invm sai is set only for syncd +$(SYNCD)_RDEPENDS += $(INVM_HSAI) diff --git a/platform/innovium/sonic-platform-modules-cel/.gitignore b/platform/innovium/sonic-platform-modules-cel/.gitignore new file mode 100755 index 000000000000..f805e810e5c6 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/.gitignore @@ -0,0 +1,33 @@ +# Object files +*.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su diff --git a/platform/innovium/sonic-platform-modules-cel/LICENSE b/platform/innovium/sonic-platform-modules-cel/LICENSE new file mode 100755 index 000000000000..2386a3920c07 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/LICENSE @@ -0,0 +1,15 @@ +Copyright (C) 2017 Celestica, Inc + +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/innovium/sonic-platform-modules-cel/README.md b/platform/innovium/sonic-platform-modules-cel/README.md new file mode 100755 index 000000000000..fbda62f91eae --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/README.md @@ -0,0 +1 @@ +# Platform drivers for Celestica Midstone-200i for the SONiC project diff --git a/platform/innovium/sonic-platform-modules-cel/debian/changelog b/platform/innovium/sonic-platform-modules-cel/debian/changelog new file mode 100755 index 000000000000..4a4e5ed2b0a0 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/debian/changelog @@ -0,0 +1,28 @@ +sonic-cel-platform-modules (0.2.2) unstable; urgency=low + + * Remove I2c mux ininitialization in init-script. + * Remapping virtual I2c ports number in sfputil. + * Fix qsfp driver, missing present status of sfp+ ports. + * Updated sfputil for decode sfp+ EEPROM. + * Add watchdog driver. + + -- Wirut Getbamrung Wed, 1 Feb 2018 16:00:00 +0700 + +sonic-cel-platform-modules (0.2.1) unstable; urgency=low + + * Fix module init-script not load CPLD virtual i2c driver properly. + + -- Pradchaya Phucharoen Mon, 9 Oct 2017 14:24:25 +0700 + +sonic-cel-platform-modules (0.2.0) unstable; urgency=low + + * Add sysfs interface to reset sfp ports. + * Fix qsfp driver, low power mode set/get incorrect bit. + + -- Pradchaya Phucharoen Tue, 26 Sep 2017 11:50:23 +0700 + +sonic-cel-platform-modules (0.1) unstable; urgency=low + + * Initial platform module. + + -- Pradchaya Phucharoen Tue, 23 Aug 2017 10:43:00 +0700 diff --git a/platform/innovium/sonic-platform-modules-cel/debian/compat b/platform/innovium/sonic-platform-modules-cel/debian/compat new file mode 100755 index 000000000000..ec635144f600 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/debian/compat @@ -0,0 +1 @@ +9 diff --git a/platform/innovium/sonic-platform-modules-cel/debian/control b/platform/innovium/sonic-platform-modules-cel/debian/control new file mode 100755 index 000000000000..48ef777a99a6 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/debian/control @@ -0,0 +1,11 @@ +Source: sonic-cel-platform-modules +Section: main +Priority: extra +Maintainer: Wirut Getbamrung +Build-Depends: debhelper (>= 8.0.0), bzip2 +Standards-Version: 3.9.3 + +Package: platform-modules-midstone-200i +Architecture: amd64 +Depends: linux-image-4.9.0-9-2-amd64 +Description: kernel modules for platform devices diff --git a/platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.init b/platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.init new file mode 100755 index 000000000000..7074d2b58125 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.init @@ -0,0 +1,52 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: $portmap +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup 200i board. +### END INIT INFO + +case "$1" in +start) + echo -n "Setting up board... " + + # Attach TLV 0x56 eeprom + echo 24lc64t 0x56 > /sys/bus/i2c/devices/i2c-0/new_device + sleep 2 + + modprobe 200i-cpld + sleep 2 + + # Turn off/down lpmod by defult (0 - Normal, 1 - Low Pow) + echo 0x00 > /sys/devices/platform/ms200i_cpld/qsfp_lpmode + + # Attach 64 instances of EEPROM driver QSFP ports + for ((n=1;n<=66;n++)); + do + echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-$n/new_device + sleep 0.1 + done + + echo "done." + ;; + +stop) + echo "done." + ;; + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/platform-modules-200i.init {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.install b/platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.install new file mode 100644 index 000000000000..4f298feb8300 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.install @@ -0,0 +1,2 @@ +midstone-200i/cfg/midstone-200i-modules.conf etc/modules-load.d +midstone-200i/systemd/platform-modules-midstone-200i.service lib/systemd/system \ No newline at end of file diff --git a/platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.postinst b/platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.postinst new file mode 100644 index 000000000000..213661ea1e84 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/debian/platform-modules-midstone-200i.postinst @@ -0,0 +1,3 @@ +depmod -a +systemctl enable platform-modules-midstone-200i.service +systemctl start platform-modules-midstone-200i.service \ No newline at end of file diff --git a/platform/innovium/sonic-platform-modules-cel/debian/rules b/platform/innovium/sonic-platform-modules-cel/debian/rules new file mode 100755 index 000000000000..3b01ad7e6555 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/debian/rules @@ -0,0 +1,32 @@ +#!/usr/bin/make -f + +export INSTALL_MOD_DIR:=extra + +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS:= midstone-200i + +%: + dh $@ + +override_dh_auto_build: + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + done) + +override_dh_auto_install: + (for mod in $(MODULE_DIRS); do \ + dh_installdirs -pplatform-modules-$${mod} \ + $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + cp $(MOD_SRC_DIR)/$${mod}/modules/*.ko \ + debian/platform-modules-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + done) + +override_dh_usrlocal: + +override_dh_clean: + dh_clean + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ + done) diff --git a/platform/innovium/sonic-platform-modules-cel/midstone-200i/cfg/midstone-200i-modules.conf b/platform/innovium/sonic-platform-modules-cel/midstone-200i/cfg/midstone-200i-modules.conf new file mode 100755 index 000000000000..b2a3e351c4c9 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/midstone-200i/cfg/midstone-200i-modules.conf @@ -0,0 +1,15 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +i2c-i801 +i2c-isch +i2c-ismt +i2c-dev +i2c-mux +i2c-smbus + +i2c-mux-gpio +i2c-mux-pca954x +ipmi-devintf diff --git a/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/200i_cpld.c b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/200i_cpld.c new file mode 100755 index 000000000000..3a99d2304029 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/200i_cpld.c @@ -0,0 +1,854 @@ +/* + * ms200i_cpld.c - driver for MidStone's CPLD + * + * Copyright (C) 2017 Celestica 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 Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_NAME "ms200i_cpld" + +#define RESET0102 0xA248 +#define RESET0310 0xA2DC +#define RESET1118 0xA2DD +#define RESET1926 0xA2DE +#define RESET2733 0xA2DF +#define RESET3441 0xA31C +#define RESET4249 0xA31D +#define RESET5057 0xA31E +#define RESET5864 0xA31F + +#define LPMOD0102 0xA249 +#define LPMOD0310 0xA2E0 +#define LPMOD1118 0xA2E1 +#define LPMOD1926 0xA2E2 +#define LPMOD2733 0xA2E3 +#define LPMOD3441 0xA320 +#define LPMOD4249 0xA321 +#define LPMOD5057 0xA322 +#define LPMOD5864 0xA323 + +#define ABS0102 0xA24A +#define ABS0310 0xA2E4 +#define ABS1118 0xA2E5 +#define ABS1926 0xA2E6 +#define ABS2733 0xA2E7 +#define ABS3441 0xA324 +#define ABS4249 0xA325 +#define ABS5057 0xA326 +#define ABS5864 0xA327 + +#define ABS6566 0xA244 + +#define INT0102 0xA24B +#define INT0310 0xA2E8 +#define INT1118 0xA2E9 +#define INT1926 0xA2EA +#define INT2733 0xA2EB +#define INT3441 0xA328 +#define INT4249 0xA329 +#define INT5057 0xA32A +#define INT5864 0xA32B + +#define LENGTH_PORT_CPLD 66 + +#define CPLD2_EX_CP_I2CFDR0_I2C 0xA230 +#define CPLD2_EX_CP_I2CCR0_I2C 0xA231 +#define CPLD2_EX_CP_I2CSR0_I2C 0xA232 +#define CPLD2_EX_CP_I2CDR0_I2C 0xA233 +#define CPLD2_EX_CP_I2CID0_I2C 0xA234 + +#define CPLD3_EX_CP_I2CFDR0_I2C 0xA2D0 +#define CPLD3_EX_CP_I2CCR0_I2C 0xA2D1 +#define CPLD3_EX_CP_I2CSR0_I2C 0xA2D2 +#define CPLD3_EX_CP_I2CDR0_I2C 0xA2D3 +#define CPLD3_EX_CP_I2CID0_I2C 0xA2D4 + +#define CPLD4_EX_CP_I2CFDR0_I2C 0xA310 +#define CPLD4_EX_CP_I2CCR0_I2C 0xA311 +#define CPLD4_EX_CP_I2CSR0_I2C 0xA312 +#define CPLD4_EX_CP_I2CDR0_I2C 0xA313 +#define CPLD4_EX_CP_I2CID0_I2C 0xA314 + +enum { + I2C_SR_BIT_RXAK = 0, + I2C_SR_BIT_MIF, + I2C_SR_BIT_SRW, + I2C_SR_BIT_BCSTM, + I2C_SR_BIT_MAL, + I2C_SR_BIT_MBB, + I2C_SR_BIT_MAAS, + I2C_SR_BIT_MCF +}; + +enum { + I2C_CR_BIT_BCST = 0, + I2C_CR_BIT_RSTA = 2, + I2C_CR_BIT_TXAK, + I2C_CR_BIT_MTX, + I2C_CR_BIT_MSTA, + I2C_CR_BIT_MIEN, + I2C_CR_BIT_MEN, +}; + +#ifdef DEBUG_KERN +#define info(fmt,args...) printk(KERN_INFO "line %3d : "fmt,__LINE__,##args) +#define check(REG) printk(KERN_INFO "line %3d : %-8s = %2.2X",__LINE__,#REG,inb(REG)); +#else +#define info(fmt,args...) +#define check(REG) +#endif + +#define GET_REG_BIT(REG,BIT) ((inb(REG) >> BIT) & 0x01) +#define SET_REG_BIT_H(REG,BIT) outb(inb(REG) | (0x01 << BIT),REG) +#define SET_REG_BIT_L(REG,BIT) outb(inb(REG) & ~(0x01 << BIT),REG) + +struct ms200i_i2c_data { + int portid; + unsigned REG_FDR0; + unsigned REG_CR0; + unsigned REG_SR0; + unsigned REG_DR0; + unsigned REG_ID0; +}; + +struct ms200i_cpld_data { + struct i2c_adapter *i2c_adapter[LENGTH_PORT_CPLD]; + struct mutex cpld_lock; + unsigned char sfpp_lpmode[2]; + unsigned char sfpp_reset[2]; +}; + +struct ms200i_cpld_data *cpld_data; + +int strtobp(const char* str,unsigned char *bytes){ + unsigned length = strlen(str); + if(length > 20){ + return 0; + } + int i,b=0; + memset(bytes,0,10); + for(i=0;i= '0' && c <= '9'){ + byte = c - '0'; + }else if(c >= 'a' && c <= 'f'){ + byte = c - 'a' + 0x0a; + }else if(c >= 'A' && c <= 'F'){ + byte = c - 'A' + 0x0a; + }else if(c == 'x' || c == 'X'){ + break; + }else{ + continue; + } + if(b%2==0) + bytes[b/2] = byte & 0x0F; + else + bytes[b/2] += (byte << 4) & 0xF0; + b++; + } + return (i/2) + (i%2); +} + +static ssize_t get_reset(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + unsigned long reset = 0; + + mutex_lock(&cpld_data->cpld_lock); + + reset = + ((unsigned long)(inb(RESET5864) & 0x7F) << 57 )| + ((unsigned long) inb(RESET5057) << 49 )| + ((unsigned long) inb(RESET4249) << 41 )| + ((unsigned long) inb(RESET3441) << 33 )| + ((unsigned long)(inb(RESET2733) & 0x7F) << 26 )| + ((unsigned long) inb(RESET1926) << 18 )| + ((unsigned long) inb(RESET1118) << 10 )| + ((unsigned long) inb(RESET0310) << 2 )| + ((unsigned long)(inb(RESET0102) & 0x03) ); + + mutex_unlock(&cpld_data->cpld_lock); + + return sprintf(buf,"0x%x%16.16lx\n", + cpld_data->sfpp_reset[1] << 1 | cpld_data->sfpp_reset[0], + reset & 0x3ffffffffffffffff); +} + +static ssize_t set_reset(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + unsigned char reset[10]; + int num; + + mutex_lock(&cpld_data->cpld_lock); + + num = strtobp(buf,reset); + if (num <= 0) + { + mutex_unlock(&cpld_data->cpld_lock); + return 22; + } + + outb (( reset[0] & 0x03 ) ,RESET0102); + outb (((reset[0] >>2) & 0x3F) | + (((reset[1] ) & 0x03) << 6),RESET0310); + outb (((reset[1] >>2) & 0x3F) | + (((reset[2] ) & 0x03) << 6),RESET1118); + outb (((reset[2] >>2) & 0x3F) | + (((reset[3] ) & 0x03) << 6),RESET1926); + outb (((reset[3] >>2) & 0x3F) | + (((reset[4] ) & 0x01) << 6),RESET2733); + outb (((reset[4] >>1) & 0x7F) | + (((reset[5] ) & 0x01) << 7),RESET3441); + outb (((reset[5] >>1) & 0x7F) | + (((reset[6] ) & 0x01) << 7),RESET4249); + outb (((reset[6] >>1) & 0x7F) | + (((reset[7] ) & 0x01) << 7),RESET5057); + outb (((reset[7] >>1) & 0x7F) ,RESET5864); + + cpld_data->sfpp_reset[0] = reset[8] & 0x01; + cpld_data->sfpp_reset[1] = (reset[8]>>1) & 0x01; + + mutex_unlock(&cpld_data->cpld_lock); + + return count; +} + +static ssize_t get_lpmode(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + unsigned long lpmod = 0; + + mutex_lock(&cpld_data->cpld_lock); + + lpmod = + ((unsigned long)(inb(LPMOD5864) & 0x7F) << 57 )| + ((unsigned long) inb(LPMOD5057) << 49 )| + ((unsigned long) inb(LPMOD4249) << 41 )| + ((unsigned long) inb(LPMOD3441) << 33 )| + ((unsigned long)(inb(LPMOD2733) & 0x7F) << 26 )| + ((unsigned long) inb(LPMOD1926) << 18 )| + ((unsigned long) inb(LPMOD1118) << 10 )| + ((unsigned long) inb(LPMOD0310) << 2 )| + ((unsigned long)(inb(LPMOD0102) & 0x03) ); + + mutex_unlock(&cpld_data->cpld_lock); + + return sprintf(buf,"0x%x%16.16lx\n", + cpld_data->sfpp_lpmode[1] << 1 | cpld_data->sfpp_lpmode[0], + lpmod & 0xffffffffffffffff); +} + +static ssize_t set_lpmode(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + unsigned char lpmod[10]; + int num; + + mutex_lock(&cpld_data->cpld_lock); + + num = strtobp(buf,lpmod); + if (num <= 0) + { + mutex_unlock(&cpld_data->cpld_lock); + return 22; + } + + outb (( lpmod[0] & 0x03 ) ,LPMOD0102); + outb (((lpmod[0] >>2) & 0x3F) | + (((lpmod[1] ) & 0x03) << 6),LPMOD0310); + outb (((lpmod[1] >>2) & 0x3F) | + (((lpmod[2] ) & 0x03) << 6),LPMOD1118); + outb (((lpmod[2] >>2) & 0x3F) | + (((lpmod[3] ) & 0x03) << 6),LPMOD1926); + outb (((lpmod[3] >>2) & 0x3F) | + (((lpmod[4] ) & 0x01) << 6),LPMOD2733); + outb (((lpmod[4] >>1) & 0x7F) | + (((lpmod[5] ) & 0x01) << 7),LPMOD3441); + outb (((lpmod[5] >>1) & 0x7F) | + (((lpmod[6] ) & 0x01) << 7),LPMOD4249); + outb (((lpmod[6] >>1) & 0x7F) | + (((lpmod[7] ) & 0x01) << 7),LPMOD5057); + outb (((lpmod[7] >>1) & 0x7F) ,LPMOD5864); + + cpld_data->sfpp_lpmode[0] = lpmod[8] & 0x01; + cpld_data->sfpp_lpmode[1] = (lpmod[8]>>1) & 0x01; + + mutex_unlock(&cpld_data->cpld_lock); + + return count; +} + +static ssize_t get_modprs(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + unsigned long present; + int present_sfp; + + mutex_lock(&cpld_data->cpld_lock); + present = + ((unsigned long)(inb(ABS5864) & 0x7F) << 57 )| + ((unsigned long) inb(ABS5057) << 49 )| + ((unsigned long) inb(ABS4249) << 41 )| + ((unsigned long) inb(ABS3441) << 33 )| + ((unsigned long)(inb(ABS2733) & 0x7F) << 26 )| + ((unsigned long) inb(ABS1926) << 18 )| + ((unsigned long) inb(ABS1118) << 10 )| + ((unsigned long) inb(ABS0310) << 2 )| + ((unsigned long)(inb(ABS0102) & 0x03) ); + + present_sfp = (inb(ABS6566) & 0x03); + mutex_unlock(&cpld_data->cpld_lock); + + return sprintf(buf,"0x%d%16.16lx\n", present_sfp, present & 0xffffffffffffffff); +} + +static ssize_t get_modirq(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + unsigned long irq; + + mutex_lock(&cpld_data->cpld_lock); + + irq = + ((unsigned long)(inb(INT5864) & 0x7F) << 57 )| + ((unsigned long) inb(INT5057) << 49 )| + ((unsigned long) inb(INT4249) << 41 )| + ((unsigned long) inb(INT3441) << 33 )| + ((unsigned long)(inb(INT2733) & 0x7F) << 26 )| + ((unsigned long) inb(INT1926) << 18 )| + ((unsigned long) inb(INT1118) << 10 )| + ((unsigned long) inb(INT0310) << 2 )| + ((unsigned long)(inb(INT0102) & 0x03) ); + + mutex_unlock(&cpld_data->cpld_lock); + + return sprintf(buf,"0x%17.17lx\n", irq & 0x3ffffffffffffffff); +} + +static DEVICE_ATTR(qsfp_reset , S_IRUGO | S_IWUSR, get_reset, set_reset); +static DEVICE_ATTR(qsfp_lpmode, S_IRUGO | S_IWUSR, get_lpmode, set_lpmode); +static DEVICE_ATTR(qsfp_modprs, S_IRUGO, get_modprs, NULL); +static DEVICE_ATTR(qsfp_modirq, S_IRUGO, get_modirq, NULL); + +static struct attribute *ms200i_lpc_attrs[] = { + &dev_attr_qsfp_reset.attr, + &dev_attr_qsfp_lpmode.attr, + &dev_attr_qsfp_modprs.attr, + &dev_attr_qsfp_modirq.attr, + NULL, +}; + +static struct attribute_group ms200i_lpc_attr_grp = { + .attrs = ms200i_lpc_attrs, +}; + +static struct resource cel_ms200i_lpc_resources[] = { + { + .flags = IORESOURCE_IO, + }, +}; + +static void cel_ms200i_lpc_dev_release( struct device * dev) +{ + return; +} + +static struct platform_device cel_ms200i_lpc_dev = { + .name = DRIVER_NAME, + .id = -1, + .num_resources = ARRAY_SIZE(cel_ms200i_lpc_resources), + .resource = cel_ms200i_lpc_resources, + .dev = { + .release = cel_ms200i_lpc_dev_release, + } +}; + + +static int i2c_wait_ack(struct i2c_adapter *a,unsigned timeout,int writing){ + int error = 0; + unsigned tick=0; + int Status; + + struct ms200i_i2c_data *new_data = i2c_get_adapdata(a); + + check(new_data->REG_SR0); + check(new_data->REG_CR0); + + while(1){ + Status = inb(new_data->REG_SR0); + tick++; + if(tick > timeout){ + info("Status %2.2X",Status); + info("Error Timeout"); + error = -ETIMEDOUT; + break; + } + + + if(Status & (1 << I2C_SR_BIT_MIF)){ + break; + } + + if(writing == 0 && (Status & (1<REG_SR0); + outb(0, new_data->REG_SR0); + + if(error<0){ + info("Status %2.2X",Status); + return error; + } + + if(!(Status & (1 << I2C_SR_BIT_MCF))){ + info("Error Unfinish"); + return -EIO; + } + + if(Status & (1 <REG_CR0,1<cpld_lock); + + /* Write the command register */ + new_data = i2c_get_adapdata(a); + + unsigned int portid = new_data->portid; + +#ifdef DEBUG_KERN + printk(KERN_INFO "portid %2d|@ 0x%2.2X|f 0x%4.4X|(%d)%-5s| (%d)%-10s|CMD %2.2X |DAT %4.4X" + ,portid,addr,flags,rw,rw == 1 ? "READ ":"WRITE" + ,size, size == 0 ? "QUICK" : + size == 1 ? "BYTE" : + size == 2 ? "BYTE_DATA" : + size == 3 ? "WORD_DATA" : + size == 4 ? "PROC_CALL" : + size == 5 ? "BLOCK_DATA" : "ERROR" + ,cmd,data->word); +#endif + /* Map the size to what the chip understands */ + switch (size) { + case I2C_SMBUS_QUICK: + case I2C_SMBUS_BYTE: + case I2C_SMBUS_BYTE_DATA: + case I2C_SMBUS_WORD_DATA: + case I2C_SMBUS_BLOCK_DATA: + break; + default: + printk(KERN_INFO "Unsupported transaction %d\n", size); + error = -EOPNOTSUPP; + goto Done; + } + + unsigned int REG_FDR0; + unsigned int REG_CR0; + unsigned int REG_SR0; + unsigned int REG_DR0; + unsigned int REG_ID0; + + REG_FDR0 = new_data->REG_FDR0; + REG_CR0 = new_data->REG_CR0; + REG_SR0 = new_data->REG_SR0; + REG_DR0 = new_data->REG_DR0; + REG_ID0 = new_data->REG_ID0; + outb(portid,REG_ID0); + + int timeout=0; + int cnt=0; + + ////[S][ADDR/R] + //Clear status register + outb( 0 , REG_SR0); + outb( 1 << I2C_CR_BIT_MIEN | 1 << I2C_CR_BIT_MTX | 1 << I2C_CR_BIT_MSTA ,REG_CR0); + SET_REG_BIT_H(REG_CR0,I2C_CR_BIT_MEN); + + if(rw == I2C_SMBUS_READ && + (size == I2C_SMBUS_QUICK || size == I2C_SMBUS_BYTE)){ + // sent device address with Read mode + outb(addr << 1 | 0x01,REG_DR0); + }else{ + // sent device address with Write mode + outb(addr << 1 | 0x00,REG_DR0); + } + + + + info( "MS Start"); + + //// Wait {A} + error = i2c_wait_ack(a,50000,1); + if(error<0){ + info( "get error %d",error); + goto Done; + } + + //// [CMD]{A} + if(size == I2C_SMBUS_BYTE_DATA || + size == I2C_SMBUS_WORD_DATA || + size == I2C_SMBUS_BLOCK_DATA || + (size == I2C_SMBUS_BYTE && rw == I2C_SMBUS_WRITE)){ + + //sent command code to data register + outb(cmd,REG_DR0); + info( "MS Send CMD 0x%2.2X",cmd); + + // Wait {A} + error = i2c_wait_ack(a,50000,1); + if(error<0){ + info( "get error %d",error); + goto Done; + } + } + + switch(size){ + case I2C_SMBUS_BYTE_DATA: + cnt = 1; break; + case I2C_SMBUS_WORD_DATA: + cnt = 2; break; + case I2C_SMBUS_BLOCK_DATA: + // in block data mode keep number of byte in block[0] + cnt = data->block[0]; + break; + default: + cnt = 0; break; + } + + // [CNT] used only bloack data write + if(size == I2C_SMBUS_BLOCK_DATA && rw == I2C_SMBUS_WRITE){ + + outb(cnt,REG_DR0); + info( "MS Send CNT 0x%2.2X",cnt); + + // Wait {A} + error = i2c_wait_ack(a,50000,1); + if(error<0){ + info( "get error %d",error); + goto Done; + } + } + + // [DATA]{A} + if( rw == I2C_SMBUS_WRITE && ( + size == I2C_SMBUS_BYTE || + size == I2C_SMBUS_BYTE_DATA || + size == I2C_SMBUS_WORD_DATA || + size == I2C_SMBUS_BLOCK_DATA + )){ + int bid=0; + info( "MS prepare to sent [%d bytes]",cnt); + if(size == I2C_SMBUS_BLOCK_DATA ){ + bid=1; // block[0] is cnt; + cnt+=1; // offset from block[0] + } + for(;bidblock[bid],REG_DR0); + info( " Data > %2.2X",data->block[bid]); + // Wait {A} + error = i2c_wait_ack(a,50000,1); + if(error<0){ + goto Done; + } + } + + } + + //REPEATE START + if( rw == I2C_SMBUS_READ && ( + size == I2C_SMBUS_BYTE_DATA || + size == I2C_SMBUS_WORD_DATA || + size == I2C_SMBUS_BLOCK_DATA + )){ + info( "MS Repeated Start"); + + SET_REG_BIT_L(REG_CR0,I2C_CR_BIT_MEN); + outb(1 << I2C_CR_BIT_MIEN | + 1 << I2C_CR_BIT_MTX | + 1 << I2C_CR_BIT_MSTA | + 1 << I2C_CR_BIT_RSTA ,REG_CR0); + SET_REG_BIT_H(REG_CR0,I2C_CR_BIT_MEN); + + // sent Address with Read mode + outb( addr<<1 | 0x1 ,REG_DR0); + + // Wait {A} + error = i2c_wait_ack(a,50000,1); + if(error<0){ + goto Done; + } + + } + + if( rw == I2C_SMBUS_READ && ( + size == I2C_SMBUS_BYTE || + size == I2C_SMBUS_BYTE_DATA || + size == I2C_SMBUS_WORD_DATA || + size == I2C_SMBUS_BLOCK_DATA + )){ + + switch(size){ + case I2C_SMBUS_BYTE: + case I2C_SMBUS_BYTE_DATA: + cnt = 1; break; + case I2C_SMBUS_WORD_DATA: + cnt = 2; break; + case I2C_SMBUS_BLOCK_DATA: + //will be changed after recived first data + cnt = 3; break; + default: + cnt = 0; break; + } + + int bid = 0; + info( "MS Receive"); + + //set to Receive mode + outb(1 << I2C_CR_BIT_MEN | + 1 << I2C_CR_BIT_MIEN | + 1 << I2C_CR_BIT_MSTA , REG_CR0); + + for(bid=-1;bidblock[bid] = inb(REG_DR0); + + info( "DATA IN [%d] %2.2X",bid,data->block[bid]); + + if(size==I2C_SMBUS_BLOCK_DATA && bid == 0){ + cnt = data->block[0] + 1; + } + } + } + } + + +Stop: + //[P] + SET_REG_BIT_L(REG_CR0,I2C_CR_BIT_MSTA); + info( "MS STOP"); + +Done: + outb(1<cpld_lock); + + return error; +} + +static u32 ms200i_i2c_func(struct i2c_adapter *a) +{ + return I2C_FUNC_SMBUS_QUICK | + I2C_FUNC_SMBUS_BYTE | + I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA | + I2C_FUNC_SMBUS_BLOCK_DATA; +} + +static const struct i2c_algorithm ms200i_i2c_algorithm = { + .smbus_xfer = ms200i_i2c_access, + .functionality = ms200i_i2c_func, +}; + +static struct i2c_adapter * cel_ms200i_i2c_init(struct platform_device *pdev, int portid) +{ + int error; + + struct i2c_adapter *new_adapter; + struct ms200i_i2c_data *new_data; + + new_adapter = kzalloc(sizeof(*new_adapter), GFP_KERNEL); + if (!new_adapter) + return NULL; + + new_adapter->dev.parent = &pdev->dev; + new_adapter->owner = THIS_MODULE; + new_adapter->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; + new_adapter->algo = &ms200i_i2c_algorithm; + + snprintf(new_adapter->name, sizeof(new_adapter->name), + "SMBus ms200i i2c Adapter portid@%04x", portid); + + new_data = kzalloc(sizeof(*new_data), GFP_KERNEL); + if (!new_data) + return NULL; + + new_data->portid = portid; + + // QSFP 1-2 and SFP 1-2 + if((portid >= 1 && portid <= 2) || (portid >= 65 && portid <= 66)){ + new_data->REG_FDR0 = CPLD2_EX_CP_I2CFDR0_I2C; + new_data->REG_CR0 = CPLD2_EX_CP_I2CCR0_I2C; + new_data->REG_SR0 = CPLD2_EX_CP_I2CSR0_I2C; + new_data->REG_DR0 = CPLD2_EX_CP_I2CDR0_I2C; + new_data->REG_ID0 = CPLD2_EX_CP_I2CID0_I2C; + + }else if((portid >= 3 && portid <= 33)){ + new_data->REG_FDR0 = CPLD3_EX_CP_I2CFDR0_I2C; + new_data->REG_CR0 = CPLD3_EX_CP_I2CCR0_I2C; + new_data->REG_SR0 = CPLD3_EX_CP_I2CSR0_I2C; + new_data->REG_DR0 = CPLD3_EX_CP_I2CDR0_I2C; + new_data->REG_ID0 = CPLD3_EX_CP_I2CID0_I2C; + + }else if((portid >= 34 && portid <= 64)){ + new_data->REG_FDR0 = CPLD4_EX_CP_I2CFDR0_I2C; + new_data->REG_CR0 = CPLD4_EX_CP_I2CCR0_I2C; + new_data->REG_SR0 = CPLD4_EX_CP_I2CSR0_I2C; + new_data->REG_DR0 = CPLD4_EX_CP_I2CDR0_I2C; + new_data->REG_ID0 = CPLD4_EX_CP_I2CID0_I2C; + } + outb(portid,new_data->REG_ID0); + outb(0x1F,new_data->REG_FDR0); // 0x1F 100kHz + + + i2c_set_adapdata(new_adapter,new_data); + + error = i2c_add_adapter(new_adapter); + if(error) + return NULL; + + return new_adapter; +}; + +static int cel_ms200i_lpc_drv_probe(struct platform_device *pdev) +{ + struct resource *res; + int ret =0; + int portid_count; + + cpld_data = devm_kzalloc(&pdev->dev, sizeof(struct ms200i_cpld_data), + GFP_KERNEL); + if (!cpld_data) + return -ENOMEM; + + mutex_init(&cpld_data->cpld_lock); + + res = platform_get_resource(pdev, IORESOURCE_IO, 0); + if (unlikely(!res)) { + printk(KERN_ERR " Specified Resource Not Available...\n"); + return -1; + } + + ret = sysfs_create_group(&pdev->dev.kobj, &ms200i_lpc_attr_grp); + if (ret) { + printk(KERN_ERR "Cannot create sysfs\n"); + } + + for(portid_count=1 ; portid_count<=LENGTH_PORT_CPLD ; portid_count++) + cpld_data->i2c_adapter[portid_count-1] = cel_ms200i_i2c_init(pdev, portid_count); + return 0; +} + +static int cel_ms200i_lpc_drv_remove(struct platform_device *pdev) +{ + int portid_count; + struct ms200i_i2c_data *new_data; + + sysfs_remove_group(&pdev->dev.kobj, &ms200i_lpc_attr_grp); + + for (portid_count=1 ; portid_count<=LENGTH_PORT_CPLD ; portid_count++) + i2c_del_adapter(cpld_data->i2c_adapter[portid_count-1]); + return 0; +} + +static struct platform_driver cel_ms200i_lpc_drv = { + .probe = cel_ms200i_lpc_drv_probe, + .remove = __exit_p(cel_ms200i_lpc_drv_remove), + .driver = { + .name = DRIVER_NAME, + }, +}; + +int cel_ms200i_lpc_init(void) +{ + platform_device_register(&cel_ms200i_lpc_dev); + platform_driver_register(&cel_ms200i_lpc_drv); + + return 0; +} + +void cel_ms200i_lpc_exit(void) +{ + platform_driver_unregister(&cel_ms200i_lpc_drv); + platform_device_unregister(&cel_ms200i_lpc_dev); +} + +module_init(cel_ms200i_lpc_init); +module_exit(cel_ms200i_lpc_exit); + +MODULE_AUTHOR("Pariwat Leamsumran "); +MODULE_DESCRIPTION("Celestica MidStone ms200i LPC Driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/200i_wdt.c b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/200i_wdt.c new file mode 100755 index 000000000000..9b3d79cc5a67 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/200i_wdt.c @@ -0,0 +1,363 @@ +/* + * Watchdog driver for the Midstone 200i + * + * Copyright (C) 2017 Celestica 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 Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define DRIVER_NAME "ms200i_wdt" + +#define CONF_GPIOBASE 0x8000F848 +#define PCI_CONFIG_ADDRESS 0x0CF8 +#define PCI_CONFIG_DATA 0x0CFC + +// WDT_CTRL is GPIO 32 +// GPIOBUS: 2 ,bit: 0th +#define WDT_CTRL_ENB_REG 0x30 +#define WDT_CTRL_DIR_REG 0x34 +#define WDT_CTRL_LVL_REG 0x38 +#define WDT_CTRL_MASK (unsigned long)(1<<(32%32)) + +// WDT_FEED is GPIO 15 +// GPIOBUS: 1 ,bit: 15th +#define WDT_FEED_ENB_REG 0x00 +#define WDT_FEED_DIR_REG 0x04 +#define WDT_FEED_LVL_REG 0x0C +#define WDT_FEED_MASK (unsigned long)(1<<(15%32)) + +static bool nowayout = WATCHDOG_NOWAYOUT; + +// For enabling Debug message +//#define ENAB_DEBUG +//#define ENAB_DEBUG_GPIO + +struct ms200i_wdt_drvdata { + struct watchdog_device wdt; + struct mutex lock; + unsigned int gpiobase; +}; + +static struct resource ms200i_wdt_resources[] = { + { + .flags = IORESOURCE_IO, + }, +}; + +static void ms200i_wdt_dev_release( struct device * dev) +{ + return; +} + +static struct platform_device ms200i_wdt_dev = { + .name = DRIVER_NAME, + .id = -1, + .num_resources = ARRAY_SIZE(ms200i_wdt_resources), + .resource = ms200i_wdt_resources, + .dev = { + .release = ms200i_wdt_dev_release, + } +}; + +static int ms200i_wdt_start(struct watchdog_device *wdt_dev) +{ + struct ms200i_wdt_drvdata *drvdata = watchdog_get_drvdata(wdt_dev); + unsigned char reset_ctrl = 0x00; + unsigned long enab, gpio ,dir; + unsigned int base_addr; +#ifdef ENAB_DEBUG + printk(KERN_INFO "WDT Start"); +#endif + mutex_lock(&drvdata->lock); + + base_addr = drvdata->gpiobase; + + enab = inl(base_addr + WDT_CTRL_ENB_REG); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "ctrl enab %16X",enab); +#endif + enab |= WDT_CTRL_MASK; +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "ctrl enab %16X",enab); +#endif + outl(enab, base_addr + WDT_CTRL_ENB_REG); +#ifdef ENAB_DEBUG_GPIO + enab = inl(base_addr + WDT_CTRL_ENB_REG); + printk(KERN_INFO "ctrl enab %16X",enab); +#endif + + enab = inl(base_addr + WDT_FEED_ENB_REG); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed enab %16X",enab); +#endif + enab |= WDT_FEED_MASK; +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed enab %16X",enab); +#endif + outl(enab, base_addr + WDT_FEED_ENB_REG); +#ifdef ENAB_DEBUG_GPIO + enab = inl(base_addr + WDT_FEED_ENB_REG); + printk(KERN_INFO "feed enab %16X",enab); +#endif + + dir = inl(base_addr + WDT_CTRL_DIR_REG); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "ctrl dir %16X",dir); +#endif + dir &= ~WDT_FEED_MASK; +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "ctrl dir %16X",dir); +#endif + outl(dir, base_addr + WDT_CTRL_DIR_REG); +#ifdef ENAB_DEBUG_GPIO + dir = inl(base_addr + WDT_CTRL_DIR_REG); + printk(KERN_INFO "ctrl dir %16X",dir); +#endif + + dir = inl(base_addr + WDT_FEED_DIR_REG); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed dir %16X",dir); +#endif + dir &= ~WDT_FEED_MASK; +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed dir %16X",dir); +#endif + outl(dir, base_addr + WDT_FEED_DIR_REG); +#ifdef ENAB_DEBUG_GPIO + dir = inl(base_addr + WDT_FEED_DIR_REG); + printk(KERN_INFO "feed dir %16X",dir); +#endif + + gpio = inl(base_addr + WDT_CTRL_LVL_REG); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "ctrl gpio %16X",gpio); +#endif + gpio &= ~WDT_CTRL_MASK; +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "ctrl gpio %16X",gpio); +#endif + outl_p( gpio, base_addr + WDT_CTRL_LVL_REG); +#ifdef ENAB_DEBUG_GPIO + gpio = inl(base_addr + WDT_CTRL_LVL_REG); + printk(KERN_INFO "ctrl gpio %16X",gpio); +#endif + + mutex_unlock(&drvdata->lock); + printk(KERN_INFO "WDT Start Finish"); + return 0; +} + +static int ms200i_wdt_stop(struct watchdog_device *wdt_dev) +{ + struct ms200i_wdt_drvdata *drvdata = watchdog_get_drvdata(wdt_dev); + unsigned long gpio; + unsigned long base_addr; +#ifdef ENAB_DEBUG + printk(KERN_INFO "WDT Stop"); +#endif + mutex_lock(&drvdata->lock); + + base_addr = drvdata->gpiobase; + + gpio = inl(base_addr + WDT_CTRL_ENB_REG); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "ctrl gpio %16X",gpio); +#endif + gpio &= ~(WDT_CTRL_MASK); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "ctrl gpio %16X",gpio); +#endif + outl_p(gpio, base_addr + WDT_CTRL_ENB_REG); +#ifdef ENAB_DEBUG_GPIO + gpio = inl(base_addr + WDT_CTRL_ENB_REG); + printk(KERN_INFO "ctrl gpio %16X",gpio); +#endif + + gpio = inl(base_addr + WDT_FEED_ENB_REG); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed gpio %16X",gpio); +#endif + gpio &= ~(WDT_CTRL_MASK); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed gpio %16X",gpio); +#endif + outl_p(gpio, base_addr + WDT_FEED_ENB_REG); +#ifdef ENAB_DEBUG_GPIO + gpio = inl(base_addr + WDT_FEED_ENB_REG); + printk(KERN_INFO "feed gpio %16X",gpio); +#endif + + mutex_unlock(&drvdata->lock); + + return 0; +} + +static int ms200i_wdt_ping(struct watchdog_device *wdt_dev) +{ + struct ms200i_wdt_drvdata *drvdata = watchdog_get_drvdata(wdt_dev); + unsigned long gpio; + unsigned long base_addr; + +#ifdef ENAB_DEBUG + printk(KERN_INFO "WDT PING"); +#endif + mutex_lock(&drvdata->lock); + + base_addr = drvdata->gpiobase; + + gpio = inl(base_addr + WDT_FEED_LVL_REG); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed gpio %16X",gpio); +#endif + gpio &= ~WDT_FEED_MASK; +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed gpio %16X",gpio); +#endif + outl_p( gpio, base_addr + WDT_FEED_LVL_REG); +#ifdef ENAB_DEBUG_GPIO + gpio = inl(base_addr + WDT_FEED_LVL_REG); + printk(KERN_INFO "feed gpio %16X",gpio); +#endif + mdelay(10); + + gpio = inl(base_addr + WDT_FEED_LVL_REG); +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed gpio %16X",gpio); +#endif + gpio |= WDT_FEED_MASK; +#ifdef ENAB_DEBUG_GPIO + printk(KERN_INFO "feed gpio %16X",gpio); +#endif + outl_p( gpio, base_addr + WDT_FEED_LVL_REG); +#ifdef ENAB_DEBUG_GPIO + gpio = inl(base_addr + WDT_FEED_LVL_REG); + printk(KERN_INFO "feed gpio %16X",gpio); +#endif + + mutex_unlock(&drvdata->lock); +#ifdef ENAB_DEBUG + printk(KERN_INFO "WDT PING FINISH"); +#endif + return 0; +} + +static const struct watchdog_info ms200i_wdt_info = { + .options = WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, + .identity = "MS200i Watchdog", +}; + +static const struct watchdog_ops ms200i_wdt_ops = { + .owner = THIS_MODULE, + .start = ms200i_wdt_start, + .stop = ms200i_wdt_stop, + .ping = ms200i_wdt_ping, +}; + +static int ms200i_wdt_probe(struct platform_device *pdev) +{ + struct ms200i_wdt_drvdata *drvdata; + int ret; + unsigned int base_addr; + + drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), + GFP_KERNEL); + if (!drvdata) { + ret = -ENOMEM; + goto err; + } + + outl(CONF_GPIOBASE, PCI_CONFIG_ADDRESS); + base_addr = inl(PCI_CONFIG_DATA); + // remove last bit , that is hardware inditcate. + base_addr &= ~(0x01); + + if(base_addr == 0){ + printk(KERN_INFO "can't get gpio base address"); + }else{ + printk(KERN_INFO "gpio base address : %8.8X",base_addr); + } + + mutex_init(&drvdata->lock); + + drvdata->gpiobase = base_addr; + drvdata->wdt.info = &ms200i_wdt_info; + drvdata->wdt.ops = &ms200i_wdt_ops; + + watchdog_set_nowayout(&drvdata->wdt, nowayout); + watchdog_set_drvdata(&drvdata->wdt, drvdata); + + ret = watchdog_register_device(&drvdata->wdt); + if (ret != 0) { + dev_err(&pdev->dev, "watchdog_register_device() failed: %d\n", + ret); + goto err; + } + + platform_set_drvdata(pdev, drvdata); + +err: + return ret; +} + +static int ms200i_wdt_remove(struct platform_device *pdev) +{ + struct ms200i_wdt_drvdata *drvdata = platform_get_drvdata(pdev); + + watchdog_unregister_device(&drvdata->wdt); +#ifdef ENAB_DEBUG + printk(KERN_INFO "MS200i WDT Remove"); +#endif + return 0; +} + +static struct platform_driver ms200i_wdt_drv = { + .probe = ms200i_wdt_probe, + .remove = ms200i_wdt_remove, + .driver = { + .name = DRIVER_NAME, + }, +}; + +int ms200i_wdt_init(void) +{ +#ifdef ENAB_DEBUG + printk(KERN_INFO "MS200i WDT Init"); +#endif + platform_device_register(&ms200i_wdt_dev); + platform_driver_register(&ms200i_wdt_drv); + + return 0; +} + +void ms200i_wdt_exit(void) +{ +#ifdef ENAB_DEBUG + printk(KERN_INFO "MS200i WDT Exit"); +#endif + platform_driver_unregister(&ms200i_wdt_drv); + platform_device_unregister(&ms200i_wdt_dev); +} + +module_init(ms200i_wdt_init); +module_exit(ms200i_wdt_exit); + +MODULE_AUTHOR("Sittisak Sinprem "); +MODULE_DESCRIPTION("Midstone ms200i Watchdog"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ms200i-watchdog"); diff --git a/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/Makefile b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/Makefile new file mode 100755 index 000000000000..932a13cf8253 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/Makefile @@ -0,0 +1 @@ +obj-m := 200i_cpld.o mc24lc64t.o 200i_wdt.o diff --git a/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/mc24lc64t.c b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/mc24lc64t.c new file mode 100755 index 000000000000..a391056d09a7 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/midstone-200i/modules/mc24lc64t.c @@ -0,0 +1,142 @@ +/* + * mc24lc64t.c - driver for Microchip 24LC64T + * + * Copyright (C) 2017 Celestica 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 Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +struct mc24lc64t_data { + struct i2c_client *fake_client; + struct mutex update_lock; +}; + +static ssize_t mc24lc64t_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = kobj_to_i2c_client(kobj); + struct mc24lc64t_data *drvdata = i2c_get_clientdata(client); + unsigned long timeout, read_time, i = 0; + int status; + + mutex_lock(&drvdata->update_lock); + + if (i2c_smbus_write_byte_data(client, off>>8, off)) + { + status = -EIO; + goto exit; + } + + msleep(1); + +begin: + + if (i < count) + { + timeout = jiffies + msecs_to_jiffies(25); /* 25 mS timeout*/ + do { + read_time = jiffies; + + status = i2c_smbus_read_byte(client); + if (status >= 0) + { + buf[i++] = status; + goto begin; + } + } while (time_before(read_time, timeout)); + + status = -ETIMEDOUT; + goto exit; + } + + status = count; + +exit: + mutex_unlock(&drvdata->update_lock); + + return status; +} + +static struct bin_attribute mc24lc64t_bit_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO, + }, + .size = 65536, + .read = mc24lc64t_read, +}; + +static int mc24lc64t_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct i2c_adapter *adapter = client->adapter; + struct mc24lc64t_data *drvdata; + int err; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE_DATA + | I2C_FUNC_SMBUS_READ_BYTE)) + return -EPFNOSUPPORT; + + if (!(drvdata = devm_kzalloc(&client->dev, + sizeof(struct mc24lc64t_data), GFP_KERNEL))) + return -ENOMEM; + + drvdata->fake_client = i2c_new_dummy(client->adapter, client->addr + 1); + if (!drvdata->fake_client) + return -ENOMEM; + + i2c_set_clientdata(client, drvdata); + mutex_init(&drvdata->update_lock); + + err = sysfs_create_bin_file(&client->dev.kobj, &mc24lc64t_bit_attr); + if (err) + i2c_unregister_device(drvdata->fake_client); + + return err; +} + +static int mc24lc64t_remove(struct i2c_client *client) +{ + struct mc24lc64t_data *drvdata = i2c_get_clientdata(client); + + i2c_unregister_device(drvdata->fake_client); + + sysfs_remove_bin_file(&client->dev.kobj, &mc24lc64t_bit_attr); + + return 0; +} + +static const struct i2c_device_id mc24lc64t_id[] = { + { "24lc64t", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mc24lc64t_id); + +static struct i2c_driver mc24lc64t_driver = { + .driver = { + .name = "mc24lc64t", + .owner = THIS_MODULE, + }, + .probe = mc24lc64t_probe, + .remove = mc24lc64t_remove, + .id_table = mc24lc64t_id, +}; + +module_i2c_driver(mc24lc64t_driver); + +MODULE_AUTHOR("Abhisit Sangjan "); +MODULE_DESCRIPTION("Microchip 24LC64T Driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-cel/midstone-200i/systemd/platform-modules-midstone-200i.service b/platform/innovium/sonic-platform-modules-cel/midstone-200i/systemd/platform-modules-midstone-200i.service new file mode 100644 index 000000000000..dbb7aed39df7 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-cel/midstone-200i/systemd/platform-modules-midstone-200i.service @@ -0,0 +1,13 @@ +[Unit] +Description=Celestica Midstone 200i platform modules +After=local-fs.target +Before=pmon.service + +[Service] +Type=oneshot +ExecStart=-/etc/init.d/platform-modules-midstone-200i start +ExecStop=-/etc/init.d/platform-modules-midstone-200i stop +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/platform/innovium/sonic-platform-modules-delta/LICENSE b/platform/innovium/sonic-platform-modules-delta/LICENSE new file mode 100644 index 000000000000..ea87fe9caabe --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/LICENSE @@ -0,0 +1,16 @@ +Copyright (C) 2016 Microsoft, Inc +Copyright (C) 2017 Delta Networks, Inc. + +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/innovium/sonic-platform-modules-delta/common/modules/dni_emc2305.c b/platform/innovium/sonic-platform-modules-delta/common/modules/dni_emc2305.c new file mode 100644 index 000000000000..73d9900af5b4 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/common/modules/dni_emc2305.c @@ -0,0 +1,381 @@ +/* + * + * + * Copyright (C) 2017 Delta Networks, Inc. + * + * This program is free software; you can redistribute it + * and/or modify it under the terms ofthe GNU General Public License as + * published by the Free Software Foundation; either version 2 of the License, + * or (at your option) any later version. + * + * + * + * + * + * A hwmon driver for the SMSC EMC2305 fan controller + * Complete datasheet is available (6/2013) at: + * http://www.smsc.com/media/Downloads_Public/Data_Sheets/2305.pdf + */ + +#include +#include +#include +#include +#include + + +static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count); +static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, + char *buf); +static ssize_t set_fan(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count); +static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, + char *buf); +static ssize_t set_fan_percentage(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count); +static ssize_t show_fan_percentage(struct device *dev, struct device_attribute * devattr, + char *buf); +static const unsigned short normal_i2c[] = { 0x2C, 0x2D, 0x2E, 0x2F, 0x4C, + 0x4D, I2C_CLIENT_END + }; + + +#define EMC2305_REG_DEVICE 0xFD +#define EMC2305_REG_VENDOR 0xFE + +//#define FAN_MINIMUN 0x33 /*20%*/ +#define FAN_MINIMUN 0x0 /*0%*/ +#define FAN_RPM_BASED 0xAB + +#define EMC2305_REG_FAN_DRIVE(n) (0x30 + 0x10 * n) +#define EMC2305_REG_FAN_MIN_DRIVE(n) (0x38 + 0x10 * n) +#define EMC2305_REG_FAN_TACH(n) (0x3E + 0x10 * n) +#define EMC2305_REG_FAN_CONF(n) (0x32 + 0x10 * n) +#define EMC2305_REG_FAN_REAR_H_RPM(n) (0x3D + 0x10 * n) +#define EMC2305_REG_FAN_REAR_L_RPM(n) (0x3C + 0x10 * n) + +#define EMC2305_DEVICE 0x34 +#define EMC2305_VENDOR 0x5D +#define MAX_FAN_SPEED 23000 + +struct emc2305_data +{ + struct device *hwmon_dev; + struct attribute_group attrs; + struct mutex lock; +}; + +static int emc2305_probe(struct i2c_client *client, + const struct i2c_device_id *id); +static int emc2305_detect(struct i2c_client *client, + struct i2c_board_info *info); +static int emc2305_remove(struct i2c_client *client); + +static const struct i2c_device_id emc2305_id[] = +{ + { "emc2305", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, emc2305_id); + +static struct i2c_driver emc2305_driver = +{ + .class = I2C_CLASS_HWMON, + .driver = { + .name = "emc2305", + }, + .probe = emc2305_probe, + .remove = emc2305_remove, + .id_table = emc2305_id, + .detect = emc2305_detect, + .address_list = normal_i2c, +}; + +static SENSOR_DEVICE_ATTR(fan1_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 0); +static SENSOR_DEVICE_ATTR(fan2_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 1); +static SENSOR_DEVICE_ATTR(fan3_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 2); +static SENSOR_DEVICE_ATTR(fan4_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 3); +static SENSOR_DEVICE_ATTR(fan5_input, S_IWUSR | S_IRUGO, show_fan, set_fan, 4); +static SENSOR_DEVICE_ATTR(fan1_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 0); +static SENSOR_DEVICE_ATTR(fan2_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 1); +static SENSOR_DEVICE_ATTR(fan3_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 2); +static SENSOR_DEVICE_ATTR(fan4_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 3); +static SENSOR_DEVICE_ATTR(fan5_input_percentage, S_IWUSR | S_IRUGO, show_fan_percentage, set_fan_percentage, 4); +static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 0); +static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 1); +static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 2); +static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 3); +static SENSOR_DEVICE_ATTR(pwm5, S_IWUSR | S_IRUGO, show_pwm, set_pwm, 4); + +static struct attribute *emc2305_attr[] = +{ + &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, + &sensor_dev_attr_fan5_input.dev_attr.attr, + &sensor_dev_attr_fan1_input_percentage.dev_attr.attr, + &sensor_dev_attr_fan2_input_percentage.dev_attr.attr, + &sensor_dev_attr_fan3_input_percentage.dev_attr.attr, + &sensor_dev_attr_fan4_input_percentage.dev_attr.attr, + &sensor_dev_attr_fan5_input_percentage.dev_attr.attr, + &sensor_dev_attr_pwm1.dev_attr.attr, + &sensor_dev_attr_pwm2.dev_attr.attr, + &sensor_dev_attr_pwm3.dev_attr.attr, + &sensor_dev_attr_pwm4.dev_attr.attr, + &sensor_dev_attr_pwm5.dev_attr.attr, + NULL +}; + +static ssize_t show_fan_percentage(struct device *dev, struct device_attribute * devattr, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + int val; + + mutex_lock(&data->lock); + val = i2c_smbus_read_word_swapped(client, + EMC2305_REG_FAN_TACH(attr->index)); + mutex_unlock(&data->lock); + /* Left shift 3 bits for showing correct RPM */ + val = val >> 3; + if ((int)(3932160 * 2 / (val > 0 ? val : 1) == 960))return sprintf(buf, "%d\n", 0); + return sprintf(buf, "%d\n", (int)(3932160 * 2 / (val > 0 ? val : 1) * 100 / MAX_FAN_SPEED)); +} + + +static ssize_t set_fan_percentage(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + unsigned long hsb, lsb; + unsigned long tech; + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, &val); + if (ret) + { + return ret; + } + if (val > 100) + { + return -EINVAL; + } + + if (val <= 5) + { + hsb = 0xff; /*high bit*/ + lsb = 0xe0; /*low bit*/ + } + else + { + val = val * 230; + tech = (3932160 * 2) / (val > 0 ? val : 1); + hsb = (uint8_t)(((tech << 3) >> 8) & 0x0ff); + lsb = (uint8_t)((tech << 3) & 0x0f8); + } + + mutex_lock(&data->lock); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_REAR_H_RPM(attr->index), hsb); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_REAR_L_RPM(attr->index), lsb); + mutex_unlock(&data->lock); + return count; +} + + +static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + int val; + + + mutex_lock(&data->lock); + val = i2c_smbus_read_word_swapped(client, + EMC2305_REG_FAN_TACH(attr->index)); + mutex_unlock(&data->lock); + /* Left shift 3 bits for showing correct RPM */ + val = val >> 3; + return sprintf(buf, "%d\n", 3932160 * 2 / (val > 0 ? val : 1)); +} + +static ssize_t set_fan(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + unsigned long hsb, lsb; + unsigned long tech; + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, &val); + if (ret) + { + return ret; + } + if (val > 23000) + { + return -EINVAL; + } + + if (val <= 960) + { + hsb = 0xff; /*high bit*/ + lsb = 0xe0; /*low bit*/ + } + else + { + tech = (3932160 * 2) / (val > 0 ? val : 1); + hsb = (uint8_t)(((tech << 3) >> 8) & 0x0ff); + lsb = (uint8_t)((tech << 3) & 0x0f8); + } + + mutex_lock(&data->lock); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_REAR_H_RPM(attr->index), hsb); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_REAR_L_RPM(attr->index), lsb); + mutex_unlock(&data->lock); + return count; +} + +static ssize_t show_pwm(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + int val; + + mutex_lock(&data->lock); + val = i2c_smbus_read_byte_data(client, + EMC2305_REG_FAN_DRIVE(attr->index)); + mutex_unlock(&data->lock); + return sprintf(buf, "%d\n", val); +} + +static ssize_t set_pwm(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); + struct i2c_client *client = to_i2c_client(dev); + struct emc2305_data *data = i2c_get_clientdata(client); + unsigned long val; + int ret; + + ret = kstrtoul(buf, 10, &val); + if (ret) + { + return ret; + } + if (val > 255) + { + return -EINVAL; + } + + mutex_lock(&data->lock); + i2c_smbus_write_byte_data(client, + EMC2305_REG_FAN_DRIVE(attr->index), + val); + mutex_unlock(&data->lock); + return count; +} + +static int emc2305_detect(struct i2c_client *client, + struct i2c_board_info *info) +{ + struct i2c_adapter *adapter = client->adapter; + int vendor, device; + + if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA)) + { + return -ENODEV; + } + + vendor = i2c_smbus_read_byte_data(client, EMC2305_REG_VENDOR); + if (vendor != EMC2305_VENDOR) + { + return -ENODEV; + } + + device = i2c_smbus_read_byte_data(client, EMC2305_REG_DEVICE); + if (device != EMC2305_DEVICE) + { + return -ENODEV; + } + + strlcpy(info->type, "emc2305", I2C_NAME_SIZE); + + return 0; +} + +static int emc2305_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct emc2305_data *data; + int err; + int i; + + data = devm_kzalloc(&client->dev, sizeof(struct emc2305_data), + GFP_KERNEL); + if (!data) + { + return -ENOMEM; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + + dev_info(&client->dev, "%s chip found\n", client->name); + + data->attrs.attrs = emc2305_attr; + err = sysfs_create_group(&client->dev.kobj, &data->attrs); + if (err) + { + return err; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + err = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + for (i = 0; i < 5; i++) + { + /* set minimum drive to 0% */ + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_MIN_DRIVE(i), FAN_MINIMUN); + i2c_smbus_write_byte_data(client, EMC2305_REG_FAN_CONF(i), FAN_RPM_BASED); + } + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &data->attrs); + return err; +} + +static int emc2305_remove(struct i2c_client *client) +{ + struct emc2305_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &data->attrs); + return 0; +} + +module_i2c_driver(emc2305_driver); + +MODULE_AUTHOR("Neal Tai"); +MODULE_DESCRIPTION("SMSC EMC2305 fan controller driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-delta/debian/changelog b/platform/innovium/sonic-platform-modules-delta/debian/changelog new file mode 100644 index 000000000000..ec8327e8ae7a --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/debian/changelog @@ -0,0 +1,5 @@ +sonic-delta-platform-modules (1.1) unstable; urgency=low + + * Initial release + + -- Neal Tai Fri, 21 APR 2017 11:11:11 -0800 diff --git a/platform/innovium/sonic-platform-modules-delta/debian/compat b/platform/innovium/sonic-platform-modules-delta/debian/compat new file mode 100644 index 000000000000..ec635144f600 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/debian/compat @@ -0,0 +1 @@ +9 diff --git a/platform/innovium/sonic-platform-modules-delta/debian/control b/platform/innovium/sonic-platform-modules-delta/debian/control new file mode 100644 index 000000000000..71c403387f80 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/debian/control @@ -0,0 +1,13 @@ +Source: sonic-delta-platform-modules +Section: main +Priority: extra +Maintainer: Neal Tai +Build-Depends: debhelper (>= 8.0.0), bzip2 +Standards-Version: 3.9.3 + +Package: platform-modules-et-c032if +Architecture: amd64 +Depends: linux-image-4.9.0-9-2-amd64 +Description: kernel modules for platform devices such as fan, led, sfp + + diff --git a/platform/innovium/sonic-platform-modules-delta/debian/platform-modules-et-c032if.init b/platform/innovium/sonic-platform-modules-delta/debian/platform-modules-et-c032if.init new file mode 100755 index 000000000000..f2d24b04a0d4 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/debian/platform-modules-et-c032if.init @@ -0,0 +1,39 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup et-c032if board. +### END INIT INFO + +case "$1" in +start) + echo -n "Setting up board... " + modprobe optoe + modprobe delta_et-c032if_platform + + /usr/local/bin/et-c032if_platform_init.sh + echo "done." + ;; + +stop) + echo "done." + + ;; + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/platform-modules-et-c032if.init {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/platform/innovium/sonic-platform-modules-delta/debian/platform-modules-et-c032if.install b/platform/innovium/sonic-platform-modules-delta/debian/platform-modules-et-c032if.install new file mode 100644 index 000000000000..45886664b870 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/debian/platform-modules-et-c032if.install @@ -0,0 +1,3 @@ +et-c032if/cfg/et-c032if-modules.conf etc/modules-load.d +et-c032if/scripts/et-c032if_platform_init.sh usr/local/bin +systemd/platform-modules-et-c032if.service lib/systemd/system diff --git a/platform/innovium/sonic-platform-modules-delta/debian/rules b/platform/innovium/sonic-platform-modules-delta/debian/rules new file mode 100755 index 000000000000..a84c235e5480 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/debian/rules @@ -0,0 +1,33 @@ +#!/usr/bin/make -f + +export INSTALL_MOD_DIR:=extra + +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS:= et-c032if + +%: + dh $@ --with=systemd + +override_dh_auto_build: + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + done) + +override_dh_auto_install: + (for mod in $(MODULE_DIRS); do \ + dh_installdirs -pplatform-modules-$${mod} \ + $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + cp $(MOD_SRC_DIR)/$${mod}/modules/*.ko \ + debian/platform-modules-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + done) + +override_dh_usrlocal: + +override_dh_clean: + dh_clean + (for mod in $(MODULE_DIRS); do \ + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ + done) + diff --git a/platform/innovium/sonic-platform-modules-delta/et-c032if/cfg/et-c032if-modules.conf b/platform/innovium/sonic-platform-modules-delta/et-c032if/cfg/et-c032if-modules.conf new file mode 100644 index 000000000000..552b4103ed02 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/et-c032if/cfg/et-c032if-modules.conf @@ -0,0 +1,13 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +i2c-i801 +i2c-isch +i2c-ismt +i2c-dev +i2c-mux +i2c-smbus +i2c-mux-gpio +i2c-mux-pca954x diff --git a/platform/innovium/sonic-platform-modules-delta/et-c032if/modules/Makefile b/platform/innovium/sonic-platform-modules-delta/et-c032if/modules/Makefile new file mode 100644 index 000000000000..2e8feec0b405 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/et-c032if/modules/Makefile @@ -0,0 +1,2 @@ +obj-m := delta_et-c032if_platform.o + diff --git a/platform/innovium/sonic-platform-modules-delta/et-c032if/modules/delta_et-c032if_platform.c b/platform/innovium/sonic-platform-modules-delta/et-c032if/modules/delta_et-c032if_platform.c new file mode 100644 index 000000000000..d4e23a166e88 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/et-c032if/modules/delta_et-c032if_platform.c @@ -0,0 +1,2100 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define CPULD_ADDR 0x31 +#define SWPLD2_ADDR 0x35 +#define SWPLD3_ADDR 0x36 +#define BUS0_BASE_NUM 10 +#define BUS0_DEV_NUM 3 +#define DEFAULT_NUM 0 +#define EEPROM_VAL 0xfc +#define SWPLD_VAL 0xfe +#define QSFP_VAL 0xff +#define BUS0_MUX_REG 0x14 +#define QSFP_PRESENCE_1 0x51 +#define QSFP_PRESENCE_2 0x52 +#define QSFP_PRESENCE_3 0x51 +#define QSFP_PRESENCE_4 0x52 +#define SFP_PRESENCE 0x71 +#define QSFP_RESPONDE_1 0x31 +#define QSFP_RESPONDE_2 0x32 +#define QSFP_RESPONDE_3 0x31 +#define QSFP_RESPONDE_4 0x32 +#define QSFP_LP_MODE_1 0x21 +#define QSFP_LP_MODE_2 0x22 +#define QSFP_LP_MODE_3 0x21 +#define QSFP_LP_MODE_4 0x22 +#define QSFP_RESET_1 0x11 +#define QSFP_RESET_2 0x12 +#define QSFP_RESET_3 0x11 +#define QSFP_RESET_4 0x12 +#define QSFP_INTERRUPT_1 0x61 +#define QSFP_INTERRUPT_2 0x62 +#define QSFP_INTERRUPT_3 0x61 +#define QSFP_INTERRUPT_4 0x62 + +#define EEPROM_SIZE 256 +#define EEPROM_MASK 29 +#define ATTR_R 1 +#define ATTR_W 2 + +#define et_c032if_i2c_device_num(NUM){ \ + .name = "delta-et-c032if-i2c-device", \ + .id = NUM, \ + .dev = { \ + .platform_data = &et_c032if_i2c_device_platform_data[NUM],\ + .release = device_release, \ + }, \ +} + +struct mutex dni_lock; + +/*Define struct to get client of i2c_new_deivce */ +struct i2c_client * i2c_client_9548_1; +struct i2c_client * i2c_client_9548_2; +struct i2c_client * i2c_client_9548_3; +struct i2c_client * i2c_client_9548_4; +struct i2c_client * i2c_client_9548_5; + +static struct kobject *kobj_cpld; +static struct kobject *kobj_swpld2; +static struct kobject *kobj_swpld3; +static struct kobject *kobj_sfp; + +enum{ + BUS0 = 0, + BUS1, + BUS2, + BUS3, + BUS4, + BUS5, + BUS6, + BUS7, + BUS8, + BUS9, + BUS10, + BUS11, + BUS12, + BUS13, + BUS14, + BUS15, + BUS16, + BUS17, + BUS18, + BUS19, +}; + +static struct cpld_attribute_data { + uint8_t bus; + uint8_t addr; + uint8_t reg; + uint8_t mask; + char note[350]; +}; + +unsigned char reverse_8bits(unsigned char c) +{ + unsigned char s = 0; + int i; + for (i = 0; i < 8; ++i) { + s <<= 1; + s |= c & 1; + c >>= 1; + } + return s; +} + +unsigned char dni_log2 (unsigned char num){ + unsigned char num_log2 = 0; + while(num > 0){ + num = num >> 1; + num_log2 += 1; + } + return num_log2 -1; +} + +/*---------------- I2C device - start ------------- */ +static void device_release(struct device *dev) +{ + return; +} + +struct i2c_device_platform_data { + int parent; + struct i2c_board_info info; + struct i2c_client *client; +}; +/* pca9548 - add 8 bus */ + +static struct pca954x_platform_mode pca954x_1_mode[] = +{ + { .adap_id = 30, + .deselect_on_exit = 1, + }, + { .adap_id = 31, + .deselect_on_exit = 1, + }, + { .adap_id = 32, + .deselect_on_exit = 1, + }, + { .adap_id = 33, + .deselect_on_exit = 1, + }, + { .adap_id = 34, + .deselect_on_exit = 1, + }, + { .adap_id = 35, + .deselect_on_exit = 1, + }, + { .adap_id = 36, + .deselect_on_exit = 1, + }, + { .adap_id = 37, + .deselect_on_exit = 1, + }, +}; + +static struct pca954x_platform_mode pca954x_2_mode[] = +{ + { .adap_id = 38, + .deselect_on_exit = 1, + }, + { .adap_id = 39, + .deselect_on_exit = 1, + }, + { .adap_id = 40, + .deselect_on_exit = 1, + }, + { .adap_id = 41, + .deselect_on_exit = 1, + }, + { .adap_id = 42, + .deselect_on_exit = 1, + }, + { .adap_id = 43, + .deselect_on_exit = 1, + }, + { .adap_id = 44, + .deselect_on_exit = 1, + }, + { .adap_id = 45, + .deselect_on_exit = 1, + }, +}; + +static struct pca954x_platform_mode pca954x_3_mode[] = +{ + { .adap_id = 46, + .deselect_on_exit = 1, + }, + { .adap_id = 47, + .deselect_on_exit = 1, + }, + { .adap_id = 48, + .deselect_on_exit = 1, + }, + { .adap_id = 49, + .deselect_on_exit = 1, + }, + { .adap_id = 50, + .deselect_on_exit = 1, + }, + { .adap_id = 51, + .deselect_on_exit = 1, + }, + { .adap_id = 52, + .deselect_on_exit = 1, + }, + { .adap_id = 53, + .deselect_on_exit = 1, + }, +}; + +static struct pca954x_platform_mode pca954x_4_mode[] = +{ + { .adap_id = 54, + .deselect_on_exit = 1, + }, + { .adap_id = 55, + .deselect_on_exit = 1, + }, + { .adap_id = 56, + .deselect_on_exit = 1, + }, + { .adap_id = 57, + .deselect_on_exit = 1, + }, + { .adap_id = 58, + .deselect_on_exit = 1, + }, + { .adap_id = 59, + .deselect_on_exit = 1, + }, + { .adap_id = 60, + .deselect_on_exit = 1, + }, + { .adap_id = 61, + .deselect_on_exit = 1, + }, +}; + +static struct pca954x_platform_mode pca954x_5_mode[] = +{ + { .adap_id = 62, + .deselect_on_exit = 1, + }, + { .adap_id = 63, + .deselect_on_exit = 1, + }, + { .adap_id = 64, + .deselect_on_exit = 1, + }, + { .adap_id = 65, + .deselect_on_exit = 1, + }, + { .adap_id = 66, + .deselect_on_exit = 1, + }, + { .adap_id = 67, + .deselect_on_exit = 1, + }, + { .adap_id = 68, + .deselect_on_exit = 1, + }, + { .adap_id = 69, + .deselect_on_exit = 1, + }, +}; + +static struct pca954x_platform_data pca954x_data[] = +{ + { + .modes = pca954x_1_mode, + .num_modes = ARRAY_SIZE(pca954x_1_mode), + }, + { + .modes = pca954x_2_mode, + .num_modes = ARRAY_SIZE(pca954x_2_mode), + }, + { + .modes = pca954x_3_mode, + .num_modes = ARRAY_SIZE(pca954x_3_mode), + }, + { + .modes = pca954x_4_mode, + .num_modes = ARRAY_SIZE(pca954x_4_mode), + }, + { + .modes = pca954x_5_mode, + .num_modes = ARRAY_SIZE(pca954x_5_mode), + }, +}; + +static struct i2c_board_info __initdata i2c_info_pca9548[] = +{ + { + I2C_BOARD_INFO("pca9548", 0x71), + .platform_data = &pca954x_data[0], + }, + { + I2C_BOARD_INFO("pca9548", 0x72), + .platform_data = &pca954x_data[1], + }, + { + I2C_BOARD_INFO("pca9548", 0x73), + .platform_data = &pca954x_data[2], + }, + { + I2C_BOARD_INFO("pca9548", 0x74), + .platform_data = &pca954x_data[3], + }, + { + I2C_BOARD_INFO("pca9548", 0x76), + .platform_data = &pca954x_data[4], + }, +}; + +static struct i2c_device_platform_data et_c032if_i2c_device_platform_data[] = { + { + /* id eeprom (0x53) */ + .parent = 10, + .info = { I2C_BOARD_INFO("24c02", 0x53) }, + .client = NULL, + }, + { + /* qsfp 1 (0x50) */ + .parent = 30, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 2 (0x50) */ + .parent = 31, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 3 (0x50) */ + .parent = 32, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 4 (0x50) */ + .parent = 33, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 5 (0x50) */ + .parent = 34, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 6 (0x50) */ + .parent = 35, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 7 (0x50) */ + .parent = 36, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 8 (0x50) */ + .parent = 37, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 9 (0x50) */ + .parent = 38, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 10 (0x50) */ + .parent = 39, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 11 (0x50) */ + .parent = 40, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 12 (0x50) */ + .parent = 41, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 13 (0x50) */ + .parent = 42, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 14 (0x50) */ + .parent = 43, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 15 (0x50) */ + .parent = 44, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 16 (0x50) */ + .parent = 45, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 17 (0x50) */ + .parent = 46, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 18 (0x50) */ + .parent = 47, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 19 (0x50) */ + .parent = 48, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 20 (0x50) */ + .parent = 49, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 21 (0x50) */ + .parent = 50, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 22 (0x50) */ + .parent = 51, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 23 (0x50) */ + .parent = 52, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 24 (0x50) */ + .parent = 53, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 25 (0x50) */ + .parent = 54, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 26 (0x50) */ + .parent = 55, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 27 (0x50) */ + .parent = 56, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 28 (0x50) */ + .parent = 57, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 29 (0x50) */ + .parent = 58, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 30 (0x50) */ + .parent = 59, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 31 (0x50) */ + .parent = 60, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* qsfp 32 (0x50) */ + .parent = 61, + .info = { .type = "optoe1", .addr = 0x50 }, + .client = NULL, + }, + { + /* sfp 1 (0x50) */ + .parent = 62, + .info = { .type = "optoe2", .addr = 0x50 }, + .client = NULL, + }, + { + /* sfp 2 (0x50) */ + .parent = 63, + .info = { .type = "optoe2", .addr = 0x50 }, + .client = NULL, + }, + +}; + + +static struct platform_device et_c032if_i2c_device[] = { + et_c032if_i2c_device_num(0), + et_c032if_i2c_device_num(1), + et_c032if_i2c_device_num(2), + et_c032if_i2c_device_num(3), + et_c032if_i2c_device_num(4), + et_c032if_i2c_device_num(5), + et_c032if_i2c_device_num(6), + et_c032if_i2c_device_num(7), + et_c032if_i2c_device_num(8), + et_c032if_i2c_device_num(9), + et_c032if_i2c_device_num(10), + et_c032if_i2c_device_num(11), + et_c032if_i2c_device_num(12), + et_c032if_i2c_device_num(13), + et_c032if_i2c_device_num(14), + et_c032if_i2c_device_num(15), + et_c032if_i2c_device_num(16), + et_c032if_i2c_device_num(17), + et_c032if_i2c_device_num(18), + et_c032if_i2c_device_num(19), + et_c032if_i2c_device_num(20), + et_c032if_i2c_device_num(21), + et_c032if_i2c_device_num(22), + et_c032if_i2c_device_num(23), + et_c032if_i2c_device_num(24), + et_c032if_i2c_device_num(25), + et_c032if_i2c_device_num(26), + et_c032if_i2c_device_num(27), + et_c032if_i2c_device_num(28), + et_c032if_i2c_device_num(29), + et_c032if_i2c_device_num(30), + et_c032if_i2c_device_num(31), + et_c032if_i2c_device_num(32), + et_c032if_i2c_device_num(33), + et_c032if_i2c_device_num(34), +}; + +/*---------------- I2C device - end ------------- */ + +/*---------------- I2C driver - start ------------- */ +static int __init i2c_device_probe(struct platform_device *pdev) +{ + struct i2c_device_platform_data *pdata; + struct i2c_adapter *parent; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + return -ENODEV; + } + + parent = i2c_get_adapter(pdata->parent); + if (!parent) { + dev_err(&pdev->dev, "Parent adapter (%d) not found\n", + pdata->parent); + return -ENODEV; + } + + pdata->client = i2c_new_device(parent, &pdata->info); + if (!pdata->client) { + dev_err(&pdev->dev, "Failed to create i2c client %s at %d\n", + pdata->info.type, pdata->parent); + return -ENODEV; + } + + return 0; +} + +static int __exit i2c_deivce_remove(struct platform_device *pdev) +{ + struct i2c_adapter *parent; + struct i2c_device_platform_data *pdata; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + return -ENODEV; + } + if (pdata->client) { + parent = (pdata->client)->adapter; + i2c_unregister_device(pdata->client); + i2c_put_adapter(parent); + } + return 0; +} +static struct platform_driver i2c_device_driver = { + .probe = i2c_device_probe, + .remove = __exit_p(i2c_deivce_remove), + .driver = { + .owner = THIS_MODULE, + .name = "delta-et-c032if-i2c-device", + } +}; + +/*---------------- I2C driver - end ------------- */ + +/*---------------- CPLD - start ------------- */ + +unsigned char cpupld_reg_addr; +unsigned char swpld2_reg_addr; +unsigned char swpld3_reg_addr; + +/* CPLD -- device */ + +enum cpld_type { + cpu_cpld, +}; + +enum swpld2_type { + swpld2, +}; + +enum swpld3_type { + swpld3, +}; + +enum cpld_attributes { +//CPLDs address and value + CPLD_REG_ADDR, + CPLD_REG_VALUE, + SWPLD2_REG_ADDR, + SWPLD2_REG_VALUE, + SWPLD3_REG_ADDR, + SWPLD3_REG_VALUE, + SFP_SELECT_PORT, + SFP_IS_PRESENT, + SFP_IS_PRESENT_ALL, + QSFP_LP_MODE, + QSFP_RESET, + QSFP_INTERRUPT, + QSFP_RESPONDE, +}; + +struct cpld_platform_data { + int reg_addr; + struct i2c_client *client; +}; + +static struct cpld_platform_data et_c032if_cpld_platform_data[] = { + [cpu_cpld] = { + .reg_addr = CPULD_ADDR, + }, +}; + +static struct cpld_platform_data et_c032if_swpld2_platform_data[] = { + [swpld2] = { + .reg_addr = SWPLD2_ADDR, + }, +}; + +static struct cpld_platform_data et_c032if_swpld3_platform_data[] = { + [swpld3] = { + .reg_addr = SWPLD3_ADDR, + }, +}; + +static struct platform_device et_c032if_cpld = { + .name = "delta-et-c032if-cpld", + .id = 0, + .dev = { + .platform_data = et_c032if_cpld_platform_data, + .release = device_release, + }, +}; + +static struct platform_device et_c032if_swpld2 = { + .name = "delta-et-c032if-swpld2", + .id = 0, + .dev = { + .platform_data = et_c032if_swpld2_platform_data, + .release = device_release + }, +}; + +static struct platform_device et_c032if_swpld3 = { + .name = "delta-et-c032if-swpld3", + .id = 0, + .dev = { + .platform_data = et_c032if_swpld3_platform_data, + .release = device_release + }, +}; + +static ssize_t get_cpld_reg(struct device *dev, struct device_attribute *dev_attr, char *buf) +{ + int ret; + int mask; + int value; + char note[450]; + struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + struct cpld_platform_data *pdata = dev->platform_data; + + mutex_lock(&dni_lock); + switch (attr->index) { + case CPLD_REG_ADDR: + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%02x\n", cpupld_reg_addr); + case SWPLD2_REG_ADDR: + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%02x\n", swpld2_reg_addr); + case SWPLD3_REG_ADDR: + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%02x\n", swpld3_reg_addr); + case CPLD_REG_VALUE: + ret = i2c_smbus_read_byte_data(pdata[cpu_cpld].client, cpupld_reg_addr); + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%02x\n", ret); + case SWPLD2_REG_VALUE: + ret = i2c_smbus_read_byte_data(pdata[swpld2].client, swpld2_reg_addr); + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%02x\n", ret); + case SWPLD3_REG_VALUE: + ret = i2c_smbus_read_byte_data(pdata[swpld3].client, swpld3_reg_addr); + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%02x\n", ret); + default: + mutex_unlock(&dni_lock); + return sprintf(buf, "%d not found", attr->index); + } + + switch (mask) { + case 0xff: + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%02x%s", value, note); + case 0x0f: + case 0x07: + case 0x03: + break; + case 0x0c: + value = value >> 2; + break; + case 0xf0: + case 0x70: + case 0x30: + value = value >> 4; + break; + case 0xe0: + value = value >> 5; + break; + case 0xc0: + value = value >> 6; + break; + default : + value = value >> dni_log2(mask); + mutex_unlock(&dni_lock); + return sprintf(buf, "%d%s", value, note); + } + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%02x%s", value, note); +} + +static ssize_t set_cpld_reg(struct device *dev, struct device_attribute *dev_attr, + const char *buf, size_t count) +{ + int err; + int set_data; + unsigned long set_data_ul; + unsigned char mask; + unsigned char mask_out; + struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + struct cpld_platform_data *pdata = dev->platform_data; + + err = kstrtoul(buf, 0, &set_data_ul); + if (err){ + return err; + } + + mutex_lock(&dni_lock); + set_data = (int)set_data_ul; + if (set_data > 0xff){ + printk(KERN_ALERT "address out of range (0x00-0xFF)\n"); + mutex_unlock(&dni_lock); + return count; + } + + switch (attr->index) { + case CPLD_REG_ADDR: + cpupld_reg_addr = set_data; + mutex_unlock(&dni_lock); + return count; + case SWPLD2_REG_ADDR: + swpld2_reg_addr = set_data; + mutex_unlock(&dni_lock); + return count; + case SWPLD3_REG_ADDR: + swpld3_reg_addr = set_data; + mutex_unlock(&dni_lock); + return count; + case CPLD_REG_VALUE: + i2c_smbus_write_byte_data(pdata[cpu_cpld].client, cpupld_reg_addr, set_data); + mutex_unlock(&dni_lock); + return count; + case SWPLD2_REG_VALUE: + i2c_smbus_write_byte_data(pdata[swpld2].client, swpld2_reg_addr, set_data); + mutex_unlock(&dni_lock); + return count; + case SWPLD3_REG_VALUE: + i2c_smbus_write_byte_data(pdata[swpld3].client, swpld3_reg_addr, set_data); + mutex_unlock(&dni_lock); + return count; + default: + mutex_unlock(&dni_lock); + return sprintf(buf, "%d not found", attr->index); + } + + switch (mask) { + case 0x03: + case 0x07: + case 0x0f: + case 0xff: + set_data = mask_out | (set_data & mask); + break; + case 0x0c: + set_data = set_data << 2; + set_data = mask_out | (set_data & mask); + break; + case 0xf0: + case 0x70: + case 0x30: + set_data = set_data << 4; + set_data = mask_out | (set_data & mask); + break; + case 0xe0: + set_data = set_data << 5; + set_data = mask_out | (set_data & mask); + break; + case 0xc0: + set_data = set_data << 6; + set_data = mask_out | (set_data & mask); + break; + default : + set_data = mask_out | (set_data << dni_log2(mask) ); + } + switch (attr->index) { + default: + mutex_unlock(&dni_lock); + return sprintf(buf, "cpld not found"); + } + mutex_unlock(&dni_lock); + return count; +} + +/* ---------------- SFP attribute read/write - start -------- */ + +static ssize_t for_status(struct device *dev, struct device_attribute *dev_attr, char *buf){ + struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + struct device *i2cdev_1 = kobj_to_dev(kobj_swpld2); + struct device *i2cdev_2 = kobj_to_dev(kobj_swpld3); + struct cpld_platform_data *pdata1 = i2cdev_1->platform_data; + struct cpld_platform_data *pdata2 = i2cdev_2->platform_data; + + mutex_lock(&dni_lock); + int ret; + u32 data = 0; + int data2 = 0; + u8 save_bytes = 0x00; + + switch (attr->index) { + case SFP_IS_PRESENT: + /* Report the SFP/QSFP ALL PRESENCE status + * This data information form SWPLD2 and SWPLD3. */ + + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_PRESENCE_4); + data = (u32)(ret & 0xff); + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_PRESENCE_3); + data |= (u32)(ret & 0xff) << 8; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_PRESENCE_2); + data |= (u32)(ret & 0xff) << 16; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_PRESENCE_1); + data |= (u32)(ret & 0xff) << 24; + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, SFP_PRESENCE); + data2 = (ret & 0x44); + save_bytes = data2 & 0x40; + save_bytes = save_bytes << 1; + data2 &= 0x04; + data2 = data2 << 4; + data2 |= save_bytes; + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%x%02x\n", data, data2); + + case QSFP_LP_MODE: + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_LP_MODE_4); + data = (u32)(ret & 0xff); + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_LP_MODE_3); + data |= (u32)(ret & 0xff) << 8; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_LP_MODE_2); + data |= (u32)(ret & 0xff) << 16; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_LP_MODE_1); + data |= (u32)(ret & 0xff) << 24; + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%x\n", data); + + case QSFP_RESET: + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_RESET_4); + data = (u32)(ret & 0xff); + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_RESET_3); + data |= (u32)(ret & 0xff) << 8; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_RESET_2); + data |= (u32)(ret & 0xff) << 16; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_RESET_1); + data |= (u32)(ret & 0xff) << 24; + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%x\n", data); + + case QSFP_INTERRUPT: + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_INTERRUPT_4); + data = (u32)(ret & 0xff); + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_INTERRUPT_3); + data |= (u32)(ret & 0xff) << 8; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_INTERRUPT_2); + data |= (u32)(ret & 0xff) << 16; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_INTERRUPT_1); + data |= (u32)(ret & 0xff) << 24; + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%x\n", data); + + case QSFP_RESPONDE: + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_RESPONDE_4); + data = (u32)(ret & 0xff); + ret = i2c_smbus_read_byte_data(pdata2[swpld3].client, QSFP_RESPONDE_3); + data |= (u32)(ret & 0xff) << 8; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_RESPONDE_2); + data |= (u32)(ret & 0xff) << 16; + ret = i2c_smbus_read_byte_data(pdata1[swpld2].client, QSFP_RESPONDE_1); + data |= (u32)(ret & 0xff) << 24; + mutex_unlock(&dni_lock); + return sprintf(buf, "0x%x\n", data); + + default: + mutex_unlock(&dni_lock); + return sprintf(buf, "%d not found", attr->index); + } +} + + +static ssize_t set_lpmode_data(struct device *dev, struct device_attribute *dev_attr, const char *buf, size_t count) +{ + struct device *i2cdev_1 = kobj_to_dev(kobj_swpld2); + struct device *i2cdev_2 = kobj_to_dev(kobj_swpld3); + struct cpld_platform_data *pdata1 = i2cdev_1->platform_data; + struct cpld_platform_data *pdata2 = i2cdev_2->platform_data; + unsigned long long set_data; + int err; + int values = 0x00; + u8 reg_t = 0x00; + + err = kstrtoull(buf, 16, &set_data); + if (err){ + return err; + } + mutex_lock(&dni_lock); + reg_t = QSFP_LP_MODE_1; + values = ((set_data >> 24 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata1[swpld2].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + + reg_t = QSFP_LP_MODE_2; + values = ((set_data >> 16 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata1[swpld2].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + + reg_t = QSFP_LP_MODE_3; + values = ((set_data >> 8 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata2[swpld3].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + + reg_t = QSFP_LP_MODE_4; + values = (set_data & 0xff); + if (i2c_smbus_write_byte_data(pdata2[swpld3].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + + mutex_unlock(&dni_lock); + return count; + +ERROR: + mutex_unlock(&dni_lock); + return -EIO; +} + +static ssize_t set_reset_data(struct device *dev, struct device_attribute *dev_attr, const char *buf, size_t count) +{ + struct device *i2cdev_1 = kobj_to_dev(kobj_swpld2); + struct device *i2cdev_2 = kobj_to_dev(kobj_swpld3); + struct cpld_platform_data *pdata1 = i2cdev_1->platform_data; + struct cpld_platform_data *pdata2 = i2cdev_2->platform_data; + unsigned long long set_data; + int err; + int values = 0x00; + u8 reg_t = 0x00; + + err = kstrtoull(buf, 16, &set_data); + if (err){ + return err; + } + + mutex_lock(&dni_lock); + reg_t = QSFP_RESET_1; + values = ((set_data >> 24 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata1[swpld2].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + reg_t = QSFP_RESET_2; + values = ((set_data >> 16 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata1[swpld2].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + reg_t = QSFP_RESET_3; + values = ((set_data >> 8 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata2[swpld3].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + reg_t = QSFP_RESET_4; + values = (set_data & 0xff); + if (i2c_smbus_write_byte_data(pdata2[swpld3].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + + mutex_unlock(&dni_lock); + return count; + +ERROR: + mutex_unlock(&dni_lock); + return -EIO; +} + +static ssize_t set_interrupt_data(struct device *dev, struct device_attribute *dev_attr, const char *buf, size_t count) +{ + struct device *i2cdev_1 = kobj_to_dev(kobj_swpld2); + struct device *i2cdev_2 = kobj_to_dev(kobj_swpld3); + struct cpld_platform_data *pdata1 = i2cdev_1->platform_data; + struct cpld_platform_data *pdata2 = i2cdev_2->platform_data; + unsigned long long set_data; + int err; + int values = 0x00; + u8 reg_t = 0x00; + + err = kstrtoull(buf, 16, &set_data); + if (err){ + return err; + } + + mutex_lock(&dni_lock); + reg_t = QSFP_INTERRUPT_1; + values = ((set_data >> 24 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata1[swpld2].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + reg_t = QSFP_INTERRUPT_2; + values = ((set_data >> 16 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata1[swpld2].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + reg_t = QSFP_INTERRUPT_3; + values = ((set_data >> 8 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata2[swpld3].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + reg_t = QSFP_INTERRUPT_4; + values = (set_data & 0xff); + + if (i2c_smbus_write_byte_data(pdata2[swpld3].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + + mutex_unlock(&dni_lock); + return count; + +ERROR: + mutex_unlock(&dni_lock); + return -EIO; +} + +static ssize_t set_responde_data(struct device *dev, struct device_attribute *dev_attr, const char *buf, size_t count) +{ + struct device *i2cdev_1 = kobj_to_dev(kobj_swpld2); + struct device *i2cdev_2 = kobj_to_dev(kobj_swpld3); + struct cpld_platform_data *pdata1 = i2cdev_1->platform_data; + struct cpld_platform_data *pdata2 = i2cdev_2->platform_data; + unsigned long long set_data; + int err; + int values = 0x00; + u8 reg_t = 0x00; + + err = kstrtoull(buf, 16, &set_data); + if (err){ + return err; + } + + mutex_lock(&dni_lock); + reg_t = QSFP_RESPONDE_1; + values = ((set_data >> 24 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata1[swpld2].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + reg_t = QSFP_RESPONDE_2; + values = ((set_data >> 16 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata1[swpld2].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + reg_t = QSFP_RESPONDE_3; + values = ((set_data >> 8 ) & 0xff); + if (i2c_smbus_write_byte_data(pdata2[swpld3].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + reg_t = QSFP_RESPONDE_4; + values = (set_data & 0xff); + if (i2c_smbus_write_byte_data(pdata2[swpld3].client, reg_t, (u8)values) < 0) + { + goto ERROR; + } + + mutex_unlock(&dni_lock); + return count; + +ERROR: + mutex_unlock(&dni_lock); + return -EIO; +} + +static SENSOR_DEVICE_ATTR(cpld_reg_addr, S_IRUGO | S_IWUSR, get_cpld_reg, set_cpld_reg, CPLD_REG_ADDR); +static SENSOR_DEVICE_ATTR(cpld_reg_value, S_IRUGO | S_IWUSR, get_cpld_reg, set_cpld_reg, CPLD_REG_VALUE); +static SENSOR_DEVICE_ATTR(swpld2_reg_addr, S_IRUGO | S_IWUSR, get_cpld_reg, set_cpld_reg, SWPLD2_REG_ADDR); +static SENSOR_DEVICE_ATTR(swpld2_reg_value, S_IRUGO | S_IWUSR, get_cpld_reg, set_cpld_reg, SWPLD2_REG_VALUE); +static SENSOR_DEVICE_ATTR(swpld3_reg_addr, S_IRUGO | S_IWUSR, get_cpld_reg, set_cpld_reg, SWPLD3_REG_ADDR); +static SENSOR_DEVICE_ATTR(swpld3_reg_value, S_IRUGO | S_IWUSR, get_cpld_reg, set_cpld_reg, SWPLD3_REG_VALUE); +//SFP, QSFP +static SENSOR_DEVICE_ATTR(sfp_is_present, S_IRUGO, for_status, NULL, SFP_IS_PRESENT); +static SENSOR_DEVICE_ATTR(sfp_lp_mode, S_IWUSR | S_IRUGO, for_status, set_lpmode_data, QSFP_LP_MODE); +static SENSOR_DEVICE_ATTR(sfp_reset, S_IWUSR | S_IRUGO, for_status, set_reset_data, QSFP_RESET); +static SENSOR_DEVICE_ATTR(sfp_interrupt, S_IWUSR | S_IRUGO, for_status, set_interrupt_data, QSFP_INTERRUPT); +static SENSOR_DEVICE_ATTR(sfp_responde, S_IWUSR | S_IRUGO, for_status, set_responde_data, QSFP_RESPONDE); + +static struct attribute *cpld_attrs[] = { + &sensor_dev_attr_cpld_reg_value.dev_attr.attr, + &sensor_dev_attr_cpld_reg_addr.dev_attr.attr, +//SFP, QSFP + &sensor_dev_attr_sfp_is_present.dev_attr.attr, + &sensor_dev_attr_sfp_lp_mode.dev_attr.attr, + &sensor_dev_attr_sfp_reset.dev_attr.attr, + &sensor_dev_attr_sfp_interrupt.dev_attr.attr, + &sensor_dev_attr_sfp_responde.dev_attr.attr, + NULL, +}; + +static struct attribute *swpld2_attrs[] = { + &sensor_dev_attr_swpld2_reg_value.dev_attr.attr, + &sensor_dev_attr_swpld2_reg_addr.dev_attr.attr, + NULL, +}; + +static struct attribute *swpld3_attrs[] = { + &sensor_dev_attr_swpld3_reg_value.dev_attr.attr, + &sensor_dev_attr_swpld3_reg_addr.dev_attr.attr, + NULL, +}; + +static struct attribute_group cpld_attr_grp = { + .attrs = cpld_attrs, +}; + +static struct attribute_group swpld2_attr_grp = { + .attrs = swpld2_attrs, +}; + +static struct attribute_group swpld3_attr_grp = { + .attrs = swpld3_attrs, +}; + +/* CPLD -- driver */ +static int __init cpld_probe(struct platform_device *pdev) +{ + struct cpld_platform_data *pdata; + struct i2c_adapter *parent; + int ret; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "CPLD platform data not found\n"); + return -ENODEV; + } + + parent = i2c_get_adapter(BUS0); + if (!parent) { + printk(KERN_WARNING "Parent adapter (%d) not found\n", BUS0); + return -ENODEV; + } + + pdata[cpu_cpld].client = i2c_new_dummy(parent, pdata[cpu_cpld].reg_addr); + if (!pdata[cpu_cpld].client) { + printk(KERN_WARNING "Fail to create dummy i2c client for addr %d\n", pdata[cpu_cpld].reg_addr); + goto error; + } + + kobj_cpld = &pdev->dev.kobj; + ret = sysfs_create_group(&pdev->dev.kobj, &cpld_attr_grp); + if (ret) { + printk(KERN_WARNING "Fail to create cpld attribute group"); + goto error; + } + + return 0; +error: + kobject_put(kobj_cpld); + i2c_unregister_device(pdata[cpu_cpld].client); + i2c_put_adapter(parent); + + return -ENODEV; +} + +static int __exit cpld_remove(struct platform_device *pdev) +{ + struct i2c_adapter *parent = NULL; + struct cpld_platform_data *pdata = pdev->dev.platform_data; + sysfs_remove_group(&pdev->dev.kobj, &cpld_attr_grp); + + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + } + else { + if (pdata[cpu_cpld].client) { + if (!parent) { + parent = (pdata[cpu_cpld].client)->adapter; + } + i2c_unregister_device(pdata[cpu_cpld].client); + } + } + i2c_put_adapter(parent); + + return 0; +} + +static int __init swpld2_probe(struct platform_device *pdev) +{ + struct cpld_platform_data *pdata; + struct i2c_adapter *parent; + int ret; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "SWPLD2 platform data not found\n"); + return -ENODEV; + } + parent = i2c_get_adapter(11); + if (!parent) { + printk(KERN_WARNING "Parent adapter (%d) not found\n", 11); + return -ENODEV; + } + + pdata[swpld2].client = i2c_new_dummy(parent, pdata[swpld2].reg_addr); + if (!pdata[swpld2].client) { + printk(KERN_WARNING "Fail to create dummy i2c client for addr %d\n", pdata[swpld2].reg_addr); + goto error; + } + + kobj_swpld2 = &pdev->dev.kobj; + ret = sysfs_create_group(&pdev->dev.kobj, &swpld2_attr_grp); + if (ret) { + printk(KERN_WARNING "Fail to create swpld attribute group"); + goto error; + } + return 0; + +error: + kobject_put(kobj_swpld2); + i2c_unregister_device(pdata[swpld2].client); + i2c_put_adapter(parent); + return -ENODEV; +} + +static int __exit swpld2_remove(struct platform_device *pdev) +{ + struct i2c_adapter *parent = NULL; + struct cpld_platform_data *pdata = pdev->dev.platform_data; + sysfs_remove_group(&pdev->dev.kobj, &swpld2_attr_grp); + + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + } + else { + if (pdata[swpld2].client) { + if (!parent) { + parent = (pdata[swpld2].client)->adapter; + } + i2c_unregister_device(pdata[swpld2].client); + } + } + i2c_put_adapter(parent); + return 0; +} + + +static int __init swpld3_probe(struct platform_device *pdev) +{ + struct cpld_platform_data *pdata; + struct i2c_adapter *parent; + int ret; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "SWPLD3 platform data not found\n"); + return -ENODEV; + } + + parent = i2c_get_adapter(11); + if (!parent) { + printk(KERN_WARNING "Parent adapter (%d) not found\n", 11); + return -ENODEV; + } + + pdata[swpld3].client = i2c_new_dummy(parent, pdata[swpld3].reg_addr); + if (!pdata[swpld3].client) { + printk(KERN_WARNING "Fail to create dummy i2c client for addr %d\n", pdata[swpld3].reg_addr); + goto error; + } + + kobj_swpld3 = &pdev->dev.kobj; + ret = sysfs_create_group(&pdev->dev.kobj, &swpld3_attr_grp); + if (ret) { + printk(KERN_WARNING "Fail to create swpld attribute group"); + goto error; + } + + return 0; + +error: + kobject_put(kobj_swpld3); + i2c_unregister_device(pdata[swpld3].client); + i2c_put_adapter(parent); + + return -ENODEV; +} + +static int __exit swpld3_remove(struct platform_device *pdev) +{ + struct i2c_adapter *parent = NULL; + struct cpld_platform_data *pdata = pdev->dev.platform_data; + sysfs_remove_group(&pdev->dev.kobj, &swpld3_attr_grp); + + if (!pdata) { + dev_err(&pdev->dev, "Missing platform data\n"); + } + else { + if (pdata[swpld3].client) { + if (!parent) { + parent = (pdata[swpld3].client)->adapter; + } + i2c_unregister_device(pdata[swpld3].client); + } + } + i2c_put_adapter(parent); + return 0; +} + +static struct platform_driver cpld_driver = { + .probe = cpld_probe, + .remove = __exit_p(cpld_remove), + .driver = { + .owner = THIS_MODULE, + .name = "delta-et-c032if-cpld", + }, +}; + +static struct platform_driver swpld2_driver = { + .probe = swpld2_probe, + .remove = __exit_p(swpld2_remove), + .driver = { + .owner = THIS_MODULE, + .name = "delta-et-c032if-swpld2", + }, +}; + +static struct platform_driver swpld3_driver = { + .probe = swpld3_probe, + .remove = __exit_p(swpld3_remove), + .driver = { + .owner = THIS_MODULE, + .name = "delta-et-c032if-swpld3", + }, +}; + + +/*---------------- CPLD - end ------------- */ + +/*---------------- delta ATTR - start ------------- */ + +struct delta_bin_attribute { + struct bin_attribute attr; + int index; +}; + +#define to_delta_attr(x) container_of(x, struct delta_bin_attribute, attr) + +#define BIN_ATTR(_name, _mode, _read, _write, _size, _index) { \ + .attr = { \ + .attr = {.name = __stringify(_name), .mode = _mode }, \ + .read = _read, \ + .write = _write, \ + .size = _size, \ + }, \ + .index = _index, \ +} + +#define DELTA_BIN_ATTR(_name, _mode, _read, _write, _size, _index) \ +struct delta_bin_attribute delta_attr_##_name \ + = BIN_ATTR(_name, _mode, _read, _write, _size, _index) + +static char eeprom_data[EEPROM_SIZE]; + +static ssize_t access_user_space(const char *name, char *buf, size_t len, loff_t offset, int mode) +{ + struct file *fp; + mm_segment_t fs; + loff_t pos = offset; + ssize_t vfs_ret = 0; + + fs = get_fs(); + set_fs(get_ds()); + + switch(mode) + { + case ATTR_W: + fp = filp_open(name, O_WRONLY, S_IWUSR | S_IRUGO); + if (IS_ERR(fp)){ + return -ENOENT; + } + vfs_ret = vfs_write(fp, buf, len, &pos); + break; + case ATTR_R: + fp = filp_open(name, O_RDONLY, S_IRUGO); + if (IS_ERR(fp)){ + return -ENOENT; + } + vfs_ret = vfs_read(fp, buf, len, &pos); + break; + } + + set_fs(fs); + filp_close(fp, NULL); + return vfs_ret; +} + +enum sfp_attributes{ + EEPROM_SYS, + EEPROM_SFP_1, + EEPROM_SFP_2, + EEPROM_SFP_3, + EEPROM_SFP_4, + EEPROM_SFP_5, + EEPROM_SFP_6, + EEPROM_SFP_7, + EEPROM_SFP_8, + EEPROM_SFP_9, + EEPROM_SFP_10, + EEPROM_SFP_11, + EEPROM_SFP_12, + EEPROM_SFP_13, + EEPROM_SFP_14, + EEPROM_SFP_15, + EEPROM_SFP_16, + EEPROM_SFP_17, + EEPROM_SFP_18, + EEPROM_SFP_19, + EEPROM_SFP_20, + EEPROM_SFP_21, + EEPROM_SFP_22, + EEPROM_SFP_23, + EEPROM_SFP_24, + EEPROM_SFP_25, + EEPROM_SFP_26, + EEPROM_SFP_27, + EEPROM_SFP_28, + EEPROM_SFP_29, + EEPROM_SFP_30, + EEPROM_SFP_31, + EEPROM_SFP_32, + EEPROM_SFP_33, + EEPROM_SFP_34, +}; + + +static ssize_t delta_bin_attr_read(struct file *filp, struct kobject *kobj, struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct delta_bin_attribute *delta_attr = to_delta_attr(attr); + char attr_path[100]; + + mutex_lock(&dni_lock); + memset(buf, 0, count); + switch(delta_attr->index) { + case EEPROM_SFP_1: + case EEPROM_SFP_2: + case EEPROM_SFP_3: + case EEPROM_SFP_4: + case EEPROM_SFP_5: + case EEPROM_SFP_6: + case EEPROM_SFP_7: + case EEPROM_SFP_8: + case EEPROM_SFP_9: + case EEPROM_SFP_10: + case EEPROM_SFP_11: + case EEPROM_SFP_12: + case EEPROM_SFP_13: + case EEPROM_SFP_14: + case EEPROM_SFP_15: + case EEPROM_SFP_16: + case EEPROM_SFP_17: + case EEPROM_SFP_18: + case EEPROM_SFP_19: + case EEPROM_SFP_20: + case EEPROM_SFP_21: + case EEPROM_SFP_22: + case EEPROM_SFP_23: + case EEPROM_SFP_24: + case EEPROM_SFP_25: + case EEPROM_SFP_26: + case EEPROM_SFP_27: + case EEPROM_SFP_28: + case EEPROM_SFP_29: + case EEPROM_SFP_30: + case EEPROM_SFP_31: + case EEPROM_SFP_32: + case EEPROM_SFP_33: + case EEPROM_SFP_34: + sprintf(attr_path, "/sys/bus/i2c/devices/%d-0050/eeprom", delta_attr->index + EEPROM_MASK); + if (access_user_space(attr_path, eeprom_data, EEPROM_SIZE, 0, ATTR_R) < 0) { + goto ACCESS_ERROR; + } + count = (count <= EEPROM_SIZE) ? count : EEPROM_SIZE; + memcpy(buf, eeprom_data + off, count); + break; + case EEPROM_SYS: + sprintf(attr_path, "/sys/bus/i2c/devices/10-0053/eeprom"); + if (access_user_space(attr_path, eeprom_data, EEPROM_SIZE, 0, ATTR_R) < 0) { + goto ACCESS_ERROR; + } + count = (count <= EEPROM_SIZE) ? count : EEPROM_SIZE; + memcpy(buf, eeprom_data + off, count); + break; + default: + goto ACCESS_ERROR; + } + mutex_unlock(&dni_lock); + return count; + +ACCESS_ERROR: + mutex_unlock(&dni_lock); + return -ENXIO; +} + +static ssize_t delta_bin_attr_write(struct file *filp, struct kobject *kobj, struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct delta_bin_attribute *delta_attr = to_delta_attr(attr); + char attr_path[100]; + + switch(delta_attr->index){ + case EEPROM_SFP_1: + case EEPROM_SFP_2: + case EEPROM_SFP_3: + case EEPROM_SFP_4: + case EEPROM_SFP_5: + case EEPROM_SFP_6: + case EEPROM_SFP_7: + case EEPROM_SFP_8: + case EEPROM_SFP_9: + case EEPROM_SFP_10: + case EEPROM_SFP_11: + case EEPROM_SFP_12: + case EEPROM_SFP_13: + case EEPROM_SFP_14: + case EEPROM_SFP_15: + case EEPROM_SFP_16: + case EEPROM_SFP_17: + case EEPROM_SFP_18: + case EEPROM_SFP_19: + case EEPROM_SFP_20: + case EEPROM_SFP_21: + case EEPROM_SFP_22: + case EEPROM_SFP_23: + case EEPROM_SFP_24: + case EEPROM_SFP_25: + case EEPROM_SFP_26: + case EEPROM_SFP_27: + case EEPROM_SFP_28: + case EEPROM_SFP_29: + case EEPROM_SFP_30: + case EEPROM_SFP_31: + case EEPROM_SFP_32: + case EEPROM_SFP_33: + case EEPROM_SFP_34: + sprintf(attr_path, "/sys/bus/i2c/devices/%d-0050/eeprom", delta_attr->index + EEPROM_MASK); + if (access_user_space(attr_path, buf, count, 0, ATTR_W) < 0) { + goto ACCESS_ERROR; + } + break; + case EEPROM_SYS: + sprintf(attr_path, "/sys/bus/i2c/devices/10-0053/eeprom"); + if (access_user_space(attr_path, buf, count, 0, ATTR_W) < 0) { + goto ACCESS_ERROR; + } + break; + default: + goto ACCESS_ERROR; + } + + mutex_unlock(&dni_lock); + return count; +ACCESS_ERROR: + mutex_unlock(&dni_lock); + return -ETIMEDOUT; +} + +DELTA_BIN_ATTR(eeprom_sys, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SYS); +DELTA_BIN_ATTR(eeprom_sfp_1, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_1); +DELTA_BIN_ATTR(eeprom_sfp_2, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_2); +DELTA_BIN_ATTR(eeprom_sfp_3, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_3); +DELTA_BIN_ATTR(eeprom_sfp_4, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_4); +DELTA_BIN_ATTR(eeprom_sfp_5, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_5); +DELTA_BIN_ATTR(eeprom_sfp_6, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_6); +DELTA_BIN_ATTR(eeprom_sfp_7, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_7); +DELTA_BIN_ATTR(eeprom_sfp_8, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_8); +DELTA_BIN_ATTR(eeprom_sfp_9, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_9); +DELTA_BIN_ATTR(eeprom_sfp_10, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_10); +DELTA_BIN_ATTR(eeprom_sfp_11, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_11); +DELTA_BIN_ATTR(eeprom_sfp_12, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_12); +DELTA_BIN_ATTR(eeprom_sfp_13, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_13); +DELTA_BIN_ATTR(eeprom_sfp_14, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_14); +DELTA_BIN_ATTR(eeprom_sfp_15, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_15); +DELTA_BIN_ATTR(eeprom_sfp_16, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_16); +DELTA_BIN_ATTR(eeprom_sfp_17, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_17); +DELTA_BIN_ATTR(eeprom_sfp_18, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_18); +DELTA_BIN_ATTR(eeprom_sfp_19, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_19); +DELTA_BIN_ATTR(eeprom_sfp_20, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_20); +DELTA_BIN_ATTR(eeprom_sfp_21, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_21); +DELTA_BIN_ATTR(eeprom_sfp_22, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_22); +DELTA_BIN_ATTR(eeprom_sfp_23, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_23); +DELTA_BIN_ATTR(eeprom_sfp_24, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_24); +DELTA_BIN_ATTR(eeprom_sfp_25, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_25); +DELTA_BIN_ATTR(eeprom_sfp_26, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_26); +DELTA_BIN_ATTR(eeprom_sfp_27, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_27); +DELTA_BIN_ATTR(eeprom_sfp_28, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_28); +DELTA_BIN_ATTR(eeprom_sfp_29, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_29); +DELTA_BIN_ATTR(eeprom_sfp_30, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_30); +DELTA_BIN_ATTR(eeprom_sfp_31, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_31); +DELTA_BIN_ATTR(eeprom_sfp_32, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_32); +DELTA_BIN_ATTR(eeprom_sfp_33, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_33); +DELTA_BIN_ATTR(eeprom_sfp_34, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_34); + +static struct bin_attribute *sfp_attrs[] = { + &delta_attr_eeprom_sys.attr, + &delta_attr_eeprom_sfp_1.attr, + &delta_attr_eeprom_sfp_2.attr, + &delta_attr_eeprom_sfp_3.attr, + &delta_attr_eeprom_sfp_4.attr, + &delta_attr_eeprom_sfp_5.attr, + &delta_attr_eeprom_sfp_6.attr, + &delta_attr_eeprom_sfp_7.attr, + &delta_attr_eeprom_sfp_8.attr, + &delta_attr_eeprom_sfp_9.attr, + &delta_attr_eeprom_sfp_10.attr, + &delta_attr_eeprom_sfp_11.attr, + &delta_attr_eeprom_sfp_12.attr, + &delta_attr_eeprom_sfp_13.attr, + &delta_attr_eeprom_sfp_14.attr, + &delta_attr_eeprom_sfp_15.attr, + &delta_attr_eeprom_sfp_16.attr, + &delta_attr_eeprom_sfp_17.attr, + &delta_attr_eeprom_sfp_18.attr, + &delta_attr_eeprom_sfp_19.attr, + &delta_attr_eeprom_sfp_20.attr, + &delta_attr_eeprom_sfp_21.attr, + &delta_attr_eeprom_sfp_22.attr, + &delta_attr_eeprom_sfp_23.attr, + &delta_attr_eeprom_sfp_24.attr, + &delta_attr_eeprom_sfp_25.attr, + &delta_attr_eeprom_sfp_26.attr, + &delta_attr_eeprom_sfp_27.attr, + &delta_attr_eeprom_sfp_28.attr, + &delta_attr_eeprom_sfp_29.attr, + &delta_attr_eeprom_sfp_30.attr, + &delta_attr_eeprom_sfp_31.attr, + &delta_attr_eeprom_sfp_32.attr, + &delta_attr_eeprom_sfp_33.attr, + &delta_attr_eeprom_sfp_34.attr, + NULL, /* need to NULL terminate the list of attributes */ +}; + +static struct attribute_group sfp_attr_grp = { + .bin_attrs = sfp_attrs, +}; + +/*---------------- delta ATTR - end ------------- */ + +/*---------------- MUX - start ------------- */ + +struct cpld_mux_platform_data { + int parent; + int base_nr; + int reg_addr; + struct i2c_client *cpld; +}; + +struct cpld_mux { + struct i2c_adapter *parent; + struct i2c_adapter **child; + struct cpld_mux_platform_data data; +}; + +static struct cpld_mux_platform_data et_c032if_cpld_mux_platform_data[] = { + { + .parent = BUS0, + .base_nr = BUS0_BASE_NUM, + .cpld = NULL, + .reg_addr = BUS0_MUX_REG, + }, +}; + +static struct platform_device et_c032if_cpld_mux[] = +{ + { + .name = "delta-et-c032if-cpld-mux", + .id = 0, + .dev = { + .platform_data = &et_c032if_cpld_mux_platform_data[0], + .release = device_release, + }, + }, +}; + +static int cpld_reg_write_byte(struct i2c_client *client, u8 regaddr, u8 val) +{ + union i2c_smbus_data data; + + data.byte = val; + return client->adapter->algo->smbus_xfer(client->adapter, client->addr, + client->flags, + I2C_SMBUS_WRITE, + regaddr, I2C_SMBUS_BYTE_DATA, &data); +} + +static int cpld_mux_select(struct i2c_mux_core *muxc, u32 chan) +{ + struct cpld_mux *mux = i2c_mux_priv(muxc); + u8 cpld_mux_val=0; + + if ( mux->data.base_nr == BUS0_BASE_NUM ) + { + switch (chan) { + case 0: + cpld_mux_val = EEPROM_VAL; + break; + case 1: + cpld_mux_val = SWPLD_VAL; + break; + case 2: + cpld_mux_val = QSFP_VAL; + break; + default: + cpld_mux_val = 0x00; + break; + } + } + else + { + cpld_mux_val = 0x00; + } + return cpld_reg_write_byte(mux->data.cpld, mux->data.reg_addr, (u8)(cpld_mux_val & 0xff)); + +} + +static int __init cpld_mux_probe(struct platform_device *pdev) +{ + struct i2c_mux_core *muxc; + struct cpld_mux *mux; + struct cpld_mux_platform_data *pdata; + struct i2c_adapter *parent; + int i, ret, dev_num; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "SWPLD platform data not found\n"); + return -ENODEV; + } + mux = kzalloc(sizeof(*mux), GFP_KERNEL); + if (!mux) { + printk(KERN_ERR "Failed to allocate memory for mux\n"); + return -ENOMEM; + } + mux->data = *pdata; + + parent = i2c_get_adapter(pdata->parent); + if (!parent) { + kfree(mux); + dev_err(&pdev->dev, "Parent adapter (%d) not found\n", pdata->parent); + return -ENODEV; + } + /* Judge bus number to decide how many devices*/ + switch (pdata->parent) { + case BUS0: + dev_num = BUS0_DEV_NUM; + break; + default : + dev_num = DEFAULT_NUM; + break; + } + + muxc = i2c_mux_alloc(parent, &pdev->dev, dev_num, 0, 0,cpld_mux_select, NULL); + if (!muxc) { + ret = -ENOMEM; + goto alloc_failed; + } + muxc->priv = mux; + platform_set_drvdata(pdev, muxc); + + for (i = 0; i < dev_num; i++) + { + int nr = pdata->base_nr + i; + unsigned int class = 0; + ret = i2c_mux_add_adapter(muxc, nr, i, class); + if (ret) { + dev_err(&pdev->dev, "Failed to add adapter %d\n", i); + goto add_adapter_failed; + } + } + dev_info(&pdev->dev, "%d port mux on %s adapter\n", dev_num, parent->name); + return 0; + +add_adapter_failed: + i2c_mux_del_adapters(muxc); +alloc_failed: + kfree(mux); + i2c_put_adapter(parent); + + return ret; +} + +static int __exit cpld_mux_remove(struct platform_device *pdev) +{ + struct i2c_mux_core *muxc = platform_get_drvdata(pdev); + struct i2c_adapter *parent = muxc->parent; + + i2c_mux_del_adapters(muxc); + i2c_put_adapter(parent); + + return 0; +} + +static struct platform_driver cpld_mux_driver = { + .probe = cpld_mux_probe, + .remove = __exit_p(cpld_mux_remove), /* TODO */ + .driver = { + .owner = THIS_MODULE, + .name = "delta-et-c032if-cpld-mux", + }, +}; +/*---------------- MUX - end ------------- */ + +/*---------------- module initialization ------------- */ +static int __init delta_et_c032if_platform_init(void) +{ + struct i2c_adapter *adapter; + struct cpld_platform_data *cpld_pdata; + struct cpld_mux_platform_data *cpld_mux_pdata; + int ret,i = 0; + + mutex_init(&dni_lock); + printk("c032if_platform module initialization\n"); + + // set the CPLD prob and remove + ret = platform_driver_register(&cpld_driver); + if (ret) { + printk(KERN_WARNING "Fail to register cpld driver\n"); + goto error_cpld_driver; + } + + ret = platform_driver_register(&cpld_mux_driver); + if (ret) { + printk(KERN_WARNING "Fail to register swpld mux driver\n"); + goto error_cpld_mux_driver; + } + + // set the SWPLD prob and remove + ret = platform_driver_register(&swpld2_driver); + if (ret) { + printk(KERN_WARNING "Fail to register swpld driver\n"); + goto error_swpld2_driver; + } + + // set the SWPLD prob and remove + ret = platform_driver_register(&swpld3_driver); + if (ret) { + printk(KERN_WARNING "Fail to register swpld driver\n"); + goto error_swpld3_driver; + } + + // register the i2c devices + ret = platform_driver_register(&i2c_device_driver); + if (ret) { + printk(KERN_WARNING "Fail to register i2c device driver\n"); + goto error_i2c_device_driver; + } + + // register the CPLD + ret = platform_device_register(&et_c032if_cpld); + if (ret) { + printk(KERN_WARNING "Fail to create cpld device\n"); + goto error_et_c032if_cpld; + } + + cpld_pdata = et_c032if_cpld.dev.platform_data; + cpld_mux_pdata = et_c032if_cpld_mux[0].dev.platform_data; + cpld_mux_pdata->cpld = cpld_pdata[cpu_cpld].client; + ret = platform_device_register(&et_c032if_cpld_mux[0]); + if (ret) { + printk(KERN_WARNING "Fail to create cpld mux\n"); + goto error_et_c032if_cpld_mux; + } + + adapter = i2c_get_adapter(12); + i2c_client_9548_1 = i2c_new_device(adapter, &i2c_info_pca9548[0]); + i2c_client_9548_2 = i2c_new_device(adapter, &i2c_info_pca9548[1]); + i2c_client_9548_3 = i2c_new_device(adapter, &i2c_info_pca9548[2]); + i2c_client_9548_4 = i2c_new_device(adapter, &i2c_info_pca9548[3]); + i2c_client_9548_5 = i2c_new_device(adapter, &i2c_info_pca9548[4]); + i2c_put_adapter(adapter); + + // register the SWPLD2 + ret = platform_device_register(&et_c032if_swpld2); + if (ret) { + printk(KERN_WARNING "Fail to create swpld2 device\n"); + goto error_swpld2_device; + } + + // register the SWPLD3 + ret = platform_device_register(&et_c032if_swpld3); + if (ret) { + printk(KERN_WARNING "Fail to create swpld3 device\n"); + goto error_swpld3_device; + } + for (i = 0; i < ARRAY_SIZE(et_c032if_i2c_device); i++) + { + ret = platform_device_register(&et_c032if_i2c_device[i]); + if (ret) { + printk(KERN_WARNING "Fail to create i2c device %d\n", i); + goto error_et_c032if_i2c_device; + } + } + + kobj_sfp = kobject_create_and_add("sfp", kernel_kobj); + if(!kobj_sfp) + { + return -ENOMEM; + } + ret = sysfs_create_group(kobj_sfp, &sfp_attr_grp); + if (ret) + { + printk(KERN_WARNING "Fail to create sysfs of sfp group\n"); + goto error_create_sfp_group; + } + if (ret) + goto error_create_sfp_group; + + return 0; + +error_create_sfp_group: + kobject_put(kobj_sfp); +error_et_c032if_i2c_device: + i--; + for (; i >= 0; i--) { + platform_device_unregister(&et_c032if_i2c_device[i]); + } + i = ARRAY_SIZE(et_c032if_cpld_mux); + platform_device_unregister(&et_c032if_swpld3); +error_swpld3_device: + platform_device_unregister(&et_c032if_swpld2); +error_swpld2_device: + i2c_unregister_device(i2c_client_9548_1); + i2c_unregister_device(i2c_client_9548_2); + i2c_unregister_device(i2c_client_9548_3); + i2c_unregister_device(i2c_client_9548_4); + i2c_unregister_device(i2c_client_9548_5); +error_et_c032if_cpld_mux: + platform_device_unregister(&et_c032if_cpld_mux[0]); + platform_device_unregister(&et_c032if_cpld); +error_et_c032if_cpld: + platform_driver_unregister(&i2c_device_driver); +error_i2c_device_driver: + platform_driver_unregister(&swpld3_driver); +error_swpld3_driver: + platform_driver_unregister(&swpld2_driver); +error_swpld2_driver: + platform_driver_unregister(&cpld_mux_driver); +error_cpld_mux_driver: + platform_driver_unregister(&cpld_driver); +error_cpld_driver: + return ret; +} + +static void __exit delta_et_c032if_platform_exit(void) +{ + int i = 0; + + kobject_put(kobj_sfp); + for (i = 0; i < ARRAY_SIZE(et_c032if_i2c_device); i++) { + platform_device_unregister(&et_c032if_i2c_device[i]); + } + platform_device_unregister(&et_c032if_swpld2); + platform_device_unregister(&et_c032if_swpld3); + i2c_unregister_device(i2c_client_9548_1); + i2c_unregister_device(i2c_client_9548_2); + i2c_unregister_device(i2c_client_9548_3); + i2c_unregister_device(i2c_client_9548_4); + i2c_unregister_device(i2c_client_9548_5); + platform_device_unregister(&et_c032if_cpld_mux[0]); + platform_device_unregister(&et_c032if_cpld); + platform_driver_unregister(&i2c_device_driver); + platform_driver_unregister(&swpld2_driver); + platform_driver_unregister(&swpld3_driver); + platform_driver_unregister(&cpld_mux_driver); + platform_driver_unregister(&cpld_driver); +} + +module_init(delta_et_c032if_platform_init); +module_exit(delta_et_c032if_platform_exit); + +MODULE_DESCRIPTION("Delta et-c032if Platform Support"); +MODULE_AUTHOR("Johnson Lu "); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-delta/et-c032if/scripts/et-c032if_platform_init.sh b/platform/innovium/sonic-platform-modules-delta/et-c032if/scripts/et-c032if_platform_init.sh new file mode 100644 index 000000000000..522aabea26bc --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/et-c032if/scripts/et-c032if_platform_init.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +#platform init script for Delta et-c032if + + + +exit 0 + + diff --git a/platform/innovium/sonic-platform-modules-delta/systemd/platform-modules-et-c032if.service b/platform/innovium/sonic-platform-modules-delta/systemd/platform-modules-et-c032if.service new file mode 100644 index 000000000000..273a5ab65a4a --- /dev/null +++ b/platform/innovium/sonic-platform-modules-delta/systemd/platform-modules-et-c032if.service @@ -0,0 +1,13 @@ +[Unit] +Description=Delta et-c032if Platform modules +After=local-fs.target +Before=pmon.service + +[Service] +Type=oneshot +ExecStart=-/etc/init.d/platform-modules-et-c032if start +ExecStop=-/etc/init.d/platform-modules-et-c032if stop +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/sonic-slave-stretch/Dockerfile.j2 b/sonic-slave-stretch/Dockerfile.j2 index 373e3d108b57..aa9ed30db568 100644 --- a/sonic-slave-stretch/Dockerfile.j2 +++ b/sonic-slave-stretch/Dockerfile.j2 @@ -274,6 +274,8 @@ RUN apt-get update && apt-get install -y \ python3-requests \ python3-pytest \ python3-colorama \ +# For bash + texi2html \ # For initramfs bash-completion \ {%- if CONFIGURED_ARCH == "amd64" %} From f7ca312fd3e20310e810297abbc9c7704c6e4d7e Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Thu, 15 Aug 2019 02:36:19 +0800 Subject: [PATCH 13/54] [sonic-platform-common][sonic-platform-daemon] Update submodules (#3333) [sonic-platform-common] [sonic_sfp] Interpret sff 'int' element =0 as valid value (Azure/sonic-platform-common#51) add more error code to get_transceiver_change_event ((Azure/sonic-platform-common#50) [sonic_platform_base] support new-platform-api-based daemons ((Azure/sonic-platform-common#48) sync change to sonic_platform_base/sonic_sfp and create symbol link ((Azure/sonic-platform-common#49) Add parser support for Tx_RxLos,TxFault, PowerControl, ResetStatus in sff8436.py ((Azure/sonic-platform-common#45) readd type_abbrv_name in sonic_sfp/sff8436.py ((Azure/sonic-platform-common#44) [psu_base] get_status_led() returns current state of the status LED ((Azure/sonic-platform-common#39) Fix abbrv name for OSFP ((Azure/sonic-platform-common#36) [sff8436] support "Control Bytes" and "Options" ((Azure/sonic-platform-common#38) sonic_sfp: avoid possible key error in get_physical_to_logical() ((Azure/sonic-platform-common#37) [sonic-platform-daemons] [xcvrd] Enhance xcvrd to handle new system level event/error (Azure/sonic-platform-daemons#39) [xcvrd] Support both new platform API and old platform plugins (Azure/sonic-platform-daemons#38) [psud] Support both new platform API and old platform plugins (Azure/sonic-platform-daemons#37) [syseepromd] Support both new platform API and old platform plugins (Azure/sonic-platform-daemons#36) Add missing import statemet (Azure/sonic-platform-daemons#32) sonic_xcvrd: Support for DOM Threshold values for EEPROM dump (Azure/sonic-platform-daemons#29) --- src/sonic-platform-common | 2 +- src/sonic-platform-daemons | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index 56b5b14dec17..0caf265f1bf3 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit 56b5b14dec179ddf445849fae2e7783ead0475b7 +Subproject commit 0caf265f1bf3d8d68a9a4a3abe20f6d89ca09231 diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 6618737230c2..88d6d5a13c12 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 6618737230c27668d2ae8787f15311171262215f +Subproject commit 88d6d5a13c12cc26458762ce3f54fd90dda7fe9f From 46a480b80a9b8480e5ecf5ff3e088a389692473e Mon Sep 17 00:00:00 2001 From: Wirut Getbamrung Date: Thu, 15 Aug 2019 07:51:20 +0700 Subject: [PATCH 14/54] [device/celestica]: Implement Sfp APIs based on the new platform API (#3290) * [platform/cel]: update qsfp driver for dx010 * [device/celestica]: add sfp api * [device/celestica]: add eeprom api --- .../sonic_platform/chassis.py | 41 +- .../sonic_platform/eeprom.py | 114 +++ .../x86_64-cel_e1031-r0/sonic_platform/sfp.py | 564 +++++++++++++ .../sonic_platform/chassis.py | 41 +- .../sonic_platform/eeprom.py | 114 +++ .../sonic_platform/sfp.py | 767 ++++++++++++++++++ .../debian/platform-modules-dx010.init | 2 +- 7 files changed, 1612 insertions(+), 31 deletions(-) create mode 100644 device/celestica/x86_64-cel_e1031-r0/sonic_platform/eeprom.py create mode 100644 device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py create mode 100644 device/celestica/x86_64-cel_seastone-r0/sonic_platform/eeprom.py create mode 100644 device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/chassis.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/chassis.py index 85da302fcc18..a611be9d47dc 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/chassis.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/chassis.py @@ -21,13 +21,15 @@ from sonic_platform.component import Component from sonic_platform.watchdog import Watchdog from sonic_platform.thermal import Thermal + from sonic_platform.sfp import Sfp + from sonic_platform.eeprom import Tlv except ImportError as e: raise ImportError(str(e) + "- required module not found") NUM_FAN = 3 NUM_PSU = 2 NUM_THERMAL = 7 -CONFIG_DB_PATH = "/etc/sonic/config_db.json" +NUM_SFP = 52 RESET_REGISTER = "0x112" REBOOT_CAUSE_PATH = "/host/reboot-cause/previous-reboot-cause.txt" COMPONENT_NAME_LIST = ["SMC_CPLD", "MMC_CPLD", "BIOS"] @@ -47,17 +49,13 @@ def __init__(self): for index in range(0, NUM_THERMAL): thermal = Thermal(index) self._thermal_list.append(thermal) + for index in range(0, NUM_SFP): + sfp = Sfp(index) + self._sfp_list.append(sfp) ChassisBase.__init__(self) self._component_name_list = COMPONENT_NAME_LIST self._watchdog = Watchdog() - - def __read_config_db(self): - try: - with open(CONFIG_DB_PATH, 'r') as fd: - data = json.load(fd) - return data - except IOError: - raise IOError("Unable to open config_db file !") + self._eeprom = Tlv() def __read_txt_file(self, file_path): try: @@ -74,12 +72,25 @@ def get_base_mac(self): A string containing the MAC address in the format 'XX:XX:XX:XX:XX:XX' """ - try: - self.config_data = self.__read_config_db() - base_mac = self.config_data["DEVICE_METADATA"]["localhost"]["mac"] - return str(base_mac) - except KeyError: - return str(None) + return self._eeprom.get_mac() + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.get_serial() + + 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. + """ + return self._eeprom.get_eeprom() def get_firmware_version(self, component_name): """ diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/eeprom.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/eeprom.py new file mode 100644 index 000000000000..b6881620612d --- /dev/null +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/eeprom.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica Haliburton +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import glob + import os + import sys + import imp + import re + from array import array + from cStringIO import StringIO + from sonic_platform_base.sonic_eeprom import eeprom_dts + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' + + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/class/i2c-adapter/i2c-2/2-0050/eeprom" + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except: + pass + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + err = self.read_eeprom_db() + if err: + # Failed to read EEPROM information from database. Read from cache file + pass + else: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if status <> 'ok': + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except: + pass + + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def get_serial(self): + return self._eeprom.get('0x23', "Undefined.") + + def get_mac(self): + return self._eeprom.get('0x24', "Undefined.") diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py new file mode 100644 index 000000000000..8379299569f5 --- /dev/null +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py @@ -0,0 +1,564 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +# +############################################################################# + +import os +import time +import subprocess +import sonic_device_util +from ctypes import create_string_buffer + +try: + from swsssdk import ConfigDBConnector + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Sfp(SfpBase, SfpUtilBase): + """Platform-specific Sfp class""" + + PORT_START = 1 + PORT_END = 52 + port_to_i2c_mapping = { + 49: 15, + 50: 14, + 51: 17, + 52: 16 + } + PRS_PATH = "/sys/devices/platform/e1031.smc/SFP/sfp_modabs" + PLATFORM_ROOT_PATH = '/usr/share/sonic/device' + SFP_STATUS_CONTROL_OFFSET = 110 + SFP_STATUS_CONTROL_WIDTH = 1 + + _port_to_eeprom_mapping = {} + _sfp_port = range(49, PORT_END + 1) + + SFP_EEPROM_TYPE_KEY = "TypeOfTransceiver" + SFP_EEPROM_HW_REV_KEY = "VendorRev" + SFP_EEPROM_MF_NAME_KEY = "VendorName" + SFP_EEPROM_MODEL_NAME_KEY = "VendorPN" + SFP_EEPROM_SERIAL_KEY = "VendorSN" + SFP_EEPROM_CONNECTOR_KEY = "Connector" + SFP_EEPROM_ENCODE_KEY = "EncodingCodes" + SFP_EEPROM_EXT_IDENT_KEY = "ExtIdentOfTypeOfTransceiver" + SFP_EEPROM_CABLE_KEY = "LengthCable(UnitsOfm)" + SFP_EEPROM_BIT_RATE_KEY = "NominalSignallingRate(UnitsOf100Mbd)" + SFP_EEPROM_SPEC_COM_KEY = "Specification compliance" + SFP_EEPROM_DATE_KEY = "VendorDataCode(YYYY-MM-DD Lot)" + SFP_EEPROM_OUI_KEY = "VendorOUI" + SFP_EEPROM_MON_DATA_KEY = "MonitorData" + SFP_EEPROM_TEMP_KEY = "Temperature" + SFP_EEPROM_VCC_KEY = "Vcc" + SFP_EEPROM_RX_PWR_KEY = "RXPower" + SFP_EEPROM_TX_PWR_KEY = "TXPower" + SFP_EEPROM_TX_BS_KEY = "TXBias" + SFP_EEPROM_STATUS_CON_KEY = "StatusControl" + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return [] + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def _convert_string_to_num(self, value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + + def get_low_power_mode(self, port_num): + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + raise NotImplementedError + + def get_transceiver_change_event(self, timeout=0): + raise NotImplementedError + + def __init__(self, sfp_index): + # Init SfpUtilBase + eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' + for x in range(self.PORT_START, self.PORT_END + 1): + if x not in self._sfp_port: + self.port_to_i2c_mapping[x] = None + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self.port_to_i2c_mapping[x]) + self.read_porttab_mappings(self.__get_path_to_port_config_file()) + SfpUtilBase.__init__(self) + + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + + def __get_sysfsfile_eeprom(self): + sysfsfile_eeprom = None + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] + try: + sysfsfile_eeprom = open( + sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) + except IOError: + print("Error: reading sysfs file %s" % + sysfs_sfp_i2c_client_eeprom_path) + return sysfsfile_eeprom + + def __get_path_to_port_config_file(self): + # Get platform and hwsku + machine_info = sonic_device_util.get_machine_info() + platform = sonic_device_util.get_platform_info(machine_info) + config_db = ConfigDBConnector() + config_db.connect() + data = config_db.get_table('DEVICE_METADATA') + try: + hwsku = data['localhost']['hwsku'] + except KeyError: + hwsku = "Unknown" + + # Load platform module from source + platform_path = "/".join([self.PLATFORM_ROOT_PATH, platform]) + hwsku_path = "/".join([platform_path, hwsku]) + + # First check for the presence of the new 'port_config.ini' file + port_config_file_path = "/".join([hwsku_path, "port_config.ini"]) + if not os.path.isfile(port_config_file_path): + # port_config.ini doesn't exist. Try loading the legacy 'portmap.ini' file + port_config_file_path = "/".join([hwsku_path, "portmap.ini"]) + + return port_config_file_path + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + hardwarerev |1*255VCHAR |hardware version of SFP + serialnum |1*255VCHAR |serial number of the SFP + manufacturename |1*255VCHAR |SFP vendor name + modelname |1*255VCHAR |SFP model name + Connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + nominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + ======================================================================== + """ + transceiver_info_dict = dict() + # get eeprom data + self.eeprom_dict = self.get_eeprom_dict(self.port_num) + if self.eeprom_dict and self.eeprom_dict.get('interface'): + transceiver_info_data = self.eeprom_dict['interface'].get('data') + + # set specification_compliance + spec_com = transceiver_info_data.get( + self.SFP_EEPROM_SPEC_COM_KEY, {}) + spec_com_str = "/".join(list(spec_com.values())) + + # set normal transceiver info + transceiver_info_dict['type'] = transceiver_info_data.get( + self.SFP_EEPROM_TYPE_KEY, 'N/A') + transceiver_info_dict['hardwarerev'] = transceiver_info_data.get( + self.SFP_EEPROM_HW_REV_KEY, 'N/A') + transceiver_info_dict['manufacturename'] = transceiver_info_data.get( + self.SFP_EEPROM_MF_NAME_KEY, 'N/A') + transceiver_info_dict['modelname'] = transceiver_info_data.get( + self.SFP_EEPROM_MODEL_NAME_KEY, 'N/A') + transceiver_info_dict['serialnum'] = transceiver_info_data.get( + self.SFP_EEPROM_SERIAL_KEY, 'N/A') + transceiver_info_dict['Connector'] = transceiver_info_data.get( + self.SFP_EEPROM_CONNECTOR_KEY, 'N/A') + transceiver_info_dict['encoding'] = transceiver_info_data.get( + self.SFP_EEPROM_ENCODE_KEY, 'N/A') + transceiver_info_dict['ext_identifier'] = transceiver_info_data.get( + self.SFP_EEPROM_EXT_IDENT_KEY, 'N/A') + transceiver_info_dict['cable_length'] = transceiver_info_data.get( + self.SFP_EEPROM_CABLE_KEY, 'N/A') + transceiver_info_dict['nominal_bit_rate'] = transceiver_info_data.get( + self.SFP_EEPROM_BIT_RATE_KEY, 'N/A') + transceiver_info_dict['vendor_date'] = transceiver_info_data.get( + self.SFP_EEPROM_DATE_KEY, 'N/A') + transceiver_info_dict['vendor_oui'] = transceiver_info_data.get( + self.SFP_EEPROM_OUI_KEY, 'N/A') + transceiver_info_dict['ext_rateselect_compliance'] = "N/A" + transceiver_info_dict['specification_compliance'] = spec_com_str or "N/A" + + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + RX LOS |BOOLEAN |RX lost-of-signal status, + | |True if has RX los, False if not. + TX FAULT |BOOLEAN |TX fault status, + | |True if has TX fault, False if not. + Reset status |BOOLEAN |reset status, + | |True if SFP in reset, False if not. + LP mode |BOOLEAN |low power mode status, + | |True in lp mode, False if not. + TX disable |BOOLEAN |TX disable status, + | |True TX disabled, False if not. + TX disabled channel |HEX |disabled TX channles in hex, + | |bits 0 to 3 represent channel 0 + | |to channel 3. + Temperature |INT |module temperature in Celsius + Voltage |INT |supply voltage in mV + TX bias |INT |TX Bias Current in mA + RX power |INT |received optical power in mW + TX power |INT |TX output power in mW + ======================================================================== + """ + transceiver_bulk_status_dict = dict() + # get eeprom data + self.eeprom_dict = self.get_eeprom_dict(self.port_num) + if self.eeprom_dict and self.eeprom_dict.get('dom'): + transceiver_dom_data = self.eeprom_dict['dom'].get('data', {}) + transceiver_dom_data_mmv = transceiver_dom_data.get( + self.SFP_EEPROM_MON_DATA_KEY) + + # set normal transceiver bulk status + transceiver_bulk_status_dict['temperature'] = transceiver_dom_data_mmv.get( + self.SFP_EEPROM_TEMP_KEY, 'N/A') + transceiver_bulk_status_dict['voltage'] = transceiver_dom_data_mmv.get( + self.SFP_EEPROM_VCC_KEY, 'N/A') + transceiver_bulk_status_dict['rx1power'] = transceiver_dom_data_mmv.get( + self.SFP_EEPROM_RX_PWR_KEY, 'N/A') + transceiver_bulk_status_dict['rx2power'] = "N/A" + transceiver_bulk_status_dict['rx3power'] = "N/A" + transceiver_bulk_status_dict['rx4power'] = "N/A" + transceiver_bulk_status_dict['tx1bias'] = transceiver_dom_data_mmv.get( + self.SFP_EEPROM_TX_BS_KEY, 'N/A') + transceiver_bulk_status_dict['tx2bias'] = "N/A" + transceiver_bulk_status_dict['tx3bias'] = "N/A" + transceiver_bulk_status_dict['tx4bias'] = "N/A" + transceiver_bulk_status_dict['tx1power'] = transceiver_dom_data_mmv.get( + self.SFP_EEPROM_TX_PWR_KEY, 'N/A') + transceiver_bulk_status_dict['tx2power'] = "N/A" + transceiver_bulk_status_dict['tx3power'] = "N/A" + transceiver_bulk_status_dict['tx4power'] = "N/A" + + for key in transceiver_bulk_status_dict: + transceiver_bulk_status_dict[key] = self._convert_string_to_num( + transceiver_bulk_status_dict[key]) + + return transceiver_bulk_status_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + # SFP doesn't support this feature + return NotImplementedError + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + rx_los = False + rx_los_key = "RXLOSState" + self.eeprom_dict = self.get_eeprom_dict(self.port_num) + if self.eeprom_dict and self.eeprom_dict.get('dom'): + transceiver_dom_data = self.eeprom_dict['dom'].get('data', {}) + transceiver_dom_data_sc = transceiver_dom_data.get( + self.SFP_EEPROM_STATUS_CON_KEY) + state = transceiver_dom_data_sc.get(rx_los_key) + rx_los = True if 'off' not in state.lower() else False + return rx_los + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + tx_fault = False + tx_fault_key = "TXFaultState" + self.eeprom_dict = self.get_eeprom_dict(self.port_num) + if self.eeprom_dict and self.eeprom_dict.get('dom'): + transceiver_dom_data = self.eeprom_dict['dom'].get('data', {}) + transceiver_dom_data_sc = transceiver_dom_data.get( + self.SFP_EEPROM_STATUS_CON_KEY) + state = transceiver_dom_data_sc.get(tx_fault_key) + tx_fault = True if 'off' not in state.lower() else False + return tx_fault + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + """ + tx_disable = False + tx_disable_key = "TXDisableState" + self.eeprom_dict = self.get_eeprom_dict(self.port_num) + if self.eeprom_dict and self.eeprom_dict.get('dom'): + transceiver_dom_data = self.eeprom_dict['dom'].get('data', {}) + transceiver_dom_data_sc = transceiver_dom_data.get( + self.SFP_EEPROM_STATUS_CON_KEY) + state = transceiver_dom_data_sc.get(tx_disable_key) + tx_disable = True if 'off' not in state.lower() else False + return tx_disable + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + # SFP doesn't support this feature + return NotImplementedError + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + # SFP doesn't support this feature + return self.get_low_power_mode(self.port_num) + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + # SFP doesn't support this feature + return NotImplementedError + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + Returns: + An integer number of current temperature in Celsius + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + return transceiver_dom_info_dict.get("temperature", "N/A") + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + Returns: + An integer number of supply voltage in mV + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + return transceiver_dom_info_dict.get("voltage", "N/A") + + def get_tx_bias(self): + """ + Retrieves the TX bias current of this SFP + Returns: + A list of four integer numbers, representing TX bias in mA + for channel 0 to channel 4. + Ex. ['110.09', '111.12', '108.21', '112.09'] + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + tx1_bs = transceiver_dom_info_dict.get("tx1bias", "N/A") + return [tx1_bs, "N/A", "N/A", "N/A"] + + def get_rx_power(self): + """ + Retrieves the received optical power for this SFP + Returns: + A list of four integer numbers, representing received optical + power in mW for channel 0 to channel 4. + Ex. ['1.77', '1.71', '1.68', '1.70'] + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + rx1_pw = transceiver_dom_info_dict.get("rx1power", "N/A") + return [rx1_pw, "N/A", "N/A", "N/A"] + + def get_tx_power(self): + """ + Retrieves the TX power of this SFP + Returns: + A list of four integer numbers, representing TX power in mW + for channel 0 to channel 4. + Ex. ['1.86', '1.86', '1.86', '1.86'] + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + tx1_pw = transceiver_dom_info_dict.get("tx1power", "N/A") + return [tx1_pw, "N/A", "N/A", "N/A"] + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return NotImplementedError + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + + sysfsfile_eeprom = self.__get_sysfsfile_eeprom() + status_control_raw = self._read_eeprom_specific_bytes( + sysfsfile_eeprom, self.SFP_STATUS_CONTROL_OFFSET, self.SFP_STATUS_CONTROL_WIDTH) + if status_control_raw is not None: + tx_disable_bit = 0x80 if tx_disable else 0x7f + status_control = int(status_control_raw[0], 16) + tx_disable_ctl = (status_control | tx_disable_bit) if tx_disable else ( + status_control & tx_disable_bit) + try: + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + sysfsfile_eeprom.seek(self.SFP_STATUS_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + return False + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return NotImplementedError + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + return self.set_low_power_mode(self.port_num, lpmode) + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + return NotImplementedError + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self.logical[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + if self.port_num not in self._sfp_port: + return False + + status = 1 + try: + with open(self.PRS_PATH, 'r') as port_status: + status = int(port_status.read(), 16) + status = (status >> (self.port_num - 49)) & 1 + except IOError: + return False + + return status == 0 + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + return transceiver_dom_info_dict.get("modelname", "N/A") + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + return transceiver_dom_info_dict.get("serialnum", "N/A") diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py index 9c9f8a03d8c8..5e98cb3d3db8 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py @@ -21,13 +21,15 @@ from sonic_platform.component import Component from sonic_platform.watchdog import Watchdog from sonic_platform.thermal import Thermal + from sonic_platform.sfp import Sfp + from sonic_platform.eeprom import Tlv except ImportError as e: raise ImportError(str(e) + "- required module not found") -CONFIG_DB_PATH = "/etc/sonic/config_db.json" NUM_FAN = 5 NUM_PSU = 2 NUM_THERMAL = 5 +NUM_SFP = 32 RESET_REGISTER = "0x103" REBOOT_CAUSE_PATH = "/host/reboot-cause/previous-reboot-cause.txt" COMPONENT_NAME_LIST = ["CPLD1", "CPLD2", "CPLD3", "CPLD4", "BIOS"] @@ -47,17 +49,13 @@ def __init__(self): for index in range(0, NUM_THERMAL): thermal = Thermal(index) self._thermal_list.append(thermal) + for index in range(0, NUM_SFP): + sfp = Sfp(index) + self._sfp_list.append(sfp) ChassisBase.__init__(self) self._component_name_list = COMPONENT_NAME_LIST self._watchdog = Watchdog() - - def __read_config_db(self): - try: - with open(CONFIG_DB_PATH, 'r') as fd: - data = json.load(fd) - return data - except IOError: - raise IOError("Unable to open config_db file !") + self._eeprom = Tlv() def __read_txt_file(self, file_path): try: @@ -74,12 +72,25 @@ def get_base_mac(self): A string containing the MAC address in the format 'XX:XX:XX:XX:XX:XX' """ - try: - self.config_data = self.__read_config_db() - base_mac = self.config_data["DEVICE_METADATA"]["localhost"]["mac"] - return str(base_mac) - except KeyError: - return str(None) + return self._eeprom.get_mac() + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.get_serial() + + 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. + """ + return self._eeprom.get_eeprom() def get_firmware_version(self, component_name): """ diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/eeprom.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/eeprom.py new file mode 100644 index 000000000000..1e10848ca439 --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/eeprom.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica Seastone-DX010 +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import glob + import os + import sys + import imp + import re + from array import array + from cStringIO import StringIO + from sonic_platform_base.sonic_eeprom import eeprom_dts + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' + + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/class/i2c-adapter/i2c-12/12-0050/eeprom" + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except: + pass + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + err = self.read_eeprom_db() + if err: + # Failed to read EEPROM information from database. Read from cache file + pass + else: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if status <> 'ok': + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except: + pass + + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def get_serial(self): + return self._eeprom.get('0x23', "Undefined.") + + def get_mac(self): + return self._eeprom.get('0x24', "Undefined.") diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py new file mode 100644 index 000000000000..6d019d7854ec --- /dev/null +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py @@ -0,0 +1,767 @@ +#!/usr/bin/env python + +############################################################################# +# Celestica +# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +# +############################################################################# + +import os +import time +import subprocess +import sonic_device_util +from ctypes import create_string_buffer + +try: + from swsssdk import ConfigDBConnector + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sfputilbase import SfpUtilBase + from sonic_platform_base.sonic_sfp.sfputilbase import sff8436Dom +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Sfp(SfpBase, SfpUtilBase): + """Platform-specific Sfp class""" + + # Port number + PORT_START = 1 + PORT_END = 32 + PORTS_IN_BLOCK = 32 + + # Offset for values in QSFP info eeprom + QSFP_CONTROL_OFFSET = 86 + QSFP_CONTROL_WIDTH = 8 + QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 + QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 + QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 + QSFP_POWEROVERRIDE_OFFSET = 93 + QSFP_POWEROVERRIDE_WIDTH = 1 + + # Key for values in QSFP eeprom dict + QSFP_EEPROM_TYPE_KEY = "Identifier" + QSFP_EEPROM_HW_REV_KEY = "Vendor Rev" + QSFP_EEPROM_MF_NAME_KEY = "Vendor Name" + QSFP_EEPROM_MODEL_NAME_KEY = "Vendor PN" + QSFP_EEPROM_SERIAL_KEY = "Vendor SN" + QSFP_EEPROM_CONNECTOR_KEY = "Connector" + QSFP_EEPROM_ENCODE_KEY = "Encoding" + QSFP_EEPROM_EXT_IDENT_KEY = "Extended Identifier" + QSFP_EEPROM_EXT_RATE_KEY = "Extended RateSelect Compliance" + QSFP_EEPROM_CABLE_KEY = "Length(km)" + QSFP_EEPROM_BIT_RATE_KEY = "Nominal Bit Rate(100Mbs)" + QSFP_EEPROM_SPEC_COM_KEY = "Specification compliance" + QSFP_EEPROM_DATE_KEY = "Vendor Date Code(YYYY-MM-DD Lot)" + QSFP_EEPROM_OUI_KEY = "Vendor OUI" + + # Path to QSFP sysfs + RESET_PATH = "/sys/devices/platform/dx010_cpld/qsfp_reset" + LP_PATH = "/sys/devices/platform/dx010_cpld/qsfp_lpmode" + PRS_PATH = "/sys/devices/platform/dx010_cpld/qsfp_modprs" + PLATFORM_ROOT_PATH = '/usr/share/sonic/device' + + _port_to_eeprom_mapping = {} + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(self.PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def _convert_string_to_num(self, value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + + 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 + + try: + reg_file = open(self.LP_PATH, "r") + content = reg_file.readline().rstrip() + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Determind if port_num start from 1 or 0 + bit_index = port_num - 1 if self.port_start == 1 else port_num + + # Mask off the bit corresponding to our port + mask = (1 << bit_index) + + # LPMode is active high + if reg_value & mask == 0: + return False + + return True + + def set_low_power_mode(self, port_num, lpmode): + try: + reg_file = open(self.LP_PATH, "r+") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Determind if port_num start from 1 or 0 + bit_index = port_num - 1 if self.port_start == 1 else port_num + + # Mask off the bit corresponding to our port + mask = (1 << bit_index) + # LPMode is active high; set or clear the bit accordingly + reg_value = reg_value | mask if lpmode else reg_value & ~mask + + # Convert our register value back to a hex string and write back + content = hex(reg_value).strip('L') + + reg_file.seek(0) + reg_file.write(content) + reg_file.close() + + return True + + def get_transceiver_change_event(self, timeout=0): + raise NotImplementedError + + def __init__(self, sfp_index): + # Init SfpUtilBase + eeprom_path = '/sys/bus/i2c/devices/i2c-{0}/{0}-0050/eeprom' + + for x in range(self.PORT_START, self.PORT_END + 1): + if self.port_start == 1: + self._port_to_eeprom_mapping[x] = eeprom_path.format( + (x - 1) + 26) + else: + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + 26) + self.read_porttab_mappings(self.__get_path_to_port_config_file()) + SfpUtilBase.__init__(self) + + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + + def __get_path_to_port_config_file(self): + # Get platform and hwsku + machine_info = sonic_device_util.get_machine_info() + platform = sonic_device_util.get_platform_info(machine_info) + config_db = ConfigDBConnector() + config_db.connect() + data = config_db.get_table('DEVICE_METADATA') + + try: + hwsku = data['localhost']['hwsku'] + except KeyError: + hwsku = "Unknown" + + # Load platform module from source + platform_path = "/".join([self.PLATFORM_ROOT_PATH, platform]) + hwsku_path = "/".join([platform_path, hwsku]) + + # First check for the presence of the new 'port_config.ini' file + port_config_file_path = "/".join([hwsku_path, "port_config.ini"]) + if not os.path.isfile(port_config_file_path): + # port_config.ini doesn't exist. Try loading the legacy 'portmap.ini' file + port_config_file_path = "/".join([hwsku_path, "portmap.ini"]) + + return port_config_file_path + + def __read_eeprom_specific_bytes(self, offset, num_bytes): + sysfsfile_eeprom = None + eeprom_raw = None + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] + try: + sysfsfile_eeprom = open( + sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + except IOError: + print("Error: reading sysfs file %s" % + sysfs_sfp_i2c_client_eeprom_path) + finally: + if sysfsfile_eeprom: + eeprom_raw = self._read_eeprom_specific_bytes( + sysfsfile_eeprom, offset, num_bytes) + sysfsfile_eeprom.close() + return eeprom_raw + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + hardwarerev |1*255VCHAR |hardware version of SFP + serialnum |1*255VCHAR |serial number of the SFP + manufacturename |1*255VCHAR |SFP vendor name + modelname |1*255VCHAR |SFP model name + Connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + nominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + ======================================================================== + """ + transceiver_info_dict = dict() + # get eeprom data + self.eeprom_dict = self.get_eeprom_dict(self.port_num) + if self.eeprom_dict and self.eeprom_dict.get('interface'): + transceiver_info_data = self.eeprom_dict['interface'].get('data') + + # set specification_compliance + spec_com = transceiver_info_data.get( + self.QSFP_EEPROM_SPEC_COM_KEY, {}) + spec_com_str = "/".join(list(spec_com.values())) + + # set normal transceiver info + transceiver_info_dict['type'] = transceiver_info_data.get( + self.QSFP_EEPROM_TYPE_KEY, 'N/A') + transceiver_info_dict['hardwarerev'] = transceiver_info_data.get( + self.QSFP_EEPROM_HW_REV_KEY, 'N/A') + transceiver_info_dict['manufacturename'] = transceiver_info_data.get( + self.QSFP_EEPROM_MF_NAME_KEY, 'N/A') + transceiver_info_dict['modelname'] = transceiver_info_data.get( + self.QSFP_EEPROM_MODEL_NAME_KEY, 'N/A') + transceiver_info_dict['serialnum'] = transceiver_info_data.get( + self.QSFP_EEPROM_SERIAL_KEY, 'N/A') + transceiver_info_dict['Connector'] = transceiver_info_data.get( + self.QSFP_EEPROM_CONNECTOR_KEY, 'N/A') + transceiver_info_dict['encoding'] = transceiver_info_data.get( + self.QSFP_EEPROM_ENCODE_KEY, 'N/A') + transceiver_info_dict['ext_identifier'] = transceiver_info_data.get( + self.QSFP_EEPROM_EXT_IDENT_KEY, 'N/A') + transceiver_info_dict['ext_rateselect_compliance'] = transceiver_info_data.get( + self.QSFP_EEPROM_EXT_RATE_KEY, 'N/A') + transceiver_info_dict['cable_length'] = transceiver_info_data.get( + self.QSFP_EEPROM_CABLE_KEY, 'N/A') + transceiver_info_dict['vendor_date'] = transceiver_info_data.get( + self.QSFP_EEPROM_DATE_KEY, 'N/A') + transceiver_info_dict['vendor_oui'] = transceiver_info_data.get( + self.QSFP_EEPROM_OUI_KEY, 'N/A') + transceiver_info_dict['nominal_bit_rate'] = transceiver_info_data.get( + self.QSFP_EEPROM_BIT_RATE_KEY, 'N/A') + transceiver_info_dict['specification_compliance'] = spec_com_str or "N/A" + + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + RX LOS |BOOLEAN |RX lost-of-signal status, + | |True if has RX los, False if not. + TX FAULT |BOOLEAN |TX fault status, + | |True if has TX fault, False if not. + Reset status |BOOLEAN |reset status, + | |True if SFP in reset, False if not. + LP mode |BOOLEAN |low power mode status, + | |True in lp mode, False if not. + TX disable |BOOLEAN |TX disable status, + | |True TX disabled, False if not. + TX disabled channel |HEX |disabled TX channles in hex, + | |bits 0 to 3 represent channel 0 + | |to channel 3. + Temperature |INT |module temperature in Celsius + Voltage |INT |supply voltage in mV + TX bias |INT |TX Bias Current in mA + RX power |INT |received optical power in mW + TX power |INT |TX output power in mW + ======================================================================== + """ + transceiver_dom_info_dict = dict() + self.eeprom_dict = self.get_eeprom_dict(self.port_num) + if self.eeprom_dict and self.eeprom_dict.get('dom'): + transceiver_dom_data = self.eeprom_dict['dom'].get('data', {}) + transceiver_dom_data_mmv = transceiver_dom_data.get( + "ModuleMonitorValues") + transceiver_dom_data_cmv = transceiver_dom_data.get( + "ChannelMonitorValues") + transceiver_dom_info_dict['temperature'] = transceiver_dom_data_mmv.get( + 'Temperature', 'N/A') + transceiver_dom_info_dict['voltage'] = transceiver_dom_data_mmv.get( + 'Vcc', 'N/A') + transceiver_dom_info_dict['rx1power'] = transceiver_dom_data_cmv.get( + 'RX1Power', 'N/A') + transceiver_dom_info_dict['rx2power'] = transceiver_dom_data_cmv.get( + 'RX2Power', 'N/A') + transceiver_dom_info_dict['rx3power'] = transceiver_dom_data_cmv.get( + 'RX3Power', 'N/A') + transceiver_dom_info_dict['rx4power'] = transceiver_dom_data_cmv.get( + 'RX4Power', 'N/A') + transceiver_dom_info_dict['tx1bias'] = transceiver_dom_data_cmv.get( + 'TX1Bias', 'N/A') + transceiver_dom_info_dict['tx2bias'] = transceiver_dom_data_cmv.get( + 'TX2Bias', 'N/A') + transceiver_dom_info_dict['tx3bias'] = transceiver_dom_data_cmv.get( + 'TX3Bias', 'N/A') + transceiver_dom_info_dict['tx4bias'] = transceiver_dom_data_cmv.get( + 'TX4Bias', 'N/A') + transceiver_dom_info_dict['tx1power'] = transceiver_dom_data_cmv.get( + 'TX1Power', 'N/A') + transceiver_dom_info_dict['tx2power'] = transceiver_dom_data_cmv.get( + 'TX2Power', 'N/A') + transceiver_dom_info_dict['tx3power'] = transceiver_dom_data_cmv.get( + 'TX3Power', 'N/A') + transceiver_dom_info_dict['tx4power'] = transceiver_dom_data_cmv.get( + 'TX4Power', 'N/A') + + for key in transceiver_dom_info_dict: + transceiver_dom_info_dict[key] = self._convert_string_to_num( + transceiver_dom_info_dict[key]) + + return transceiver_dom_info_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + try: + reg_file = open(self.RESET_PATH, "r") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content = reg_file.readline().rstrip() + reg_value = int(content, 16) + bin_format = bin(reg_value)[2:].zfill(32) + return bin_format[::-1][self.index] == '0' + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + rx_los_list = [] + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + self.QSFP_CHANNL_RX_LOS_STATUS_OFFSET, self.QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + return rx_los_list + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + tx_fault_list = [] + dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( + self.QSFP_CHANNL_TX_FAULT_STATUS_OFFSET, self.QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault_list.append(tx_fault_data & 0x01 != 0) + tx_fault_list.append(tx_fault_data & 0x02 != 0) + tx_fault_list.append(tx_fault_data & 0x04 != 0) + tx_fault_list.append(tx_fault_data & 0x08 != 0) + return tx_fault_list + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + """ + tx_disable_list = [] + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + self.QSFP_CONTROL_OFFSET, self.QSFP_CONTROL_WIDTH) + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX1Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX2Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX3Disable']['value']) + tx_disable_list.append( + 'On' == dom_control_data['data']['TX4Disable']['value']) + + return tx_disable_list + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + tx_disable_list = self.get_tx_disable() + if tx_disable_list is None: + return 0 + tx_disabled = 0 + for i in range(len(tx_disable_list)): + if tx_disable_list[i]: + tx_disabled |= 1 << i + return tx_disabled + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + return self.get_low_power_mode(self.port_num) + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + power_override = False + + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return False + + dom_control_raw = self.__read_eeprom_specific_bytes( + self.QSFP_CONTROL_OFFSET, self.QSFP_CONTROL_WIDTH) + if dom_control_raw is not None: + dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) + power_override = ( + 'On' == dom_control_data['data']['PowerOverride']['value']) + + return power_override + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + Returns: + An integer number of current temperature in Celsius + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + return transceiver_dom_info_dict.get("temperature", "N/A") + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + Returns: + An integer number of supply voltage in mV + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + return transceiver_dom_info_dict.get("voltage", "N/A") + + def get_tx_bias(self): + """ + Retrieves the TX bias current of this SFP + Returns: + A list of four integer numbers, representing TX bias in mA + for channel 0 to channel 4. + Ex. ['110.09', '111.12', '108.21', '112.09'] + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + tx1_bs = transceiver_dom_info_dict.get("tx1bias", "N/A") + tx2_bs = transceiver_dom_info_dict.get("tx2bias", "N/A") + tx3_bs = transceiver_dom_info_dict.get("tx3bias", "N/A") + tx4_bs = transceiver_dom_info_dict.get("tx4bias", "N/A") + return [tx1_bs, tx2_bs, tx3_bs, tx4_bs] + + def get_rx_power(self): + """ + Retrieves the received optical power for this SFP + Returns: + A list of four integer numbers, representing received optical + power in mW for channel 0 to channel 4. + Ex. ['1.77', '1.71', '1.68', '1.70'] + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + rx1_pw = transceiver_dom_info_dict.get("rx1power", "N/A") + rx2_pw = transceiver_dom_info_dict.get("rx2power", "N/A") + rx3_pw = transceiver_dom_info_dict.get("rx3power", "N/A") + rx4_pw = transceiver_dom_info_dict.get("rx4power", "N/A") + return [rx1_pw, rx2_pw, rx3_pw, rx4_pw] + + def get_tx_power(self): + """ + Retrieves the TX power of this SFP + Returns: + A list of four integer numbers, representing TX power in mW + for channel 0 to channel 4. + Ex. ['1.86', '1.86', '1.86', '1.86'] + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + tx1_pw = transceiver_dom_info_dict.get("tx1power", "N/A") + tx2_pw = transceiver_dom_info_dict.get("tx2power", "N/A") + tx3_pw = transceiver_dom_info_dict.get("tx3power", "N/A") + tx4_pw = transceiver_dom_info_dict.get("tx4power", "N/A") + return [tx1_pw, tx2_pw, tx3_pw, tx4_pw] + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # Check for invalid port_num + + try: + reg_file = open(self.RESET_PATH, "r+") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content = reg_file.readline().rstrip() + + # File content is a string containing the hex representation of the + # register + reg_value = int(content, 16) + + # Determind if port_num start from 1 or 0 + bit_index = self.port_num - 1 if self.port_start == 1 else self.port_num + + # Mask off the bit corresponding to our port + mask = (1 << bit_index) + + # ResetL is active low + reg_value = reg_value & ~mask + + # Convert our register value back to a hex string and write back + reg_file.seek(0) + reg_file.write(hex(reg_value).rstrip('L')) + reg_file.close() + + # Sleep 1 second to allow it to settle + time.sleep(1) + + # Flip the bit back high and write back to the register to take port out of reset + try: + reg_file = open(self.RESET_PATH, "w") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + reg_value = reg_value | mask + reg_file.seek(0) + reg_file.write(hex(reg_value).rstrip('L')) + reg_file.close() + + return True + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + sysfsfile_eeprom = None + try: + tx_disable_ctl = 0xf if tx_disable else 0x0 + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(self.QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + sysfsfile_eeprom = None + try: + channel_state = self.get_tx_disable_channel() + tx_enable_mask = [0xe, 0xd, 0xb, 0x7] + tx_disable_mask = [0x1, 0x3, 0x7, 0xf] + tx_disable_ctl = channel_state | tx_disable_mask[ + channel] if disable else channel_state & tx_enable_mask[channel] + buffer = create_string_buffer(1) + buffer[0] = chr(tx_disable_ctl) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(self.QSFP_CONTROL_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + return self.set_low_power_mode(self.port_num, lpmode) + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + try: + power_override_bit = 0 + if power_override: + power_override_bit |= 1 << 0 + + power_set_bit = 0 + if power_set: + power_set_bit |= 1 << 1 + + buffer = create_string_buffer(1) + buffer[0] = chr(power_override_bit | power_set_bit) + # Write to eeprom + sysfsfile_eeprom = open( + self.port_to_eeprom_mapping[self.port_num], "r+b") + sysfsfile_eeprom.seek(self.QSFP_POWEROVERRIDE_OFFSET) + sysfsfile_eeprom.write(buffer[0]) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + finally: + if sysfsfile_eeprom is not None: + sysfsfile_eeprom.close() + time.sleep(0.01) + return True + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self.logical[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + try: + reg_file = open(self.PRS_PATH, "r") + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + content = reg_file.readline().rstrip() + reg_value = int(content, 16) + + # Determind if port_num start from 1 or 0 + bit_index = self.port_num - 1 if self.port_start == 1 else self.port_num + + # Mask off the bit corresponding to our port + mask = (1 << bit_index) + + # ModPrsL is active low + if reg_value & mask == 0: + return True + + return False + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + return transceiver_dom_info_dict.get("modelname", "N/A") + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + transceiver_dom_info_dict = self.get_transceiver_bulk_status() + return transceiver_dom_info_dict.get("serialnum", "N/A") diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init index aa13d572be78..99d0aab3fd61 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init @@ -137,7 +137,7 @@ start) # Attach 32 instances of EEPROM driver QSFP ports for ((n=26;n<=58;n++)); do - echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-$n/new_device + echo optoe1 0x50 > /sys/bus/i2c/devices/i2c-$n/new_device sleep 0.1 done From 51af28da559a9160b6794eecd94c7172f09f6165 Mon Sep 17 00:00:00 2001 From: lguohan Date: Thu, 15 Aug 2019 00:32:58 -0700 Subject: [PATCH 15/54] [baseimage]: install ndisc6 package (#3344) ndisc6 gathers a few diagnostic tools for IPv6 networks including: - ndisc6, which performs ICMPv6 Neighbor Discovery in userland, - rdisc6, which performs ICMPv6 Router Discovery in userland, - rltraceroute6, a UDP/ICMP IPv6 implementation of traceroute, - tcptraceroute6, a TCP/IPv6-based traceroute implementation, - tcpspray6, a TCP/IP Discard/Echo bandwidth meter, - addrinfo, easy script interface for hostname and address resolution, - dnssort, DNS sorting script. Signed-off-by: Guohan Lu --- build_debian.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index 42d6a18fbffd..126a8ee329eb 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -271,7 +271,8 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in mtr-tiny \ locales \ cgroup-tools \ - ipmitool + ipmitool \ + ndisc6 if [[ $CONFIGURED_ARCH == amd64 ]]; then From 9348a3c525b74a09c40f00a959edfd3a813b898d Mon Sep 17 00:00:00 2001 From: Greg Paussa <50457169+gpaussabrcm@users.noreply.github.com> Date: Thu, 15 Aug 2019 03:34:34 -0400 Subject: [PATCH 16/54] [build] Fix cleaning SONIC_PYTHON_STDEB_DEBS (#3343) * slave.mk * .gitignore The SONIC_PYTHON_STDEB_DEBS group is part of SONIC_CLEAN_DEBS for cleaning with 'make clean', but this group is overlooked since they reside in PYTHON_DEBS_PATH, not DEBS_PATH. This fix creates a separate clean rule for SONIC_PYTHON_STDEB_DEBS. Also noticed the .arch file showing up on 'git status' so added it to .gitignore. Signed-off-by: Greg Paussa --- .gitignore | 1 + slave.mk | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 06b10caa315e..739454168796 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .DS_Store # Build system related +.arch .platform .screen diff --git a/slave.mk b/slave.mk index af39497bf089..c85ce2289603 100644 --- a/slave.mk +++ b/slave.mk @@ -704,7 +704,6 @@ SONIC_CLEAN_DEBS = $(addsuffix -clean,$(addprefix $(DEBS_PATH)/, \ $(SONIC_COPY_DEBS) \ $(SONIC_MAKE_DEBS) \ $(SONIC_DPKG_DEBS) \ - $(SONIC_PYTHON_STDEB_DEBS) \ $(SONIC_DERIVED_DEBS) \ $(SONIC_EXTRA_DEBS))) @@ -729,15 +728,20 @@ SONIC_CLEAN_TARGETS += $(addsuffix -clean,$(addprefix $(TARGET_PATH)/, \ $(SONIC_CLEAN_TARGETS) : $(TARGET_PATH)/%-clean : .platform @rm -f $(TARGET_PATH)/$* +SONIC_CLEAN_STDEB_DEBS = $(addsuffix -clean,$(addprefix $(PYTHON_DEBS_PATH)/, \ + $(SONIC_PYTHON_STDEB_DEBS))) +$(SONIC_CLEAN_STDEB_DEBS) : $(PYTHON_DEBS_PATH)/%-clean : .platform + @rm -f $(PYTHON_DEBS_PATH)/$* + SONIC_CLEAN_WHEELS = $(addsuffix -clean,$(addprefix $(PYTHON_WHEELS_PATH)/, \ $(SONIC_PYTHON_WHEELS))) $(SONIC_CLEAN_WHEELS) : $(PYTHON_WHEELS_PATH)/%-clean : .platform @rm -f $(PYTHON_WHEELS_PATH)/$* clean-logs : .platform - @rm -f $(TARGET_PATH)/*.log $(DEBS_PATH)/*.log $(FILES_PATH)/*.log $(PYTHON_WHEELS_PATH)/*.log + @rm -f $(TARGET_PATH)/*.log $(DEBS_PATH)/*.log $(FILES_PATH)/*.log $(PYTHON_DEBS_PATH)/*.log $(PYTHON_WHEELS_PATH)/*.log -clean : .platform clean-logs $$(SONIC_CLEAN_DEBS) $$(SONIC_CLEAN_FILES) $$(SONIC_CLEAN_TARGETS) $$(SONIC_CLEAN_WHEELS) +clean : .platform clean-logs $$(SONIC_CLEAN_DEBS) $$(SONIC_CLEAN_FILES) $$(SONIC_CLEAN_TARGETS) $$(SONIC_CLEAN_STDEB_DEBS) $$(SONIC_CLEAN_WHEELS) ############################################################################### ## all @@ -756,6 +760,6 @@ jessie : $$(addprefix $(TARGET_PATH)/,$$(SONIC_JESSIE_DOCKERS_FOR_INSTALLERS)) ## Standard targets ############################################################################### -.PHONY : $(SONIC_CLEAN_DEBS) $(SONIC_CLEAN_FILES) $(SONIC_CLEAN_TARGETS) $(SONIC_CLEAN_WHEELS) $(SONIC_PHONY_TARGETS) clean distclean configure +.PHONY : $(SONIC_CLEAN_DEBS) $(SONIC_CLEAN_FILES) $(SONIC_CLEAN_TARGETS) $(SONIC_CLEAN_STDEB_DEBS) $(SONIC_CLEAN_WHEELS) $(SONIC_PHONY_TARGETS) clean distclean configure .INTERMEDIATE : $(SONIC_INSTALL_TARGETS) $(SONIC_INSTALL_WHEELS) $(DOCKER_LOAD_TARGETS) docker-start .platform From 6c64b1ff874193a946f79c71c91dce1be2684abf Mon Sep 17 00:00:00 2001 From: Jonathan Tsai Date: Thu, 15 Aug 2019 15:43:34 +0800 Subject: [PATCH 17/54] [Quanta] Add a new supported device and platform, IX9-32X (#3341) Switch Vendor: Quanta Switch SKU: IX9-32X CPU: Broadwell-DE with BMC ASIC Vendor: Broadcom Switch ASIC: Tomahawk3, BCM56980 Port Configuration: 32x400G Signed-off-by: Jonathan Tsai --- .../Quanta-IX9-32X/port_config.ini | 33 ++ .../Quanta-IX9-32X/sai.profile | 1 + .../Quanta-IX9-32X/th3-ix9-32x400G.config.bcm | 341 +++++++++++++++ .../x86_64-quanta_ix9_bwde-r0/default_sku | 1 + .../x86_64-quanta_ix9_bwde-r0/installer.conf | 3 + .../led_proc_init.soc | 2 + .../plugins/eeprom.py | 21 + .../plugins/psuutil.py | 49 +++ .../plugins/sfputil.py | 176 ++++++++ platform/broadcom/one-image.mk | 1 + platform/broadcom/platform-modules-quanta.mk | 6 + .../debian/changelog | 7 + .../debian/control | 4 + .../debian/rules | 2 +- .../ix9-32x/classes/__init__.py | 0 .../ix9-32x/modules/Makefile | 3 + .../ix9-32x/modules/qci_cpld_led.c | 277 ++++++++++++ .../ix9-32x/modules/qci_cpld_qsfpdd.c | 411 ++++++++++++++++++ .../ix9-32x/modules/qci_platform_ix9.c | 293 +++++++++++++ .../ix9-32x/service/ix9-platform-init.service | 13 + .../ix9-32x/setup.py | 16 + .../ix9-32x/utils/quanta_ix9_util.py | 217 +++++++++ src/sonic-device-data/tests/permitted_list | 5 + 23 files changed, 1881 insertions(+), 1 deletion(-) create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/port_config.ini create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/sai.profile create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/th3-ix9-32x400G.config.bcm create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/default_sku create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/installer.conf create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/led_proc_init.soc create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/eeprom.py create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/psuutil.py create mode 100644 device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/sfputil.py create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix9-32x/classes/__init__.py create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_led.c create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_qsfpdd.c create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_platform_ix9.c create mode 100755 platform/broadcom/sonic-platform-modules-quanta/ix9-32x/service/ix9-platform-init.service create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix9-32x/setup.py create mode 100755 platform/broadcom/sonic-platform-modules-quanta/ix9-32x/utils/quanta_ix9_util.py diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/port_config.ini b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/port_config.ini new file mode 100644 index 000000000000..8f770329437f --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias index +Ethernet0 33,34,35,36,37,38,39,40 fourhundredGigE1 0 +Ethernet4 25,26,27,28,29,30,31,32 fourhundredGigE2 1 +Ethernet8 49,50,51,52,53,54,55,56 fourhundredGigE3 2 +Ethernet12 57,58,59,60,61,62,63,64 fourhundredGigE4 3 +Ethernet16 65,66,67,68,69,70,71,72 fourhundredGigE5 4 +Ethernet20 73,74,75,76,77,78,79,80 fourhundredGigE6 5 +Ethernet24 81,82,83,84,85,86,87,88 fourhundredGigE7 6 +Ethernet28 89,90,91,92,93,94,95,96 fourhundredGigE8 7 +Ethernet32 17,18,19,20,21,22,23,24 fourhundredGigE9 8 +Ethernet36 97,98,99,100,101,102,103,104 fourhundredGigE10 9 +Ethernet40 9,10,11,12,13,14,15,16 fourhundredGigE11 10 +Ethernet44 41,42,43,44,45,46,47,48 fourhundredGigE12 11 +Ethernet48 113,114,115,116,117,118,119,120 fourhundredGigE13 12 +Ethernet52 105,106,107,108,109,110,111,112 fourhundredGigE14 13 +Ethernet56 121,122,123,124,125,126,127,128 fourhundredGigE15 14 +Ethernet60 1,2,3,4,5,6,7,8 fourhundredGigE16 15 +Ethernet64 137,138,139,140,141,142,143,144 fourhundredGigE17 16 +Ethernet68 129,130,131,132,133,134,135,136 fourhundredGigE18 17 +Ethernet72 241,242,243,244,245,246,247,248 fourhundredGigE19 18 +Ethernet76 249,250,251,252,253,254,255,256 fourhundredGigE20 19 +Ethernet80 225,226,227,228,229,230,231,232 fourhundredGigE21 20 +Ethernet84 145,146,147,148,149,150,151,152 fourhundredGigE22 21 +Ethernet88 153,154,155,156,157,158,159,160 fourhundredGigE23 22 +Ethernet92 233,234,235,236,237,238,239,240 fourhundredGigE24 23 +Ethernet96 161,162,163,164,165,166,167,168 fourhundredGigE25 24 +Ethernet100 169,170,171,172,173,174,175,176 fourhundredGigE26 25 +Ethernet104 177,178,179,180,181,182,183,184 fourhundredGigE27 26 +Ethernet108 185,186,187,188,189,190,191,192 fourhundredGigE28 27 +Ethernet112 193,194,195,196,197,198,199,200 fourhundredGigE29 28 +Ethernet116 201,202,203,204,205,206,207,208 fourhundredGigE30 29 +Ethernet120 209,210,211,212,213,214,215,216 fourhundredGigE31 30 +Ethernet124 217,218,219,220,221,222,223,224 fourhundredGigE32 31 diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/sai.profile b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/sai.profile new file mode 100644 index 000000000000..54b62b1d097c --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/th3-ix9-32x400G.config.bcm diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/th3-ix9-32x400G.config.bcm b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/th3-ix9-32x400G.config.bcm new file mode 100644 index 000000000000..704183e10924 --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/Quanta-IX9-32X/th3-ix9-32x400G.config.bcm @@ -0,0 +1,341 @@ +ccm_dma_enable=0 +ccmdma_intr_enable=0 +ctr_evict_enable=0 +mem_cache_enable=0 +parity_correction=0 +parity_enable=0 +phy_enable=0 +phy_null=1 +pll_bypass=1 + +init_all_modules=0 +core_clock_frequency=1325 +dpr_clock_frequency=1000 +device_clock_frequency=1325 + +load_firmware=0x2 +port_flex_enable=1 + +# portmap settings +pbmp_xport_xe=0x111101111411110111101111011114111102222 + +portmap_1=1:400 +portmap_5=9:400 +portmap_9=17:400 +portmap_13=25:400 +portmap_20=33:400 +portmap_24=41:400 +portmap_28=49:400 +portmap_32=57:400 + +portmap_40=65:400 +portmap_44=73:400 +portmap_48=81:400 +portmap_52=89:400 +portmap_60=97:400 +portmap_64=105:400 +portmap_68=113:400 +portmap_72=121:400 + +portmap_80=129:400 +portmap_84=137:400 +portmap_88=145:400 +portmap_92=153:400 +portmap_100=161:400 +portmap_104=169:400 +portmap_108=177:400 +portmap_112=185:400 + +portmap_120=193:400 +portmap_124=201:400 +portmap_128=209:400 +portmap_132=217:400 +portmap_140=225:400 +portmap_144=233:400 +portmap_148=241:400 +portmap_152=249:400 + +# datapath port +portmap_38=257:10 +portmap_118=258:10 + +# loopback port +portmap_19=260:10 +portmap_39=260:10 +portmap_59=261:10 +portmap_79=262:10 +portmap_99=263:10 +portmap_119=264:10 +portmap_139=265:10 +portmap_159=266:10 + +# port order remap +dport_map_port_20=1 +dport_map_port_13=2 +dport_map_port_28=3 +dport_map_port_32=4 +dport_map_port_40=5 +dport_map_port_44=6 +dport_map_port_48=7 +dport_map_port_52=8 +dport_map_port_9=9 +dport_map_port_60=10 +dport_map_port_5=11 +dport_map_port_24=12 +dport_map_port_68=13 +dport_map_port_64=14 +dport_map_port_72=15 +dport_map_port_1=16 + +dport_map_port_84=17 +dport_map_port_80=18 +dport_map_port_148=19 +dport_map_port_152=20 +dport_map_port_140=21 +dport_map_port_88=22 +dport_map_port_92=23 +dport_map_port_144=24 +dport_map_port_100=25 +dport_map_port_104=26 +dport_map_port_108=27 +dport_map_port_112=28 +dport_map_port_120=29 +dport_map_port_124=30 +dport_map_port_128=31 +dport_map_port_132=32 + +dport_map_port_38=33 +dport_map_port_118=34 + +### lane swap and polarity follow front port order ### +phy_chain_tx_lane_map_physical{33.0}=0x75206431 +serdes_core_tx_polarity_flip_physical{33}=0xdb +phy_chain_rx_lane_map_physical{33.0}=0x13572064 +serdes_core_rx_polarity_flip_physical{33}=0x69 + +phy_chain_tx_lane_map_physical{25.0}=0x75314206 +serdes_core_tx_polarity_flip_physical{25}=0xe8 +phy_chain_rx_lane_map_physical{25.0}=0x67103524 +serdes_core_rx_polarity_flip_physical{25}=0x7c + +phy_chain_tx_lane_map_physical{49.0}=0x57326014 +serdes_core_tx_polarity_flip_physical{49}=0x0e +phy_chain_rx_lane_map_physical{49.0}=0x21463057 +serdes_core_rx_polarity_flip_physical{49}=0xd2 + +phy_chain_tx_lane_map_physical{57.0}=0x12307564 +serdes_core_tx_polarity_flip_physical{57}=0xa6 +phy_chain_rx_lane_map_physical{57.0}=0x57460231 +serdes_core_rx_polarity_flip_physical{57}=0x99 + +phy_chain_tx_lane_map_physical{65.0}=0x60345721 +serdes_core_tx_polarity_flip_physical{65}=0xe2 +phy_chain_rx_lane_map_physical{65.0}=0x40675123 +serdes_core_rx_polarity_flip_physical{65}=0x0f + +phy_chain_tx_lane_map_physical{73.0}=0x21306574 +serdes_core_tx_polarity_flip_physical{73}=0xa4 +phy_chain_rx_lane_map_physical{73.0}=0x67451302 +serdes_core_rx_polarity_flip_physical{73}=0x06 + +phy_chain_tx_lane_map_physical{81.0}=0x65210347 +serdes_core_tx_polarity_flip_physical{81}=0xe2 +phy_chain_rx_lane_map_physical{81.0}=0x10675423 +serdes_core_rx_polarity_flip_physical{81}=0x0f + +phy_chain_tx_lane_map_physical{89.0}=0x41236570 +serdes_core_tx_polarity_flip_physical{89}=0x8d +phy_chain_rx_lane_map_physical{89.0}=0x45672031 +serdes_core_rx_polarity_flip_physical{89}=0x63 + +phy_chain_tx_lane_map_physical{17.0}=0x76312504 +serdes_core_tx_polarity_flip_physical{17}=0x8e +phy_chain_rx_lane_map_physical{17.0}=0x75126403 +serdes_core_rx_polarity_flip_physical{17}=0x2d + +phy_chain_tx_lane_map_physical{97.0}=0x31025764 +serdes_core_tx_polarity_flip_physical{97}=0x3c +phy_chain_rx_lane_map_physical{97.0}=0x52136470 +serdes_core_rx_polarity_flip_physical{97}=0x9c + +phy_chain_tx_lane_map_physical{9.0}=0x57326014 +serdes_core_tx_polarity_flip_physical{9}=0x3d +phy_chain_rx_lane_map_physical{9.0}=0x31452076 +serdes_core_rx_polarity_flip_physical{9}=0x1e + +phy_chain_tx_lane_map_physical{41.0}=0x03215764 +serdes_core_tx_polarity_flip_physical{41}=0x3c +phy_chain_rx_lane_map_physical{41.0}=0x54671302 +serdes_core_rx_polarity_flip_physical{41}=0x99 + +phy_chain_tx_lane_map_physical{113.0}=0x60175243 +serdes_core_tx_polarity_flip_physical{113}=0xcd +phy_chain_rx_lane_map_physical{113.0}=0x20473156 +serdes_core_rx_polarity_flip_physical{113}=0x87 + +phy_chain_tx_lane_map_physical{105.0}=0x65034721 +serdes_core_tx_polarity_flip_physical{105}=0xe6 +phy_chain_rx_lane_map_physical{105.0}=0x04157263 +serdes_core_rx_polarity_flip_physical{105}=0x4c + +phy_chain_tx_lane_map_physical{121.0}=0x16435072 +serdes_core_tx_polarity_flip_physical{121}=0xae +phy_chain_rx_lane_map_physical{121.0}=0x13560247 +serdes_core_rx_polarity_flip_physical{121}=0x2d + +phy_chain_tx_lane_map_physical{1.0}=0x34650172 +serdes_core_tx_polarity_flip_physical{1}=0xff +phy_chain_rx_lane_map_physical{1.0}=0x13026457 +serdes_core_rx_polarity_flip_physical{1}=0x99 + +phy_chain_tx_lane_map_physical{137.0}=0x02673451 +serdes_core_tx_polarity_flip_physical{137}=0x25 +phy_chain_rx_lane_map_physical{137.0}=0x14730562 +serdes_core_rx_polarity_flip_physical{137}=0x86 + +phy_chain_tx_lane_map_physical{129.0}=0x12304675 +serdes_core_tx_polarity_flip_physical{129}=0x49 +phy_chain_rx_lane_map_physical{129.0}=0x76453021 +serdes_core_rx_polarity_flip_physical{129}=0xc3 + +phy_chain_tx_lane_map_physical{241.0}=0x31462075 +serdes_core_tx_polarity_flip_physical{241}=0xf5 +phy_chain_rx_lane_map_physical{241.0}=0x47315602 +serdes_core_rx_polarity_flip_physical{241}=0xe1 + +phy_chain_tx_lane_map_physical{249.0}=0x13206547 +serdes_core_tx_polarity_flip_physical{249}=0x27 +phy_chain_rx_lane_map_physical{249.0}=0x64750312 +serdes_core_rx_polarity_flip_physical{249}=0xbd + +phy_chain_tx_lane_map_physical{225.0}=0x60315742 +serdes_core_tx_polarity_flip_physical{225}=0x44 +phy_chain_rx_lane_map_physical{225.0}=0x01546372 +serdes_core_rx_polarity_flip_physical{225}=0xc3 + +phy_chain_tx_lane_map_physical{145.0}=0x51374602 +serdes_core_tx_polarity_flip_physical{145}=0x5f +phy_chain_rx_lane_map_physical{145.0}=0x23106754 +serdes_core_rx_polarity_flip_physical{145}=0xbc + +phy_chain_tx_lane_map_physical{153.0}=0x05163742 +serdes_core_tx_polarity_flip_physical{153}=0x0f +phy_chain_rx_lane_map_physical{153.0}=0x67102354 +serdes_core_rx_polarity_flip_physical{153}=0xf0 + +phy_chain_tx_lane_map_physical{233.0}=0x20134576 +serdes_core_tx_polarity_flip_physical{233}=0x07 +phy_chain_rx_lane_map_physical{233.0}=0x23107465 +serdes_core_rx_polarity_flip_physical{233}=0xe6 + +phy_chain_tx_lane_map_physical{161.0}=0x53246710 +serdes_core_tx_polarity_flip_physical{161}=0x0f +phy_chain_rx_lane_map_physical{161.0}=0x03471265 +serdes_core_rx_polarity_flip_physical{161}=0xc0 + +phy_chain_tx_lane_map_physical{169.0}=0x20137654 +serdes_core_tx_polarity_flip_physical{169}=0x8a +phy_chain_rx_lane_map_physical{169.0}=0x27360415 +serdes_core_rx_polarity_flip_physical{169}=0x9c + +phy_chain_tx_lane_map_physical{177.0}=0x50346712 +serdes_core_tx_polarity_flip_physical{177}=0x4f +phy_chain_rx_lane_map_physical{177.0}=0x13460257 +serdes_core_rx_polarity_flip_physical{177}=0x5a + +phy_chain_tx_lane_map_physical{185.0}=0x12305674 +serdes_core_tx_polarity_flip_physical{185}=0xba +phy_chain_rx_lane_map_physical{185.0}=0x57460123 +serdes_core_rx_polarity_flip_physical{185}=0x9f + +phy_chain_tx_lane_map_physical{193.0}=0x50346712 +serdes_core_tx_polarity_flip_physical{193}=0x4f +phy_chain_rx_lane_map_physical{193.0}=0x13750264 +serdes_core_rx_polarity_flip_physical{193}=0x69 + +phy_chain_tx_lane_map_physical{201.0}=0x12305674 +serdes_core_tx_polarity_flip_physical{201}=0xba +phy_chain_rx_lane_map_physical{201.0}=0x57460123 +serdes_core_rx_polarity_flip_physical{201}=0x9f + +phy_chain_tx_lane_map_physical{209.0}=0x50346712 +serdes_core_tx_polarity_flip_physical{209}=0x4f +phy_chain_rx_lane_map_physical{209.0}=0x13460275 +serdes_core_rx_polarity_flip_physical{209}=0x5a + +phy_chain_tx_lane_map_physical{217.0}=0x31205674 +serdes_core_tx_polarity_flip_physical{217}=0x5a +phy_chain_rx_lane_map_physical{217.0}=0x67541203 +serdes_core_rx_polarity_flip_physical{217}=0x33 + + +port_fec_20=9 +port_fec_13=9 +port_fec_28=9 +port_fec_32=9 +port_fec_40=9 +port_fec_44=9 +port_fec_48=9 +port_fec_52=9 +port_fec_9=9 +port_fec_60=9 +port_fec_5=9 +port_fec_24=9 +port_fec_68=9 +port_fec_64=9 +port_fec_72=9 +port_fec_1=9 + +port_fec_84=9 +port_fec_80=9 +port_fec_148=9 +port_fec_152=9 +port_fec_140=9 +port_fec_88=9 +port_fec_92=9 +port_fec_144=9 +port_fec_100=9 +port_fec_104=9 +port_fec_108=9 +port_fec_112=9 +port_fec_120=9 +port_fec_124=9 +port_fec_128=9 +port_fec_132=9 + + +port_init_cl72_20=1 +port_init_cl72_13=1 +port_init_cl72_28=1 +port_init_cl72_32=1 +port_init_cl72_40=1 +port_init_cl72_44=1 +port_init_cl72_48=1 +port_init_cl72_52=1 +port_init_cl72_9=1 +port_init_cl72_60=1 +port_init_cl72_5=1 +port_init_cl72_24=1 +port_init_cl72_68=1 +port_init_cl72_64=1 +port_init_cl72_72=1 +port_init_cl72_1=1 + +port_init_cl72_84=1 +port_init_cl72_80=1 +port_init_cl72_148=1 +port_init_cl72_152=1 +port_init_cl72_140=1 +port_init_cl72_88=1 +port_init_cl72_92=1 +port_init_cl72_144=1 +port_init_cl72_100=1 +port_init_cl72_104=1 +port_init_cl72_108=1 +port_init_cl72_112=1 +port_init_cl72_120=1 +port_init_cl72_124=1 +port_init_cl72_128=1 +port_init_cl72_132=1 + + diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/default_sku b/device/quanta/x86_64-quanta_ix9_bwde-r0/default_sku new file mode 100644 index 000000000000..0ca35bb0074e --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/default_sku @@ -0,0 +1 @@ +Quanta-IX9-32X t1 diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/installer.conf b/device/quanta/x86_64-quanta_ix9_bwde-r0/installer.conf new file mode 100644 index 000000000000..925a32fc0c3a --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/installer.conf @@ -0,0 +1,3 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/led_proc_init.soc b/device/quanta/x86_64-quanta_ix9_bwde-r0/led_proc_init.soc new file mode 100644 index 000000000000..adff95218e4f --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/led_proc_init.soc @@ -0,0 +1,2 @@ +sleep 10 +led auto on diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/eeprom.py b/device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/eeprom.py new file mode 100644 index 000000000000..2a35f3a22a17 --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/eeprom.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, 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): + self.eeprom_path = "/sys/bus/i2c/devices/18-0054/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/psuutil.py b/device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/psuutil.py new file mode 100644 index 000000000000..885842bbda5a --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/psuutil.py @@ -0,0 +1,49 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + MAX_PSUS = 2 + + return MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is\ + faulty + """ + status = 1 + + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + status = 1 + + return status diff --git a/device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/sfputil.py b/device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/sfputil.py new file mode 100644 index 000000000000..6dc23d8195f4 --- /dev/null +++ b/device/quanta/x86_64-quanta_ix9_bwde-r0/plugins/sfputil.py @@ -0,0 +1,176 @@ +#!/usr/bin/env python + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class SfpUtil(SfpUtilBase): + """Platform specific SfpUtill class""" + + _port_start = 0 + _port_end = 31 + ports_in_block = 32 + + _port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 1 : 32, + 2 : 33, + 3 : 34, + 4 : 35, + 5 : 36, + 6 : 37, + 7 : 38, + 8 : 39, + 9 : 40, + 10 : 41, + 11 : 42, + 12 : 43, + 13 : 44, + 14 : 45, + 15 : 46, + 16 : 47, + 17 : 48, + 18 : 49, + 19 : 50, + 20 : 51, + 21 : 52, + 22 : 53, + 23 : 54, + 24 : 55, + 25 : 56, + 26 : 57, + 27 : 58, + 28 : 59, + 29 : 60, + 30 : 61, + 31 : 62, + 32 : 63, + } + + _qsfp_ports = range(0, ports_in_block + 1) + + def __init__(self): + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' + for x in range(0, self._port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1]) + self._port_to_eeprom_mapping[x] = port_eeprom_path + SfpUtilBase.__init__(self) + + def reset(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + try: + reg_file = open("/sys/class/cpld-qsfpdd/port-"+str(port_num+1)+"/reset", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = 0 + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 2 second to allow it to settle + time.sleep(2) + + # Flip the value back write back to the register to take port out of reset + try: + reg_file = open("/sys/class/cpld-qsfpdd/port-"+str(port_num+1)+"/reset", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = 1 + reg_file.write(hex(reg_value)) + reg_file.close() + + 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 False + + try: + reg_file = open("/sys/class/cpld-qsfpdd/port-"+str(port_num+1)+"/lpmode", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = int(reg_file.readline().rstrip()) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = 1 + else: + reg_value = 0 + + reg_file.write(hex(reg_value)) + reg_file.close() + + return True + + 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 + + try: + reg_file = open("/sys/class/cpld-qsfpdd/port-"+str(port_num+1)+"/lpmode") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = int(reg_file.readline().rstrip()) + + if reg_value == 0: + return False + + return True + + 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 + + try: + reg_file = open("/sys/class/cpld-qsfpdd/port-"+str(port_num+1)+"/module_present") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_file.readline().rstrip() + if reg_value == '1': + return True + + return False + + @property + def port_start(self): + return self._port_start + + @property + def port_end(self): + return self._port_end + + @property + def qsfp_ports(self): + return range(0, self.ports_in_block + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + 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 + + diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 0edb6ebc4f9a..a850065a0f0a 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -45,6 +45,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(QUANTA_IX7_32X_PLATFORM_MODULE) \ $(QUANTA_IX8_56X_PLATFORM_MODULE) \ $(QUANTA_IX8C_56X_PLATFORM_MODULE) \ + $(QUANTA_IX9_32X_PLATFORM_MODULE) \ $(MITAC_LY1200_32X_PLATFORM_MODULE) \ $(ALPHANETWORKS_SNH60A0_320FV2_PLATFORM_MODULE) \ $(ALPHANETWORKS_SNH60B0_640F_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-quanta.mk b/platform/broadcom/platform-modules-quanta.mk index 93cf7b4d9d7f..456af3019e38 100644 --- a/platform/broadcom/platform-modules-quanta.mk +++ b/platform/broadcom/platform-modules-quanta.mk @@ -4,11 +4,13 @@ QUANTA_IX1B_32X_PLATFORM_MODULE_VERSION = 1.0 QUANTA_IX7_32X_PLATFORM_MODULE_VERSION = 1.0 QUANTA_IX8_56X_PLATFORM_MODULE_VERSION = 1.0 QUANTA_IX8C_56X_PLATFORM_MODULE_VERSION = 1.0 +QUANTA_IX9_32X_PLATFORM_MODULE_VERSION = 1.0 export QUANTA_IX1B_32X_PLATFORM_MODULE_VERSION export QUANTA_IX7_32X_PLATFORM_MODULE_VERSION export QUANTA_IX8_56X_PLATFORM_MODULE_VERSION export QUANTA_IX8C_56X_PLATFORM_MODULE_VERSION +export QUANTA_IX9_32X_PLATFORM_MODULE_VERSION QUANTA_IX1B_32X_PLATFORM_MODULE = sonic-platform-quanta-ix1b-32x_$(QUANTA_IX1B_32X_PLATFORM_MODULE_VERSION)_amd64.deb $(QUANTA_IX1B_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-quanta @@ -28,4 +30,8 @@ QUANTA_IX8C_56X_PLATFORM_MODULE = sonic-platform-quanta-ix8c-56x_$(QUANTA_IX8C_5 $(QUANTA_IX8C_56X_PLATFORM_MODULE)_PLATFORM = x86_64-quanta_ix8c_bwde-r0 $(eval $(call add_extra_package,$(QUANTA_IX1B_32X_PLATFORM_MODULE),$(QUANTA_IX8C_56X_PLATFORM_MODULE))) +QUANTA_IX9_32X_PLATFORM_MODULE = sonic-platform-quanta-ix9-32x_$(QUANTA_IX9_32X_PLATFORM_MODULE_VERSION)_amd64.deb +$(QUANTA_IX9_32X_PLATFORM_MODULE)_PLATFORM = x86_64-quanta_ix9_bwde-r0 +$(eval $(call add_extra_package,$(QUANTA_IX1B_32X_PLATFORM_MODULE),$(QUANTA_IX9_32X_PLATFORM_MODULE))) + SONIC_STRETCH_DEBS += $(QUANTA_IX1B_32X_PLATFORM_MODULE) diff --git a/platform/broadcom/sonic-platform-modules-quanta/debian/changelog b/platform/broadcom/sonic-platform-modules-quanta/debian/changelog index 4bed63edf9cd..fe1cfa45490b 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/debian/changelog +++ b/platform/broadcom/sonic-platform-modules-quanta/debian/changelog @@ -25,3 +25,10 @@ sonic-quanta-platform-modules (1.0) unstable; urgency=low * Initial release -- Chih-Pei Chang Jonathan Tsai Thu, 4 Jan 2018 13:50:01 +0800 + +sonic-quanta-platform-modules (1.0) unstable; urgency=low + + * Add support for Quanta IX9-32X + * Initial release + + -- Jonathan Tsai Thu, 31 Jan 2019 13:09:01 +0800 diff --git a/platform/broadcom/sonic-platform-modules-quanta/debian/control b/platform/broadcom/sonic-platform-modules-quanta/debian/control index aea2a39d6ff3..f25b0d8e3c5b 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/debian/control +++ b/platform/broadcom/sonic-platform-modules-quanta/debian/control @@ -20,3 +20,7 @@ Description: kernel modules for platform devices such as psu, led, sfp Package: sonic-platform-quanta-ix8c-56x Architecture: amd64 Description: kernel modules for platform devices such as psu, led, sfp + +Package: sonic-platform-quanta-ix9-32x +Architecture: amd64 +Description: kernel modules for platform devices such as psu, led, sfp diff --git a/platform/broadcom/sonic-platform-modules-quanta/debian/rules b/platform/broadcom/sonic-platform-modules-quanta/debian/rules index 8ceede79196b..46b9607135a8 100644 --- a/platform/broadcom/sonic-platform-modules-quanta/debian/rules +++ b/platform/broadcom/sonic-platform-modules-quanta/debian/rules @@ -19,7 +19,7 @@ PACKAGE_PRE_NAME := sonic-platform-quanta KVERSION ?= $(shell uname -r) KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) -MODULE_DIRS:= ix1b-32x ix7-32x ix8-56x ix8c-56x +MODULE_DIRS:= ix1b-32x ix7-32x ix8-56x ix8c-56x ix9-32x MODULE_DIR := modules UTILS_DIR := utils SERVICE_DIR := service diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/classes/__init__.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/classes/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/Makefile b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/Makefile new file mode 100644 index 000000000000..929782931a47 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/Makefile @@ -0,0 +1,3 @@ +obj-m:=qci_cpld_qsfpdd.o qci_cpld_led.o qci_platform_ix9.o + + diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_led.c b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_led.c new file mode 100644 index 000000000000..d8f89240a851 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_led.c @@ -0,0 +1,277 @@ +/* + * A LED CPLD driver for Quanta Switch Platform + * + * The CPLD is customize by Quanta for decode led bit stream, + * This driver modify from Quanta CPLD I/O driver. + * + * Copyright (C) 2015 Quanta Inc. + * + * Author: Luffy Cheng + * Author: Roger Chang + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static DEFINE_IDA(cpld_led_ida); + +enum platform_type { + IX7 = 0, + IX8C, + IX9, + NONE +}; + +static struct class *cpld_class = NULL; + +struct cpld_data { + struct i2c_client *cpld_client; + char name[8]; + u8 cpld_id; +}; + +struct cpld_led_data { + struct mutex lock; + struct device *port_dev; + struct cpld_data *cpld_data; +}; + +static int cpld_led_probe(struct i2c_client *client, + const struct i2c_device_id *id); +static int cpld_led_remove(struct i2c_client *client); + +static const struct i2c_device_id cpld_led_id[] = { + { "CPLDLED_IX7", IX7 }, + { "CPLDLED_IX8C", IX8C }, + { "CPLDLED_IX9", IX9 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, cpld_led_id); + +static struct i2c_driver cpld_led_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "qci_cpld_led", + }, + .probe = cpld_led_probe, + .remove = cpld_led_remove, + .id_table = cpld_led_id, +// .address_list = normal_i2c, +}; + +#define CPLD_LED_ID_PREFIX "CPLDLED-" +#define CPLD_LED_ID_FORMAT CPLD_LED_ID_PREFIX "%d" + +#define CPLD_DECODER_OFFSET 0x4 +#define CPLD_DECODER_MASK 0x1 +#define CPLD_USERCODE_START_OFFSET 0x0 + +static ssize_t get_led_decode(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct cpld_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->cpld_client; + u8 offset = (u8)(CPLD_DECODER_OFFSET); + s32 value; + + value = i2c_smbus_read_byte_data(client, offset); + if (value < 0) + return -ENODEV; + + dev_dbg(&client->dev, "read led decode value= %x\n", value); + + value &= CPLD_DECODER_MASK; + + return sprintf(buf, "%d\n", (value == 0) ? 1 : 0); +} + +static ssize_t get_usercode(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct cpld_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->cpld_client; + u8 i = 0; + s32 value = 0, reading = 0; + + for (i = 0; i < 4; i++) + { + reading = i2c_smbus_read_byte_data(client, CPLD_USERCODE_START_OFFSET + i); + if (reading < 0) + return -ENODEV; + + dev_dbg(&client->dev, "read led usercode reg %d value= %x\n", i, reading); + + value |= reading << (24 - 8 * i); + } + + return sprintf(buf, "%X\n", value); +} + +static ssize_t set_led_decode(struct device *dev, + struct device_attribute *devattr, + const char *buf, + size_t count) +{ + struct cpld_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->cpld_client; + s32 value; + long enable; + + if (kstrtol(buf, 0, &enable)) + return -EINVAL; + + if ((enable != 1) && (enable != 0)) + return -EINVAL; + +// mutex_lock(&data->lock); + value = i2c_smbus_read_byte_data(client, CPLD_DECODER_OFFSET); + if (value < 0) + return -ENODEV; + + dev_dbg(&client->dev, "read led decode value= %x\n", value); + + value |= CPLD_DECODER_MASK; + if (enable) + value &= ~CPLD_DECODER_MASK; + + dev_dbg(&client->dev, "write led decode value= %x\n", value); + + i2c_smbus_write_byte_data(client, CPLD_DECODER_OFFSET, (u8)value); +// mutex_unlock(&data->lock); + + return count; +} + +static DEVICE_ATTR(led_decode, S_IWUSR | S_IRUGO, get_led_decode, set_led_decode); +static DEVICE_ATTR(usercode, S_IRUGO, get_usercode, NULL); + +static const struct attribute *led_attrs[] = { + &dev_attr_usercode.attr, + &dev_attr_led_decode.attr, + NULL, +}; + +static const struct attribute_group led_attr_group = { + .attrs = (struct attribute **) led_attrs, +}; + +static int cpld_led_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct cpld_led_data *data; + struct cpld_data *led_data; + struct device *port_dev; + int nr, err; + + if (!cpld_class) + { + cpld_class = class_create(THIS_MODULE, "cpld-led"); + if (IS_ERR(cpld_class)) { + pr_err("couldn't create sysfs class\n"); + return PTR_ERR(cpld_class); + } + } + + data = devm_kzalloc(&client->dev, sizeof(struct cpld_led_data), + GFP_KERNEL); + if (!data) + return -ENOMEM; + + /* Test */ + nr = ida_simple_get(&cpld_led_ida, 1, 99, GFP_KERNEL); + if (nr < 0) + goto err_out; + + led_data = kzalloc(sizeof(struct cpld_led_data), GFP_KERNEL); + + port_dev = device_create(cpld_class, &client->dev, MKDEV(0,0), led_data, CPLD_LED_ID_FORMAT, nr); + if (IS_ERR(port_dev)) { + err = PTR_ERR(port_dev); + // printk("err_status\n"); + } + + data->port_dev = port_dev; + data->cpld_data = led_data; + + dev_info(&client->dev, "Register CPLDLED %d\n", nr); + + sprintf(led_data->name, "LED%d-data", nr); + led_data->cpld_id = nr; + dev_set_drvdata(port_dev, led_data); + port_dev->init_name = led_data->name; + led_data->cpld_client = client; + + err = sysfs_create_group(&port_dev->kobj, &led_attr_group); + // if (status) printk("err status\n"); + /* end */ + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + + dev_info(&client->dev, "%s device found\n", client->name); + + + return 0; + +err_out: + return nr; +} + +/* FIXME: for older kernel doesn't with idr_is_empty function, implement here */ +static int idr_has_entry(int id, void *p, void *data) +{ + return 1; +} + +static bool cpld_idr_is_empty(struct idr *idp) +{ + return !idr_for_each(idp, idr_has_entry, NULL); +} + +static int cpld_led_remove(struct i2c_client *client) +{ + struct cpld_led_data *data = i2c_get_clientdata(client); + + dev_info(data->port_dev, "Remove CPLDLED-%d\n", data->cpld_data->cpld_id); + device_unregister(data->port_dev); + ida_simple_remove(&cpld_led_ida, data->cpld_data->cpld_id); + kfree(data->cpld_data); + + if (cpld_idr_is_empty(&cpld_led_ida.idr)) + class_destroy(cpld_class); + + return 0; +} + +module_i2c_driver(cpld_led_driver); + +MODULE_AUTHOR("Luffy Cheng "); +MODULE_AUTHOR("Roger Chang "); +MODULE_DESCRIPTION("Quanta Switch LED CPLD driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_qsfpdd.c b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_qsfpdd.c new file mode 100644 index 000000000000..d616f887dbbf --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_cpld_qsfpdd.c @@ -0,0 +1,411 @@ +/* + * A CPLD driver for monitor QSFPDD module I/O + * + * The CPLD is customize by Quanta for controlling QSFPDD module signals, + * they are RESET , INTERREPT , Module_Present, LPMODE + * Each CPLD control 16 modules, each module use 4 bits in register. + * + * Copyright (C) 2015 Quanta Inc. + * + * Author: Luffy Cheng + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static DEFINE_IDA(cpld_ida); + +enum platform_type { + QSFPDD = 0, + NONE +}; + +static struct class *cpld_class = NULL; + +struct sfp_data { + struct i2c_client *cpld_client; + char name[8]; + u8 port_id; + u8 cpld_port; +}; + +struct cpld_data { + struct mutex lock; + struct device *port_dev[16]; + struct sfp_data *port_data[16]; +}; + +static int cpld_probe(struct i2c_client *client, + const struct i2c_device_id *id); +static int cpld_remove(struct i2c_client *client); + +static const struct i2c_device_id cpld_id[] = { + { "CPLD-QSFPDD", QSFPDD }, + { } +}; +MODULE_DEVICE_TABLE(i2c, cpld_id); + +static struct i2c_driver cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "qci_cpld_qsfpdd", + }, + .probe = cpld_probe, + .remove = cpld_remove, + .id_table = cpld_id, +// .address_list = normal_i2c, +}; + +#define CPLD_ID_PREFIX "port-" +#define CPLD_ID_FORMAT CPLD_ID_PREFIX "%d" + +#define RESET_MASK 0x08 +#define INTERRUPT_MASK 0x04 +#define MODULE_PRESENT_MASK 0x02 +#define LPMODE_MASK 0x01 + +static inline u8 get_group_cmd(u8 group) +{ + //FIXME: if group cmd change + return (group + 1); +} + +static inline u8 port_remapping(u8 phy_port) +{ + /* FIXME: implement by hardware design */ + /* The CPLD register port mapping is weird : + * MSB -------- LSB (word data) + * P3 P4 P1 P2 (per port 4 bits) + * For easy coding bit shift, we treat it as hw port swap + */ + return (phy_port % 2) ? (phy_port - 1) : (phy_port + 1); +} + +static ssize_t get_reset(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct sfp_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->cpld_client; + u8 group = (u8)(data->cpld_port / 4); + u8 group_port = data->cpld_port % 4; + s32 value; + + dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id, + data->cpld_port + 1, group + 1, group_port + 1); + + value = i2c_smbus_read_word_data(client, get_group_cmd(group)); + if (value < 0) + return -ENODEV; + + dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value); + + value >>= (group_port * 4); + value &= RESET_MASK; + + return sprintf(buf, "%d\n", value ? 1 : 0); +} + +static ssize_t get_interrupt(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct sfp_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->cpld_client; + u8 group = (u8)(data->cpld_port / 4); + u8 group_port = data->cpld_port % 4; + s32 value; + + dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id, + data->cpld_port + 1, group + 1, group_port + 1); + + value = i2c_smbus_read_word_data(client, get_group_cmd(group)); + if (value < 0) + return -ENODEV; + + dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value); + + value >>= (group_port * 4); + value &= INTERRUPT_MASK; + + return sprintf(buf, "%d\n", value ? 1 : 0); +} + +static ssize_t get_module_present(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct sfp_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->cpld_client; + u8 group = (u8)(data->cpld_port / 4); + u8 group_port = data->cpld_port % 4; + s32 value; + + dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id, + data->cpld_port + 1, group + 1, group_port + 1); + + value = i2c_smbus_read_word_data(client, get_group_cmd(group)); + if (value < 0) + return -ENODEV; + + dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value); + + value >>= (group_port * 4); + value &= MODULE_PRESENT_MASK; + + //FIXME: if present is not low active + return sprintf(buf, "%d\n", value ? 0 : 1); +} + +static ssize_t get_lpmode(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + struct sfp_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->cpld_client; + u8 group = (u8)(data->cpld_port / 4); + u8 group_port = data->cpld_port % 4; + s32 value; + + dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id, + data->cpld_port + 1, group + 1, group_port + 1); + + value = i2c_smbus_read_word_data(client, get_group_cmd(group)); + if (value < 0) + return -ENODEV; + + dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value); + + value >>= (group_port * 4); + value &= LPMODE_MASK; + + return sprintf(buf, "%d\n", value ? 1 : 0); +} + +static ssize_t set_reset(struct device *dev, + struct device_attribute *devattr, + const char *buf, + size_t count) +{ + struct sfp_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->cpld_client; + u8 group = (u8)(data->cpld_port / 4); + u8 group_port = data->cpld_port % 4; + s32 value; + long disable; + + dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id, + data->cpld_port + 1, group + 1, group_port + 1); + + if (kstrtol(buf, 0, &disable)) + return -EINVAL; + + if ((disable != 1) && (disable != 0)) + return -EINVAL; + +// mutex_lock(&data->lock); + value = i2c_smbus_read_word_data(client, get_group_cmd(group)); + if (value < 0) + return -ENODEV; + + dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value); + + value &= ~(RESET_MASK << (group_port * 4)); + if (disable) + value |= (RESET_MASK << (group_port * 4)); + + dev_dbg(&client->dev, "write group%d value= %x\n", group + 1, value); + + i2c_smbus_write_word_data(client, get_group_cmd(group), (u16)value); +// mutex_unlock(&data->lock); + + return count; +} + +static ssize_t set_lpmode(struct device *dev, + struct device_attribute *devattr, + const char *buf, + size_t count) +{ + struct sfp_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->cpld_client; + u8 group = (u8)(data->cpld_port / 4); + u8 group_port = data->cpld_port % 4; + s32 value; + long disable; + + dev_dbg(&client->dev, "port_id %d => cpld_port %d, group %d(%d)\n", data->port_id, + data->cpld_port + 1, group + 1, group_port + 1); + + if (kstrtol(buf, 0, &disable)) + return -EINVAL; + + if ((disable != 1) && (disable != 0)) + return -EINVAL; + +// mutex_lock(&data->lock); + value = i2c_smbus_read_word_data(client, get_group_cmd(group)); + if (value < 0) + return -ENODEV; + + dev_dbg(&client->dev, "read group%d value= %x\n", group + 1, value); + + value &= ~(LPMODE_MASK << (group_port * 4)); + if (disable) + value |= (LPMODE_MASK << (group_port * 4)); + + dev_dbg(&client->dev, "write group%d value= %x\n", group + 1, value); + + i2c_smbus_write_word_data(client, get_group_cmd(group), (u16)value); +// mutex_unlock(&data->lock); + + return count; +} + +static DEVICE_ATTR(reset, S_IWUSR | S_IRUGO, get_reset, set_reset); +static DEVICE_ATTR(lpmode, S_IWUSR | S_IRUGO, get_lpmode, set_lpmode); +static DEVICE_ATTR(module_present, S_IRUGO, get_module_present, NULL); +static DEVICE_ATTR(interrupt, S_IRUGO, get_interrupt, NULL); + +static const struct attribute *sfp_attrs[] = { + &dev_attr_reset.attr, + &dev_attr_lpmode.attr, + &dev_attr_module_present.attr, + &dev_attr_interrupt.attr, + NULL, +}; + +static const struct attribute_group sfp_attr_group = { + .attrs = (struct attribute **) sfp_attrs, +}; + +static int cpld_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct cpld_data *data; + struct sfp_data *port_data; + struct device *port_dev; + int port_nr, i, err; + + if (!cpld_class) + { + cpld_class = class_create(THIS_MODULE, "cpld-qsfpdd"); + if (IS_ERR(cpld_class)) { + pr_err("couldn't create sysfs class\n"); + return PTR_ERR(cpld_class); + } + } + + data = devm_kzalloc(&client->dev, sizeof(struct cpld_data), + GFP_KERNEL); + if (!data) + return -ENOMEM; + + /* register sfp port data to sysfs */ + for (i = 0; i < 16; i++) + { + port_nr = ida_simple_get(&cpld_ida, 1, 99, GFP_KERNEL); + if (port_nr < 0) + return port_nr; + + port_data = kzalloc(sizeof(struct sfp_data), GFP_KERNEL); + + port_dev = device_create(cpld_class, &client->dev, MKDEV(0,0), port_data, CPLD_ID_FORMAT, port_nr); + if (IS_ERR(port_dev)) { + err = PTR_ERR(port_dev); + // printk("err_status\n"); + } + + data->port_dev[i] = port_dev; + data->port_data[i] = port_data; + + dev_info(&client->dev, "Register qsfpdd port-%d\n", port_nr); + + /* FIXME: implement Logical/Physical port remapping */ + //port_data->cpld_port = i; + port_data->cpld_port = port_remapping(i); + sprintf(port_data->name, "port-%d", port_nr); + port_data->port_id = port_nr; + dev_set_drvdata(port_dev, port_data); + port_dev->init_name = port_data->name; + port_data->cpld_client = client; + + err = sysfs_create_group(&port_dev->kobj, &sfp_attr_group); + // if (status) printk("err status\n"); + } + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + + dev_info(&client->dev, "%s device found\n", client->name); + + + return 0; + +#if 0 +//FIXME: implement error check +exit_remove: +// sysfs_remove_group(&client->dev.kobj, &data->attrs); + return err; +#endif +} + +/* FIXME: for older kernel doesn't with idr_is_empty function, implement here */ +static int idr_has_entry(int id, void *p, void *data) +{ + return 1; +} + +static bool cpld_idr_is_empty(struct idr *idp) +{ + return !idr_for_each(idp, idr_has_entry, NULL); +} + +static int cpld_remove(struct i2c_client *client) +{ + struct cpld_data *data = i2c_get_clientdata(client); + int i; + + for (i = 15; i >= 0; i--) + { + dev_info(data->port_dev[i], "Remove qsfpdd port-%d\n", data->port_data[i]->port_id); + device_unregister(data->port_dev[i]); + ida_simple_remove(&cpld_ida, data->port_data[i]->port_id); + kfree(data->port_data[i]); + } + + if (cpld_idr_is_empty(&cpld_ida.idr)) + class_destroy(cpld_class); + + return 0; +} + +module_i2c_driver(cpld_driver); + +MODULE_AUTHOR("Luffy Cheng "); +MODULE_DESCRIPTION("Quanta Switch SFP CPLD driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_platform_ix9.c b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_platform_ix9.c new file mode 100644 index 000000000000..a927e850791f --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/modules/qci_platform_ix9.c @@ -0,0 +1,293 @@ +/* + * Quanta IX9 platform driver + * + * + * Copyright (C) 2019 Quanta Computer inc. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if LINUX_VERSION_CODE > KERNEL_VERSION(3,12,0) +#include +#else +#include +#endif +#define MUX_INFO(bus, deselect) \ + {.adap_id = bus, .deselect_on_exit = deselect} + +static struct pca954x_platform_mode pca9546_1_modes[] = { + MUX_INFO(0x10, 1), + MUX_INFO(0x11, 1), + MUX_INFO(0x12, 1), + MUX_INFO(0x13, 1), +}; + +static struct pca954x_platform_data pca9546_1_data = { + .modes = pca9546_1_modes, + .num_modes = 4, +}; + +static struct pca954x_platform_mode pca9548_1_modes[] = { + MUX_INFO(0x14, 1), + MUX_INFO(0x15, 1), + MUX_INFO(0x16, 1), + MUX_INFO(0x17, 1), +}; + +static struct pca954x_platform_data pca9548_1_data = { + .modes = pca9548_1_modes, + .num_modes = 4, +}; + +static struct pca954x_platform_mode pca9548sfp1_modes[] = { + MUX_INFO(0x20, 1), + MUX_INFO(0x21, 1), + MUX_INFO(0x22, 1), + MUX_INFO(0x23, 1), + MUX_INFO(0x24, 1), + MUX_INFO(0x25, 1), + MUX_INFO(0x26, 1), + MUX_INFO(0x27, 1), +}; + +static struct pca954x_platform_data pca9548sfp1_data = { + .modes = pca9548sfp1_modes, + .num_modes = 8, +}; + +static struct pca954x_platform_mode pca9548sfp2_modes[] = { + MUX_INFO(0x28, 1), + MUX_INFO(0x29, 1), + MUX_INFO(0x2a, 1), + MUX_INFO(0x2b, 1), + MUX_INFO(0x2c, 1), + MUX_INFO(0x2d, 1), + MUX_INFO(0x2e, 1), + MUX_INFO(0x2f, 1), +}; + +static struct pca954x_platform_data pca9548sfp2_data = { + .modes = pca9548sfp2_modes, + .num_modes = 8, +}; + +static struct pca954x_platform_mode pca9548sfp3_modes[] = { + MUX_INFO(0x30, 1), + MUX_INFO(0x31, 1), + MUX_INFO(0x32, 1), + MUX_INFO(0x33, 1), + MUX_INFO(0x34, 1), + MUX_INFO(0x35, 1), + MUX_INFO(0x36, 1), + MUX_INFO(0x37, 1), +}; + +static struct pca954x_platform_data pca9548sfp3_data = { + .modes = pca9548sfp3_modes, + .num_modes = 8, +}; + +static struct pca954x_platform_mode pca9548sfp4_modes[] = { + MUX_INFO(0x38, 1), + MUX_INFO(0x39, 1), + MUX_INFO(0x3a, 1), + MUX_INFO(0x3b, 1), + MUX_INFO(0x3c, 1), + MUX_INFO(0x3d, 1), + MUX_INFO(0x3e, 1), + MUX_INFO(0x3f, 1), +}; + +static struct pca954x_platform_data pca9548sfp4_data = { + .modes = pca9548sfp4_modes, + .num_modes = 8, +}; + +static struct pca953x_platform_data tca9539_1_data = { + .gpio_base = 0x10, +}; +//CPU Linking Board at CPU's I2C Bus +static struct pca953x_platform_data pca9555_CPU_data = { + .gpio_base = 0x20, +}; + +static struct i2c_board_info ix9_i2c_devices[] = { + { + I2C_BOARD_INFO("pca9546", 0x72), + .platform_data = &pca9546_1_data, // 0 pca9546_1 + }, + { + I2C_BOARD_INFO("pca9548", 0x77), + .platform_data = &pca9548_1_data, // 1 pca9548_1 + }, + { + I2C_BOARD_INFO("tca9539", 0x74), + .platform_data = &tca9539_1_data, // 2 Board ID and QSFP-DD PW EN/PG + }, + { + I2C_BOARD_INFO("24c02", 0x54), // 3 MB_BOARDINFO_EEPROM + }, + { + I2C_BOARD_INFO("pca9548", 0x73), + .platform_data = &pca9548sfp1_data, // 4 0x77 ch0 pca9548 #1 + }, + { + I2C_BOARD_INFO("pca9548", 0x73), + .platform_data = &pca9548sfp2_data, // 5 0x77 ch1 pca9548 #2 + }, + { + I2C_BOARD_INFO("pca9548", 0x73), + .platform_data = &pca9548sfp3_data, // 6 0x77 ch2 pca9548 #3 + }, + { + I2C_BOARD_INFO("pca9548", 0x73), + .platform_data = &pca9548sfp4_data, // 7 0x77 ch3 pca9548 #4 + }, + { + I2C_BOARD_INFO("CPLD-QSFPDD", 0x38), // 8 0x72 ch0 CPLD-IO #2, #3 + }, + { + I2C_BOARD_INFO("CPLDLED_IX9", 0x39), // 9 0x72 ch1 CPLD-LED #4, #5 + }, + { + I2C_BOARD_INFO("optoe1", 0x50), // 10 eeprom for loopback module + }, + { + I2C_BOARD_INFO("pca9555", 0x22), // 11 CPU Linking Board at CPU's I2C Bus + .platform_data = &pca9555_CPU_data, + }, +}; + +static struct platform_driver ix9_platform_driver = { + .driver = { + .name = "qci-ix9", + .owner = THIS_MODULE, + }, +}; + +static struct platform_device *ix9_device; + +static int __init ix9_platform_init(void) +{ + struct i2c_client *client; + struct i2c_adapter *adapter; + int ret, i; + + ret = platform_driver_register(&ix9_platform_driver); + if (ret < 0) + return ret; + + /* Register platform stuff */ + ix9_device = platform_device_alloc("qci-ix9", -1); + if (!ix9_device) { + ret = -ENOMEM; + goto fail_platform_driver; + } + + ret = platform_device_add(ix9_device); + if (ret) + goto fail_platform_device; + + adapter = i2c_get_adapter(0); + client = i2c_new_device(adapter, &ix9_i2c_devices[0]); // pca9546_1 - Address: 0x72 + client = i2c_new_device(adapter, &ix9_i2c_devices[1]); // pca9548_1 - Address: 0x77 + client = i2c_new_device(adapter, &ix9_i2c_devices[11]); // CPU Linking Board at CPU's I2C Bus - Address: 0x22 + i2c_put_adapter(adapter); + + adapter = i2c_get_adapter(0x10); + client = i2c_new_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #2 - Address: 0x38 + client = i2c_new_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #4 - Address: 0x39 + i2c_put_adapter(adapter); + + adapter = i2c_get_adapter(0x11); + client = i2c_new_device(adapter, &ix9_i2c_devices[8]); // CPLD-IO #3 - Address: 0x38 + client = i2c_new_device(adapter, &ix9_i2c_devices[9]); // CPLD-LED #5 - Address: 0x39 + i2c_put_adapter(adapter); + + adapter = i2c_get_adapter(0x12); + client = i2c_new_device(adapter, &ix9_i2c_devices[3]); // MB_BOARDINFO_EEPROM - Address: 0x54 + i2c_put_adapter(adapter); + + adapter = i2c_get_adapter(0x13); + client = i2c_new_device(adapter, &ix9_i2c_devices[2]); // tca9539_1 Board ID and QSFP-DD PW EN/PG - Address: 0x74 + i2c_put_adapter(adapter); + + adapter = i2c_get_adapter(0x14); + client = i2c_new_device(adapter, &ix9_i2c_devices[4]); // pca9548 #1 QSFPDD - Address: 0x73 + i2c_put_adapter(adapter); + + adapter = i2c_get_adapter(0x15); + client = i2c_new_device(adapter, &ix9_i2c_devices[5]); // pca9548 #2 QSFPDD - Address: 0x73 + i2c_put_adapter(adapter); + + adapter = i2c_get_adapter(0x16); + client = i2c_new_device(adapter, &ix9_i2c_devices[6]); // pca9548 #3 QSFPDD - Address: 0x73 + i2c_put_adapter(adapter); + + adapter = i2c_get_adapter(0x17); + client = i2c_new_device(adapter, &ix9_i2c_devices[7]); // pca9548 #4 QSFPDD - Address: 0x73 + i2c_put_adapter(adapter); + + for(i = 0x20; i < 0x40; i++) + { + adapter = i2c_get_adapter(i); + client = i2c_new_device(adapter, &ix9_i2c_devices[10]); // eeprom for loopback module - Address: 0x50 + i2c_put_adapter(adapter); + } + + return 0; + +fail_platform_device: + platform_device_put(ix9_device); + +fail_platform_driver: + platform_driver_unregister(&ix9_platform_driver); + return ret; +} + +static void __exit ix9_platform_exit(void) +{ + platform_device_unregister(ix9_device); + platform_driver_unregister(&ix9_platform_driver); +} + +module_init(ix9_platform_init); +module_exit(ix9_platform_exit); + +MODULE_AUTHOR("Jonathan Tsai "); +MODULE_VERSION("1.0"); +MODULE_DESCRIPTION("Quanta IX9 Platform Driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/service/ix9-platform-init.service b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/service/ix9-platform-init.service new file mode 100755 index 000000000000..1f33cc170118 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/service/ix9-platform-init.service @@ -0,0 +1,13 @@ +[Unit] +Description=Quanta IX9-32X Platform initialization service +Before=pmon.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/quanta_ix9_util.py install +ExecStop=/usr/local/bin/quanta_ix9_util.py clean +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/setup.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/setup.py new file mode 100644 index 000000000000..b2f1b39fcd73 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/setup.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python + +import os +import sys +from setuptools import setup +os.listdir + +setup( + name='ix9_32x', + version='1.0', + description='Module to initialize Quanta IX9-32X platforms', + + packages=['ix9_32x'], + package_dir={'ix9_32x': 'ix9-32x/classes'}, +) + diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/utils/quanta_ix9_util.py b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/utils/quanta_ix9_util.py new file mode 100755 index 000000000000..4c31aa8584b8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix9-32x/utils/quanta_ix9_util.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python +# +# Copyright (C) 2018 Quanta Computer Inc. +# +# 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 . + +""" +Usage: %(scriptName)s [options] command object + +options: + -h | --help : this help message + -d | --debug : run with debug mode + -f | --force : ignore error during installation or clean +command: + install : install drivers and generate related sysfs nodes + clean : uninstall drivers and remove related sysfs nodes +""" + +import os +import commands +import sys, getopt +import logging +import re +import time +from collections import namedtuple + +DEBUG = False +args = [] +FORCE = 0 +i2c_prefix = '/sys/bus/i2c/devices/' + + +if DEBUG == True: + print sys.argv[0] + print 'ARGV :', sys.argv[1:] + + +def main(): + global DEBUG + global args + global FORCE + + if len(sys.argv)<2: + show_help() + + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', + 'debug', + 'force', + ]) + if DEBUG == True: + print options + print args + print len(sys.argv) + + for opt, arg in options: + if opt in ('-h', '--help'): + show_help() + elif opt in ('-d', '--debug'): + DEBUG = True + logging.basicConfig(level=logging.INFO) + elif opt in ('-f', '--force'): + FORCE = 1 + else: + logging.info('no option') + for arg in args: + if arg == 'install': + install() + elif arg == 'clean': + uninstall() + else: + show_help() + + return 0 + +def show_help(): + print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + sys.exit(0) + +def show_log(txt): + if DEBUG == True: + print "[IX9-32X]"+txt + return + +def exec_cmd(cmd, show): + logging.info('Run :'+cmd) + status, output = commands.getstatusoutput(cmd) + show_log (cmd +"with result:" + str(status)) + show_log (" output:"+output) + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + +instantiate =[ +#turn on module power +'echo 21 > /sys/class/gpio/export', +'echo out > /sys/class/gpio/gpio21/direction', +'echo 1 >/sys/class/gpio/gpio21/value', +#Reset fron-ports LED CPLD +'echo 33 > /sys/class/gpio/export', +'echo out > /sys/class/gpio/gpio33/direction', +'echo 0 >/sys/class/gpio/gpio33/value', +'echo 1 >/sys/class/gpio/gpio33/value', +#Enable front-ports LED decoding +'echo 1 > /sys/class/cpld-led/CPLDLED-1/led_decode', +'echo 1 > /sys/class/cpld-led/CPLDLED-2/led_decode', +#Update System LED +'echo 39 > /sys/class/gpio/export', +'echo out > /sys/class/gpio/gpio39/direction', +'echo 0 > /sys/class/gpio/gpio39/value', +'echo 40 > /sys/class/gpio/export', +'echo out > /sys/class/gpio/gpio40/direction', +'echo 1 > /sys/class/gpio/gpio40/value', +] + +drivers =[ +'lpc_ich', +'i2c-i801', +'i2c-dev', +'i2c-mux-pca954x', +'gpio-pca953x', +'qci_cpld_qsfpdd', +'qci_cpld_led', +'qci_platform_ix9', +'ipmi_devintf' +] + + + +def system_install(): + global FORCE + + #remove default drivers to avoid modprobe order conflicts + status, output = exec_cmd("rmmod i2c_ismt ", 1) + status, output = exec_cmd("rmmod i2c-i801 ", 1) + #setup driver dependency + status, output = exec_cmd("depmod -a ", 1) + #install drivers + for i in range(0,len(drivers)): + status, output = exec_cmd("modprobe "+drivers[i], 1) + if status: + print output + if FORCE == 0: + return status + + #remove net rules for generating new net rules + status, output = exec_cmd("systemctl stop systemd-udevd.service ", 1) + status, output = exec_cmd("rm /etc/udev/rules.d/70-persistent-net.rules ", 1) + status, output = exec_cmd("rmmod ixgbe ", 1) + status, output = exec_cmd("rmmod igb ", 1) + status, output = exec_cmd("modprobe igb ", 1) + status, output = exec_cmd("modprobe ixgbe ", 1) + status, output = exec_cmd("systemctl start systemd-udevd.service ", 1) + + #instantiate devices + for i in range(0,len(instantiate)): + status, output = exec_cmd(instantiate[i], 1) + if status: + print output + if FORCE == 0: + return status + + #QSFPDD for 1~32 port + for port_number in range(1,33): + bus_number = port_number + 31 + os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number)) + + return + +def system_ready(): + if not device_found(): + return False + return True + +def install(): + if not device_found(): + print "No device, installing...." + status = system_install() + if status: + if FORCE == 0: + return status + else: + print " ix9 driver already installed...." + return + +def uninstall(): + global FORCE + #uninstall drivers + for i in range(len(drivers)-1,-1,-1): + status, output = exec_cmd("rmmod "+drivers[i], 1) + if status: + print output + if FORCE == 0: + return status + return + +def device_found(): + ret1, log = exec_cmd("ls "+i2c_prefix+"i2c-0", 0) + return ret1 + +if __name__ == "__main__": + main() + + + diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 7e9adc1df318..6e5a066fff65 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -153,3 +153,8 @@ ifp_inports_support_enable port_flex_enable pdma_descriptor_prefetch_enable pktdma_poll_mode_channel_bitmap +ccm_dma_enable +ccmdma_intr_enable +phy_enable +init_all_modules +port_fec From d7096e8176c25c891eaa0a2a50f5d551165bcda5 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Thu, 15 Aug 2019 00:45:54 -0700 Subject: [PATCH 18/54] [control plane assistant] stop control plane assistant after warm reboot (#3337) Delay saving configuration so that the control assistant configurations won't be persisted. Signed-off-by: Ying Xie --- .../warmboot-finalizer/finalize-warmboot.sh | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/files/image_config/warmboot-finalizer/finalize-warmboot.sh b/files/image_config/warmboot-finalizer/finalize-warmboot.sh index 00e4e1b7f3f9..32c9c8444cc3 100755 --- a/files/image_config/warmboot-finalizer/finalize-warmboot.sh +++ b/files/image_config/warmboot-finalizer/finalize-warmboot.sh @@ -68,6 +68,14 @@ function finalize_warm_boot() sudo config warm_restart disable } +function stop_control_plane_assistant() +{ + if [[ -x ${ASSISTANT_SCRIPT} ]]; then + debug "Tearing down control plane assistant ..." + ${ASSISTANT_SCRIPT} -m reset + fi +} + wait_for_database_service @@ -78,11 +86,6 @@ if [[ x"${WARM_BOOT}" != x"true" ]]; then exit 0 fi -# No need to wait for the reconciliation process. Database has been loaded -# and migrated. This is good enough to save a copy. -debug "Save in-memory database after warm reboot ..." -config save -y - list=${COMP_LIST} # Wait up to 5 minutes @@ -94,6 +97,12 @@ for i in `seq 60`; do sleep 5 done +stop_control_plane_assistant + +# Save DB after stopped control plane assistant to avoid extra entries +debug "Save in-memory database after warm reboot ..." +config save -y + if [[ -n "${list}" ]]; then debug "Some components didn't finish reconcile: ${list} ..." fi From 635ddce4ab2f4a7467fcff2dc1450470c517f666 Mon Sep 17 00:00:00 2001 From: Jonathan Tsai Date: Thu, 15 Aug 2019 15:46:34 +0800 Subject: [PATCH 19/54] [Quanta][IX7,IX8,IX8C] Correct port index (#3327) Verified with index from 1 Signed-off-by: Jonathan Tsai --- .../Quanta-IX7-32X/port_config.ini | 64 +++---- .../plugins/sfputil.py | 97 +++++----- .../Quanta-IX8-56X/port_config.ini | 112 ++++++------ .../plugins/sfputil.py | 166 ++++++++++-------- .../Quanta-IX8C-56X/port_config.ini | 112 ++++++------ .../plugins/sfputil.py | 166 ++++++++++-------- 6 files changed, 371 insertions(+), 346 deletions(-) diff --git a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/port_config.ini b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/port_config.ini index 42b75f2175b3..14f4716d9091 100644 --- a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/port_config.ini +++ b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/Quanta-IX7-32X/port_config.ini @@ -1,33 +1,33 @@ # name lanes alias index speed -Ethernet0 29,30,31,32 hundredGigE1 0 100000 -Ethernet4 33,34,35,36 hundredGigE2 1 100000 -Ethernet8 41,42,43,44 hundredGigE3 2 100000 -Ethernet12 45,46,47,48 hundredGigE4 3 100000 -Ethernet16 1,2,3,4 hundredGigE5 4 100000 -Ethernet20 5,6,7,8 hundredGigE6 5 100000 -Ethernet24 9,10,11,12 hundredGigE7 6 100000 -Ethernet28 13,14,15,16 hundredGigE8 7 100000 -Ethernet32 17,18,19,20 hundredGigE9 8 100000 -Ethernet36 21,22,23,24 hundredGigE10 9 100000 -Ethernet40 25,26,27,28 hundredGigE11 10 100000 -Ethernet44 37,38,39,40 hundredGigE12 11 100000 -Ethernet48 49,50,51,52 hundredGigE13 12 100000 -Ethernet52 53,54,55,56 hundredGigE14 13 100000 -Ethernet56 57,58,59,60 hundredGigE15 14 100000 -Ethernet60 61,62,63,64 hundredGigE16 15 100000 -Ethernet64 65,66,67,68 hundredGigE17 16 100000 -Ethernet68 69,70,71,72 hundredGigE18 17 100000 -Ethernet72 73,74,75,76 hundredGigE19 18 100000 -Ethernet76 77,78,79,80 hundredGigE20 19 100000 -Ethernet80 93,94,95,96 hundredGigE21 20 100000 -Ethernet84 101,102,103,104 hundredGigE22 21 100000 -Ethernet88 105,106,107,108 hundredGigE23 22 100000 -Ethernet92 109,110,111,112 hundredGigE24 23 100000 -Ethernet96 113,114,115,116 hundredGigE25 24 100000 -Ethernet100 117,118,119,120 hundredGigE26 25 100000 -Ethernet104 121,122,123,124 hundredGigE27 26 100000 -Ethernet108 125,126,127,128 hundredGigE28 27 100000 -Ethernet112 81,82,83,84 hundredGigE29 28 100000 -Ethernet116 85,86,87,88 hundredGigE30 29 100000 -Ethernet120 89,90,91,92 hundredGigE31 30 100000 -Ethernet124 97,98,99,100 hundredGigE32 31 100000 +Ethernet0 29,30,31,32 hundredGigE1 1 100000 +Ethernet4 33,34,35,36 hundredGigE2 2 100000 +Ethernet8 41,42,43,44 hundredGigE3 3 100000 +Ethernet12 45,46,47,48 hundredGigE4 4 100000 +Ethernet16 1,2,3,4 hundredGigE5 5 100000 +Ethernet20 5,6,7,8 hundredGigE6 6 100000 +Ethernet24 9,10,11,12 hundredGigE7 7 100000 +Ethernet28 13,14,15,16 hundredGigE8 8 100000 +Ethernet32 17,18,19,20 hundredGigE9 9 100000 +Ethernet36 21,22,23,24 hundredGigE10 10 100000 +Ethernet40 25,26,27,28 hundredGigE11 11 100000 +Ethernet44 37,38,39,40 hundredGigE12 12 100000 +Ethernet48 49,50,51,52 hundredGigE13 13 100000 +Ethernet52 53,54,55,56 hundredGigE14 14 100000 +Ethernet56 57,58,59,60 hundredGigE15 15 100000 +Ethernet60 61,62,63,64 hundredGigE16 16 100000 +Ethernet64 65,66,67,68 hundredGigE17 17 100000 +Ethernet68 69,70,71,72 hundredGigE18 18 100000 +Ethernet72 73,74,75,76 hundredGigE19 19 100000 +Ethernet76 77,78,79,80 hundredGigE20 20 100000 +Ethernet80 93,94,95,96 hundredGigE21 21 100000 +Ethernet84 101,102,103,104 hundredGigE22 22 100000 +Ethernet88 105,106,107,108 hundredGigE23 23 100000 +Ethernet92 109,110,111,112 hundredGigE24 24 100000 +Ethernet96 113,114,115,116 hundredGigE25 25 100000 +Ethernet100 117,118,119,120 hundredGigE26 26 100000 +Ethernet104 121,122,123,124 hundredGigE27 27 100000 +Ethernet108 125,126,127,128 hundredGigE28 28 100000 +Ethernet112 81,82,83,84 hundredGigE29 29 100000 +Ethernet116 85,86,87,88 hundredGigE30 30 100000 +Ethernet120 89,90,91,92 hundredGigE31 31 100000 +Ethernet124 97,98,99,100 hundredGigE32 32 100000 diff --git a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/plugins/sfputil.py b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/plugins/sfputil.py index 09ce8928b8e9..85a4aad26dae 100644 --- a/device/quanta/x86_64-quanta_ix7_rglbmc-r0/plugins/sfputil.py +++ b/device/quanta/x86_64-quanta_ix7_rglbmc-r0/plugins/sfputil.py @@ -1,53 +1,58 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: import time - from sonic_sfp.sfputilbase import SfpUtilBase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import string + from ctypes import create_string_buffer + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) class SfpUtil(SfpUtilBase): - """Platform specific SfpUtill class""" + """Platform-specific SfpUtil class""" - PORT_START = 0 - PORT_END = 31 + PORT_START = 1 + PORT_END = 32 PORTS_IN_BLOCK = 32 _port_to_eeprom_mapping = {} _port_to_i2c_mapping = { - 0 : 32, - 1 : 33, - 2 : 34, - 3 : 35, - 4 : 36, - 5 : 37, - 6 : 38, - 7 : 39, - 8 : 40, - 9 : 41, - 10 : 42, - 11 : 43, - 12 : 44, - 13 : 45, - 14 : 46, - 15 : 47, - 16 : 48, - 17 : 49, - 18 : 50, - 19 : 51, - 20 : 52, - 21 : 53, - 22 : 54, - 23 : 55, - 24 : 56, - 25 : 57, - 26 : 58, - 27 : 59, - 28 : 60, - 29 : 61, - 30 : 62, - 31 : 63, + 1 : 32, + 2 : 33, + 3 : 34, + 4 : 35, + 5 : 36, + 6 : 37, + 7 : 38, + 8 : 39, + 9 : 40, + 10 : 41, + 11 : 42, + 12 : 43, + 13 : 44, + 14 : 45, + 15 : 46, + 16 : 47, + 17 : 48, + 18 : 49, + 19 : 50, + 20 : 51, + 21 : 52, + 22 : 53, + 23 : 54, + 24 : 55, + 25 : 56, + 26 : 57, + 27 : 58, + 28 : 59, + 29 : 60, + 30 : 61, + 31 : 62, + 32 : 63, } @property @@ -68,17 +73,17 @@ def port_to_eeprom_mapping(self): def __init__(self): eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' - for x in range(0, self.port_end+1): + for x in range(self.port_start, self.port_end+1): self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x]) SfpUtilBase.__init__(self) def get_presence(self, port_num): # Check for invalid port_num - if port_num < self.PORT_START or port_num > self.PORT_END: + if port_num < self.port_start or port_num > self.port_end: return False try: - reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/module_present") + reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num)+"/module_present") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -95,7 +100,7 @@ def get_low_power_mode(self, port_num): return False try: - reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/lpmode") + reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num)+"/lpmode") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -113,7 +118,7 @@ def set_low_power_mode(self, port_num, lpmode): return False try: - reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/lpmode", "r+") + reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num)+"/lpmode", "r+") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -137,7 +142,7 @@ def reset(self, port_num): return False try: - reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/reset", "r+") + reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num)+"/reset", "r+") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -151,7 +156,7 @@ def reset(self, port_num): # Flip the value back write back to the register to take port out of reset try: - reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num+1)+"/reset", "r+") + reg_file = open("/sys/class/cpld-qsfp28/port-"+str(port_num)+"/reset", "r+") except IOError as e: print "Error: unable to open file: %s" % str(e) return False diff --git a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/port_config.ini b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/port_config.ini index 1b33f50c92dd..c9dd2fb999f9 100644 --- a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/port_config.ini +++ b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/Quanta-IX8-56X/port_config.ini @@ -1,57 +1,57 @@ # name lanes alias index speed -Ethernet0 60 twentyfiveGigE1 0 25000 -Ethernet1 59 twentyfiveGigE2 1 25000 -Ethernet2 58 twentyfiveGigE3 2 25000 -Ethernet3 57 twentyfiveGigE4 3 25000 -Ethernet4 64 twentyfiveGigE5 4 25000 -Ethernet5 63 twentyfiveGigE6 5 25000 -Ethernet6 62 twentyfiveGigE7 6 25000 -Ethernet7 61 twentyfiveGigE8 7 25000 -Ethernet8 49 twentyfiveGigE9 8 25000 -Ethernet9 50 twentyfiveGigE10 9 25000 -Ethernet10 51 twentyfiveGigE11 10 25000 -Ethernet11 52 twentyfiveGigE12 11 25000 -Ethernet12 4 twentyfiveGigE13 12 25000 -Ethernet13 3 twentyfiveGigE14 13 25000 -Ethernet14 2 twentyfiveGigE15 14 25000 -Ethernet15 1 twentyfiveGigE16 15 25000 -Ethernet16 8 twentyfiveGigE17 16 25000 -Ethernet17 7 twentyfiveGigE18 17 25000 -Ethernet18 6 twentyfiveGigE19 18 25000 -Ethernet19 5 twentyfiveGigE20 19 25000 -Ethernet20 16 twentyfiveGigE21 20 25000 -Ethernet21 15 twentyfiveGigE22 21 25000 -Ethernet22 14 twentyfiveGigE23 22 25000 -Ethernet23 13 twentyfiveGigE24 23 25000 -Ethernet24 24 twentyfiveGigE25 24 25000 -Ethernet25 23 twentyfiveGigE26 25 25000 -Ethernet26 22 twentyfiveGigE27 26 25000 -Ethernet27 21 twentyfiveGigE28 27 25000 -Ethernet28 32 twentyfiveGigE29 28 25000 -Ethernet29 31 twentyfiveGigE30 29 25000 -Ethernet30 30 twentyfiveGigE31 30 25000 -Ethernet31 29 twentyfiveGigE32 31 25000 -Ethernet32 36 twentyfiveGigE33 32 25000 -Ethernet33 35 twentyfiveGigE34 33 25000 -Ethernet34 34 twentyfiveGigE35 34 25000 -Ethernet35 33 twentyfiveGigE36 35 25000 -Ethernet36 44 twentyfiveGigE37 36 25000 -Ethernet37 43 twentyfiveGigE38 37 25000 -Ethernet38 42 twentyfiveGigE39 38 25000 -Ethernet39 41 twentyfiveGigE40 39 25000 -Ethernet40 86 twentyfiveGigE41 40 25000 -Ethernet41 85 twentyfiveGigE42 41 25000 -Ethernet42 88 twentyfiveGigE43 42 25000 -Ethernet43 87 twentyfiveGigE44 43 25000 -Ethernet44 94 twentyfiveGigE45 44 25000 -Ethernet45 93 twentyfiveGigE46 45 25000 -Ethernet46 96 twentyfiveGigE47 46 25000 -Ethernet47 95 twentyfiveGigE48 47 25000 -Ethernet48 97,98,99,100 hundredGigE49 48 100000 -Ethernet52 105,106,107,108 hundredGigE50 49 100000 -Ethernet56 113,114,115,116 hundredGigE51 50 100000 -Ethernet60 121,122,123,124 hundredGigE52 51 100000 -Ethernet64 77,78,79,80 hundredGigE53 52 100000 -Ethernet68 65,66,67,68 hundredGigE54 53 100000 -Ethernet72 69,70,71,72 hundredGigE55 54 100000 -Ethernet76 125,126,127,128 hundredGigE56 55 100000 +Ethernet0 60 twentyfiveGigE1 1 25000 +Ethernet1 59 twentyfiveGigE2 2 25000 +Ethernet2 58 twentyfiveGigE3 3 25000 +Ethernet3 57 twentyfiveGigE4 4 25000 +Ethernet4 64 twentyfiveGigE5 5 25000 +Ethernet5 63 twentyfiveGigE6 6 25000 +Ethernet6 62 twentyfiveGigE7 7 25000 +Ethernet7 61 twentyfiveGigE8 8 25000 +Ethernet8 49 twentyfiveGigE9 9 25000 +Ethernet9 50 twentyfiveGigE10 10 25000 +Ethernet10 51 twentyfiveGigE11 11 25000 +Ethernet11 52 twentyfiveGigE12 12 25000 +Ethernet12 4 twentyfiveGigE13 13 25000 +Ethernet13 3 twentyfiveGigE14 14 25000 +Ethernet14 2 twentyfiveGigE15 15 25000 +Ethernet15 1 twentyfiveGigE16 16 25000 +Ethernet16 8 twentyfiveGigE17 17 25000 +Ethernet17 7 twentyfiveGigE18 18 25000 +Ethernet18 6 twentyfiveGigE19 19 25000 +Ethernet19 5 twentyfiveGigE20 20 25000 +Ethernet20 16 twentyfiveGigE21 21 25000 +Ethernet21 15 twentyfiveGigE22 22 25000 +Ethernet22 14 twentyfiveGigE23 23 25000 +Ethernet23 13 twentyfiveGigE24 24 25000 +Ethernet24 24 twentyfiveGigE25 25 25000 +Ethernet25 23 twentyfiveGigE26 26 25000 +Ethernet26 22 twentyfiveGigE27 27 25000 +Ethernet27 21 twentyfiveGigE28 28 25000 +Ethernet28 32 twentyfiveGigE29 29 25000 +Ethernet29 31 twentyfiveGigE30 30 25000 +Ethernet30 30 twentyfiveGigE31 31 25000 +Ethernet31 29 twentyfiveGigE32 32 25000 +Ethernet32 36 twentyfiveGigE33 33 25000 +Ethernet33 35 twentyfiveGigE34 34 25000 +Ethernet34 34 twentyfiveGigE35 35 25000 +Ethernet35 33 twentyfiveGigE36 36 25000 +Ethernet36 44 twentyfiveGigE37 37 25000 +Ethernet37 43 twentyfiveGigE38 38 25000 +Ethernet38 42 twentyfiveGigE39 39 25000 +Ethernet39 41 twentyfiveGigE40 40 25000 +Ethernet40 86 twentyfiveGigE41 41 25000 +Ethernet41 85 twentyfiveGigE42 42 25000 +Ethernet42 88 twentyfiveGigE43 43 25000 +Ethernet43 87 twentyfiveGigE44 44 25000 +Ethernet44 94 twentyfiveGigE45 45 25000 +Ethernet45 93 twentyfiveGigE46 46 25000 +Ethernet46 96 twentyfiveGigE47 47 25000 +Ethernet47 95 twentyfiveGigE48 48 25000 +Ethernet48 97,98,99,100 hundredGigE49 49 100000 +Ethernet52 105,106,107,108 hundredGigE50 50 100000 +Ethernet56 113,114,115,116 hundredGigE51 51 100000 +Ethernet60 121,122,123,124 hundredGigE52 52 100000 +Ethernet64 77,78,79,80 hundredGigE53 53 100000 +Ethernet68 65,66,67,68 hundredGigE54 54 100000 +Ethernet72 69,70,71,72 hundredGigE55 55 100000 +Ethernet76 125,126,127,128 hundredGigE56 56 100000 diff --git a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/plugins/sfputil.py b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/plugins/sfputil.py index 205ed3c82d0d..627c99fee0c9 100644 --- a/device/quanta/x86_64-quanta_ix8_rglbmc-r0/plugins/sfputil.py +++ b/device/quanta/x86_64-quanta_ix8_rglbmc-r0/plugins/sfputil.py @@ -1,91 +1,101 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: import time - from sonic_sfp.sfputilbase import SfpUtilBase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import string + from ctypes import create_string_buffer + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) class SfpUtil(SfpUtilBase): - """Platform specific SfpUtill class""" + """Platform-specific SfpUtil class""" - PORT_START = 0 - PORT_END = 55 - QSFP_PORT_START = 48 + PORT_START = 1 + PORT_END = 56 PORTS_IN_BLOCK = 56 + QSFP_PORT_START = 49 + QSFP_PORT_END = 56 _port_to_eeprom_mapping = {} _port_to_i2c_mapping = { - 0 : 32, - 1 : 33, - 2 : 34, - 3 : 35, - 4 : 36, - 5 : 37, - 6 : 38, - 7 : 39, - 8 : 40, - 9 : 41, - 10 : 42, - 11 : 43, - 12 : 44, - 13 : 45, - 14 : 46, - 15 : 47, - 16 : 48, - 17 : 49, - 18 : 50, - 19 : 51, - 20 : 52, - 21 : 53, - 22 : 54, - 23 : 55, - 24 : 56, - 25 : 57, - 26 : 58, - 27 : 59, - 28 : 60, - 29 : 61, - 30 : 62, - 31 : 63, - 32 : 64, - 33 : 65, - 34 : 66, - 35 : 67, - 36 : 68, - 37 : 69, - 38 : 70, - 39 : 71, - 40 : 72, - 41 : 73, - 42 : 74, - 43 : 75, - 44 : 76, - 45 : 77, - 46 : 78, - 47 : 79, - 48 : 80,#QSFP49 - 49 : 81,#QSFP50 - 50 : 82,#QSFP51 - 51 : 83,#QSFP52 - 52 : 84,#QSFP53 - 53 : 85,#QSFP54 - 54 : 86,#QSFP55 - 55 : 87,#QSFP56 + 1 : 32, + 2 : 33, + 3 : 34, + 4 : 35, + 5 : 36, + 6 : 37, + 7 : 38, + 8 : 39, + 9 : 40, + 10 : 41, + 11 : 42, + 12 : 43, + 13 : 44, + 14 : 45, + 15 : 46, + 16 : 47, + 17 : 48, + 18 : 49, + 19 : 50, + 20 : 51, + 21 : 52, + 22 : 53, + 23 : 54, + 24 : 55, + 25 : 56, + 26 : 57, + 27 : 58, + 28 : 59, + 29 : 60, + 30 : 61, + 31 : 62, + 32 : 63, + 33 : 64, + 34 : 65, + 35 : 66, + 36 : 67, + 37 : 68, + 38 : 69, + 39 : 70, + 40 : 71, + 41 : 72, + 42 : 73, + 43 : 74, + 44 : 75, + 45 : 76, + 46 : 77, + 47 : 78, + 48 : 79, + 49 : 80,#QSFP49 + 50 : 81,#QSFP50 + 51 : 82,#QSFP51 + 52 : 83,#QSFP52 + 53 : 84,#QSFP53 + 54 : 85,#QSFP54 + 55 : 86,#QSFP55 + 56 : 87,#QSFP56 } @property def port_start(self): return self.PORT_START + @property + def port_end(self): + return self.PORT_END + @property def qsfp_port_start(self): return self.QSFP_PORT_START @property - def port_end(self): - return self.PORT_END + def qsfp_port_end(self): + return self.QSFP_PORT_END @property def qsfp_ports(self): @@ -97,26 +107,26 @@ def port_to_eeprom_mapping(self): def __init__(self): eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' - for x in range(0, self.port_end+1): + for x in range(self.port_start, self.port_end+1): self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x]) SfpUtilBase.__init__(self) def get_presence(self, port_num): # Check for invalid port_num - if port_num < self.PORT_START or port_num > self.PORT_END: + if port_num < self.port_start or port_num > self.port_end: return False try: - if port_num < 48: - reg_file = open("/sys/class/cpld-sfp28/port-"+str(port_num+1)+"/pre_n") + if port_num < self.qsfp_port_start: + reg_file = open("/sys/class/cpld-sfp28/port-"+str(port_num)+"/pre_n") else: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+34)+"/value") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+34)+"/value") except IOError as e: print "Error: unable to open file: %s" % str(e) return False reg_value = reg_file.readline().rstrip() - if port_num < 48: + if port_num < self.qsfp_port_start: if reg_value == '1': return True else: @@ -127,11 +137,11 @@ def get_presence(self, port_num): def get_low_power_mode(self, port_num): # Check for invalid port_num - if port_num < self.qsfp_port_start or port_num > self.port_end: + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: return False try: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+35)+"/value") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+35)+"/value") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -145,11 +155,11 @@ def get_low_power_mode(self, port_num): def set_low_power_mode(self, port_num, lpmode): # Check for invalid port_num - if port_num < self.qsfp_port_start or port_num > self.port_end: + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: return False try: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+35)+"/value", "r+") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+35)+"/value", "r+") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -173,7 +183,7 @@ def reset(self, port_num): return False try: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+32)+"/value", "r+") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+32)+"/value", "r+") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -187,7 +197,7 @@ def reset(self, port_num): # Flip the value back write back to the register to take port out of reset try: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+32)+"/value", "r+") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+32)+"/value", "r+") except IOError as e: print "Error: unable to open file: %s" % str(e) return False diff --git a/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/port_config.ini b/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/port_config.ini index 1b33f50c92dd..c9dd2fb999f9 100644 --- a/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/port_config.ini +++ b/device/quanta/x86_64-quanta_ix8c_bwde-r0/Quanta-IX8C-56X/port_config.ini @@ -1,57 +1,57 @@ # name lanes alias index speed -Ethernet0 60 twentyfiveGigE1 0 25000 -Ethernet1 59 twentyfiveGigE2 1 25000 -Ethernet2 58 twentyfiveGigE3 2 25000 -Ethernet3 57 twentyfiveGigE4 3 25000 -Ethernet4 64 twentyfiveGigE5 4 25000 -Ethernet5 63 twentyfiveGigE6 5 25000 -Ethernet6 62 twentyfiveGigE7 6 25000 -Ethernet7 61 twentyfiveGigE8 7 25000 -Ethernet8 49 twentyfiveGigE9 8 25000 -Ethernet9 50 twentyfiveGigE10 9 25000 -Ethernet10 51 twentyfiveGigE11 10 25000 -Ethernet11 52 twentyfiveGigE12 11 25000 -Ethernet12 4 twentyfiveGigE13 12 25000 -Ethernet13 3 twentyfiveGigE14 13 25000 -Ethernet14 2 twentyfiveGigE15 14 25000 -Ethernet15 1 twentyfiveGigE16 15 25000 -Ethernet16 8 twentyfiveGigE17 16 25000 -Ethernet17 7 twentyfiveGigE18 17 25000 -Ethernet18 6 twentyfiveGigE19 18 25000 -Ethernet19 5 twentyfiveGigE20 19 25000 -Ethernet20 16 twentyfiveGigE21 20 25000 -Ethernet21 15 twentyfiveGigE22 21 25000 -Ethernet22 14 twentyfiveGigE23 22 25000 -Ethernet23 13 twentyfiveGigE24 23 25000 -Ethernet24 24 twentyfiveGigE25 24 25000 -Ethernet25 23 twentyfiveGigE26 25 25000 -Ethernet26 22 twentyfiveGigE27 26 25000 -Ethernet27 21 twentyfiveGigE28 27 25000 -Ethernet28 32 twentyfiveGigE29 28 25000 -Ethernet29 31 twentyfiveGigE30 29 25000 -Ethernet30 30 twentyfiveGigE31 30 25000 -Ethernet31 29 twentyfiveGigE32 31 25000 -Ethernet32 36 twentyfiveGigE33 32 25000 -Ethernet33 35 twentyfiveGigE34 33 25000 -Ethernet34 34 twentyfiveGigE35 34 25000 -Ethernet35 33 twentyfiveGigE36 35 25000 -Ethernet36 44 twentyfiveGigE37 36 25000 -Ethernet37 43 twentyfiveGigE38 37 25000 -Ethernet38 42 twentyfiveGigE39 38 25000 -Ethernet39 41 twentyfiveGigE40 39 25000 -Ethernet40 86 twentyfiveGigE41 40 25000 -Ethernet41 85 twentyfiveGigE42 41 25000 -Ethernet42 88 twentyfiveGigE43 42 25000 -Ethernet43 87 twentyfiveGigE44 43 25000 -Ethernet44 94 twentyfiveGigE45 44 25000 -Ethernet45 93 twentyfiveGigE46 45 25000 -Ethernet46 96 twentyfiveGigE47 46 25000 -Ethernet47 95 twentyfiveGigE48 47 25000 -Ethernet48 97,98,99,100 hundredGigE49 48 100000 -Ethernet52 105,106,107,108 hundredGigE50 49 100000 -Ethernet56 113,114,115,116 hundredGigE51 50 100000 -Ethernet60 121,122,123,124 hundredGigE52 51 100000 -Ethernet64 77,78,79,80 hundredGigE53 52 100000 -Ethernet68 65,66,67,68 hundredGigE54 53 100000 -Ethernet72 69,70,71,72 hundredGigE55 54 100000 -Ethernet76 125,126,127,128 hundredGigE56 55 100000 +Ethernet0 60 twentyfiveGigE1 1 25000 +Ethernet1 59 twentyfiveGigE2 2 25000 +Ethernet2 58 twentyfiveGigE3 3 25000 +Ethernet3 57 twentyfiveGigE4 4 25000 +Ethernet4 64 twentyfiveGigE5 5 25000 +Ethernet5 63 twentyfiveGigE6 6 25000 +Ethernet6 62 twentyfiveGigE7 7 25000 +Ethernet7 61 twentyfiveGigE8 8 25000 +Ethernet8 49 twentyfiveGigE9 9 25000 +Ethernet9 50 twentyfiveGigE10 10 25000 +Ethernet10 51 twentyfiveGigE11 11 25000 +Ethernet11 52 twentyfiveGigE12 12 25000 +Ethernet12 4 twentyfiveGigE13 13 25000 +Ethernet13 3 twentyfiveGigE14 14 25000 +Ethernet14 2 twentyfiveGigE15 15 25000 +Ethernet15 1 twentyfiveGigE16 16 25000 +Ethernet16 8 twentyfiveGigE17 17 25000 +Ethernet17 7 twentyfiveGigE18 18 25000 +Ethernet18 6 twentyfiveGigE19 19 25000 +Ethernet19 5 twentyfiveGigE20 20 25000 +Ethernet20 16 twentyfiveGigE21 21 25000 +Ethernet21 15 twentyfiveGigE22 22 25000 +Ethernet22 14 twentyfiveGigE23 23 25000 +Ethernet23 13 twentyfiveGigE24 24 25000 +Ethernet24 24 twentyfiveGigE25 25 25000 +Ethernet25 23 twentyfiveGigE26 26 25000 +Ethernet26 22 twentyfiveGigE27 27 25000 +Ethernet27 21 twentyfiveGigE28 28 25000 +Ethernet28 32 twentyfiveGigE29 29 25000 +Ethernet29 31 twentyfiveGigE30 30 25000 +Ethernet30 30 twentyfiveGigE31 31 25000 +Ethernet31 29 twentyfiveGigE32 32 25000 +Ethernet32 36 twentyfiveGigE33 33 25000 +Ethernet33 35 twentyfiveGigE34 34 25000 +Ethernet34 34 twentyfiveGigE35 35 25000 +Ethernet35 33 twentyfiveGigE36 36 25000 +Ethernet36 44 twentyfiveGigE37 37 25000 +Ethernet37 43 twentyfiveGigE38 38 25000 +Ethernet38 42 twentyfiveGigE39 39 25000 +Ethernet39 41 twentyfiveGigE40 40 25000 +Ethernet40 86 twentyfiveGigE41 41 25000 +Ethernet41 85 twentyfiveGigE42 42 25000 +Ethernet42 88 twentyfiveGigE43 43 25000 +Ethernet43 87 twentyfiveGigE44 44 25000 +Ethernet44 94 twentyfiveGigE45 45 25000 +Ethernet45 93 twentyfiveGigE46 46 25000 +Ethernet46 96 twentyfiveGigE47 47 25000 +Ethernet47 95 twentyfiveGigE48 48 25000 +Ethernet48 97,98,99,100 hundredGigE49 49 100000 +Ethernet52 105,106,107,108 hundredGigE50 50 100000 +Ethernet56 113,114,115,116 hundredGigE51 51 100000 +Ethernet60 121,122,123,124 hundredGigE52 52 100000 +Ethernet64 77,78,79,80 hundredGigE53 53 100000 +Ethernet68 65,66,67,68 hundredGigE54 54 100000 +Ethernet72 69,70,71,72 hundredGigE55 55 100000 +Ethernet76 125,126,127,128 hundredGigE56 56 100000 diff --git a/device/quanta/x86_64-quanta_ix8c_bwde-r0/plugins/sfputil.py b/device/quanta/x86_64-quanta_ix8c_bwde-r0/plugins/sfputil.py index 205ed3c82d0d..627c99fee0c9 100644 --- a/device/quanta/x86_64-quanta_ix8c_bwde-r0/plugins/sfputil.py +++ b/device/quanta/x86_64-quanta_ix8c_bwde-r0/plugins/sfputil.py @@ -1,91 +1,101 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: import time - from sonic_sfp.sfputilbase import SfpUtilBase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + import string + from ctypes import create_string_buffer + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) class SfpUtil(SfpUtilBase): - """Platform specific SfpUtill class""" + """Platform-specific SfpUtil class""" - PORT_START = 0 - PORT_END = 55 - QSFP_PORT_START = 48 + PORT_START = 1 + PORT_END = 56 PORTS_IN_BLOCK = 56 + QSFP_PORT_START = 49 + QSFP_PORT_END = 56 _port_to_eeprom_mapping = {} _port_to_i2c_mapping = { - 0 : 32, - 1 : 33, - 2 : 34, - 3 : 35, - 4 : 36, - 5 : 37, - 6 : 38, - 7 : 39, - 8 : 40, - 9 : 41, - 10 : 42, - 11 : 43, - 12 : 44, - 13 : 45, - 14 : 46, - 15 : 47, - 16 : 48, - 17 : 49, - 18 : 50, - 19 : 51, - 20 : 52, - 21 : 53, - 22 : 54, - 23 : 55, - 24 : 56, - 25 : 57, - 26 : 58, - 27 : 59, - 28 : 60, - 29 : 61, - 30 : 62, - 31 : 63, - 32 : 64, - 33 : 65, - 34 : 66, - 35 : 67, - 36 : 68, - 37 : 69, - 38 : 70, - 39 : 71, - 40 : 72, - 41 : 73, - 42 : 74, - 43 : 75, - 44 : 76, - 45 : 77, - 46 : 78, - 47 : 79, - 48 : 80,#QSFP49 - 49 : 81,#QSFP50 - 50 : 82,#QSFP51 - 51 : 83,#QSFP52 - 52 : 84,#QSFP53 - 53 : 85,#QSFP54 - 54 : 86,#QSFP55 - 55 : 87,#QSFP56 + 1 : 32, + 2 : 33, + 3 : 34, + 4 : 35, + 5 : 36, + 6 : 37, + 7 : 38, + 8 : 39, + 9 : 40, + 10 : 41, + 11 : 42, + 12 : 43, + 13 : 44, + 14 : 45, + 15 : 46, + 16 : 47, + 17 : 48, + 18 : 49, + 19 : 50, + 20 : 51, + 21 : 52, + 22 : 53, + 23 : 54, + 24 : 55, + 25 : 56, + 26 : 57, + 27 : 58, + 28 : 59, + 29 : 60, + 30 : 61, + 31 : 62, + 32 : 63, + 33 : 64, + 34 : 65, + 35 : 66, + 36 : 67, + 37 : 68, + 38 : 69, + 39 : 70, + 40 : 71, + 41 : 72, + 42 : 73, + 43 : 74, + 44 : 75, + 45 : 76, + 46 : 77, + 47 : 78, + 48 : 79, + 49 : 80,#QSFP49 + 50 : 81,#QSFP50 + 51 : 82,#QSFP51 + 52 : 83,#QSFP52 + 53 : 84,#QSFP53 + 54 : 85,#QSFP54 + 55 : 86,#QSFP55 + 56 : 87,#QSFP56 } @property def port_start(self): return self.PORT_START + @property + def port_end(self): + return self.PORT_END + @property def qsfp_port_start(self): return self.QSFP_PORT_START @property - def port_end(self): - return self.PORT_END + def qsfp_port_end(self): + return self.QSFP_PORT_END @property def qsfp_ports(self): @@ -97,26 +107,26 @@ def port_to_eeprom_mapping(self): def __init__(self): eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' - for x in range(0, self.port_end+1): + for x in range(self.port_start, self.port_end+1): self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x]) SfpUtilBase.__init__(self) def get_presence(self, port_num): # Check for invalid port_num - if port_num < self.PORT_START or port_num > self.PORT_END: + if port_num < self.port_start or port_num > self.port_end: return False try: - if port_num < 48: - reg_file = open("/sys/class/cpld-sfp28/port-"+str(port_num+1)+"/pre_n") + if port_num < self.qsfp_port_start: + reg_file = open("/sys/class/cpld-sfp28/port-"+str(port_num)+"/pre_n") else: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+34)+"/value") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+34)+"/value") except IOError as e: print "Error: unable to open file: %s" % str(e) return False reg_value = reg_file.readline().rstrip() - if port_num < 48: + if port_num < self.qsfp_port_start: if reg_value == '1': return True else: @@ -127,11 +137,11 @@ def get_presence(self, port_num): def get_low_power_mode(self, port_num): # Check for invalid port_num - if port_num < self.qsfp_port_start or port_num > self.port_end: + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: return False try: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+35)+"/value") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+35)+"/value") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -145,11 +155,11 @@ def get_low_power_mode(self, port_num): def set_low_power_mode(self, port_num, lpmode): # Check for invalid port_num - if port_num < self.qsfp_port_start or port_num > self.port_end: + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: return False try: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+35)+"/value", "r+") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+35)+"/value", "r+") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -173,7 +183,7 @@ def reset(self, port_num): return False try: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+32)+"/value", "r+") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+32)+"/value", "r+") except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -187,7 +197,7 @@ def reset(self, port_num): # Flip the value back write back to the register to take port out of reset try: - reg_file = open("/sys/class/gpio/gpio"+str((port_num-48)*4+32)+"/value", "r+") + reg_file = open("/sys/class/gpio/gpio"+str((port_num-self.qsfp_port_start)*4+32)+"/value", "r+") except IOError as e: print "Error: unable to open file: %s" % str(e) return False From 0d84105639c08e9cb50005d27178db8ade4b1973 Mon Sep 17 00:00:00 2001 From: Roy Lee Date: Thu, 15 Aug 2019 15:48:19 +0800 Subject: [PATCH 20/54] [device] as5712-54x, add more entries for sensors (#3328) * Change psu driver to comfort to lm-sensors. Signed-off-by: roy_lee * Duplicate fan attributes with naming conforming to lm-sensors. Replace psu drivers. Signed-off-by: roy_lee * Revise cpr_4011_4mxx.c to support lm-sensors. Signed-off-by: roy_lee --- .../modules/accton_as5712_54x_fan.c | 59 +- .../as5712-54x/modules/cpr_4011_4mxx.c | 401 +--------- .../as5712-54x/modules/ym2651y.c | 684 +----------------- .../common/modules/cpr_4011_4mxx.c | 26 + 4 files changed, 67 insertions(+), 1103 deletions(-) mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/accton_as5712_54x_fan.c mode change 100755 => 120000 platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/cpr_4011_4mxx.c mode change 100755 => 120000 platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/ym2651y.c diff --git a/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/accton_as5712_54x_fan.c b/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/accton_as5712_54x_fan.c old mode 100755 new mode 100644 index db81a1a8ca97..3f74e3f375a9 --- a/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/accton_as5712_54x_fan.c +++ b/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/accton_as5712_54x_fan.c @@ -33,6 +33,8 @@ #include #include +#define DRVNAME "as5712_54x_fan" + #define FAN_MAX_NUMBER 5 #define FAN_SPEED_CPLD_TO_RPM_STEP 150 #define FAN_SPEED_PRECENT_TO_CPLD_STEP 5 @@ -130,47 +132,58 @@ static ssize_t fan_set_duty_cycle(struct device *dev, struct device_attribute *da,const char *buf, size_t count); static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, char *buf); - +static ssize_t show_name(struct device *dev, struct device_attribute *da, + char *buf); extern int as5712_54x_cpld_read(unsigned short cpld_addr, u8 reg); extern int as5712_54x_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); /*******************/ -#define _MAKE_SENSOR_DEVICE_ATTR(prj, id) \ - static SENSOR_DEVICE_ATTR(prj##fan##id##_fault, S_IRUGO, fan_show_value, NULL, FAN##id##_FAULT); \ +#define _MAKE_SENSOR_DEVICE_ATTR(prj, id, id2) \ static SENSOR_DEVICE_ATTR(prj##fan##id##_speed_rpm, S_IRUGO, fan_show_value, NULL, FAN##id##_SPEED); \ static SENSOR_DEVICE_ATTR(prj##fan##id##_duty_cycle_percentage, S_IWUSR | S_IRUGO, fan_show_value, \ fan_set_duty_cycle, FAN##id##_DUTY_CYCLE); \ static SENSOR_DEVICE_ATTR(prj##fan##id##_direction, S_IRUGO, fan_show_value, NULL, FAN##id##_DIRECTION); \ static SENSOR_DEVICE_ATTR(prj##fanr##id##_fault, S_IRUGO, fan_show_value, NULL, FANR##id##_FAULT); \ - static SENSOR_DEVICE_ATTR(prj##fanr##id##_speed_rpm, S_IRUGO, fan_show_value, NULL, FANR##id##_SPEED); + static SENSOR_DEVICE_ATTR(prj##fanr##id##_speed_rpm, S_IRUGO, fan_show_value, NULL, FANR##id##_SPEED);\ + static SENSOR_DEVICE_ATTR(prj##fan##id##_input, S_IRUGO, fan_show_value, NULL, FAN##id##_SPEED); \ + static SENSOR_DEVICE_ATTR(prj##fan##id2##_input, S_IRUGO, fan_show_value, NULL, FANR##id##_SPEED);\ + static SENSOR_DEVICE_ATTR(prj##fan##id##_fault, S_IRUGO, fan_show_value, NULL, FAN##id##_FAULT); \ + static SENSOR_DEVICE_ATTR(prj##fan##id2##_fault, S_IRUGO, fan_show_value, NULL, FANR##id##_FAULT); + +#define MAKE_SENSOR_DEVICE_ATTR(prj,id, id2) _MAKE_SENSOR_DEVICE_ATTR(prj,id, id2) -#define MAKE_SENSOR_DEVICE_ATTR(prj,id) _MAKE_SENSOR_DEVICE_ATTR(prj,id) +MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 1, 11) +MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 2, 12) +MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 3, 13) +MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 4, 14) +MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 5, 15) -MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 1) -MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 2) -MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 3) -MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 4) -MAKE_SENSOR_DEVICE_ATTR(PROJECT_NAME, 5) +static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0); /*******************/ -#define _MAKE_FAN_ATTR(prj, id) \ - &sensor_dev_attr_##prj##fan##id##_fault.dev_attr.attr, \ +#define _MAKE_FAN_ATTR(prj, id, id2) \ &sensor_dev_attr_##prj##fan##id##_speed_rpm.dev_attr.attr, \ &sensor_dev_attr_##prj##fan##id##_duty_cycle_percentage.dev_attr.attr,\ &sensor_dev_attr_##prj##fan##id##_direction.dev_attr.attr, \ &sensor_dev_attr_##prj##fanr##id##_fault.dev_attr.attr, \ - &sensor_dev_attr_##prj##fanr##id##_speed_rpm.dev_attr.attr, + &sensor_dev_attr_##prj##fanr##id##_speed_rpm.dev_attr.attr,\ + &sensor_dev_attr_##prj##fan##id##_input.dev_attr.attr, \ + &sensor_dev_attr_##prj##fan##id2##_input.dev_attr.attr, \ + &sensor_dev_attr_##prj##fan##id##_fault.dev_attr.attr, \ + &sensor_dev_attr_##prj##fan##id2##_fault.dev_attr.attr, + -#define MAKE_FAN_ATTR(prj, id) _MAKE_FAN_ATTR(prj, id) +#define MAKE_FAN_ATTR(prj, id, id2) _MAKE_FAN_ATTR(prj, id, id2) static struct attribute *accton_as5712_54x_fan_attributes[] = { /* fan related attributes */ - MAKE_FAN_ATTR(PROJECT_NAME,1) - MAKE_FAN_ATTR(PROJECT_NAME,2) - MAKE_FAN_ATTR(PROJECT_NAME,3) - MAKE_FAN_ATTR(PROJECT_NAME,4) - MAKE_FAN_ATTR(PROJECT_NAME,5) + MAKE_FAN_ATTR(PROJECT_NAME,1, 11) + MAKE_FAN_ATTR(PROJECT_NAME,2, 12) + MAKE_FAN_ATTR(PROJECT_NAME,3, 13) + MAKE_FAN_ATTR(PROJECT_NAME,4, 14) + MAKE_FAN_ATTR(PROJECT_NAME,5, 15) + &sensor_dev_attr_name.dev_attr.attr, NULL }; /*******************/ @@ -232,6 +245,12 @@ static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, return ret; } + +static ssize_t show_name(struct device *dev, struct device_attribute *da, + char *buf) +{ + return sprintf(buf, "%s\n", DRVNAME); +} /*******************/ static ssize_t fan_set_duty_cycle(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { @@ -379,7 +398,7 @@ static int accton_as5712_54x_fan_remove(struct platform_device *pdev) return 0; } -#define DRVNAME "as5712_54x_fan" + static struct platform_driver accton_as5712_54x_fan_driver = { .probe = accton_as5712_54x_fan_probe, diff --git a/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/cpr_4011_4mxx.c b/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/cpr_4011_4mxx.c deleted file mode 100755 index 30bea914d589..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/cpr_4011_4mxx.c +++ /dev/null @@ -1,400 +0,0 @@ -/* - * An hwmon driver for the CPR-4011-4Mxx Redundant Power Module - * - * Copyright (C) Brandon Chuang - * - * Based on ad7414.c - * Copyright 2006 Stefan Roese , DENX Software Engineering - * - * 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. - */ -#if 0 -#define DEBUG -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_FAN_DUTY_CYCLE 100 - -/* Addresses scanned - */ -static const unsigned short normal_i2c[] = { 0x3c, 0x3d, 0x3e, 0x3f, I2C_CLIENT_END }; - -/* Each client has this additional data - */ -struct cpr_4011_4mxx_data { - struct device *hwmon_dev; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 vout_mode; /* Register value */ - u16 v_in; /* Register value */ - u16 v_out; /* Register value */ - u16 i_in; /* Register value */ - u16 i_out; /* Register value */ - u16 p_in; /* Register value */ - u16 p_out; /* Register value */ - u16 temp_input[2]; /* Register value */ - u8 fan_fault; /* Register value */ - u16 fan_duty_cycle[2]; /* Register value */ - u16 fan_speed[2]; /* Register value */ -}; - -static ssize_t show_linear(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t show_fan_fault(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t show_vout(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t set_fan_duty_cycle(struct device *dev, struct device_attribute *da, const char *buf, size_t count); -static int cpr_4011_4mxx_write_word(struct i2c_client *client, u8 reg, u16 value); -static struct cpr_4011_4mxx_data *cpr_4011_4mxx_update_device(struct device *dev); - -enum cpr_4011_4mxx_sysfs_attributes { - PSU_V_IN, - PSU_V_OUT, - PSU_I_IN, - PSU_I_OUT, - PSU_P_IN, - PSU_P_OUT, - PSU_TEMP1_INPUT, - PSU_FAN1_FAULT, - PSU_FAN1_DUTY_CYCLE, - PSU_FAN1_SPEED, -}; - -/* sysfs attributes for hwmon - */ -static SENSOR_DEVICE_ATTR(psu_v_in, S_IRUGO, show_linear, NULL, PSU_V_IN); -static SENSOR_DEVICE_ATTR(psu_v_out, S_IRUGO, show_vout, NULL, PSU_V_OUT); -static SENSOR_DEVICE_ATTR(psu_i_in, S_IRUGO, show_linear, NULL, PSU_I_IN); -static SENSOR_DEVICE_ATTR(psu_i_out, S_IRUGO, show_linear, NULL, PSU_I_OUT); -static SENSOR_DEVICE_ATTR(psu_p_in, S_IRUGO, show_linear, NULL, PSU_P_IN); -static SENSOR_DEVICE_ATTR(psu_p_out, S_IRUGO, show_linear, NULL, PSU_P_OUT); -static SENSOR_DEVICE_ATTR(psu_temp1_input, S_IRUGO, show_linear, NULL, PSU_TEMP1_INPUT); -static SENSOR_DEVICE_ATTR(psu_fan1_fault, S_IRUGO, show_fan_fault, NULL, PSU_FAN1_FAULT); -static SENSOR_DEVICE_ATTR(psu_fan1_duty_cycle_percentage, S_IWUSR | S_IRUGO, show_linear, set_fan_duty_cycle, PSU_FAN1_DUTY_CYCLE); -static SENSOR_DEVICE_ATTR(psu_fan1_speed_rpm, S_IRUGO, show_linear, NULL, PSU_FAN1_SPEED); - -static struct attribute *cpr_4011_4mxx_attributes[] = { - &sensor_dev_attr_psu_v_in.dev_attr.attr, - &sensor_dev_attr_psu_v_out.dev_attr.attr, - &sensor_dev_attr_psu_i_in.dev_attr.attr, - &sensor_dev_attr_psu_i_out.dev_attr.attr, - &sensor_dev_attr_psu_p_in.dev_attr.attr, - &sensor_dev_attr_psu_p_out.dev_attr.attr, - &sensor_dev_attr_psu_temp1_input.dev_attr.attr, - &sensor_dev_attr_psu_fan1_fault.dev_attr.attr, - &sensor_dev_attr_psu_fan1_duty_cycle_percentage.dev_attr.attr, - &sensor_dev_attr_psu_fan1_speed_rpm.dev_attr.attr, - NULL -}; - -static int two_complement_to_int(u16 data, u8 valid_bit, int mask) -{ - u16 valid_data = data & mask; - bool is_negative = valid_data >> (valid_bit - 1); - - return is_negative ? (-(((~valid_data) & mask) + 1)) : valid_data; -} - -static ssize_t set_fan_duty_cycle(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 cpr_4011_4mxx_data *data = i2c_get_clientdata(client); - int nr = (attr->index == PSU_FAN1_DUTY_CYCLE) ? 0 : 1; - long speed; - int error; - - error = kstrtol(buf, 10, &speed); - if (error) - return error; - - if (speed < 0 || speed > MAX_FAN_DUTY_CYCLE) - return -EINVAL; - - mutex_lock(&data->update_lock); - data->fan_duty_cycle[nr] = speed; - cpr_4011_4mxx_write_word(client, 0x3B + nr, data->fan_duty_cycle[nr]); - mutex_unlock(&data->update_lock); - - return count; -} - -static ssize_t show_linear(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct cpr_4011_4mxx_data *data = cpr_4011_4mxx_update_device(dev); - - u16 value = 0; - int exponent, mantissa; - int multiplier = 1000; - - switch (attr->index) { - case PSU_V_IN: - value = data->v_in; - break; - case PSU_I_IN: - value = data->i_in; - break; - case PSU_I_OUT: - value = data->i_out; - break; - case PSU_P_IN: - value = data->p_in; - break; - case PSU_P_OUT: - value = data->p_out; - break; - case PSU_TEMP1_INPUT: - value = data->temp_input[0]; - break; - case PSU_FAN1_DUTY_CYCLE: - multiplier = 1; - value = data->fan_duty_cycle[0]; - break; - case PSU_FAN1_SPEED: - multiplier = 1; - value = data->fan_speed[0]; - break; - default: - break; - } - - exponent = two_complement_to_int(value >> 11, 5, 0x1f); - mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); - - return (exponent >= 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) : - sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); -} - -static ssize_t show_fan_fault(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct cpr_4011_4mxx_data *data = cpr_4011_4mxx_update_device(dev); - - u8 shift = (attr->index == PSU_FAN1_FAULT) ? 7 : 6; - - return sprintf(buf, "%d\n", data->fan_fault >> shift); -} - -static ssize_t show_vout(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct cpr_4011_4mxx_data *data = cpr_4011_4mxx_update_device(dev); - int exponent, mantissa; - int multiplier = 1000; - - exponent = two_complement_to_int(data->vout_mode, 5, 0x1f); - mantissa = data->v_out; - - return (exponent > 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) : - sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); -} - -static const struct attribute_group cpr_4011_4mxx_group = { - .attrs = cpr_4011_4mxx_attributes, -}; - -static int cpr_4011_4mxx_probe(struct i2c_client *client, - const struct i2c_device_id *dev_id) -{ - struct cpr_4011_4mxx_data *data; - int status; - - if (!i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) { - status = -EIO; - goto exit; - } - - data = kzalloc(sizeof(struct cpr_4011_4mxx_data), GFP_KERNEL); - if (!data) { - status = -ENOMEM; - goto exit; - } - - i2c_set_clientdata(client, data); - data->valid = 0; - mutex_init(&data->update_lock); - - dev_info(&client->dev, "chip found\n"); - - /* Register sysfs hooks */ - status = sysfs_create_group(&client->dev.kobj, &cpr_4011_4mxx_group); - if (status) { - goto exit_free; - } - - data->hwmon_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->hwmon_dev)) { - status = PTR_ERR(data->hwmon_dev); - goto exit_remove; - } - - dev_info(&client->dev, "%s: psu '%s'\n", - dev_name(data->hwmon_dev), client->name); - - return 0; - -exit_remove: - sysfs_remove_group(&client->dev.kobj, &cpr_4011_4mxx_group); -exit_free: - kfree(data); -exit: - - return status; -} - -static int cpr_4011_4mxx_remove(struct i2c_client *client) -{ - struct cpr_4011_4mxx_data *data = i2c_get_clientdata(client); - - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &cpr_4011_4mxx_group); - kfree(data); - - return 0; -} - -static const struct i2c_device_id cpr_4011_4mxx_id[] = { - { "cpr_4011_4mxx", 0 }, - {} -}; -MODULE_DEVICE_TABLE(i2c, cpr_4011_4mxx_id); - -static struct i2c_driver cpr_4011_4mxx_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "cpr_4011_4mxx", - }, - .probe = cpr_4011_4mxx_probe, - .remove = cpr_4011_4mxx_remove, - .id_table = cpr_4011_4mxx_id, - .address_list = normal_i2c, -}; - -static int cpr_4011_4mxx_read_byte(struct i2c_client *client, u8 reg) -{ - return i2c_smbus_read_byte_data(client, reg); -} - -static int cpr_4011_4mxx_read_word(struct i2c_client *client, u8 reg) -{ - return i2c_smbus_read_word_data(client, reg); -} - -static int cpr_4011_4mxx_write_word(struct i2c_client *client, u8 reg, u16 value) -{ - return i2c_smbus_write_word_data(client, reg, value); -} - -struct reg_data_byte { - u8 reg; - u8 *value; -}; - -struct reg_data_word { - u8 reg; - u16 *value; -}; - -static struct cpr_4011_4mxx_data *cpr_4011_4mxx_update_device(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct cpr_4011_4mxx_data *data = i2c_get_clientdata(client); - - mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { - int i, status; - struct reg_data_byte regs_byte[] = { {0x20, &data->vout_mode}, - {0x81, &data->fan_fault}}; - struct reg_data_word regs_word[] = { {0x88, &data->v_in}, - {0x8b, &data->v_out}, - {0x89, &data->i_in}, - {0x8c, &data->i_out}, - {0x96, &data->p_out}, - {0x97, &data->p_in}, - {0x8d, &(data->temp_input[0])}, - {0x8e, &(data->temp_input[1])}, - {0x3b, &(data->fan_duty_cycle[0])}, - {0x3c, &(data->fan_duty_cycle[1])}, - {0x90, &(data->fan_speed[0])}, - {0x91, &(data->fan_speed[1])}}; - - dev_dbg(&client->dev, "Starting cpr_4011_4mxx update\n"); - - /* Read byte data */ - for (i = 0; i < ARRAY_SIZE(regs_byte); i++) { - status = cpr_4011_4mxx_read_byte(client, regs_byte[i].reg); - - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", - regs_byte[i].reg, status); - } - else { - *(regs_byte[i].value) = status; - } - } - - /* Read word data */ - for (i = 0; i < ARRAY_SIZE(regs_word); i++) { - status = cpr_4011_4mxx_read_word(client, regs_word[i].reg); - - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", - regs_word[i].reg, status); - } - else { - *(regs_word[i].value) = status; - } - } - - data->last_updated = jiffies; - data->valid = 1; - } - - mutex_unlock(&data->update_lock); - - return data; -} - -static int __init cpr_4011_4mxx_init(void) -{ - return i2c_add_driver(&cpr_4011_4mxx_driver); -} - -static void __exit cpr_4011_4mxx_exit(void) -{ - i2c_del_driver(&cpr_4011_4mxx_driver); -} - -MODULE_AUTHOR("Brandon Chuang "); -MODULE_DESCRIPTION("CPR_4011_4MXX driver"); -MODULE_LICENSE("GPL"); - -module_init(cpr_4011_4mxx_init); -module_exit(cpr_4011_4mxx_exit); diff --git a/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/cpr_4011_4mxx.c b/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/cpr_4011_4mxx.c new file mode 120000 index 000000000000..fd43cc1f1c77 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/cpr_4011_4mxx.c @@ -0,0 +1 @@ +../../common/modules/cpr_4011_4mxx.c \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/ym2651y.c b/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/ym2651y.c deleted file mode 100755 index 519530387e29..000000000000 --- a/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/ym2651y.c +++ /dev/null @@ -1,683 +0,0 @@ -/* - * An hwmon driver for the 3Y Power YM-2651Y Power Module - * - * Copyright (C) 2014 Accton Technology Corporation. - * Brandon Chuang - * - * Based on ad7414.c - * Copyright 2006 Stefan Roese , DENX Software Engineering - * - * 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. - */ -#if 0 -#define DEBUG -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_FAN_DUTY_CYCLE 100 - -/* Addresses scanned - */ -static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; - -enum chips { - YM2651, - YM2401, -}; - -/* Each client has this additional data - */ -struct ym2651y_data { - struct device *hwmon_dev; - struct mutex update_lock; - char valid; /* !=0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - u8 chip; /* chip id */ - u8 capability; /* Register value */ - u16 status_word; /* Register value */ - u8 fan_fault; /* Register value */ - u8 over_temp; /* Register value */ - u16 v_out; /* Register value */ - u16 i_out; /* Register value */ - u16 p_out; /* Register value */ - u8 vout_mode; /* Register value */ - u16 temp; /* Register value */ - u16 fan_speed; /* Register value */ - u16 fan_duty_cycle[2]; /* Register value */ - u8 fan_dir[5]; /* Register value */ - u8 pmbus_revision; /* Register value */ - u8 mfr_id[10]; /* Register value */ - u8 mfr_model[16]; /* Register value */ - u8 mfr_revsion[3]; /* Register value */ - u16 mfr_vin_min; /* Register value */ - u16 mfr_vin_max; /* Register value */ - u16 mfr_iin_max; /* Register value */ - u16 mfr_iout_max; /* Register value */ - u16 mfr_pin_max; /* Register value */ - u16 mfr_pout_max; /* Register value */ - u16 mfr_vout_min; /* Register value */ - u16 mfr_vout_max; /* Register value */ -}; - -static ssize_t show_byte(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_word(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_linear(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_vout(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t show_fan_fault(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_over_temp(struct device *dev, struct device_attribute *da, - char *buf); -static ssize_t show_ascii(struct device *dev, struct device_attribute *da, - char *buf); -static struct ym2651y_data *ym2651y_update_device(struct device *dev); -static ssize_t set_fan_duty_cycle(struct device *dev, struct device_attribute *da, - const char *buf, size_t count); -static int ym2651y_write_word(struct i2c_client *client, u8 reg, u16 value); - -enum ym2651y_sysfs_attributes { - PSU_POWER_ON = 0, - PSU_TEMP_FAULT, - PSU_POWER_GOOD, - PSU_FAN1_FAULT, - PSU_FAN_DIRECTION, - PSU_OVER_TEMP, - PSU_V_OUT, - PSU_I_OUT, - PSU_P_OUT, - PSU_TEMP1_INPUT, - PSU_FAN1_SPEED, - PSU_FAN1_DUTY_CYCLE, - PSU_PMBUS_REVISION, - PSU_MFR_ID, - PSU_MFR_MODEL, - PSU_MFR_REVISION, - PSU_MFR_VIN_MIN, - PSU_MFR_VIN_MAX, - PSU_MFR_VOUT_MIN, - PSU_MFR_VOUT_MAX, - PSU_MFR_IIN_MAX, - PSU_MFR_IOUT_MAX, - PSU_MFR_PIN_MAX, - PSU_MFR_POUT_MAX -}; - -/* sysfs attributes for hwmon - */ -static SENSOR_DEVICE_ATTR(psu_power_on, S_IRUGO, show_word, NULL, PSU_POWER_ON); -static SENSOR_DEVICE_ATTR(psu_temp_fault, S_IRUGO, show_word, NULL, PSU_TEMP_FAULT); -static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_word, NULL, PSU_POWER_GOOD); -static SENSOR_DEVICE_ATTR(psu_fan1_fault, S_IRUGO, show_fan_fault, NULL, PSU_FAN1_FAULT); -static SENSOR_DEVICE_ATTR(psu_over_temp, S_IRUGO, show_over_temp, NULL, PSU_OVER_TEMP); -static SENSOR_DEVICE_ATTR(psu_v_out, S_IRUGO, show_vout, NULL, PSU_V_OUT); -static SENSOR_DEVICE_ATTR(psu_i_out, S_IRUGO, show_linear, NULL, PSU_I_OUT); -static SENSOR_DEVICE_ATTR(psu_p_out, S_IRUGO, show_linear, NULL, PSU_P_OUT); -static SENSOR_DEVICE_ATTR(psu_temp1_input, S_IRUGO, show_linear, NULL, PSU_TEMP1_INPUT); -static SENSOR_DEVICE_ATTR(psu_fan1_speed_rpm, S_IRUGO, show_linear, NULL, PSU_FAN1_SPEED); -static SENSOR_DEVICE_ATTR(psu_fan1_duty_cycle_percentage, S_IWUSR | S_IRUGO, show_linear, set_fan_duty_cycle, PSU_FAN1_DUTY_CYCLE); -static SENSOR_DEVICE_ATTR(psu_fan_dir, S_IRUGO, show_ascii, NULL, PSU_FAN_DIRECTION); -static SENSOR_DEVICE_ATTR(psu_pmbus_revision,S_IRUGO, show_byte, NULL, PSU_PMBUS_REVISION); -static SENSOR_DEVICE_ATTR(psu_mfr_id, S_IRUGO, show_ascii, NULL, PSU_MFR_ID); -static SENSOR_DEVICE_ATTR(psu_mfr_model, S_IRUGO, show_ascii, NULL, PSU_MFR_MODEL); -static SENSOR_DEVICE_ATTR(psu_mfr_revision, S_IRUGO, show_ascii, NULL, PSU_MFR_REVISION); -static SENSOR_DEVICE_ATTR(psu_mfr_vin_min, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MIN); -static SENSOR_DEVICE_ATTR(psu_mfr_vin_max, S_IRUGO, show_linear, NULL, PSU_MFR_VIN_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_vout_min, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MIN); -static SENSOR_DEVICE_ATTR(psu_mfr_vout_max, S_IRUGO, show_linear, NULL, PSU_MFR_VOUT_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_iin_max, S_IRUGO, show_linear, NULL, PSU_MFR_IIN_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_iout_max, S_IRUGO, show_linear, NULL, PSU_MFR_IOUT_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_pin_max, S_IRUGO, show_linear, NULL, PSU_MFR_PIN_MAX); -static SENSOR_DEVICE_ATTR(psu_mfr_pout_max, S_IRUGO, show_linear, NULL, PSU_MFR_POUT_MAX); - -static struct attribute *ym2651y_attributes[] = { - &sensor_dev_attr_psu_power_on.dev_attr.attr, - &sensor_dev_attr_psu_temp_fault.dev_attr.attr, - &sensor_dev_attr_psu_power_good.dev_attr.attr, - &sensor_dev_attr_psu_fan1_fault.dev_attr.attr, - &sensor_dev_attr_psu_over_temp.dev_attr.attr, - &sensor_dev_attr_psu_v_out.dev_attr.attr, - &sensor_dev_attr_psu_i_out.dev_attr.attr, - &sensor_dev_attr_psu_p_out.dev_attr.attr, - &sensor_dev_attr_psu_temp1_input.dev_attr.attr, - &sensor_dev_attr_psu_fan1_speed_rpm.dev_attr.attr, - &sensor_dev_attr_psu_fan1_duty_cycle_percentage.dev_attr.attr, - &sensor_dev_attr_psu_fan_dir.dev_attr.attr, - &sensor_dev_attr_psu_pmbus_revision.dev_attr.attr, - &sensor_dev_attr_psu_mfr_id.dev_attr.attr, - &sensor_dev_attr_psu_mfr_model.dev_attr.attr, - &sensor_dev_attr_psu_mfr_revision.dev_attr.attr, - &sensor_dev_attr_psu_mfr_vin_min.dev_attr.attr, - &sensor_dev_attr_psu_mfr_vin_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_pout_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_iin_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_pin_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_vout_min.dev_attr.attr, - &sensor_dev_attr_psu_mfr_vout_max.dev_attr.attr, - &sensor_dev_attr_psu_mfr_iout_max.dev_attr.attr, - NULL -}; - -static ssize_t show_byte(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - - if (!data->valid) { - return 0; - } - - return (attr->index == PSU_PMBUS_REVISION) ? sprintf(buf, "%d\n", data->pmbus_revision) : - sprintf(buf, "0\n"); -} - -static ssize_t show_word(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - u16 status = 0; - - if (!data->valid) { - return 0; - } - - switch (attr->index) { - case PSU_POWER_ON: /* psu_power_on, low byte bit 6 of status_word, 0=>ON, 1=>OFF */ - status = (data->status_word & 0x40) ? 0 : 1; - break; - case PSU_TEMP_FAULT: /* psu_temp_fault, low byte bit 2 of status_word, 0=>Normal, 1=>temp fault */ - status = (data->status_word & 0x4) >> 2; - break; - case PSU_POWER_GOOD: /* psu_power_good, high byte bit 3 of status_word, 0=>OK, 1=>FAIL */ - status = (data->status_word & 0x800) ? 0 : 1; - break; - } - - return sprintf(buf, "%d\n", status); -} - -static int two_complement_to_int(u16 data, u8 valid_bit, int mask) -{ - u16 valid_data = data & mask; - bool is_negative = valid_data >> (valid_bit - 1); - - return is_negative ? (-(((~valid_data) & mask) + 1)) : valid_data; -} - -static ssize_t set_fan_duty_cycle(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 ym2651y_data *data = i2c_get_clientdata(client); - int nr = (attr->index == PSU_FAN1_DUTY_CYCLE) ? 0 : 1; - long speed; - int error; - - error = kstrtol(buf, 10, &speed); - if (error) - return error; - - if (speed < 0 || speed > MAX_FAN_DUTY_CYCLE) - return -EINVAL; - - mutex_lock(&data->update_lock); - data->fan_duty_cycle[nr] = speed; - ym2651y_write_word(client, 0x3B + nr, data->fan_duty_cycle[nr]); - mutex_unlock(&data->update_lock); - - return count; -} - -static ssize_t show_linear(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - - u16 value = 0; - int exponent, mantissa; - int multiplier = 1000; - - if (!data->valid) { - return 0; - } - - switch (attr->index) { - case PSU_V_OUT: - value = data->v_out; - break; - case PSU_I_OUT: - value = data->i_out; - break; - case PSU_P_OUT: - value = data->p_out; - break; - case PSU_TEMP1_INPUT: - value = data->temp; - break; - case PSU_FAN1_SPEED: - value = data->fan_speed; - multiplier = 1; - break; - case PSU_FAN1_DUTY_CYCLE: - value = data->fan_duty_cycle[0]; - multiplier = 1; - break; - case PSU_MFR_VIN_MIN: - value = data->mfr_vin_min; - break; - case PSU_MFR_VIN_MAX: - value = data->mfr_vin_max; - break; - case PSU_MFR_VOUT_MIN: - value = data->mfr_vout_min; - break; - case PSU_MFR_VOUT_MAX: - value = data->mfr_vout_max; - break; - case PSU_MFR_PIN_MAX: - value = data->mfr_pin_max; - break; - case PSU_MFR_POUT_MAX: - value = data->mfr_pout_max; - break; - case PSU_MFR_IOUT_MAX: - value = data->mfr_iout_max; - break; - case PSU_MFR_IIN_MAX: - value = data->mfr_iin_max; - break; - } - - exponent = two_complement_to_int(value >> 11, 5, 0x1f); - mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); - - return (exponent >= 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) : - sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); -} - -static ssize_t show_fan_fault(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - u8 shift; - - if (!data->valid) { - return 0; - } - - shift = (attr->index == PSU_FAN1_FAULT) ? 7 : 6; - - return sprintf(buf, "%d\n", data->fan_fault >> shift); -} - -static ssize_t show_over_temp(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct ym2651y_data *data = ym2651y_update_device(dev); - - if (!data->valid) { - return 0; - } - - return sprintf(buf, "%d\n", data->over_temp >> 7); -} - -static ssize_t show_ascii(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct ym2651y_data *data = ym2651y_update_device(dev); - u8 *ptr = NULL; - - if (!data->valid) { - return 0; - } - - switch (attr->index) { - case PSU_FAN_DIRECTION: /* psu_fan_dir */ - ptr = data->fan_dir + 1; /* Skip the first byte since it is the length of string. */ - break; - case PSU_MFR_ID: /* psu_mfr_id */ - ptr = data->mfr_id + 1; /* The first byte is the count byte of string. */; - break; - case PSU_MFR_MODEL: /* psu_mfr_model */ - ptr = data->mfr_model + 1; /* The first byte is the count byte of string. */ - break; - case PSU_MFR_REVISION: /* psu_mfr_revision */ - ptr = data->mfr_revsion + 1; /* The first byte is the count byte of string. */ - break; - default: - return 0; - } - - return sprintf(buf, "%s\n", ptr); -} - -static ssize_t show_vout_by_mode(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct ym2651y_data *data = ym2651y_update_device(dev); - int exponent, mantissa; - int multiplier = 1000; - - if (!data->valid) { - return 0; - } - - exponent = two_complement_to_int(data->vout_mode, 5, 0x1f); - mantissa = data->v_out; - - return (exponent > 0) ? sprintf(buf, "%d\n", (mantissa << exponent) * multiplier) : - sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); -} - -static ssize_t show_vout(struct device *dev, struct device_attribute *da, - char *buf) -{ - struct i2c_client *client = to_i2c_client(dev); - struct ym2651y_data *data = i2c_get_clientdata(client); - - if (data->chip == YM2401) { - return show_vout_by_mode(dev, da, buf); - } - - return show_linear(dev, da, buf); -} - -static const struct attribute_group ym2651y_group = { - .attrs = ym2651y_attributes, -}; - -static int ym2651y_probe(struct i2c_client *client, - const struct i2c_device_id *dev_id) -{ - struct ym2651y_data *data; - int status; - - if (!i2c_check_functionality(client->adapter, - I2C_FUNC_SMBUS_BYTE_DATA | - I2C_FUNC_SMBUS_WORD_DATA | - I2C_FUNC_SMBUS_I2C_BLOCK)) { - status = -EIO; - goto exit; - } - - data = kzalloc(sizeof(struct ym2651y_data), GFP_KERNEL); - if (!data) { - status = -ENOMEM; - goto exit; - } - - i2c_set_clientdata(client, data); - mutex_init(&data->update_lock); - data->chip = dev_id->driver_data; - dev_info(&client->dev, "chip found\n"); - - /* Register sysfs hooks */ - status = sysfs_create_group(&client->dev.kobj, &ym2651y_group); - if (status) { - goto exit_free; - } - - data->hwmon_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->hwmon_dev)) { - status = PTR_ERR(data->hwmon_dev); - goto exit_remove; - } - - dev_info(&client->dev, "%s: psu '%s'\n", - dev_name(data->hwmon_dev), client->name); - - return 0; - -exit_remove: - sysfs_remove_group(&client->dev.kobj, &ym2651y_group); -exit_free: - kfree(data); -exit: - - return status; -} - -static int ym2651y_remove(struct i2c_client *client) -{ - struct ym2651y_data *data = i2c_get_clientdata(client); - - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &ym2651y_group); - kfree(data); - - return 0; -} - -static const struct i2c_device_id ym2651y_id[] = { - { "ym2651", YM2651 }, - { "ym2401", YM2401 }, - {} -}; -MODULE_DEVICE_TABLE(i2c, ym2651y_id); - -static struct i2c_driver ym2651y_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "ym2651", - }, - .probe = ym2651y_probe, - .remove = ym2651y_remove, - .id_table = ym2651y_id, - .address_list = normal_i2c, -}; - -static int ym2651y_read_byte(struct i2c_client *client, u8 reg) -{ - return i2c_smbus_read_byte_data(client, reg); -} - -static int ym2651y_read_word(struct i2c_client *client, u8 reg) -{ - return i2c_smbus_read_word_data(client, reg); -} - -static int ym2651y_write_word(struct i2c_client *client, u8 reg, u16 value) -{ - return i2c_smbus_write_word_data(client, reg, value); -} - -static int ym2651y_read_block(struct i2c_client *client, u8 command, u8 *data, - int data_len) -{ - int result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); - - if (unlikely(result < 0)) - goto abort; - if (unlikely(result != data_len)) { - result = -EIO; - goto abort; - } - - result = 0; - -abort: - return result; -} - -struct reg_data_byte { - u8 reg; - u8 *value; -}; - -struct reg_data_word { - u8 reg; - u16 *value; -}; - -static struct ym2651y_data *ym2651y_update_device(struct device *dev) -{ - struct i2c_client *client = to_i2c_client(dev); - struct ym2651y_data *data = i2c_get_clientdata(client); - - mutex_lock(&data->update_lock); - - if (time_after(jiffies, data->last_updated + HZ + HZ / 2) - || !data->valid) { - int i, status, length; - u8 command, buf; - struct reg_data_byte regs_byte[] = { {0x19, &data->capability}, - {0x20, &data->vout_mode}, - {0x7d, &data->over_temp}, - {0x81, &data->fan_fault}, - {0x98, &data->pmbus_revision}}; - struct reg_data_word regs_word[] = { {0x79, &data->status_word}, - {0x8b, &data->v_out}, - {0x8c, &data->i_out}, - {0x96, &data->p_out}, - {0x8d, &data->temp}, - {0x3b, &(data->fan_duty_cycle[0])}, - {0x3c, &(data->fan_duty_cycle[1])}, - {0x90, &data->fan_speed}, - {0xa0, &data->mfr_vin_min}, - {0xa1, &data->mfr_vin_max}, - {0xa2, &data->mfr_iin_max}, - {0xa3, &data->mfr_pin_max}, - {0xa4, &data->mfr_vout_min}, - {0xa5, &data->mfr_vout_max}, - {0xa6, &data->mfr_iout_max}, - {0xa7, &data->mfr_pout_max}}; - - dev_dbg(&client->dev, "Starting ym2651 update\n"); - data->valid = 0; - - /* Read byte data */ - for (i = 0; i < ARRAY_SIZE(regs_byte); i++) { - status = ym2651y_read_byte(client, regs_byte[i].reg); - - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", - regs_byte[i].reg, status); - goto exit; - } - else { - *(regs_byte[i].value) = status; - } - } - - /* Read word data */ - for (i = 0; i < ARRAY_SIZE(regs_word); i++) { - status = ym2651y_read_word(client, regs_word[i].reg); - - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", - regs_word[i].reg, status); - goto exit; - } - else { - *(regs_word[i].value) = status; - } - } - - /* Read fan_direction */ - command = 0xC3; - status = ym2651y_read_block(client, command, data->fan_dir, - ARRAY_SIZE(data->fan_dir)-1); - data->fan_dir[ARRAY_SIZE(data->fan_dir)-1] = '\0'; - - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", command, status); - goto exit; - } - - /* Read mfr_id */ - command = 0x99; - status = ym2651y_read_block(client, command, data->mfr_id, - ARRAY_SIZE(data->mfr_id)-1); - data->mfr_id[ARRAY_SIZE(data->mfr_id)-1] = '\0'; - - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", command, status); - goto exit; - } - - /* Read mfr_model */ - command = 0x9a; - length = 1; - - /* Read first byte to determine the length of data */ - status = ym2651y_read_block(client, command, &buf, length); - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", command, status); - goto exit; - } - - status = ym2651y_read_block(client, command, data->mfr_model, buf+1); - data->mfr_model[buf+1] = '\0'; - - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", command, status); - goto exit; - } - - /* Read mfr_revsion */ - command = 0x9b; - status = ym2651y_read_block(client, command, data->mfr_revsion, - ARRAY_SIZE(data->mfr_revsion)-1); - data->mfr_revsion[ARRAY_SIZE(data->mfr_revsion)-1] = '\0'; - - if (status < 0) { - dev_dbg(&client->dev, "reg %d, err %d\n", command, status); - goto exit; - } - - data->last_updated = jiffies; - data->valid = 1; - } - -exit: - mutex_unlock(&data->update_lock); - - return data; -} - -static int __init ym2651y_init(void) -{ - return i2c_add_driver(&ym2651y_driver); -} - -static void __exit ym2651y_exit(void) -{ - i2c_del_driver(&ym2651y_driver); -} - -MODULE_AUTHOR("Brandon Chuang "); -MODULE_DESCRIPTION("3Y Power YM-2651Y driver"); -MODULE_LICENSE("GPL"); - -module_init(ym2651y_init); -module_exit(ym2651y_exit); - diff --git a/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/ym2651y.c b/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/ym2651y.c new file mode 120000 index 000000000000..f4d67640ccc3 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as5712-54x/modules/ym2651y.c @@ -0,0 +1 @@ +../../common/modules/ym2651y.c \ No newline at end of file diff --git a/platform/broadcom/sonic-platform-modules-accton/common/modules/cpr_4011_4mxx.c b/platform/broadcom/sonic-platform-modules-accton/common/modules/cpr_4011_4mxx.c index 2cea5f5e39f9..f1790b4515ff 100644 --- a/platform/broadcom/sonic-platform-modules-accton/common/modules/cpr_4011_4mxx.c +++ b/platform/broadcom/sonic-platform-modules-accton/common/modules/cpr_4011_4mxx.c @@ -93,6 +93,21 @@ static SENSOR_DEVICE_ATTR(psu_fan1_fault, S_IRUGO, show_fan_fault, NULL, PSU_ static SENSOR_DEVICE_ATTR(psu_fan1_duty_cycle_percentage, S_IWUSR | S_IRUGO, show_linear, set_fan_duty_cycle, PSU_FAN1_DUTY_CYCLE); static SENSOR_DEVICE_ATTR(psu_fan1_speed_rpm, S_IRUGO, show_linear, NULL, PSU_FAN1_SPEED); + +/*Duplicate nodes for lm-sensors.*/ +static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_linear, NULL, PSU_V_IN); +static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_vout, NULL, PSU_V_OUT); +static SENSOR_DEVICE_ATTR(curr1_input, S_IRUGO, show_linear, NULL, PSU_I_IN); +static SENSOR_DEVICE_ATTR(curr2_input, S_IRUGO, show_linear, NULL, PSU_I_OUT); +static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, show_linear, NULL, PSU_P_IN); +static SENSOR_DEVICE_ATTR(power2_input, S_IRUGO, show_linear, NULL, PSU_P_OUT); +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_linear, NULL, PSU_TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, show_fan_fault, NULL, PSU_FAN1_FAULT); +static SENSOR_DEVICE_ATTR(pwm1_input, S_IRUGO, show_linear, NULL, PSU_FAN1_DUTY_CYCLE); +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_linear, NULL, PSU_FAN1_SPEED); + + + static struct attribute *cpr_4011_4mxx_attributes[] = { &sensor_dev_attr_psu_v_in.dev_attr.attr, &sensor_dev_attr_psu_v_out.dev_attr.attr, @@ -104,6 +119,17 @@ static struct attribute *cpr_4011_4mxx_attributes[] = { &sensor_dev_attr_psu_fan1_fault.dev_attr.attr, &sensor_dev_attr_psu_fan1_duty_cycle_percentage.dev_attr.attr, &sensor_dev_attr_psu_fan1_speed_rpm.dev_attr.attr, + /*Duplicate nodes for lm-sensors.*/ + &sensor_dev_attr_in1_input.dev_attr.attr, + &sensor_dev_attr_in2_input.dev_attr.attr, + &sensor_dev_attr_curr1_input.dev_attr.attr, + &sensor_dev_attr_curr2_input.dev_attr.attr, + &sensor_dev_attr_power1_input.dev_attr.attr, + &sensor_dev_attr_power2_input.dev_attr.attr, + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_fan1_fault.dev_attr.attr, + &sensor_dev_attr_pwm1_input.dev_attr.attr, + &sensor_dev_attr_fan1_input.dev_attr.attr, NULL }; From 24e65cc393c3aae7937f56ea76a65a5847178af1 Mon Sep 17 00:00:00 2001 From: jostar-yang Date: Thu, 15 Aug 2019 15:50:13 +0800 Subject: [PATCH 21/54] [devices]: Add support fpga drv and pimutility for minipack platform (#3053) --- .../plugins/led_control.py | 59 ++ .../plugins/sfputil.py | 104 +++- .../minipack/classes/pimutil.py | 578 ++++++++++++++++++ .../minipack/lib/fbfpgaiomodule.c | 126 ++++ .../service/minipack-setup-qsfp-oom.service | 16 + .../minipack/setup.py | 6 +- .../minipack/utils/accton_minipack_util.py | 45 +- .../minipack/utils/setup_qsfp_eeprom.py | 317 ++++++++++ 8 files changed, 1184 insertions(+), 67 deletions(-) create mode 100755 device/accton/x86_64-accton_minipack-r0/plugins/led_control.py mode change 100644 => 100755 device/accton/x86_64-accton_minipack-r0/plugins/sfputil.py create mode 100755 platform/broadcom/sonic-platform-modules-accton/minipack/classes/pimutil.py create mode 100755 platform/broadcom/sonic-platform-modules-accton/minipack/lib/fbfpgaiomodule.c create mode 100644 platform/broadcom/sonic-platform-modules-accton/minipack/service/minipack-setup-qsfp-oom.service mode change 100644 => 100755 platform/broadcom/sonic-platform-modules-accton/minipack/setup.py create mode 100755 platform/broadcom/sonic-platform-modules-accton/minipack/utils/setup_qsfp_eeprom.py diff --git a/device/accton/x86_64-accton_minipack-r0/plugins/led_control.py b/device/accton/x86_64-accton_minipack-r0/plugins/led_control.py new file mode 100755 index 000000000000..26e2a7f7c8a2 --- /dev/null +++ b/device/accton/x86_64-accton_minipack-r0/plugins/led_control.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# +# led_control.py +# +# Platform-specific LED control functionality for SONiC +# + +try: + from sonic_led.led_control_base import LedControlBase + import swsssdk + import threading + import os + import logging + import struct + import time + import syslog + from socket import * + from select import * + from minipack.pimutil import PimUtil +except ImportError, e: + raise ImportError(str(e) + " - required module not found") + + +class LedControl(LedControlBase): + """Platform specific LED control class""" + SONIC_PORT_NAME_PREFIX = "Ethernet" + + + def __init__(self): + pim=PimUtil() + pim.init_pim_fpga() + + def _port_name_to_index(self, port_name): + # Strip "Ethernet" off port name + if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX): + return -1 + + port_idx = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) + return port_idx + + def _port_state_to_mode(self, port_idx, state): + if state == "up": + return 1, 4 #port linkup, led is green + else: + return 0, 0 #port linkdown, led is off + + def port_link_state_change(self, portname, state): + pim=PimUtil() + port_idx = self._port_name_to_index(portname) + new_control, led_mode = self._port_state_to_mode(port_idx, state) + color, control=pim.get_port_led(port_idx) + + if color==led_mode: + if control==new_control: + return + + pim.set_port_led(port_idx, led_mode, new_control)#port linkup, led is green + #port linkdown, led is off + diff --git a/device/accton/x86_64-accton_minipack-r0/plugins/sfputil.py b/device/accton/x86_64-accton_minipack-r0/plugins/sfputil.py old mode 100644 new mode 100755 index 16105acbf78a..6f62d8ed4c07 --- a/device/accton/x86_64-accton_minipack-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_minipack-r0/plugins/sfputil.py @@ -6,6 +6,9 @@ try: import time from sonic_sfp.sfputilbase import SfpUtilBase + import os + import sys, getopt + from minipack.pimutil import PimUtil except ImportError as e: raise ImportError("%s - required module not found" % str(e)) @@ -16,7 +19,7 @@ class SfpUtil(SfpUtilBase): PORT_START = 0 PORT_END = 128 - BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/" + LOCAL_OOM_PATH = "/usr/local/bin/minipack_qsfp/port%d_eeprom" _port_to_is_present = {} _port_to_lp_mode = {} @@ -53,42 +56,91 @@ def sfp_map(self, index): def __init__(self): - eeprom_path = self.BASE_OOM_PATH + "eeprom" - - for x in range(0, self.port_end+1): - bus = self.sfp_map(x) - self.port_to_eeprom_mapping[x] = eeprom_path.format( - bus) + for x in range(0, self.port_end): + self.port_to_eeprom_mapping[x] = self.LOCAL_OOM_PATH %x SfpUtilBase.__init__(self) + pim=PimUtil() + pim.init_pim_fpga() + + def __del__(self): + self.value=0 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 - eeprom_path = self.port_to_eeprom_mapping[port_num] - with open(eeprom_path) as f: - try: - content = f.read(1) - except IOError as e: - #Not print any error, for if any, treat as Not present. - return False - return True - + pim=PimUtil() + status=pim.get_qsfp_presence(port_num) + return status + def get_low_power_mode(self, port_num): - raise NotImplementedError + if port_num < self.port_start or port_num > self.port_end: + return False + + pim=PimUtil() + return pim.get_low_power_mode(port_num) def set_low_power_mode(self, port_num, lpmode): - raise NotImplementedError + if port_num < self.port_start or port_num > self.port_end: + return False + pim=PimUtil() + pim.set_low_power_mode(port_num, lpmode) + return True def reset(self, port_num): - raise NotImplementedError + if port_num < self.port_start or port_num > self.port_end: + return False + pim=PimUtil() + pim.reset(port_num) + return True + + def get_transceiver_change_event(self, timeout=0): + pim=PimUtil() + start_time = time.time() + port_dict = {} + forever = False - 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 + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print "get_transceiver_change_event:Invalid timeout value", timeout + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print 'get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + change_status=0 + port_dict = pim.get_qsfp_interrupt() + present=0 + for key, value in port_dict.iteritems(): + if value==1: + present=self.get_presence(key) + change_status=1 + if present: + port_dict[key]='1' + else: + port_dict[key]='0' + + if change_status: + return True, port_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, {} + print "get_evt_change_event: Should not reach here." + return False, {} diff --git a/platform/broadcom/sonic-platform-modules-accton/minipack/classes/pimutil.py b/platform/broadcom/sonic-platform-modules-accton/minipack/classes/pimutil.py new file mode 100755 index 000000000000..778ff76afd19 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/minipack/classes/pimutil.py @@ -0,0 +1,578 @@ +# Copyright (c) 2019 Edgecore Networks Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT +# LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS +# FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. +# +# See the Apache Version 2.0 License for specific language governing +# permissions and limitations under the License. + +# ------------------------------------------------------------------ +# HISTORY: +# mm/dd/yyyy (A.D.) +# 5/29/2019: Jostar create for minipack +# ----------------------------------------------------------- +try: + import os + import sys, getopt + import subprocess + import click + import imp + import logging + import logging.config + import logging.handlers + import types + import time # this is only being used as part of the example + import traceback + from tabulate import tabulate + import fbfpgaio + import re + import time + from select import select + #from ctypes import fbfpgaio + +except ImportError as e: + raise ImportError('%s - required module not found' % str(e)) + + +# pimutil.py +# +# Platform-specific PIM interface for SONiC +# + +iob = { + "revision": 0x0, + "scratchpad": 0x4, + "interrupt_status": 0x2C, + "pim_status": 0x40, + "pim_present_intr_mask": 0x44, +} + +dom_base = [ + 0xFFFFFFFF, # Padding + 0x40000, + 0x48000, + 0x50000, + 0x58000, + 0x60000, + 0x68000, + 0x70000, + 0x78000, +] + + +dom = { + "revision": 0x0, + "system_led": 0xC, + "intr_status": 0x2C, + "qsfp_present": 0x48, + "qsfp_present_intr": 0x50, + "qsfp_present_intr_mask": 0x58, + "qsfp_intr": 0x60, + "qsfp_intr_mask": 0x68, + "qsfp_reset": 0x70, + "qsfp_lp_mode": 0x78, + "device_power_bad_status": 0x90, + "port_led_color_profile": { + 0: 0x300, + 1: 0x300, + 2: 0x304, + 3: 0x304, + 4: 0x308, + 5: 0x308, + 6: 0x30C, + 7: 0x30C, + }, + "port_led_control": { + 1: 0x310, + 2: 0x314, + 3: 0x318, + 4: 0x31C, + 5: 0x320, + 6: 0x324, + 7: 0x328, + 8: 0x32C, + 9: 0x330, + 10: 0x334, + 11: 0x338, + 12: 0x33C, + 13: 0x340, + 14: 0x344, + 15: 0x348, + 16: 0x34C, + }, + "dom_control_config": 0x410, + "dom_global_status": 0x414, + "dom_data": 0x4000, + + + "mdio": { + "config": 0x0200, + "command": 0x0204, + "write": 0x0208, + "read": 0x020C, + "status": 0x0210, + "intr_mask": 0x0214, + "source_sel": 0x0218, + }, # mdio +} + +mdio_read_cmd = 0x1 +mdio_write_cmd = 0x0 +mdio_device_type = 0x1F + + +#fbfpgaio=cdll.LoadLibrary('./fbfpgaio.so') + +def init_resources(): + fbfpgaio.hw_init() + return + +def release_resources(): + fbfpgaio.hw_release() + return + +def fpga_io(offset, data=None): + if data is None: + return fbfpgaio.hw_io(offset) + else: + fbfpgaio.hw_io(offset, data) + return + +def pim_io(pim, offset, data=None): + global dom_base + target_offset = dom_base[pim]+offset + if data is None: + retval = fpga_io(target_offset) + #print ("0x%04X" % retval) # idebug + return retval + else: + retval = fpga_io(target_offset, data) + return retval + + +def show_pim_present(): + pim_status = fpga_io(iob["pim_status"]) + + header = "PIM # " + status_str = " " + for shift in range(0,8): + status = pim_status & (0x10000 << shift) #[23:16] from pim_0 to pim_7 + header += " %d " % (shift+1) + if status: + status_str += (" | ") + else: + status_str += (" X ") + print(header) + print(status_str) + +def show_qsfp_present_status(pim_num): + status = fpga_io(dom_base[pim_num]+dom["qsfp_present"]) + interrupt = fpga_io(dom_base[pim_num]+dom["qsfp_present_intr"]) + mask = fpga_io(dom_base[pim_num]+dom["qsfp_present_intr_mask"]) + + print + print(" (0x48) (0x50) (0x58)") + print(" 0x%08X 0x%08X 0x%08X" %(status, interrupt, mask)) + print(" Status Interrupt Mask") + for row in range(8): + output_str = str() + status_left = bool(status & (0x1 << row*2)) + status_right = bool(status & (0x2 << row*2)) + interrupt_left = bool(interrupt & (0x1 << row*2)) + interrupt_right = bool(interrupt & (0x2 << row*2)) + mask_left = bool(mask & (0x1 << row*2)) + mask_right = bool(mask & (0x2 << row*2)) + print("%2d: %d %d %d %d %d %d" % \ + (row*2+1, status_left, status_right, \ + interrupt_left, interrupt_right, \ + mask_left, mask_right)) + print + + + +#pim_index start from 0 to 7 +#port_index start from 0 to 127. Each 16-port is to one pim card. +class PimUtil(object): + + PORT_START = 0 + PORT_END = 127 + + def __init__(self): + self.value=1 + + def __del__(self): + self.value=0 + + def init_pim_fpga(self): + init_resources() + + def release_pim_fpga(self): + release_resources() + + def get_pim_by_port(self, port_num): + if port_num < self.PORT_START or port_num > self.PORT_END: + return False + pim_num=port_num/16 + return True, pim_num+1 + + def get_onepimport_by_port(self, port_num): + if port_num < self.PORT_START or port_num > self.PORT_END: + return False + if port_num < 16: + return True, port_num + else: + return True, port_num%16 + + def get_pim_presence(self, pim_num): + if pim_num <0 or pim_num > 7: + return 0 + pim_status = fpga_io(iob["pim_status"]) + status = pim_status & (0x10000 << pim_num) + if status: + return 1 #present + else: + return 0 #not present + + #return code=0:100G. return code=1:400G + def get_pim_board_id(self, pim_num): + if pim_num <0 or pim_num > 7: + return False + board_id = fpga_io(dom_base[pim_num+1]+dom["revision"]) + board_id = board_id & 0x1 + if board_id==0x0: + return 0 + else: + return 1 + + + def get_pim_status(self, pim_num): + if pim_num <0 or pim_num > 7: + return 0xFF + power_status =0 + #device_power_bad_status + status=fpga_io(dom_base[pim_num+1]+dom["device_power_bad_status"]) + + for x in range(0, 5): + if status & ( (0xf) << (4*x) ) : + power_status = power_status | (0x1 << x) + + if ( status & 0x1000000): + power_status=power_status | (0x1 << 5) + if ( status & 0x2000000): + power_status=power_status | (0x1 << 6) + if ( status & 0x8000000): + power_status=power_status | (0x1 << 7) + if ( status & 0x10000000): + power_status=power_status | (0x1 << 8) + if ( status & 0x40000000): + power_status=power_status | (0x1 << 9) + if ( status & 0x80000000): + power_status=power_status | (0x1 << 10) + + return power_status + #path=0:MDIO path is set on TH3. path=1:MDIO path is set on FPGA. + def set_pim_mdio_source_sel(self, pim_num, path): + if pim_num <0 or pim_num > 7: + return False + status= pim_io(pim_num+1, dom["mdio"]["source_sel"]) + + if path==1: + status = status | 0x2 + else: + status = status & 0xfffffffd + + pim_io(pim_num+1, dom["mdio"]["source_sel"], status) + return True + #retrun code=0, path is TH3. retrun code=1, path is FPGA + def get_pim_mdio_source_sel(sefl, pim_num): + if pim_num <0 or pim_num > 7: + return False + path= pim_io(pim_num+1, dom["mdio"]["source_sel"]) + path = path & 0x2 + if path: + return 1 + else: + return 0 + + #This api will set mdio path to MAC side.(At default, mdio path is set to FPGA side). + def pim_init(self, pim_num): + if pim_num <0 or pim_num > 7: + return False + status=self.set_pim_mdio_source_sel(pim_num, 0) + #put init phy cmd here + + + #return code="pim_dict[pim_num]='1' ":insert evt. return code="pim_dict[pim_num]='0' ":remove evt + def get_pim_change_event(self, timeout=0): + start_time = time.time() + pim_dict = {} + forever = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print "get_transceiver_change_event:Invalid timeout value", timeout + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print 'get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout + + return False, {} # Time wrap or possibly incorrect timeout + + pim_mask_status = fpga_io(iob["pim_present_intr_mask"], 0xffff00000) + + while timeout >= 0: + new_pim_status=0 + pim_status = fpga_io(iob["pim_status"]) + present_status= pim_status & 0xff0000 + change_status=pim_status & 0xff + interrupt_status = fpga_io(iob["interrupt_status"]) + + for pim_num in range(0,8): + if change_status & (0x1 << pim_num) : + status = present_status & (0x10000 << pim_num) + new_pim_status = new_pim_status | (0x1 << pim_num) #prepare to W1C to clear + if status: + pim_dict[pim_num]='1' + else: + pim_dict[pim_num]='0' + + if change_status: + new_pim_status = pim_status | new_pim_status #Write one to clear interrupt bit + fpga_io(iob["pim_status"], new_pim_status) + return True, pim_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, {} + print "get_evt_change_event: Should not reach here." + return False, {} + + + def get_pim_max_number(self): + return 8 + + #pim_num start from 0 to 7 + #color:0=amber, 1=blue + #contrl:off(0),on(1), flash(2) + def set_pim_led(self, pim_num, color, control): + if pim_num <0 or pim_num > 7: + return False + + led_val=fpga_io(dom_base[pim_num+1]+dom["system_led"]) + + if color==1: + led_val = led_val | (0x8000 | 0x4000) #blue + elif color==0: + led_val = (led_val & ( ~ 0x8000)) | 0x4000 #amber + else: + print "Set RGB control to Green1" + led_val = led_val & (~ 0x4000) + led_val = led_val & (~ 0xfff) + led_val = led_val | 0x0f0 #B.G.R Birghtness, set to Green + + if control==0: + led_val = led_val & ( ~ 0x3000) #Off + elif control==1: + led_val = led_val & ( ~ 0x3000) #Off + led_val = led_val | 0x1000 #On + else: + led_val = led_val | 0x3000 #Flash + + fpga_io(dom_base[pim_num+1]+dom["system_led"], led_val) + + def get_qsfp_presence(self, port_num): + #xlate port to get pim_num + status, pim_num=self.get_pim_by_port(port_num) + + if status==0: + return False + else: + present = fpga_io(dom_base[pim_num]+dom["qsfp_present"]) + status, shift = self.get_onepimport_by_port(port_num) + if status==0: + return False + else: + if bool(present & (0x1 << shift)): + return 1 #present + else: + return 0 #not present + + #return code: low_power(1) or high_power(0) + def get_low_power_mode(self, port_num): + status, pim_num=self.get_pim_by_port(port_num) + + if status==0: + return False + else: + lp_mode = fpga_io(dom_base[pim_num]+dom["qsfp_lp_mode"]) + + status, shift=self.get_onepimport_by_port(port_num) + if status==0: + return False + else: + if (lp_mode & (0x1 << shift)): + return 1 #low + else: + return 0 #high + + #lpmode=1 to hold QSFP in low power mode. lpmode=0 to release QSFP from low power mode. + def set_low_power_mode(self, port_num, mode): + status, pim_num=self.get_pim_by_port(port_num) + if status==0: + return False + val = fpga_io(dom_base[pim_num]+dom["qsfp_lp_mode"]) + status, shift=self.get_onepimport_by_port(port_num) + if status==0: + return False + else: + if mode==0: + new_val = val & (~(0x1 << shift)) + else: + new_val=val|(0x1 << shift) + status=fpga_io(dom_base[pim_num]+dom["qsfp_lp_mode"], new_val) + return status + + #port_dict[idx]=1 means get interrupt(change evt), port_dict[idx]=0 means no get interrupt + def get_qsfp_interrupt(self): + port_dict={} + #show_qsfp_present_status(1) + for pim_num in range(0, 8): + fpga_io(dom_base[pim_num+1]+dom["qsfp_present_intr_mask"], 0xffff0000) + fpga_io(dom_base[pim_num+1]+dom["qsfp_intr_mask"], 0xffff0000) + for pim_num in range(0, 8): + clear_bit=0 + qsfp_present_intr_status = fpga_io(dom_base[pim_num+1]+dom["qsfp_present_intr"]) + interrupt_status = qsfp_present_intr_status & 0xffff + #time.sleep(2) + if interrupt_status: + for idx in range (0,16): + port_idx=idx + (pim_num*16) + if interrupt_status & (0x1< +#include +#include +#include +#include + +//#define IDEBUG(...) printf(__VA_ARGS__) +#define IDEBUG(...) + +#define FPGA_RESOURCE_NODE "/sys/devices/pci0000:00/0000:00:03.0/0000:05:00.0/resource0" +#define FPGA_RESOURCE_LENGTH 0x80000 + + +static int hw_handle = -1; +static void *io_base = NULL; + +static PyObject *fbfpgaio_hw_init(PyObject *self) +{ + const char fpga_resource_node[] = FPGA_RESOURCE_NODE; + + /* Open hardware resource node */ + hw_handle = open(fpga_resource_node, O_RDWR|O_SYNC); + if (hw_handle == -1) { + IDEBUG("[ERROR] %s: open hw resource node\n", __func__); + return Py_False; + } + + IDEBUG("[PASS] %s: open hw resource node\n", __func__); + + /* Mapping hardware resource */ + io_base = mmap(NULL, FPGA_RESOURCE_LENGTH, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_NORESERVE, hw_handle, 0); + if (io_base == MAP_FAILED) { + IDEBUG("[ERROR] %s: mapping resource node\n", __func__); + perror("map_failed"); + fprintf(stderr,"%d %s\\n",errno,strerror(errno)); + return Py_False; + } + + IDEBUG("[PASS] %s: mapping resource node\n", __func__); + + return Py_True; +} + +static PyObject *fbfpgaio_hw_release(PyObject *self) +{ + int retval = 0; + + if ((io_base != NULL) && (io_base != MAP_FAILED)) { + retval = munmap(io_base, FPGA_RESOURCE_LENGTH); + if (retval == 0) { + IDEBUG("[PASS] %s: Unmapping hardware resources\n", __func__); + close(hw_handle); + return Py_True; + } + } + + IDEBUG("[ERROR] %s: unmapping resource node\n", __func__); + return Py_False; +} + +static PyObject *fbfpgaio_hw_io(PyObject *self, PyObject *args) +{ + void *offset = NULL; + /* We are not able to diffrentiate the input data between an unsigned value or a + 'None' object. We assume that the input data (if any) will be an unsigned integer. + The default value of 'data' is larger than the max. number of unsigned integer. + This value signify that the caller of this function does not input a data argument. */ + unsigned long input_data = 0x1FFFFFFFF; + + if (!PyArg_ParseTuple(args, "I|k", &offset, &input_data)) { + return NULL; + } + + if (input_data == 0x1FFFFFFFF) { + // Read operation + IDEBUG("Read operation\n"); + unsigned int *address = (unsigned int *) ((unsigned long) io_base + (unsigned long) offset); + return Py_BuildValue("k", *address); + } else { + // Write operation + IDEBUG("Write operation\n"); + unsigned int *address = (unsigned int *) ((unsigned long) io_base + (unsigned long) offset); + unsigned int data = (unsigned int) (input_data & 0xFFFFFFFF); + *address = data; + + Py_INCREF(Py_None); + return Py_None; + } +} + +static PyMethodDef FbfpgaMethods[] = { + { "hw_init", (PyCFunction) fbfpgaio_hw_init, METH_NOARGS, "Initialize resources for accessing FPGA" }, + { "hw_release", (PyCFunction) fbfpgaio_hw_release, METH_NOARGS, "Release resources for accessing FPGA" }, + { "hw_io", fbfpgaio_hw_io, METH_VARARGS, "Access FPGA" }, + { NULL, NULL, 0, NULL }, +}; + +PyMODINIT_FUNC +initfbfpgaio(void) +{ + char docstr[] = "\ +1. hw_init():\n\ + return value: True/False\n\ +2. hw_release():\n\ + return value: True/False\n\ +3. hw_io(offset,[data])\n\ + return value:\n\ + In reading operation: data which is read from FPGA\n\ + In writing operation: None\n"; + + (void) Py_InitModule3("fbfpgaio", FbfpgaMethods, docstr); +} diff --git a/platform/broadcom/sonic-platform-modules-accton/minipack/service/minipack-setup-qsfp-oom.service b/platform/broadcom/sonic-platform-modules-accton/minipack/service/minipack-setup-qsfp-oom.service new file mode 100644 index 000000000000..df1c961bf181 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/minipack/service/minipack-setup-qsfp-oom.service @@ -0,0 +1,16 @@ +[Unit] +Description=Accton MiniPack Platform setup qsfp oom service +Before=pmon.service +After=minipack-platform-init.service +DefaultDependencies=no + +[Service] +ExecStart=/usr/local/bin/setup_qsfp_eeprom.py +KillSignal=SIGKILL +SuccessExitStatus=SIGKILL + +# Resource Limitations +LimitCORE=infinity + +[Install] +WantedBy=multi-user.target diff --git a/platform/broadcom/sonic-platform-modules-accton/minipack/setup.py b/platform/broadcom/sonic-platform-modules-accton/minipack/setup.py old mode 100644 new mode 100755 index aca53ea12798..b5d08c090bab --- a/platform/broadcom/sonic-platform-modules-accton/minipack/setup.py +++ b/platform/broadcom/sonic-platform-modules-accton/minipack/setup.py @@ -2,9 +2,11 @@ import os import sys -from setuptools import setup +from setuptools import setup, Extension os.listdir +module1 = Extension("fbfpgaio", sources = ["minipack/lib/fbfpgaiomodule.c"]) + setup( name='minipack', version='1.0', @@ -12,5 +14,7 @@ packages=['minipack'], package_dir={'minipack': 'minipack/classes'}, + ext_modules=[module1], + ) diff --git a/platform/broadcom/sonic-platform-modules-accton/minipack/utils/accton_minipack_util.py b/platform/broadcom/sonic-platform-modules-accton/minipack/utils/accton_minipack_util.py index 6f3485579c52..261074c5d99a 100755 --- a/platform/broadcom/sonic-platform-modules-accton/minipack/utils/accton_minipack_util.py +++ b/platform/broadcom/sonic-platform-modules-accton/minipack/utils/accton_minipack_util.py @@ -238,7 +238,7 @@ def device_install(): for i in range(0,len(mknod)): #for pca932x need times to built new i2c buses if mknod[i].find('pca954') != -1: - time.sleep(1) + time.sleep(2) status, output = log_os_system(mknod[i], 1) if status: @@ -246,49 +246,14 @@ def device_install(): if FORCE == 0: return status - # initialize multiplexer for 8 PIMs - cmdl = "echo pca9548 0x%x > /sys/bus/i2c/devices/i2c-%d/new_device" - for pim in range(2, 10): - cmdm = cmdl % (0x72, pim) - status, output =log_os_system(cmdm, 1) - cmdm = cmdl % (0x71, pim) - status, output =log_os_system(cmdm, 1) - - for i in range(0, NO_QSFP): - bus = sfp_map(i) - status, output =log_os_system( - "echo optoe1 0x50 > /sys/bus/i2c/devices/i2c-"+str(bus)+"/new_device", 1) - if status: - print output - if FORCE == 0: - return status - status, output =log_os_system( - "echo port"+str(i+1)+" > /sys/bus/i2c/devices/"+str(bus)+"-0050/port_name", 1) - if status: - print output - if FORCE == 0: - return status + rm_cmd="rm -rf /usr/local/bin/minipack_qsfp > /dev/null 2>&1" + log_os_system(rm_cmd, 1) + mk_cmd= "mkdir /usr/local/bin/minipack_qsfp" + log_os_system(mk_cmd, 1) return def device_uninstall(): - for i in range(0,NO_QSFP): - bus = sfp_map(i) - target = "/sys/bus/i2c/devices/i2c-"+str(bus)+"/delete_device" - status, output =log_os_system("echo 0x50 > "+ target, 1) - if status: - print output - if FORCE == 0: - return status - - # Multiplexer for 8 PIMs - cmdl = "echo 0x%x > /sys/bus/i2c/devices/i2c-%d/delete_device" - for pim in range(2, 10): - cmdm = cmdl % (0x72, pim) - status, output =log_os_system(cmdm, 1) - cmdm = cmdl % (0x71, pim) - status, output =log_os_system(cmdm, 1) - nodelist = mknod for i in range(len(nodelist)): target = nodelist[-(i+1)] diff --git a/platform/broadcom/sonic-platform-modules-accton/minipack/utils/setup_qsfp_eeprom.py b/platform/broadcom/sonic-platform-modules-accton/minipack/utils/setup_qsfp_eeprom.py new file mode 100755 index 000000000000..84388520b902 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/minipack/utils/setup_qsfp_eeprom.py @@ -0,0 +1,317 @@ +#!/usr/bin/env python +# +# Copyright (c) 2019 Edgecore Networks Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +# +# THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT +# LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS +# FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. +# +# See the Apache Version 2.0 License for specific language governing +# permissions and limitations under the License. + +# ------------------------------------------------------------------ +# HISTORY: +# mm/dd/yyyy (A.D.) +# 7/22/2019: Jostar create for minipack +# ------------------------------------------------------------------ + +try: + import os + import sys, getopt + import subprocess + import subprocess + import click + import imp + import commands + import logging + import logging.config + import logging.handlers + import types + import time # this is only being used as part of the example + import traceback + from tabulate import tabulate + from minipack.pimutil import PimUtil +except ImportError as e: + raise ImportError('%s - required module not found' % str(e)) + +#2:idle state. 1:insert state, 0:remove state. +pim_state=[2,2,2,2,2,2,2,2] + +# port_use_i2c_bus[idx], idx means port_idx. Idx start from 0 to 127 +# port_use_i2c_bus[0] means port0 use i2c-device number +# port_use_i2c_bus[1] means port1 use i2c-device number +#At default , port_use_i2c_bus are 0. When PIM insert, it will no be 0 +port_use_i2c_bus= [0] * 128 + +#pim_port_use_bus[idx] are for 8 channel use. At default, pim_port_use_bus[idx]=0 +#pim_port_use_bus[idx] will save pim_idx(0 to 7). +#setup service will check when pim insert at first time. +#It will find +# 1. Does this pim card insert or not in the past. So it will check pim_port_use_bus[idx] +# 2. If make sure that pim_port_use_bus[idx]==0. Assgin oom start i2c dev numer to pim_port_use_bus[idx]. +#Never set pim_port_use_bus[idx] to 0 +#So if pim next insert, it need to check whether pim_port_use_bus[idx] is 0 or not. +#if pim_port_use_bus[idx]!=0, means this pim card has setup oom sysfs +pim_port_use_bus=[0] * 8 + +oom_i2c_bus_table=1 + +pim_dev=PimUtil() + +# Deafults +VERSION = '1.0' +FUNCTION_NAME = '/usr/local/bin/setup_qsfp_eeprom' +DEBUG = False +PIM_MIN=0 +PIM_MAX=8 + +def my_log(txt): + if DEBUG == True: + print "[ACCTON DBG]: "+txt + return + +def log_os_system(cmd): + logging.info('Run :'+cmd) + status = 1 + output = "" + status, output = commands.getstatusoutput(cmd) + if status: + logging.info('Failed :'+cmd) + return status, output + +def qsfp_map_bus(idx): + port = idx + 1 + base = ((port-1)/8*8) + 10 + idx = (port - 1) % 8 + idx = 7 - idx + if (idx%2): + idx = idx -1 + else: + idx = idx +1 + bus = base + idx + return bus + +def pca9548_sysfs(i2c_bus, create): + if create==1: + cmdl = "echo pca9548 0x%x > /sys/bus/i2c/devices/i2c-%d/new_device" + else: + cmdl = "echo 0x%x > /sys/bus/i2c/devices/i2c-%d/delete_device" + + cmdm = cmdl % (0x72, i2c_bus) + status1, output =log_os_system(cmdm) + cmdm = cmdl % (0x71, i2c_bus) + status2, output =log_os_system(cmdm) + return (status1 | status2) + + +def qsfp_eeprom_sys(pim_idx, i2c_bus_order, create): + # initialize multiplexer for 8 PIMs + global port_use_i2c_bus + start_port=pim_idx*16 + end_port = (pim_idx+1)*16 + start_bus=(i2c_bus_order-1)*16 + end_bus = i2c_bus_order*16 + k=start_port + for i in range(start_bus, end_bus): + bus = qsfp_map_bus(i) + if create==1: + status, output =log_os_system( + "echo optoe1 0x50 > /sys/bus/i2c/devices/i2c-"+str(bus)+"/new_device") + if status: + print output + return 1 + status, output =log_os_system( + "echo port"+str(k+1)+" > /sys/bus/i2c/devices/"+str(bus)+"-0050/port_name") + + status, output =log_os_system( + "ln -s -f /sys/bus/i2c/devices/"+str(bus)+"-0050/eeprom" + " /usr/local/bin/minipack_qsfp/port" + str(k) + "_eeprom") + if status: + print output + return 1 + else: + status, output =log_os_system( + "echo 0x50 > /sys/bus/i2c/devices/i2c-"+str(bus)+"/delete_device") + if status: + print output + + k=k+1 + + return 0 + +def check_pca_active( i2c_addr, bus): + cmd = "i2cget -y -f %d 0x%x 0x0" + cmd = cmd %(bus, i2c_addr) + status, output = commands.getstatusoutput(cmd) + return status + +def set_pim_port_use_bus(pim_idx): + + global pim_port_use_bus + global oom_i2c_bus_table + + if pim_port_use_bus[pim_idx]!=0: + return 0 + + pim_port_use_bus[pim_idx]=oom_i2c_bus_table + oom_i2c_bus_table=oom_i2c_bus_table+1 + + return pim_port_use_bus[pim_idx] + + +def del_pim_port_use_bus(pim_idx): + global oom_i2c_bus_table + + oom_i2c_bus_table=oom_i2c_bus_table-1 + pim_port_use_bus[pim_idx]=0 + + +def device_remove(): + cmd1 = "echo 0x%x > /sys/bus/i2c/devices/i2c-%d/delete_device" + + for bus in range(2, 10): + #ret=check_pca_active(0x72, bus) + #if ret==0: + + cmdm= cmd1 % (0x72, bus) + status, output = commands.getstatusoutput(cmdm) + print "Remove %d-0072 i2c device"%bus + cmdm= cmd1 % (0x71, bus) + status, output = commands.getstatusoutput(cmdm) + print "Remove %d-0071 i2c device"%bus + + cmd="rm -f /usr/local/bin/minipack_qsfp/port*" + status, output=log_os_system(cmd) + return status + +class device_monitor(object): + + PIM_STATE_REMOVE = 0 + PIM_STATE_INSERT = 1 + PIM_STATE_IDLE=2 + + def __init__(self, log_file, log_level): + """Needs a logger and a logger level.""" + # set up logging to file + logging.basicConfig( + filename=log_file, + filemode='w', + level=log_level, + format= '[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s', + datefmt='%H:%M:%S' + ) + # set up logging to console + if log_level == logging.DEBUG: + console = logging.StreamHandler() + console.setLevel(log_level) + formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') + console.setFormatter(formatter) + logging.getLogger('').addHandler(console) + + sys_handler = handler = logging.handlers.SysLogHandler(address = '/dev/log') + sys_handler.setLevel(logging.WARNING) + logging.getLogger('').addHandler(sys_handler) + + #logging.debug('SET. logfile:%s / loglevel:%d', log_file, log_level) + + def manage_pim(self): + global pim_dev + global pim_state + + for pim_idx in range(PIM_MIN, PIM_MAX): + presence=pim_dev.get_pim_presence(pim_idx) + if presence==1: + if pim_state[pim_idx]!=self.PIM_STATE_INSERT: + #find which i2c_device can use. It start from 2 + i2c_bus_order=set_pim_port_use_bus(pim_idx) + if i2c_bus_order==0: + logging.info("pim_state[%d] PIM_STATE_INSERT", pim_idx); + pim_state[pim_idx]=self.PIM_STATE_INSERT + continue + + logging.info ("pim_idx=%d oom use i2c_bus_order=%d", pim_idx, i2c_bus_order) + ready=0 + retry_limit=100 + retry_count=0 + while retry_count < retry_limit: + ret=check_pca_active(0x72, pim_idx+2) + if ret==0: + ready=1 + break + retry_count=retry_count+1 + time.sleep(0.2) + + if ready==1: + status=pca9548_sysfs(pim_idx+2, 1) + if status: + status=pca9548_sysfs(pim_idx+2, 0) #del pca i2c device, give up set oom at this time. + del_pim_port_use_bus(pim_idx) + continue + status=qsfp_eeprom_sys(pim_idx,i2c_bus_order, 1) + if status: + status=pca9548_sysfs(pim_idx+2, 0) #del pca i2c device, give up set oom at this time. + del_pim_port_use_bus(pim_idx) + continue + #ret_2=check_pca_active(0x72, pim_idx+2) + #ret_1=check_pca_active(0x71, pim_idx+2) + + pim_state[pim_idx]=self.PIM_STATE_INSERT + logging.info("pim_state[%d] PIM_STATE_INSERT", pim_idx); + else: + print "retry check 100 times for check pca addr" + del_pim_port_use_bus(pim_idx) + else: + if pim_state[pim_idx]==self.PIM_STATE_INSERT: + #pca9548_sysfs(pim_idx+2, 0) + pim_state[pim_idx]=self.PIM_STATE_REMOVE + logging.info("pim_state[%d] PIM_STATE_REMOVE", pim_idx); + +def main(argv): + log_file = '%s.log' % FUNCTION_NAME + log_level = logging.INFO + remove_dev=0 + cpu_pca_i2c_ready=0 + + if len(sys.argv) != 1: + try: + opts, args = getopt.getopt(argv,'hdlr',['lfile=']) + except getopt.GetoptError: + print 'A:Usage: %s [-d] [-l ]' % sys.argv[0] + return 0 + for opt, arg in opts: + if opt == '-h': + print 'B:Usage: %s [-d] [-l ]' % sys.argv[0] + return 0 + elif opt in ('-d', '--debug'): + log_level = logging.DEBUG + elif opt in ('-l', '--lfile'): + log_file = arg + elif opt in ('-r', '--remove'): + remove_dev=1 + + if remove_dev==1: + device_remove() + return 0 + monitor = device_monitor(log_file, log_level) + global pim_dev + pim_dev.init_pim_fpga() + + while cpu_pca_i2c_ready==0: + status=check_pca_active(0x70, 1) + time.sleep(0.5) + if status==0: + cpu_pca_i2c_ready=1 + print "Make sure CPU pca i2c device is ready" + break + + while True: + monitor.manage_pim() + time.sleep(2) + + +if __name__ == "__main__": + main(sys.argv[1:]) From bd3a8bf0007e6bd6066d7cf90d36ba8b944b8959 Mon Sep 17 00:00:00 2001 From: linalvin <45193981+linalvin@users.noreply.github.com> Date: Thu, 15 Aug 2019 16:00:52 +0800 Subject: [PATCH 22/54] [device][platform] Update Inventec new platform d6356 (#2791) --- .../INVENTEC-D6356/port_config.ini | 57 + .../INVENTEC-D6356/sai.profile | 2 + .../td3-d6356-48x25G-8x100G.config.bcm | 398 + .../x86_64-inventec_d6356-r0/default_sku | 1 + .../x86_64-inventec_d6356-r0/installer.conf | 4 + .../led_proc_init.soc | 6 + .../plugins/eeprom.py | 22 + .../plugins/psuutil.py | 84 + .../plugins/sfputil.py | 217 + .../x86_64-inventec_d6356-r0/sensors.conf | 106 + platform/broadcom/one-image.mk | 1 + .../broadcom/platform-modules-inventec.mk | 8 +- .../d6356/modules/Makefile | 5 + .../d6356/modules/inv_cpld.c | 950 ++ .../d6356/modules/inv_eeprom.c | 181 + .../d6356/modules/inv_mux.c | 281 + .../d6356/modules/inv_mux.h | 47 + .../d6356/modules/inv_platform.c | 275 + .../d6356/modules/inv_swps.c | 3049 ++++++ .../d6356/modules/inv_swps.h | 1164 +++ .../d6356/modules/io_expander.c | 2046 ++++ .../d6356/modules/io_expander.h | 187 + .../d6356/modules/transceiver.c | 8389 +++++++++++++++++ .../d6356/modules/transceiver.h | 815 ++ .../d6356/utils/inventec_d6356_util.py | 251 + .../debian/control | 5 + .../debian/platform-modules-d6356.init | 58 + .../debian/platform-modules-d6356.install | 1 + .../debian/rules | 2 +- 29 files changed, 18610 insertions(+), 2 deletions(-) create mode 100755 device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/port_config.ini create mode 100755 device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/sai.profile create mode 100644 device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/td3-d6356-48x25G-8x100G.config.bcm create mode 100644 device/inventec/x86_64-inventec_d6356-r0/default_sku create mode 100644 device/inventec/x86_64-inventec_d6356-r0/installer.conf create mode 100644 device/inventec/x86_64-inventec_d6356-r0/led_proc_init.soc create mode 100644 device/inventec/x86_64-inventec_d6356-r0/plugins/eeprom.py create mode 100755 device/inventec/x86_64-inventec_d6356-r0/plugins/psuutil.py create mode 100755 device/inventec/x86_64-inventec_d6356-r0/plugins/sfputil.py create mode 100644 device/inventec/x86_64-inventec_d6356-r0/sensors.conf create mode 100755 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/Makefile create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_cpld.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_eeprom.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_mux.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_mux.h create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_platform.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_swps.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_swps.h create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/io_expander.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/io_expander.h create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/transceiver.c create mode 100644 platform/broadcom/sonic-platform-modules-inventec/d6356/modules/transceiver.h create mode 100755 platform/broadcom/sonic-platform-modules-inventec/d6356/utils/inventec_d6356_util.py create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d6356.init create mode 100644 platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d6356.install diff --git a/device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/port_config.ini b/device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/port_config.ini new file mode 100755 index 000000000000..ba13dd5743bc --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/port_config.ini @@ -0,0 +1,57 @@ +# name lanes alias index +Ethernet0 1 Ethernet0 0 +Ethernet1 2 Ethernet1 1 +Ethernet2 3 Ethernet2 2 +Ethernet3 4 Ethernet3 3 +Ethernet4 5 Ethernet4 4 +Ethernet5 6 Ethernet5 5 +Ethernet6 7 Ethernet6 6 +Ethernet7 8 Ethernet7 7 +Ethernet8 13 Ethernet8 8 +Ethernet9 14 Ethernet9 9 +Ethernet10 15 Ethernet10 10 +Ethernet11 16 Ethernet11 11 +Ethernet12 21 Ethernet12 12 +Ethernet13 22 Ethernet13 13 +Ethernet14 23 Ethernet14 14 +Ethernet15 24 Ethernet15 15 +Ethernet16 29 Ethernet16 16 +Ethernet17 30 Ethernet17 17 +Ethernet18 31 Ethernet18 18 +Ethernet19 32 Ethernet19 19 +Ethernet20 33 Ethernet20 20 +Ethernet21 34 Ethernet21 21 +Ethernet22 35 Ethernet22 22 +Ethernet23 36 Ethernet23 23 +Ethernet24 41 Ethernet24 24 +Ethernet25 42 Ethernet25 25 +Ethernet26 43 Ethernet26 26 +Ethernet27 44 Ethernet27 27 +Ethernet28 49 Ethernet28 28 +Ethernet29 50 Ethernet29 29 +Ethernet30 51 Ethernet30 30 +Ethernet31 52 Ethernet31 31 +Ethernet32 57 Ethernet32 32 +Ethernet33 58 Ethernet33 33 +Ethernet34 59 Ethernet34 34 +Ethernet35 60 Ethernet35 35 +Ethernet36 61 Ethernet36 36 +Ethernet37 62 Ethernet37 37 +Ethernet38 63 Ethernet38 38 +Ethernet39 64 Ethernet39 39 +Ethernet40 65 Ethernet40 40 +Ethernet41 66 Ethernet41 41 +Ethernet42 67 Ethernet42 42 +Ethernet43 68 Ethernet43 43 +Ethernet44 69 Ethernet44 44 +Ethernet45 70 Ethernet45 45 +Ethernet46 71 Ethernet46 46 +Ethernet47 72 Ethernet47 47 +Ethernet48 85,86,87,88 Ethernet48 48 +Ethernet52 77,78,79,80 Ethernet52 49 +Ethernet56 93,94,95,96 Ethernet56 50 +Ethernet60 97,98,99,100 Ethernet60 51 +Ethernet64 113,114,115,116 Ethernet64 52 +Ethernet68 105,106,107,108 Ethernet68 53 +Ethernet72 121,122,123,124 Ethernet72 54 +Ethernet76 125,126,127,128 Ethernet76 55 diff --git a/device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/sai.profile b/device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/sai.profile new file mode 100755 index 000000000000..f147d44c0b34 --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/sai.profile @@ -0,0 +1,2 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/td3-d6356-48x25G-8x100G.config.bcm +SAI_NUM_ECMP_MEMBERS=32 diff --git a/device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/td3-d6356-48x25G-8x100G.config.bcm b/device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/td3-d6356-48x25G-8x100G.config.bcm new file mode 100644 index 000000000000..f6fc4f02f1ef --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/INVENTEC-D6356/td3-d6356-48x25G-8x100G.config.bcm @@ -0,0 +1,398 @@ +### fix for sonic +ptp_ts_pll_fref=50000000 +ptp_bs_fref_0=50000000 +ptp_bs_fref_1=50000000 +### end fix + + +core_clock_frequency=1525 +dpp_clock_ratio=2:3 + +oversubscribe_mode=1 +pbmp_xport_xe=0x488787878808787fdfe1e1e1fe1e1e1fe + + +portmap_65=130:10 + +### Pipeline0, halfpipe 0 (12x25G + 2x100G) +portmap_1=1:25 +portmap_2=2:25 +portmap_3=3:25 +portmap_4=4:25 +portmap_5=5:25 +portmap_6=6:25 +portmap_7=7:25 +portmap_8=8:25 +portmap_13=13:25 +portmap_14=14:25 +portmap_15=15:25 +portmap_16=16:25 +portmap_21=21:25 +portmap_22=22:25 +portmap_23=23:25 +portmap_24=24:25 +portmap_29=29:25 +portmap_30=30:25 +portmap_31=31:25 +portmap_32=32:25 + +### Pipeline0, halfpipe 1 (12x25G + 2x100G) +portmap_33=33:25 +portmap_34=34:25 +portmap_35=35:25 +portmap_36=36:25 +portmap_41=41:25 +portmap_42=42:25 +portmap_43=43:25 +portmap_44=44:25 +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 + +### Pipeline 1 +### First management port +portmap_66=129:10:m +### Second management port +portmap_130=128:10:m +### Loopback port +portmap_131=131:10 + +### Pipeline 1, halfpipe 0 (12x25G + 2x100G) +portmap_67=65:25 +portmap_68=66:25 +portmap_69=67:25 +portmap_70=68:25 +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 + +### Pipeline 1, halfpipe 1 (12x25G + 2x100G) +portmap_99=97:100 +portmap_107=105:100 +portmap_115=113:100 +portmap_123=121:100 +portmap_127=125:100 + +l2_mem_entries=32768 +l3_mem_entries=16384 +fpem_mem_entries=16384 +l2xmsg_mode=1 + + +#dport part +dport_map_port_79=87 +dport_map_port_87=79 +dport_map_port_107=115 +dport_map_port_115=107 + +#Polarity flips after lane swaps +#rx part +#FC1 +phy_chain_rx_polarity_flip_physical{5.0}=0x1 +phy_chain_rx_polarity_flip_physical{6.0}=0x1 +phy_chain_rx_polarity_flip_physical{7.0}=0x1 +phy_chain_rx_polarity_flip_physical{8.0}=0x1 + +#FC3 +phy_chain_rx_polarity_flip_physical{13.0}=0x1 +phy_chain_rx_polarity_flip_physical{14.0}=0x1 +phy_chain_rx_polarity_flip_physical{15.0}=0x1 +phy_chain_rx_polarity_flip_physical{16.0}=0x1 + +#FC5 +phy_chain_rx_polarity_flip_physical{21.0}=0x1 +phy_chain_rx_polarity_flip_physical{22.0}=0x1 +phy_chain_rx_polarity_flip_physical{23.0}=0x1 +phy_chain_rx_polarity_flip_physical{24.0}=0x1 + +#FC8 +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 + +#FC10 +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 + +#FC12 +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 + +#FC14 +phy_chain_rx_polarity_flip_physical{57.0}=0x1 +phy_chain_rx_polarity_flip_physical{58.0}=0x1 +phy_chain_rx_polarity_flip_physical{59.0}=0x1 +phy_chain_rx_polarity_flip_physical{60.0}=0x1 + +#FC15 +phy_chain_rx_polarity_flip_physical{63.0}=0x1 +phy_chain_rx_polarity_flip_physical{64.0}=0x1 + +#FC16 +phy_chain_rx_polarity_flip_physical{65.0}=0x1 +phy_chain_rx_polarity_flip_physical{66.0}=0x1 + +#FC17 +phy_chain_rx_polarity_flip_physical{69.0}=0x1 +phy_chain_rx_polarity_flip_physical{70.0}=0x1 +phy_chain_rx_polarity_flip_physical{71.0}=0x1 +phy_chain_rx_polarity_flip_physical{72.0}=0x1 + +#FC19 +phy_chain_rx_polarity_flip_physical{77.0}=0x1 +phy_chain_rx_polarity_flip_physical{78.0}=0x1 + +#FC21 +phy_chain_rx_polarity_flip_physical{85.0}=0x1 +phy_chain_rx_polarity_flip_physical{86.0}=0x1 + +#FC23 +phy_chain_rx_polarity_flip_physical{93.0}=0x1 +phy_chain_rx_polarity_flip_physical{94.0}=0x1 + +#FC24 +phy_chain_rx_polarity_flip_physical{99.0}=0x1 +phy_chain_rx_polarity_flip_physical{100.0}=0x1 + +#FC26 +phy_chain_rx_polarity_flip_physical{105.0}=0x1 +phy_chain_rx_polarity_flip_physical{106.0}=0x1 + +#FC28 +phy_chain_rx_polarity_flip_physical{113.0}=0x1 +#phy_chain_rx_polarity_flip_physical{114.0}=0x1 + +#FC30 +phy_chain_rx_polarity_flip_physical{121.0}=0x1 +phy_chain_rx_polarity_flip_physical{122.0}=0x1 + +#FC31 +phy_chain_rx_polarity_flip_physical{127.0}=0x1 +phy_chain_rx_polarity_flip_physical{128.0}=0x1 + +#tx part +#FC19 +phy_chain_tx_polarity_flip_physical{79.0}=0x1 +phy_chain_tx_polarity_flip_physical{80.0}=0x1 + +#FC21 +phy_chain_tx_polarity_flip_physical{87.0}=0x1 +phy_chain_tx_polarity_flip_physical{88.0}=0x1 + +#FC23 +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}=0x1 + +#FC24 +phy_chain_tx_polarity_flip_physical{99.0}=0x1 +phy_chain_tx_polarity_flip_physical{100.0}=0x1 + +#FC26 +phy_chain_tx_polarity_flip_physical{107.0}=0x1 +phy_chain_tx_polarity_flip_physical{108.0}=0x1 + +#FC28 +phy_chain_tx_polarity_flip_physical{115.0}=0x1 +phy_chain_tx_polarity_flip_physical{116.0}=0x1 + +#FC30 +phy_chain_tx_polarity_flip_physical{122.0}=0x1 +phy_chain_tx_polarity_flip_physical{123.0}=0x1 +phy_chain_tx_polarity_flip_physical{124.0}=0x1 + +#FC31 +phy_chain_tx_polarity_flip_physical{127.0}=0x1 +phy_chain_tx_polarity_flip_physical{128.0}=0x1 + + +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{85.0}=0x0213 +phy_chain_tx_lane_map_physical{85.0}=0x3120 +phy_chain_rx_lane_map_physical{77.0}=0x2031 +phy_chain_tx_lane_map_physical{77.0}=0x1302 + +phy_chain_rx_lane_map_physical{93.0}=0x2031 +phy_chain_tx_lane_map_physical{93.0}=0x1302 +phy_chain_rx_lane_map_physical{97.0}=0x0213 +phy_chain_tx_lane_map_physical{97.0}=0x3120 + +phy_chain_rx_lane_map_physical{113.0}=0x1203 +phy_chain_tx_lane_map_physical{113.0}=0x3120 +phy_chain_rx_lane_map_physical{105.0}=0x2031 +phy_chain_tx_lane_map_physical{105.0}=0x1302 + +phy_chain_rx_lane_map_physical{121.0}=0x2031 +phy_chain_tx_lane_map_physical{121.0}=0x1302 +phy_chain_rx_lane_map_physical{125.0}=0x0213 +phy_chain_tx_lane_map_physical{125.0}=0x3120 + +phy_chain_tx_polarity_flip_physical{129.0}=0x0 +phy_chain_rx_polarity_flip_physical{129.0}=0x0 +phy_chain_tx_polarity_flip_physical{130.0}=0x0 +phy_chain_rx_polarity_flip_physical{130.0}=0x0 +phy_chain_tx_polarity_flip_physical{131.0}=0x0 +phy_chain_rx_polarity_flip_physical{131.0}=0x0 +phy_chain_tx_polarity_flip_physical{132.0}=0x0 +phy_chain_rx_polarity_flip_physical{132.0}=0x0 + +# EQ/IDriver +serdes_preemphasis_1=0x13460B +serdes_preemphasis_2=0x13460B +serdes_preemphasis_3=0x14450B +serdes_preemphasis_4=0x13460B +serdes_preemphasis_5=0x11480B +serdes_preemphasis_6=0x13470A +serdes_preemphasis_7=0x14460A +serdes_preemphasis_8=0x11490A +serdes_preemphasis_13=0x10490B +serdes_preemphasis_14=0x104A0A +serdes_preemphasis_15=0x0F4B0A +serdes_preemphasis_16=0x0F4B0A +serdes_preemphasis_21=0x0D4D0A +serdes_preemphasis_22=0x0D4D0A +serdes_preemphasis_23=0x0D4D0A +serdes_preemphasis_24=0x0D4D0A +serdes_preemphasis_29=0x0B4F0A +serdes_preemphasis_30=0x0D4E09 +serdes_preemphasis_31=0x0B4F0A +serdes_preemphasis_32=0x0C4F09 +serdes_preemphasis_33=0x0B4F0A +serdes_preemphasis_34=0x0A5109 +serdes_preemphasis_35=0x09510A +serdes_preemphasis_36=0x0B5009 +serdes_preemphasis_41=0x09510A +serdes_preemphasis_42=0x0B5009 +serdes_preemphasis_43=0x09510A +serdes_preemphasis_44=0x0A5109 +serdes_preemphasis_49=0x0A500A +serdes_preemphasis_50=0x0B4F0A +serdes_preemphasis_51=0x09510A +serdes_preemphasis_52=0x0E4C0A +serdes_preemphasis_57=0x0D4D0A +serdes_preemphasis_58=0x0E4D09 +serdes_preemphasis_59=0x0C4E0A +serdes_preemphasis_60=0x0E4D09 +serdes_preemphasis_61=0x0B4F0A +serdes_preemphasis_62=0x0D4E09 +serdes_preemphasis_63=0x0D4D0A +serdes_preemphasis_64=0x0D4D0A +serdes_preemphasis_67=0x0B4F0A +serdes_preemphasis_68=0x0C4E0A +serdes_preemphasis_69=0x0B4F0A +serdes_preemphasis_70=0x0B4F0A +serdes_preemphasis_71=0x0B4F0A +serdes_preemphasis_72=0x0F4B0A +serdes_preemphasis_73=0x0E4C0A +serdes_preemphasis_74=0x0F4B0A +serdes_preemphasis_87=0x0E4C0A +serdes_preemphasis_79=0x0F4B0A +serdes_preemphasis_95=0x0F4B0A +serdes_preemphasis_99=0x0F4B0A +serdes_preemphasis_115=0x13470A +serdes_preemphasis_107=0x12480A +serdes_preemphasis_123=0x154609 +serdes_preemphasis_127=0x13470A + +# interface type +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_95=14 +serdes_if_type_99=14 +serdes_if_type_115=14 +serdes_if_type_107=14 +serdes_if_type_123=14 +serdes_if_type_127=14 + diff --git a/device/inventec/x86_64-inventec_d6356-r0/default_sku b/device/inventec/x86_64-inventec_d6356-r0/default_sku new file mode 100644 index 000000000000..f4c77ebd10f5 --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/default_sku @@ -0,0 +1 @@ +INVENTEC-D6356 t1 diff --git a/device/inventec/x86_64-inventec_d6356-r0/installer.conf b/device/inventec/x86_64-inventec_d6356-r0/installer.conf new file mode 100644 index 000000000000..1db64ba02c38 --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 +VAR_LOG_SIZE=1024 diff --git a/device/inventec/x86_64-inventec_d6356-r0/led_proc_init.soc b/device/inventec/x86_64-inventec_d6356-r0/led_proc_init.soc new file mode 100644 index 000000000000..d4c2fde64f9c --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/led_proc_init.soc @@ -0,0 +1,6 @@ +led auto off +led stop +m0 load 0 0x0 /usr/share/sonic/platform/linkscan_led_fw.bin +m0 load 0 0x3800 /usr/share/sonic/platform/custom_led.bin +led auto on +led start diff --git a/device/inventec/x86_64-inventec_d6356-r0/plugins/eeprom.py b/device/inventec/x86_64-inventec_d6356-r0/plugins/eeprom.py new file mode 100644 index 000000000000..953570d79cd7 --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/plugins/eeprom.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +############################################################################# +# Inventec d6356 +# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/2-0055/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/inventec/x86_64-inventec_d6356-r0/plugins/psuutil.py b/device/inventec/x86_64-inventec_d6356-r0/plugins/psuutil.py new file mode 100755 index 000000000000..8ed0bce72979 --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/plugins/psuutil.py @@ -0,0 +1,84 @@ +# +# psuutil.py +# Platform-specific PSU status interface for SONiC +# + + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + PSU_DIR = "/sys/class/hwmon/hwmon1" + + def __init__(self): + PsuBase.__init__(self) + +# Get sysfs attribute + def get_attr_value(self, attr_path): + + retval = 'ERR' + if (not os.path.isfile(attr_path)): + return retval + + try: + with open(attr_path, 'r') as fd: + retval = fd.read() + except Exception as error: + logging.error("Unable to open ", attr_path, " file !") + + retval = retval.rstrip(' \t\n\r') + return retval + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + :return: An integer, the number of PSUs available on the device + """ + MAX_PSUS = 2 + return MAX_PSUS + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is\ + faulty + """ + status = 0 + attr_file = 'psoc_psu'+ str(index) + '_iout' + attr_path = self.PSU_DIR +'/' + attr_file + + attr_value = self.get_attr_value(attr_path) + if (attr_value != 'ERR'): + # Check for PSU status + if (attr_value != 0): + status = 1 + return status + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by index + :param index: An integer, index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + status = 0 + psu_absent = 0 + ind = index + attr_file ='psu'+ str(ind) + attr_path = self.PSU_DIR +'/' + attr_file + normal_attr_value = '0 : normal' + attr_value = self.get_attr_value(attr_path) + if (attr_value != 'ERR'): + # Check for PSU presence + if (attr_value == normal_attr_value): + status = 1 + return status diff --git a/device/inventec/x86_64-inventec_d6356-r0/plugins/sfputil.py b/device/inventec/x86_64-inventec_d6356-r0/plugins/sfputil.py new file mode 100755 index 000000000000..5ea81ffcfc16 --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/plugins/sfputil.py @@ -0,0 +1,217 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 55 + PORTS_IN_BLOCK = 56 + QSFP_PORT_START = 48 + QSFP_PORT_END = 55 + + _port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 0:22, + 1:23, + 2:24, + 3:25, + 4:26, + 5:27, + 6:28, + 7:29, + 8:30, + 9:31, + 10:32, + 11:33, + 12:34, + 13:35, + 14:36, + 15:37, + 16:38, + 17:39, + 18:40, + 19:41, + 20:42, + 21:43, + 22:44, + 23:45, + 24:46, + 25:47, + 26:48, + 27:49, + 28:50, + 29:51, + 30:52, + 31:53, + 32:54, + 33:55, + 34:56, + 35:57, + 36:58, + 37:59, + 38:60, + 39:61, + 40:62, + 41:63, + 42:64, + 43:65, + 44:66, + 45:67, + 46:68, + 47:69, + 48:14, + 49:15, + 50:16, + 51:17, + 52:18, + 53:19, + 54:20, + 55:21 + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START + + @property + def qsfp_port_end(self): + return self.QSFP_PORT_END + + @property + def qsfp_ports(self): + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = "/sys/bus/i2c/devices/{0}-0050/eeprom" + + for x in range(0, self.port_end + 1): + port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x]) + self.port_to_eeprom_mapping[x] = port_eeprom_path + SfpUtilBase.__init__(self) + + 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 + + try: + reg_file = open("/sys/class/swps/port"+str(port_num)+"/present") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = int(reg_file.readline().rstrip()) + + if reg_value == 0: + return True + + 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 port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + try: + reg_file = open("/sys/class/swps/port"+str(port_num)+"/lpmod") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + + reg_value = int(reg_file.readline().rstrip()) + + if reg_value == 0: + 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 False + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + print "\nError:SFP's don't support this property" + return False + + try: + reg_file = open("/sys/class/swps/port"+str(port_num)+"/lpmod", "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = int(reg_file.readline().rstrip()) + + # LPMode is active high; set or clear the bit accordingly + if lpmode is True: + reg_value = 1 + else: + reg_value = 0 + + reg_file.write(hex(reg_value)) + reg_file.close() + + return True + + def reset(self, port_num): + QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/class/swps/port"+str(port_num)+"/reset" + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + print "\nError:SFP's don't support this property" + return False + + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = 0 + reg_file.write(hex(reg_value)) + reg_file.close() + + # Sleep 2 second to allow it to settle + time.sleep(2) + + # Flip the value back write back to the register to take port out of reset + try: + reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = 1 + reg_file.write(hex(reg_value)) + reg_file.close() + + return True + + def get_transceiver_change_event(self): + """ + TODO: This function need to be implemented + """ + raise NotImplementedError diff --git a/device/inventec/x86_64-inventec_d6356-r0/sensors.conf b/device/inventec/x86_64-inventec_d6356-r0/sensors.conf new file mode 100644 index 000000000000..6f7318168ee6 --- /dev/null +++ b/device/inventec/x86_64-inventec_d6356-r0/sensors.conf @@ -0,0 +1,106 @@ +# libsensors configuration file +chip "ucd90160-*" + ignore temp1 + +chip "tmp75-i2c-*-0048" + label temp1 "CPU Board Temperature" + +chip "tmp75-i2c-*-004a" + label temp1 "FrontSide Temperature" + +chip "tmp75-i2c-*-004e" + label temp1 "NearASIC Temperature" + +chip "tmp75-i2c-*-004d" + label temp1 "RearSide Temperature" + +chip "inv_cpld-i2c-*-77" + label fan1 "FanModule1 Front RPM" + label fan2 "FanModule1 Rear RPM" + label fan3 "FanModule2 Front RPM" + label fan4 "FanModule2 Rear RPM" + label fan5 "FanModule3 Front RPM" + label fan6 "FanModule3 Rear RPM" + label fan7 "FanModule4 Front RPM" + label fan8 "FanModule4 Rear RPM" + label fan9 "FanModule5 Front RPM" + label fan10 "FanModule5 Rear RPM" + label pwm1 "FanModule1 PWM (0-255)" + label pwm2 "FanModule2 PWM (0-255)" + label pwm3 "FanModule3 PWM (0-255)" + label pwm4 "FanModule4 PWM (0-255)" + label pwm5 "FanModule5 PWM (0-255)" + +chip "pmbus-i2c-*-005a" + ignore power3 + ignore curr3 + label fan1 "PSU1 Fan RPM" + label temp1 "PSU1 Temperature1" + label temp2 "PSU1 Temperature2" + label temp3 "PSU1 Temperature3" + label in1 "PSU1 Input Voltage" + label curr1 "PSU1 Input Current" + label power1 "PSU1 Input Power" + label in2 "PSU1 Output Voltage" + label curr2 "PSU1 Output Current" + label power2 "PSU1 Output Power" + label pwm1 "PSU1 PWM (0-100)" + +chip "pmbus-i2c-*-005b" + ignore power3 + ignore curr3 + label fan1 "PSU2 Fan RPM" + label temp1 "PSU2 Temperature1" + label temp2 "PSU2 Temperature2" + label temp3 "PSU2 Temperature3" + label in1 "PSU2 Input Voltage" + label curr1 "PSU2 Input Current" + label power1 "PSU2 Input Power" + label in2 "PSU2 Output Voltage" + label curr2 "PSU2 Output Current" + label power2 "PSU2 Output Power" + label pwm1 "PSU2 PWM (0-100)" + +chip "inv_psoc-*" + label temp1 "FrontSide Temperature" + label temp2 "FanBoard Temperature" + label temp3 "NearASIC Temperature" + label temp4 "Center Temperature" + + label temp5 "CPU Board Temperature" + label temp6 "ASIC Temperature" + label temp7 "PSU1 Temperature1" + label temp8 "PSU2 Temperature1" + label temp9 "PSU1 Temperature2" + label temp10 "PSU2 Temperature2" + label fan1 "FanModule1 Front RPM" + label fan2 "FanModule1 Rear RPM" + label fan3 "FanModule2 Front RPM" + label fan4 "FanModule2 Rear RPM" + label fan5 "FanModule3 Front RPM" + label fan6 "FanModule3 Rear RPM" + label fan7 "FanModule4 Front RPM" + label fan8 "FanModule4 Rear RPM" + label fan9 "FanModule5 Front RPM" + label fan10 "FanModule5 Rear RPM" + label pwm1 "FanModule1 PWM" + label pwm2 "FanModule2 PWM" + label pwm3 "FanModule3 PWM" + label pwm4 "FanModule4 PWM" + label pwm5 "FanModule5 PWM" + label pwm6 "PSU1 FAN PWM" + label pwm7 "PSU2 FAN PWM" + label fan11 "PSU1 FAN RPM" + label fan12 "PSU2 FAN RPM" + label in1 "PSU1 Input Voltage" + label in2 "PSU2 Input Voltage" + label curr1 "PSU1 Input Current" + label curr2 "PSU2 Input Current" + label power1 "PSU1 Input Power" + label power2 "PSU2 Input Power" + label in3 "PSU1 Output Voltage" + label in4 "PSU2 Output Voltage" + label curr3 "PSU1 Output Current" + label curr4 "PSU2 Output Current" + label power3 "PSU1 Output Power" + label power4 "PSU2 Output Power" diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index a850065a0f0a..0d69d63c02e2 100644 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -35,6 +35,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ $(INVENTEC_D7054Q28B_PLATFORM_MODULE) \ $(INVENTEC_D7264Q28B_PLATFORM_MODULE) \ + $(INVENTEC_D6356_PLATFORM_MODULE) \ $(CEL_DX010_PLATFORM_MODULE) \ $(CEL_HALIBURTON_PLATFORM_MODULE) \ $(DELTA_AG9032V1_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-inventec.mk b/platform/broadcom/platform-modules-inventec.mk index ead32e75a815..871604ce91d9 100644 --- a/platform/broadcom/platform-modules-inventec.mk +++ b/platform/broadcom/platform-modules-inventec.mk @@ -4,12 +4,14 @@ INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION = 1.1.0 INVENTEC_D7054Q28B_PLATFORM_MODULE_VERSION = 1.1.0 INVENTEC_D6254QS_PLATFORM_MODULE_VERSION = 1.1.0 INVENTEC_D6556_PLATFORM_MODULE_VERSION = 1.1.0 +INVENTEC_D6356_PLATFORM_MODULE_VERSION = 1.1.0 INVENTEC_D7264Q28B_PLATFORM_MODULE_VERSION = 1.1.0 export INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION export INVENTEC_D7054Q28B_PLATFORM_MODULE_VERSION export INVENTEC_D6254QS_PLATFORM_MODULE_VERSION export INVENTEC_D6556_PLATFORM_MODULE_VERSION +export INVENTEC_D6356_PLATFORM_MODULE_VERSION export INVENTEC_D7264Q28B_PLATFORM_MODULE_VERSION INVENTEC_D7032Q28B_PLATFORM_MODULE = platform-modules-d7032q28b_$(INVENTEC_D7032Q28B_PLATFORM_MODULE_VERSION)_amd64.deb @@ -30,8 +32,12 @@ INVENTEC_D6556_PLATFORM_MODULE = platform-modules-d6556_$(INVENTEC_D6556_PLATFOR $(INVENTEC_D6556_PLATFORM_MODULE)_PLATFORM = x86_64-inventec_d6556-r0 $(eval $(call add_extra_package,$(INVENTEC_D7032Q28B_PLATFORM_MODULE),$(INVENTEC_D6556_PLATFORM_MODULE))) +INVENTEC_D6356_PLATFORM_MODULE = platform-modules-d6356_$(INVENTEC_D6356_PLATFORM_MODULE_VERSION)_amd64.deb +$(INVENTEC_D6356_PLATFORM_MODULE)_PLATFORM = x86_64-inventec_d6356-r0 +$(eval $(call add_extra_package,$(INVENTEC_D7032Q28B_PLATFORM_MODULE),$(INVENTEC_D6356_PLATFORM_MODULE))) + INVENTEC_D7264Q28B_PLATFORM_MODULE = platform-modules-d7264q28b_$(INVENTEC_D7264Q28B_PLATFORM_MODULE_VERSION)_amd64.deb $(INVENTEC_D7264Q28B_PLATFORM_MODULE)_PLATFORM = x86_64-inventec_d7264q28b-r0 $(eval $(call add_extra_package,$(INVENTEC_D7032Q28B_PLATFORM_MODULE),$(INVENTEC_D7264Q28B_PLATFORM_MODULE))) -SONIC_STRETCH_DEBS += $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ No newline at end of file +SONIC_STRETCH_DEBS += $(INVENTEC_D7032Q28B_PLATFORM_MODULE) diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/Makefile b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/Makefile new file mode 100755 index 000000000000..23e8295b9026 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/Makefile @@ -0,0 +1,5 @@ +obj-m += inv_cpld.o +obj-m += inv_platform.o +obj-m += inv_eeprom.o +obj-m += swps.o +swps-objs := inv_swps.o inv_mux.o io_expander.o transceiver.o diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_cpld.c b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_cpld.c new file mode 100644 index 000000000000..8ccaf617b3c4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_cpld.c @@ -0,0 +1,950 @@ +/* + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* definition */ +#define CPLD_INFO_OFFSET 0x00 +#define CPLD_BIOSCS_OFFSET 0x04 +#define CPLD_CTL_OFFSET 0x0C +#define CPLD_LED_OFFSET 0x2E +#define CPLD_INT_OFFSET 0x30 +#define CPLD_INTMASK_OFFSET 0x31 +#define CPLD_INT2_OFFSET 0x32 +#define CPLD_INTMASK2_OFFSET 0x33 +#define CPLD_PSU_OFFSET 0x40 +#define CPLD_POWERSTATUS_OFFSET 0x41 +#define CPLD_PWM_OFFSET 0x50 +#define CPLD_RPM_OFFSET 0x55 +#define CPLD_FANSTATUS_OFFSET 0x69 +#define CPLD_FANLED_OFFSET 0x6B +#define CPLD_RESETBUTTONSTATUS_OFFSET 0x75 +#define CPLD_RSTCAUSE_OFFSET 0x76 +#define CPLD_WATCHDOGCOUNTER_OFFSET 0x77 +#define CPLD_WATCHDOGCONFIG_OFFSET 0x78 +#define CPLD_WATCHDOGENABLE_OFFSET 0x79 +#define CPLD_PANICCODE_OFFSET 0x7E +#define CPLD2_ADDRESS 0x33 + +#define FAN_NUM 4 +static u8 hasCPLD2 = 1; +static struct i2c_client *client2; + +/* Each client has this additional data */ +struct cpld_data { + struct device *hwmon_dev; + struct mutex update_lock; + u8 diag; +}; + +/*-----------------------------------------------------------------------*/ +static ssize_t cpld_i2c_read(struct i2c_client *client, u8 *buf, u8 offset, size_t count) +{ + int i; + s32 temp = 0; + + for(i=0; iuser_msg_data; + + if(recv_msg->msg.data[0]==0 && recv_msg->msg.data_len>0) { + msg_result->result_length=recv_msg->msg.data_len-1; + memcpy(msg_result->result, &recv_msg->msg.data[1], recv_msg->msg.data_len-1); + } + ipmi_free_recv_msg(recv_msg); + mutex_unlock(&ipmi_mutex); + + return; +} + +int start_ipmi_command(char NetFn, char cmd,char *data,int data_length, char* result, int* result_length) +{ + int rv=0,i; + int timeout; + + //wait previous command finish at least 50msec + timeout=50; + while((mutex_is_locked(&ipmi_mutex) == 1 || (mutex_is_locked(&ipmi2_mutex) == 1)) && (--timeout)>0) { usleep_range(1000,1010); } + if(timeout==0) { return -1; } + mutex_lock(&ipmi_mutex); + mutex_lock(&ipmi2_mutex); + + if(ipmi_mh_user == NULL) { + for (i=0,rv=1; i0) { usleep_range(1000,1100);} + if(timeout==0) { + mutex_unlock(&ipmi2_mutex); + return -1; + } + else { + *result_length=ipmiresult.result_length; + memcpy(result,ipmiresult.result,*result_length); + mutex_unlock(&ipmi2_mutex); + return 0; + } + } + return 0; +} +EXPORT_SYMBOL(start_ipmi_command); + +/*-----------------------------------------------------------------------*/ +/* sysfs attributes for hwmon */ +static ssize_t show_info(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); + ssize_t len = 0; + + u8 byte[4] = {0,0,0,0}; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client, byte, CPLD_INFO_OFFSET, 4); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + sprintf (buf, "The CPLD release date is %02d/%02d/%d.\n", + byte[2] & 0xf, (byte[3] & 0x1f), 2014+(byte[2] >> 4)); /* mm/dd/yyyy*/ + sprintf (buf, "%sThe PCB version is %X\n", buf, byte[0]&0xf); + sprintf (buf, "%sThe CPLD version is %d.%d\n", buf, byte[1]>>4, byte[1]&0xf); + + if(hasCPLD2) { + mutex_lock(&data->update_lock); + cpld_i2c_read(client2, byte, CPLD_INFO_OFFSET, 4); + mutex_unlock(&data->update_lock); + + sprintf (buf, "%s\nThe CPLD2 release date is %02d/%02d/%d.\n", buf, + byte[2] & 0xf, (byte[3] & 0x1f), 2014+(byte[2] >> 4)); /* mm/dd/yyyy*/ + sprintf (buf, "%sThe CPLD version is %d.%d\n", buf, byte[1]>>4, byte[1]&0xf); + } + + return strlen(buf); +} + +static char* powerstatus_str[] = { + "Failed", //0 + "Good", //1 +}; + +static ssize_t show_powerstatus(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); + ssize_t len = 0; + u8 byte[2] = {0,0}; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client, byte, CPLD_POWERSTATUS_OFFSET, 2); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + sprintf (buf, "PGD_P5V_STBY: %s\n", powerstatus_str[(byte[0]>>7) & 0x01]); + sprintf (buf, "%sPGD_P3V3_STBY: %s\n", buf, powerstatus_str[(byte[0]>>6) & 0x01]);; + sprintf (buf, "%sPGD_P1V8_A: %s\n", buf, powerstatus_str[(byte[0]>>4) & 0x01]); + sprintf (buf, "%sPGD_P3V3_SYS: %s\n", buf, powerstatus_str[(byte[0]>>3) & 0x01]); + sprintf (buf, "%sPGD_P3V3_A: %s\n", buf, powerstatus_str[(byte[0]>>2) & 0x01]); + sprintf (buf, "%sPGD_P3V3_B: %s\n", buf, powerstatus_str[(byte[0]>>1) & 0x01]); + sprintf (buf, "%sPGD_P1V2: %s\n", buf, powerstatus_str[(byte[0]>>0) & 0x01]); + sprintf (buf, "%sPGD_P0V8_A: %s\n", buf,powerstatus_str[(byte[1]>>7) & 0x01]); + sprintf (buf, "%sPGD_P0V89_ROV: %s\n", buf, powerstatus_str[(byte[1]>>6) & 0x01]); + sprintf (buf, "%sSW_PWR_READY: %s\n", buf, powerstatus_str[(byte[1]>>3) & 0x01]); + sprintf (buf, "%sCORE_PWRGD_TO_CPLD: %s\n", buf, powerstatus_str[(byte[1]>>2) & 0x01]); + sprintf (buf, "%sCPU_STBY_PWROK: %s\n", buf, powerstatus_str[(byte[1]>>1) & 0x01]); + + return strlen(buf); +} + +static ssize_t show_diag(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); + uint8_t ipmisend[]= { IPMI_DIAGFLAG_OFFSET, 1}; + uint8_t result[MAX_IPMI_RECV_LENGTH]; + int result_len=0; + start_ipmi_command(NETFN_OEM, CMD_GETDATA,ipmisend, 2, result, &result_len); + data->diag = (result[0] & 0x80) !=0; + return sprintf (buf, "%d\n", data->diag); +} + +static ssize_t set_diag(struct device *dev, + struct device_attribute *da, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + uint8_t ipmisend[]= { IPMI_DIAGFLAG_OFFSET, 0x80}; + uint8_t result[MAX_IPMI_RECV_LENGTH]; + int result_len=0; + u8 diag = simple_strtol(buf, NULL, 10); + data->diag = diag?1:0; + if (data->diag==0) ipmisend[1] = 0x00; + + start_ipmi_command(NETFN_OEM, CMD_SETDATA,ipmisend, 2, result, &result_len); + + return count; +} + +static char* resetbutton_str[] = { + "No press", //0 + "Reserved", //1 + "Press and hold <5s", //2 + "Press and hold >5s", //3 +}; + +static ssize_t show_resetbuttonstatus(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); + ssize_t len = 0; + u8 byte = 0; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client, &byte, CPLD_RESETBUTTONSTATUS_OFFSET, 1); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + byte &=0x03; + + return sprintf (buf, "0x%02X:%s\n", byte,resetbutton_str[byte]); +} + +static char* interrupt_str[] = { + "CPU_SEN_ALERT_N", //0 + "EXT_USB_OC_N", //1 + "PS2_ALERT_N", //2 + "PS1_ALERT_N", //3 + "PLD_SEN5_ALERT_N", //4 + "PLD_SEN4_ALERT_N", //5 + "PLD_SEN3_ALERT_N", //6 + "UCD90160_TEMP_INT_N", //7 + "RSTBTN_INT_N", //8 + "WDT_IRQ_N", //9 + "RSTBTN_5s_INT_N", //10 + "Reserved" //11 +}; + +static ssize_t show_interrupt(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); + ssize_t len = 0; + u8 byte[4] = {0,0,0,0}; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client, byte, CPLD_INT_OFFSET, 4); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + sprintf (buf, "0x%02X 0x%02X:", byte[0],byte[2]); + if(byte[0]==0xff && byte[2]==0x07) sprintf (buf, "%sNone",buf); + if(!(byte[0]&0x01)) sprintf (buf, "%s%s ",buf,interrupt_str[0]); + if(!(byte[0]&0x02)) sprintf (buf, "%s%s ",buf,interrupt_str[1]); + if(!(byte[0]&0x04)) sprintf (buf, "%s%s ",buf,interrupt_str[2]); + if(!(byte[0]&0x08)) sprintf (buf, "%s%s ",buf,interrupt_str[3]); + if(!(byte[0]&0x10)) sprintf (buf, "%s%s ",buf,interrupt_str[4]); + if(!(byte[0]&0x20)) sprintf (buf, "%s%s ",buf,interrupt_str[5]); + if(!(byte[0]&0x40)) sprintf (buf, "%s%s ",buf,interrupt_str[6]); + if(!(byte[0]&0x80)) sprintf (buf, "%s%s ",buf,interrupt_str[7]); + if(!(byte[2]&0x01)) sprintf (buf, "%s%s%s ",buf,interrupt_str[8] ,(byte[3]&0x01)?"(Blocked)":""); + if(!(byte[2]&0x02)) sprintf (buf, "%s%s%s ",buf,interrupt_str[9] ,(byte[3]&0x02)?"(Blocked)":""); + if(!(byte[2]&0x04)) sprintf (buf, "%s%s%s ",buf,interrupt_str[10],(byte[3]&0x04)?"(Blocked)":""); + + return sprintf (buf, "%s\n", buf); +} + +static char* bios_str[] = { + "BIOS1", //0 + "BIOS2", //1 +}; + +static ssize_t show_bios_cs(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); + ssize_t len = 0; + u8 byte = 0; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client, &byte, CPLD_BIOSCS_OFFSET, 1); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + byte &= 0x01; + + return sprintf (buf, "%d:%s\n", byte,bios_str[byte]); +} + +static ssize_t set_bios_cs(struct device *dev, + struct device_attribute *da, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte = 0; + u8 temp = simple_strtol(buf, NULL, 10); + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_BIOSCS_OFFSET, 1); + if(temp) byte |= 0x01; else byte &= ~(0x01); + cpld_i2c_write(client, &byte, CPLD_BIOSCS_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static char* led_str[] = { + "OFF", //000 + "ON", //001 + "1 Hz", //010 + "2 Hz", //011 +}; + +static ssize_t show_led(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); + ssize_t len = 0; + u8 byte = 0; + int shift = attr->index; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client, &byte, CPLD_LED_OFFSET, 1); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + byte = (byte >> shift) & 0x3; + + return sprintf (buf, "%d: %s\n", byte, led_str[byte]); +} + +static ssize_t set_led(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); + + u8 temp = simple_strtol(buf, NULL, 16); + u8 byte = 0; + int shift = attr->index; + temp &= 0x3; + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_LED_OFFSET, 1); + byte &= ~(0x3<update_lock); + + return count; +} + +static char* psu_str[] = { + "unpowered", //00 + "normal", //01 + "not installed", //10 + "not installed", //11 +}; + +static ssize_t show_psu(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); + ssize_t len = 0; + u8 byte=0; + int shift = (attr->index == 0)?0:4; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client2, &byte, CPLD_PSU_OFFSET, 1); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + byte = (byte >> shift) & 0x3; + + return sprintf (buf, "%d:%s\n", byte, psu_str[byte]); +} + +static ssize_t show_pwm(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); + ssize_t len = 0; + u8 byte=0; + u8 offset = attr->index + CPLD_PWM_OFFSET; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client2, &byte, offset, 1); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + return sprintf(buf, "%d\n", byte); +} + +static ssize_t set_pwm(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); + u8 offset = attr->index + CPLD_PWM_OFFSET; + u8 byte = simple_strtol(buf, NULL, 10); + + mutex_lock(&data->update_lock); + cpld_i2c_write(client2, &byte, offset, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_rpm(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); + ssize_t len = 0; + u8 offset = attr->index*2 + CPLD_RPM_OFFSET; + u8 byte[2] = {0,0}; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client2, byte, offset, 2); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + return sprintf(buf, "%d\n", (byte[0]<<8 | byte[1])); +} + +static char* fantype_str[] = { + "Normal Type", //00 + "REVERSAL Type", //01 + "UNPLUGGED", //10 + "UNPLUGGED", //11 +}; + +static ssize_t show_fantype(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + 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); + ssize_t len = 0; + u8 offset = CPLD_FANSTATUS_OFFSET; + u8 byte[2] = {0,0}; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client2, byte, offset, 2); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + status = (((byte[0] >> attr->index) & 0x01)) | (((byte[1] >> attr->index) & 0x01)<<1); + + return sprintf(buf, "%d:%s\n",status,fantype_str[status]); +} + +static char* fanled_str[] = { + "None", //00 + "Green", //01 + "Red", //10 + "Both", //11 +}; + +static ssize_t show_fanled(struct device *dev, struct device_attribute *da, + char *buf) +{ + int status; + 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); + ssize_t len = 0; + u8 byte[2] = {0,0}; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client2, byte, CPLD_FANLED_OFFSET, 2); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + status = (((byte[0] >> attr->index) & 0x01)) | (((byte[1] >> attr->index) & 0x01)<<1); + + return sprintf(buf, "%d:%s\n",status,fanled_str[status]); +} + +static ssize_t set_fanled(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); + u8 byte[2] = {0,0}; + u8 temp = simple_strtol(buf, NULL, 16); + int shift = attr->index; + + temp &= 0x3; + mutex_lock(&data->update_lock); + cpld_i2c_read(client2, byte, CPLD_FANLED_OFFSET, 2); + byte[0] &= ~(1<> 1) & 0x01)<update_lock); + + return count; +} + +static ssize_t set_watchdog_feed(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte=0; + + mutex_lock(&data->update_lock); + cpld_i2c_read(client, &byte, CPLD_WATCHDOGENABLE_OFFSET, 1); + byte |= 0x02; + cpld_i2c_write(client, &byte, CPLD_WATCHDOGENABLE_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t set_watchdog_enable(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte=0x03; + + mutex_lock(&data->update_lock); + cpld_i2c_write(client, &byte, CPLD_WATCHDOGENABLE_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_watchdog_enable(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); + ssize_t len = 0; + u8 byte=0; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client, &byte, CPLD_WATCHDOGENABLE_OFFSET, 1); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + return sprintf(buf, "%d\n",(byte&0x01)); +} + +static ssize_t set_watchdog_config(struct device *dev, + struct device_attribute *da, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cpld_data *data = i2c_get_clientdata(client); + u8 byte = simple_strtol(buf, NULL, 10); + + if (byte<6) byte=6; + mutex_lock(&data->update_lock); + cpld_i2c_write(client, &byte, CPLD_WATCHDOGCONFIG_OFFSET, 1); + mutex_unlock(&data->update_lock); + + return count; +} + +static ssize_t show_watchdog_config(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); + ssize_t len = 0; + u8 byte=0; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client, &byte, CPLD_WATCHDOGCONFIG_OFFSET, 1); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + return sprintf(buf, "%d seconds\n",byte); +} + +static ssize_t show_watchdog_counter(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); + ssize_t len = 0; + u8 byte=0; + + mutex_lock(&data->update_lock); + len = cpld_i2c_read(client, &byte, CPLD_WATCHDOGCOUNTER_OFFSET, 1); + mutex_unlock(&data->update_lock); + if (len==0) return 0; + + return sprintf(buf, "%d seconds\n",byte); +} + +static SENSOR_DEVICE_ATTR(info, S_IRUGO, show_info, 0, 0); +static SENSOR_DEVICE_ATTR(diag, S_IWUSR|S_IRUGO, show_diag, set_diag, 0); +static SENSOR_DEVICE_ATTR(interrupt, S_IRUGO, show_interrupt, 0, 0); + +static SENSOR_DEVICE_ATTR(stacking_led, S_IWUSR|S_IRUGO, show_led, set_led, 0); +static SENSOR_DEVICE_ATTR(fan_led, S_IWUSR|S_IRUGO, show_led, set_led, 2); +static SENSOR_DEVICE_ATTR(power_led, S_IWUSR|S_IRUGO, show_led, set_led, 4); +static SENSOR_DEVICE_ATTR(service_led, S_IWUSR|S_IRUGO, show_led, set_led, 6); + +static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 0); +static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 1); +static SENSOR_DEVICE_ATTR(pwm3, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 2); +static SENSOR_DEVICE_ATTR(pwm4, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 3); +#if FAN_NUM>4 +static SENSOR_DEVICE_ATTR(pwm5, S_IWUSR|S_IRUGO, show_pwm, set_pwm, 4); +#endif + +static SENSOR_DEVICE_ATTR(fanmodule1_type, S_IRUGO, show_fantype, 0, 0); +static SENSOR_DEVICE_ATTR(fanmodule2_type, S_IRUGO, show_fantype, 0, 1); +static SENSOR_DEVICE_ATTR(fanmodule3_type, S_IRUGO, show_fantype, 0, 2); +static SENSOR_DEVICE_ATTR(fanmodule4_type, S_IRUGO, show_fantype, 0, 3); +#if FAN_NUM>4 +static SENSOR_DEVICE_ATTR(fanmodule5_type, S_IRUGO, show_fantype, 0, 4); +#endif + +static SENSOR_DEVICE_ATTR(fanmodule1_led, S_IWUSR|S_IRUGO, show_fanled, set_fanled, 0); +static SENSOR_DEVICE_ATTR(fanmodule2_led, S_IWUSR|S_IRUGO, show_fanled, set_fanled, 1); +static SENSOR_DEVICE_ATTR(fanmodule3_led, S_IWUSR|S_IRUGO, show_fanled, set_fanled, 2); +static SENSOR_DEVICE_ATTR(fanmodule4_led, S_IWUSR|S_IRUGO, show_fanled, set_fanled, 3); +#if FAN_NUM>4 +static SENSOR_DEVICE_ATTR(fanmodule5_led, S_IWUSR|S_IRUGO, show_fanled, set_fanled, 4); +#endif + +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, show_rpm, 0, 0); +static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, show_rpm, 0, 1); +static SENSOR_DEVICE_ATTR(fan3_input, S_IRUGO, show_rpm, 0, 2); +static SENSOR_DEVICE_ATTR(fan4_input, S_IRUGO, show_rpm, 0, 3); +static SENSOR_DEVICE_ATTR(fan5_input, S_IRUGO, show_rpm, 0, 4); +static SENSOR_DEVICE_ATTR(fan6_input, S_IRUGO, show_rpm, 0, 5); +static SENSOR_DEVICE_ATTR(fan7_input, S_IRUGO, show_rpm, 0, 6); +static SENSOR_DEVICE_ATTR(fan8_input, S_IRUGO, show_rpm, 0, 7); +#if FAN_NUM>4 +static SENSOR_DEVICE_ATTR(fan9_input, S_IRUGO, show_rpm, 0, 8); +static SENSOR_DEVICE_ATTR(fan10_input,S_IRUGO, show_rpm, 0, 9); +#endif + +static SENSOR_DEVICE_ATTR(psu1, S_IRUGO, show_psu, 0, 0); +static SENSOR_DEVICE_ATTR(psu2, S_IRUGO, show_psu, 0, 1); +static SENSOR_DEVICE_ATTR(power_status, S_IRUGO, show_powerstatus, 0, 0); +static SENSOR_DEVICE_ATTR(resetbutton_status, S_IRUGO, show_resetbuttonstatus, 0, 0); + +static SENSOR_DEVICE_ATTR(watchdog_feed, S_IWUSR, 0, set_watchdog_feed, 0); +static SENSOR_DEVICE_ATTR(watchdog_enable, S_IWUSR|S_IRUGO, show_watchdog_enable, set_watchdog_enable, 0); +static SENSOR_DEVICE_ATTR(watchdog_config, S_IWUSR|S_IRUGO, show_watchdog_config, set_watchdog_config, 0); +static SENSOR_DEVICE_ATTR(watchdog_counter, S_IRUGO, show_watchdog_counter, 0, 0); + +static SENSOR_DEVICE_ATTR(bios_cs, S_IWUSR|S_IRUGO, show_bios_cs, set_bios_cs, 0); + +static struct attribute *cpld_attributes[] = { + &sensor_dev_attr_info.dev_attr.attr, + &sensor_dev_attr_diag.dev_attr.attr, + + &sensor_dev_attr_stacking_led.dev_attr.attr, + &sensor_dev_attr_fan_led.dev_attr.attr, + &sensor_dev_attr_power_led.dev_attr.attr, + &sensor_dev_attr_service_led.dev_attr.attr, + + &sensor_dev_attr_interrupt.dev_attr.attr, + + &sensor_dev_attr_psu1.dev_attr.attr, + &sensor_dev_attr_psu2.dev_attr.attr, + &sensor_dev_attr_power_status.dev_attr.attr, + &sensor_dev_attr_resetbutton_status.dev_attr.attr, + + &sensor_dev_attr_pwm1.dev_attr.attr, + &sensor_dev_attr_pwm2.dev_attr.attr, + &sensor_dev_attr_pwm3.dev_attr.attr, + &sensor_dev_attr_pwm4.dev_attr.attr, +#if FAN_NUM>4 + &sensor_dev_attr_pwm5.dev_attr.attr, +#endif + &sensor_dev_attr_fanmodule1_type.dev_attr.attr, + &sensor_dev_attr_fanmodule2_type.dev_attr.attr, + &sensor_dev_attr_fanmodule3_type.dev_attr.attr, + &sensor_dev_attr_fanmodule4_type.dev_attr.attr, +#if FAN_NUM>4 + &sensor_dev_attr_fanmodule5_type.dev_attr.attr, +#endif + &sensor_dev_attr_fanmodule1_led.dev_attr.attr, + &sensor_dev_attr_fanmodule2_led.dev_attr.attr, + &sensor_dev_attr_fanmodule3_led.dev_attr.attr, + &sensor_dev_attr_fanmodule4_led.dev_attr.attr, +#if FAN_NUM>4 + &sensor_dev_attr_fanmodule5_led.dev_attr.attr, +#endif + &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, + &sensor_dev_attr_fan5_input.dev_attr.attr, + &sensor_dev_attr_fan6_input.dev_attr.attr, + &sensor_dev_attr_fan7_input.dev_attr.attr, + &sensor_dev_attr_fan8_input.dev_attr.attr, +#if FAN_NUM>4 + &sensor_dev_attr_fan9_input.dev_attr.attr, + &sensor_dev_attr_fan10_input.dev_attr.attr, +#endif + &sensor_dev_attr_watchdog_feed.dev_attr.attr, + &sensor_dev_attr_watchdog_enable.dev_attr.attr, + &sensor_dev_attr_watchdog_config.dev_attr.attr, + &sensor_dev_attr_watchdog_counter.dev_attr.attr, + + &sensor_dev_attr_bios_cs.dev_attr.attr, + NULL +}; + +static const struct attribute_group cpld_group = { + .attrs = cpld_attributes, +}; + +/*-----------------------------------------------------------------------*/ +/* device probe and removal */ +static int +cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct cpld_data *data; + int status; + u8 byte[5]; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) + return -EIO; + + data = kzalloc(sizeof(struct cpld_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &cpld_group); + + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + //Check CPLD2 exist or not + client2 = i2c_new_dummy(client->adapter, CPLD2_ADDRESS); + if(!client2) { + hasCPLD2 = 0; + client2 = client; + } else { + status = i2c_smbus_read_byte_data(client2, CPLD_INFO_OFFSET); + if(status<0) { + i2c_unregister_device(client2); + i2c_set_clientdata(client2, NULL); + hasCPLD2 = 0; + client2 = client; + } + } + + //Handle LED control by the driver + byte[0]=0x01; + cpld_i2c_write(client, byte, CPLD_CTL_OFFSET, 1); + cpld_i2c_write(client2, byte, CPLD_CTL_OFFSET, 1); + + dev_info(&client->dev, "%s: sensor '%s'\n", + dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &cpld_group); +exit_free: + i2c_set_clientdata(client, NULL); + kfree(data); + return status; +} + +static int cpld_remove(struct i2c_client *client) +{ + struct cpld_data *data = i2c_get_clientdata(client); + + sysfs_remove_group(&client->dev.kobj, &cpld_group); + hwmon_device_unregister(data->hwmon_dev); + i2c_set_clientdata(client, NULL); + if(hasCPLD2) { + i2c_unregister_device(client2); + i2c_set_clientdata(client2, NULL); + } + kfree(data); + return 0; +} + +static const struct i2c_device_id cpld_ids[] = { + { "inv_cpld" , 0, }, + { /* LIST END */ } +}; +MODULE_DEVICE_TABLE(i2c, cpld_ids); + +static struct i2c_driver cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "inv_cpld", + }, + .probe = cpld_probe, + .remove = cpld_remove, + .id_table = cpld_ids, +}; + +/*-----------------------------------------------------------------------*/ + +/* module glue */ + +static int __init inv_cpld_init(void) +{ + return i2c_add_driver(&cpld_driver); +} + +static void __exit inv_cpld_exit(void) +{ + i2c_del_driver(&cpld_driver); +} + +MODULE_AUTHOR("jack.ting "); +MODULE_DESCRIPTION("cpld driver"); +MODULE_LICENSE("GPL"); + +module_init(inv_cpld_init); +module_exit(inv_cpld_exit); diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_eeprom.c b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_eeprom.c new file mode 100644 index 000000000000..7bb167d2e74e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_eeprom.c @@ -0,0 +1,181 @@ +/* + * 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 + + +/* Size of EEPROM in bytes */ +#define EEPROM_SIZE 256 + +#define SLICE_BITS (6) +#define SLICE_SIZE (1 << SLICE_BITS) +#define SLICE_NUM (EEPROM_SIZE/SLICE_SIZE) + +/* Each client has this additional data */ +struct eeprom_data { + struct mutex update_lock; + u8 valid; /* bitfield, bit!=0 if slice is valid */ + unsigned long last_updated[SLICE_NUM]; /* In jiffies, 8 slices */ + u8 data[EEPROM_SIZE]; /* Register values */ +}; + + +static void inv_eeprom_update_client(struct i2c_client *client, u8 slice) +{ + struct eeprom_data *data = i2c_get_clientdata(client); + int i, j; + int ret; + int addr; + + + mutex_lock(&data->update_lock); + + if (!(data->valid & (1 << slice)) || + time_after(jiffies, data->last_updated[slice] + 300 * HZ)) { + dev_dbg(&client->dev, "Starting eeprom update, slice %u\n", slice); + + addr = slice << SLICE_BITS; + + ret = i2c_smbus_write_byte_data(client, ((u8)addr >> 8) & 0xFF, (u8)addr & 0xFF); + /* select the eeprom address */ + if (ret < 0) { + dev_err(&client->dev, "address set failed\n"); + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE)) { + goto exit; + } + + for (i = slice << SLICE_BITS; i < (slice + 1) << SLICE_BITS; i+= SLICE_SIZE) { + for (j = i; j < (i+SLICE_SIZE); j++) { + int res; + + res = i2c_smbus_read_byte(client); + if (res < 0) { + goto exit; + } + + data->data[j] = res & 0xFF; + } + } + + data->last_updated[slice] = jiffies; + data->valid |= (1 << slice); + } + +exit: + mutex_unlock(&data->update_lock); +} + +static ssize_t inv_eeprom_read(struct file *filp, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t count) +{ + struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj)); + struct eeprom_data *data = i2c_get_clientdata(client); + u8 slice; + + + if (off > EEPROM_SIZE) { + return 0; + } + if (off + count > EEPROM_SIZE) { + count = EEPROM_SIZE - off; + } + if (count == 0) { + return 0; + } + + /* Only refresh slices which contain requested bytes */ + for (slice = off >> SLICE_BITS; slice <= (off + count - 1) >> SLICE_BITS; slice++) { + inv_eeprom_update_client(client, slice); + } + + memcpy(buf, &data->data[off], count); + + return count; +} + +static struct bin_attribute inv_eeprom_attr = { + .attr = { + .name = "eeprom", + .mode = S_IRUGO, + }, + .size = EEPROM_SIZE, + .read = inv_eeprom_read, +}; + +static int inv_eeprom_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct eeprom_data *data; + int err; + + if (!(data = kzalloc(sizeof(struct eeprom_data), GFP_KERNEL))) { + err = -ENOMEM; + goto exit; + } + + memset(data->data, 0xff, EEPROM_SIZE); + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + /* create the sysfs eeprom file */ + err = sysfs_create_bin_file(&client->dev.kobj, &inv_eeprom_attr); + if (err) { + goto exit_kfree; + } + + return 0; + +exit_kfree: + kfree(data); +exit: + return err; +} + +static int inv_eeprom_remove(struct i2c_client *client) +{ + sysfs_remove_bin_file(&client->dev.kobj, &inv_eeprom_attr); + kfree(i2c_get_clientdata(client)); + + return 0; +} + +static const struct i2c_device_id inv_eeprom_id[] = { + { "inv_eeprom", 0 }, + { } +}; + +static struct i2c_driver inv_eeprom_driver = { + .driver = { + .name = "inv_eeprom", + }, + .probe = inv_eeprom_probe, + .remove = inv_eeprom_remove, + .id_table = inv_eeprom_id, +}; + +module_i2c_driver(inv_eeprom_driver); + +MODULE_AUTHOR("Inventec"); +MODULE_DESCRIPTION("Inventec D6556 Mother Board EEPROM driver"); +MODULE_LICENSE("GPL"); + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_mux.c b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_mux.c new file mode 100644 index 000000000000..a303527bec46 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_mux.c @@ -0,0 +1,281 @@ +/* + * 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. + */ +#include +#include +#include +#include +#include +#include "io_expander.h" +#include "inv_mux.h" + +static struct mux_obj_s *mux_head_p = NULL; + + +/* ========== MUX object functions ========== + */ +int +_common_force_pull_gpio(int mem_addr, + int input, + int bit_offset){ + + unsigned int val = 0; + unsigned int targ = 0; + + /* Get current value */ + val = inl(mem_addr); + if (val == 0) { + SWPS_ERR("%s: inl:%d fail!\n", __func__, val); + return -1; + } + /* Count target value */ + switch (input) { + case 0: /* Pull Low */ + targ = (val & (~(1 << bit_offset))); + break; + case 1: /* Pull high */ + targ = (val | (1 << bit_offset)); + break; + default: + SWPS_ERR("%s: input state:%d incorrect!\n", + __func__, input); + return -1; + } + /* Setup gpio */ + outl(targ, mem_addr); + if (targ != inl(mem_addr)){ + SWPS_ERR("%s: outl:%d fail!\n", __func__, targ); + return -1; + } + SWPS_DEBUG("%s: done.\n", __func__); + return 0; +} + + +int +rangeley_force_pull_high(struct mux_obj_s *self){ + SWPS_ERR("%s: not ready!\n", __func__); + return -1; +} + + +int +rangeley_force_pull_low(struct mux_obj_s *self){ + SWPS_ERR("%s: not ready!\n", __func__); + return -1; +} + + +int +hedera_force_pull_high(struct mux_obj_s *self){ + return _common_force_pull_gpio(MUX_RST_MEM_ADDR_HEDERA, 1, 5); +} + + +int +hedera_force_pull_low(struct mux_obj_s *self){ + return _common_force_pull_gpio(MUX_RST_MEM_ADDR_HEDERA, 0, 5); +} + + +int +normal_gpio_pull_high(struct mux_obj_s *self){ + return gpio_direction_output(self->gpio_num, 1); +} + + +int +normal_gpio_pull_low(struct mux_obj_s *self){ + return gpio_direction_output(self->gpio_num, 0); +} + + +int +pca9548_reset_mux_all(struct mux_obj_s *self){ + /* [Note] Power-on reset (PCA9548A-NXP) + * When power is applied to VDD, an internal Power-On Reset (POR) + * holds the PCA9548A in a reset condition until VDD has reached + * VPOR. At this point, the reset condition is released and the + * PCA9548A register and I2C-bus state machine are initialized to + * their default states (all zeroes) causing all the channels to + * be deselected. Thereafter, VDD must be lowered below 0.2 V for + * at least 5 us in order to reset the device. + */ + if (self->_pull_low(self) < 0) { + SWPS_ERR("%s: _pull_low fail!\n", __func__); + return -1; + } + mdelay(MUX_RST_WAIT_MS); + if (self->_pull_high(self) < 0) { + SWPS_ERR("%s: _pull_high fail!\n", __func__); + return -1; + } + mdelay(MUX_RST_WAIT_MS); + return 0; +} + + +int +common_reset_mux_all(struct mux_obj_s *self){ + SWPS_ERR("%s: not ready!\n", __func__); + return -1; +} + + +int +init_gpio_4_force(struct mux_obj_s *self){ + return 0; +} + + +int +init_gpio_4_normal(struct mux_obj_s *self){ + + int err = 0; + + if (!gpio_is_valid(self->gpio_num)) { + SWPS_ERR("%s: GIPO:%d isn't valid\n", __func__, self->gpio_num); + return -1; + } + err = gpio_request(self->gpio_num, MUX_GPIO_LABEL); + if (err < 0) { + SWPS_ERR("%s: gpio_request fail :%d :%d\n", + __func__, err, self->gpio_num); + return -1; + } + SWPS_DEBUG("%s: gpio_request:%d ok.\n", __func__, self->gpio_num); + return 0; +} + + +static int +_setup_muxctl_cb(struct mux_obj_s *self, + unsigned gpio){ + + char mod_dsc[32] = "ERR"; + + switch (gpio) { + case MUX_RST_GPIO_FORCE_RANGELEY: + self->gpio_num = gpio; + self->_pull_low = rangeley_force_pull_low; + self->_pull_high = rangeley_force_pull_high; + self->_init = init_gpio_4_force; + self->reset = pca9548_reset_mux_all; + memset(mod_dsc, 0, 32); + snprintf(mod_dsc, 31, "Rangeley force mode"); + goto ok_setup_muxctl_cb; + + case MUX_RST_GPIO_FORCE_HEDERA: + self->gpio_num = gpio; + self->_pull_low = hedera_force_pull_low; + self->_pull_high = hedera_force_pull_high; + self->_init = init_gpio_4_force; + self->reset = pca9548_reset_mux_all; + memset(mod_dsc, 0, 32); + snprintf(mod_dsc, 31, "Hedera force mode"); + goto ok_setup_muxctl_cb; + + case MUX_RST_GPIO_48_PAC9548: + case MUX_RST_GPIO_69_PAC9548: + case MUX_RST_GPIO_249_PCA9548: + case MUX_RST_GPIO_500_PAC9548: + case MUX_RST_GPIO_505_PCA9548: + self->gpio_num = gpio; + self->_pull_low = normal_gpio_pull_low; + self->_pull_high = normal_gpio_pull_high; + self->_init = init_gpio_4_normal; + self->reset = pca9548_reset_mux_all; + memset(mod_dsc, 0, 32); + snprintf(mod_dsc, 31, "Normal mode :%d", (int)gpio); + goto ok_setup_muxctl_cb; + + default: + break; + } + SWPS_ERR("%s: Unexpected GPIO:%d\n", __func__, gpio); + return -1; + +ok_setup_muxctl_cb: + SWPS_INFO("muxctl: %s.\n", mod_dsc); + return 0; +} + + +/* ========== MUX public functions ========== + */ +void +clean_mux_gpio(void){ + + if (!mux_head_p) { + SWPS_DEBUG("%s: mux_head_p is NULL\n", __func__); + return; + } + if (gpio_is_valid(mux_head_p->gpio_num)) { + gpio_free(mux_head_p->gpio_num); + } + kfree(mux_head_p); + mux_head_p = NULL; + SWPS_DEBUG("%s: done.\n", __func__); +} + + +int +reset_mux_gpio(void){ + + if (!mux_head_p) { + SWPS_ERR("%s: MUX ctl object doesn't exist!\n", __func__); + return -1; + } + if (mux_head_p->reset(mux_head_p) < 0){ + SWPS_ERR("%s: reset fail!\n", __func__); + return -1; + } + return 0; +} + + +int +init_mux_gpio(unsigned gpio){ + + /* Create MUX control object */ + if (mux_head_p) { + SWPS_DEBUG("%s: mux_head_p is not NULL!\n", __func__); + clean_mux_gpio(); + } + /* Currently, it is using single muxctl architecture. + * In the future, it may use the multi-muxctl if HW add new features. + * (Ex: Port power-status control) + */ + mux_head_p = kzalloc(sizeof(struct mux_obj_s), GFP_KERNEL); + if (!mux_head_p) { + SWPS_ERR("%s: kzalloc fail!\n", __func__); + return -1; + } + /* Initial MUX controller */ + if (_setup_muxctl_cb(mux_head_p, gpio) < 0){ + SWPS_ERR("%s: _setup_muxctl_cb fail!\n", __func__); + return -1; + } + if (mux_head_p->_init(mux_head_p) < 0) { + SWPS_ERR("%s: init() fail\n", __func__); + goto err_init_mux_gpio; + } + /* Setup default value */ + if (mux_head_p->_pull_high(mux_head_p) < 0) { + SWPS_ERR("%s: setup default fail!\n", __func__); + goto err_init_mux_gpio; + } + return 0; + +err_init_mux_gpio: + clean_mux_gpio(); + return -1; +} + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_mux.h b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_mux.h new file mode 100644 index 000000000000..f981a304644a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_mux.h @@ -0,0 +1,47 @@ +/* + * 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. + */ + +#ifndef INV_MUX_H +#define INV_MUX_H + + +/* MUX basic information */ +#define MUX_GPIO_LABEL "SWPS_RST_MUX" + +/* MUX reset GPIO define */ +#define MUX_RST_GPIO_FORCE (30100) +#define MUX_RST_GPIO_FORCE_RANGELEY (30101) +#define MUX_RST_GPIO_FORCE_HEDERA (30102) +#define MUX_RST_GPIO_48_PAC9548 (48) +#define MUX_RST_GPIO_69_PAC9548 (69) +#define MUX_RST_GPIO_249_PCA9548 (249) +#define MUX_RST_GPIO_500_PAC9548 (500) +#define MUX_RST_GPIO_505_PCA9548 (505) + +/* MUX relate value define */ +#define MUX_RST_WAIT_MS (1) +#define MUX_RST_MEM_ADDR_RANGELEY (0) // TBD +#define MUX_RST_MEM_ADDR_HEDERA (0x548) + +struct mux_obj_s { + unsigned gpio_num; + int (*_pull_high)(struct mux_obj_s *self); + int (*_pull_low)(struct mux_obj_s *self); + int (*_init)(struct mux_obj_s *self); + int (*reset)(struct mux_obj_s *self); +}; + + +void clean_mux_gpio(void); +int reset_mux_gpio(void); +int init_mux_gpio(unsigned gpio); + + +#endif /* INV_MUX_H */ + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_platform.c b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_platform.c new file mode 100644 index 000000000000..42900232dca8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_platform.c @@ -0,0 +1,275 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +struct inv_i2c_board_info { + int ch; + int size; + struct i2c_board_info *board_info; +}; + +#define bus_id(id) (id) +static struct pca954x_platform_mode pca9641_modes_1[] = { + {.adap_id = bus_id(2),}, +}; + +static struct pca954x_platform_mode pca9641_modes_2[] = { + {.adap_id = bus_id(5),}, +}; + +static struct pca954x_platform_mode pca9641_modes_3[] = { + {.adap_id = bus_id(3),}, +}; + +static struct pca954x_platform_mode pca9641_modes_4[] = { + {.adap_id = bus_id(4),}, +}; + +static struct pca954x_platform_mode mux_modes_0[] = { + {.adap_id = bus_id(6),}, {.adap_id = bus_id(7),}, + {.adap_id = bus_id(8),}, {.adap_id = bus_id(9),}, + {.adap_id = bus_id(10),}, {.adap_id = bus_id(11),}, + {.adap_id = bus_id(12),}, {.adap_id = bus_id(13),}, +}; +static struct pca954x_platform_mode mux_modes_0_0[] = { + {.adap_id = bus_id(14),}, {.adap_id = bus_id(15),}, + {.adap_id = bus_id(16),}, {.adap_id = bus_id(17),}, + {.adap_id = bus_id(18),}, {.adap_id = bus_id(19),}, + {.adap_id = bus_id(20),}, {.adap_id = bus_id(21),}, +}; + +static struct pca954x_platform_mode mux_modes_0_1[] = { + {.adap_id = bus_id(22),}, {.adap_id = bus_id(23),}, + {.adap_id = bus_id(24),}, {.adap_id = bus_id(25),}, + {.adap_id = bus_id(26),}, {.adap_id = bus_id(27),}, + {.adap_id = bus_id(28),}, {.adap_id = bus_id(29),}, +}; + +static struct pca954x_platform_mode mux_modes_0_2[] = { + {.adap_id = bus_id(30),}, {.adap_id = bus_id(31),}, + {.adap_id = bus_id(32),}, {.adap_id = bus_id(33),}, + {.adap_id = bus_id(34),}, {.adap_id = bus_id(35),}, + {.adap_id = bus_id(36),}, {.adap_id = bus_id(37),}, +}; + +static struct pca954x_platform_mode mux_modes_0_3[] = { + {.adap_id = bus_id(38),}, {.adap_id = bus_id(39),}, + {.adap_id = bus_id(40),}, {.adap_id = bus_id(41),}, + {.adap_id = bus_id(42),}, {.adap_id = bus_id(43),}, + {.adap_id = bus_id(44),}, {.adap_id = bus_id(45),}, +}; + +static struct pca954x_platform_mode mux_modes_0_4[] = { + {.adap_id = bus_id(46),}, {.adap_id = bus_id(47),}, + {.adap_id = bus_id(48),}, {.adap_id = bus_id(49),}, + {.adap_id = bus_id(50),}, {.adap_id = bus_id(51),}, + {.adap_id = bus_id(52),}, {.adap_id = bus_id(53),}, +}; + +static struct pca954x_platform_mode mux_modes_0_5[] = { + {.adap_id = bus_id(54),}, {.adap_id = bus_id(55),}, + {.adap_id = bus_id(56),}, {.adap_id = bus_id(57),}, + {.adap_id = bus_id(58),}, {.adap_id = bus_id(59),}, + {.adap_id = bus_id(60),}, {.adap_id = bus_id(61),}, +}; + +static struct pca954x_platform_mode mux_modes_0_6[] = { + {.adap_id = bus_id(62),}, {.adap_id = bus_id(63),}, + {.adap_id = bus_id(64),}, {.adap_id = bus_id(65),}, + {.adap_id = bus_id(66),}, {.adap_id = bus_id(67),}, + {.adap_id = bus_id(68),}, {.adap_id = bus_id(69),}, +}; + +//no i2c device driver attach to mux 7 + +static struct pca954x_platform_data pca9641_data_1 = { + .modes = pca9641_modes_1, + .num_modes = 1, +}; +static struct pca954x_platform_data pca9641_data_2 = { + .modes = pca9641_modes_2, + .num_modes = 1, +}; +static struct pca954x_platform_data pca9641_data_3 = { + .modes = pca9641_modes_3, + .num_modes = 1, +}; +static struct pca954x_platform_data pca9641_data_4 = { + .modes = pca9641_modes_4, + .num_modes = 1, +}; +static struct pca954x_platform_data mux_data_0 = { + .modes = mux_modes_0, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_0 = { + .modes = mux_modes_0_0, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_1 = { + .modes = mux_modes_0_1, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_2 = { + .modes = mux_modes_0_2, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_3 = { + .modes = mux_modes_0_3, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_4 = { + .modes = mux_modes_0_4, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_5 = { + .modes = mux_modes_0_5, + .num_modes = 8, +}; +static struct pca954x_platform_data mux_data_0_6 = { + .modes = mux_modes_0_6, + .num_modes = 8, +}; + +static struct i2c_board_info i2c_device_info0[] __initdata = { + {"pca9641", 0, 0x76, &pca9641_data_1, 0, 0}, //PCA9641-1 + {"pca9641", 0, 0x73, &pca9641_data_3, 0, 0}, //PCA9641-3 + {"pca9641", 0, 0x09, &pca9641_data_4, 0, 0}, //PCA9641-4 +}; +static struct i2c_board_info i2c_device_info1[] __initdata = { + {"pca9641", 0, 0x0A, &pca9641_data_2, 0, 0}, //PCA9641-2 +}; +static struct i2c_board_info i2c_device_info2[] __initdata = { + {"inv_cpld", 0, 0x77, 0, 0, 0}, //CPLD +}; +static struct i2c_board_info i2c_device_info3[] __initdata = { + {"tmp75", 0, 0x48, 0, 0, 0}, //CPU Board Temp + {"tmp75", 0, 0x4A, 0, 0, 0}, //Temp + {"tmp75", 0, 0x4D, 0, 0, 0}, //Temp + {"tmp75", 0, 0x4E, 0, 0, 0}, //Temp +}; +static struct i2c_board_info i2c_device_info4[] __initdata = { + {"pmbus", 0, 0x5A, 0, 0, 0}, //PSU1 + {"pmbus", 0, 0x5B, 0, 0, 0}, //PSU2 +}; +static struct i2c_board_info i2c_device_info5[] __initdata = { + {"pca9548", 0, 0x70, &mux_data_0, 0, 0}, //mux root +}; +static struct i2c_board_info i2c_device_info6[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_0, 0, 0}, +}; +static struct i2c_board_info i2c_device_info7[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_1, 0, 0}, +}; +static struct i2c_board_info i2c_device_info8[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_2, 0, 0}, +}; +static struct i2c_board_info i2c_device_info9[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_3, 0, 0}, +}; +static struct i2c_board_info i2c_device_info10[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_4, 0, 0}, +}; +static struct i2c_board_info i2c_device_info11[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_5, 0, 0}, +}; +static struct i2c_board_info i2c_device_info12[] __initdata = { + {"pca9548", 0, 0x72, &mux_data_0_6, 0, 0}, +}; + + +static struct inv_i2c_board_info i2cdev_list[] = { + {bus_id(0), ARRAY_SIZE(i2c_device_info0), i2c_device_info0 }, //SMBus + {bus_id(1), ARRAY_SIZE(i2c_device_info1), i2c_device_info1 }, //pca9641-2 + {bus_id(2), ARRAY_SIZE(i2c_device_info2), i2c_device_info2 }, //pca9641-1 + {bus_id(3), ARRAY_SIZE(i2c_device_info3), i2c_device_info3 }, //pca9641-3 + {bus_id(4), ARRAY_SIZE(i2c_device_info4), i2c_device_info4 }, //pca9641-4 + {bus_id(5), ARRAY_SIZE(i2c_device_info5), i2c_device_info5 }, //mux root + {bus_id(6), ARRAY_SIZE(i2c_device_info6), i2c_device_info6 }, //mux CH0 + {bus_id(7), ARRAY_SIZE(i2c_device_info7), i2c_device_info7 }, //mux CH1 + {bus_id(8), ARRAY_SIZE(i2c_device_info8), i2c_device_info8 }, //mux CH2 + {bus_id(9), ARRAY_SIZE(i2c_device_info9), i2c_device_info9 }, //mux CH3 + {bus_id(10),ARRAY_SIZE(i2c_device_info10), i2c_device_info10}, //mux CH4 + {bus_id(11),ARRAY_SIZE(i2c_device_info11), i2c_device_info11}, //mux CH5 + {bus_id(12),ARRAY_SIZE(i2c_device_info12), i2c_device_info12}, //mux CH6 +}; + +///////////////////////////////////////////////////////////////////////////////////////// +static struct platform_device *device_i2c_gpio0; +static struct i2c_gpio_platform_data i2c_gpio_platdata0 = { + .scl_pin = 58, //494, + .sda_pin = 75, //511, + + .udelay = 5, //5:100kHz + .sda_is_open_drain = 0, + .scl_is_open_drain = 0, + .scl_is_output_only = 0 +}; + +static int __init inv_platform_init(void) +{ + struct i2c_adapter *adap = NULL; + struct i2c_client *e = NULL; + int ret = 0; + int i,j,k; + + //printk("%s \n", __func__); + + //use i2c-gpio + //register i2c gpio + //config gpio58,75 to gpio function 58=32+3*8+2 75=32*2+8*1+3 gpio69=32*2+8*0+5 + outl( inl(0x533) | (1<<2), 0x533); //i2c-gpio sdl (GPIO58) + outl( inl(0x541) | (1<<3), 0x541); //i2c-gpio sda (GPIO75) + outl( inl(0x540) | (1<<5), 0x540); //RST_I2C_MUX_N (GPIO69) + outl( inl(0x500) | (1<<7), 0x500); //SYS_RDY_N (GPIO7) + outl( inl(0x501) | (1<<7), 0x501); //BMC_HEART_BEAT (GPIO15) + outl( inl(0x503) | (1<<2)|(1<<3), 0x503); //PSOC_HEART_BEAT(26),CPLD_HEART_BEAT(27) + + device_i2c_gpio0 = platform_device_alloc("i2c-gpio", 1); + if (!device_i2c_gpio0) { + printk(KERN_ERR "i2c-gpio: platform_device_alloc fail\n"); + return -ENOMEM; + } + device_i2c_gpio0->name = "i2c-gpio"; + device_i2c_gpio0->id = 1; + device_i2c_gpio0->dev.platform_data = &i2c_gpio_platdata0; + + ret = platform_device_add(device_i2c_gpio0); + if (ret) { + printk(KERN_ERR "i2c-gpio: platform_device_add fail %d\n", ret); + } + msleep(10); + for(i=0; idev.platform_data = NULL; + platform_device_unregister(device_i2c_gpio0); +} + +module_init(inv_platform_init); +module_exit(inv_platform_exit); + +MODULE_AUTHOR("Inventec"); +MODULE_DESCRIPTION("Platform devices"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_swps.c b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_swps.c new file mode 100644 index 000000000000..cbb22fba2979 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_swps.c @@ -0,0 +1,3049 @@ +/* + * 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. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "inv_swps.h" + +static int ctl_major; +static int port_major; +static int ioexp_total; +static int port_total; +static int auto_config; +static int flag_i2c_reset; +static int flag_mod_state; +static unsigned gpio_rest_mux; +static struct class *swp_class_p = NULL; +static struct inv_platform_s *platform_p = NULL; +static struct inv_ioexp_layout_s *ioexp_layout = NULL; +static struct inv_port_layout_s *port_layout = NULL; + +static void swp_polling_worker(struct work_struct *work); +static DECLARE_DELAYED_WORK(swp_polling, swp_polling_worker); + +static int reset_i2c_topology(void); + + +static int +__swp_match(struct device *dev, +#ifdef SWPS_KERN_VER_AF_3_10 + + const void *data){ +#else + void *data){ +#endif + + char *name = (char *)data; + if (strcmp(dev_name(dev), name) == 0) + return 1; + return 0; +} + + +struct device * +get_swpdev_by_name(char *name){ + struct device *dev = class_find_device(swp_class_p, + NULL, + name, + __swp_match); + return dev; +} + + +static int +sscanf_2_int(const char *buf) { + + int result = -EBFONT; + char *hex_tag = "0x"; + + if (strcspn(buf, hex_tag) == 0) { + if (sscanf(buf,"%x",&result)) { + return result; + } + } else { + if (sscanf(buf,"%d",&result)) { + return result; + } + if(sscanf(buf,"-%d",&result)) { + return -result; + } + if (sscanf(buf,"%x",&result)) { + return result; + } + } + return -EBFONT; +} + + +static int +sscanf_2_binary(const char *buf) { + + int result = sscanf_2_int(buf); + + if (result < 0){ + return -EBFONT; + } + switch (result) { + case 0: + case 1: + return result; + default: + break; + } + return -EBFONT; +} + + +static int +_get_polling_period(void) { + + int retval = 0; + + if (SWP_POLLING_PERIOD == 0) { + return 0; + } + retval = ((SWP_POLLING_PERIOD * HZ) / 1000); + if (retval == 0) { + return 1; + } + return retval; +} + + +static struct transvr_obj_s * +_get_transvr_obj(char *dev_name) { + + struct device *dev_p = NULL; + struct transvr_obj_s *transvr_obj_p = NULL; + + dev_p = get_swpdev_by_name(dev_name); + if (!dev_p){ + return NULL; + } + transvr_obj_p = dev_get_drvdata(dev_p); + if (!transvr_obj_p){ + return NULL; + } + return transvr_obj_p; +} + + +static void +unlock_tobj_all(void) { + + struct transvr_obj_s *tobj_p; + char port_name[32]; + int port_id = 0; + int minor_curr = 0; + + for (minor_curr=0; minor_currauto_config = auto_config; + unlock_transvr_obj(tobj_p); + SWPS_DEBUG("%s: Set %s auto_config=%d\n", + __func__, tobj_p->swp_name, auto_config); + } + return retval; +} + + +/* ========== R/W Functions module control attribute ========== + */ +static ssize_t +show_attr_platform(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 32, "%s\n", platform_p->name); +} + + +static ssize_t +show_attr_version(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 8, "%s\n", SWP_VERSION); +} + + +static ssize_t +show_attr_status(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 8, "%d\n", flag_mod_state); +} + + +static ssize_t +show_attr_auto_config(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + return snprintf(buf_p, 8, "%d\n", auto_config); +} + + +static int +_check_reset_pwd(const char *buf_p, + size_t count) { + + int in_max = 64; + int in_len = (int)count; + char in_val[64] = "ERR"; + char *emsg = "ERR"; + + if (in_len >= in_max) { + emsg = "input too much"; + goto err_check_reset_pwd; + } + if (!sscanf(buf_p,"%s",in_val)) { + emsg = "format incorrect"; + goto err_check_reset_pwd; + } + if (strcmp(in_val, SWP_RESET_PWD) != 0) { + emsg = "password incorrect"; + goto err_check_reset_pwd; + } + return 0; + +err_check_reset_pwd: + SWPS_ERR("%s: %s\n", __func__, emsg); + return -1; +} + + +static ssize_t +store_attr_reset_i2c(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + if (_check_reset_pwd(buf_p, count) < 0) { + return -EBFONT; + } + /* Polling mode */ + if (SWP_POLLING_ENABLE) { + SWPS_INFO("%s: reset I2C :polling\n", __func__); + flag_i2c_reset = 1; + return count; + } + /* Direct mode */ + SWPS_INFO("%s: reset I2C go. :direct\n", __func__); + if (reset_i2c_topology() < 0) { + SWPS_ERR("%s: reset fail!\n", __func__); + return -EIO; + } + SWPS_INFO("%s: reset I2C ok. :direct\n", __func__); + return count; +} + + +static ssize_t +store_attr_reset_swps(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p; + char port_name[32] = "ERR"; + int port_id = 0; + int minor_curr = 0; + + if (_check_reset_pwd(buf_p, count) < 0) { + return -EBFONT; + } + for (minor_curr=0; minor_currstate = STATE_TRANSVR_DISCONNECTED; + unlock_transvr_obj(tobj_p); + SWPS_INFO("%s: reset:%s\n", __func__, tobj_p->swp_name); + } + return count; +} + + +static ssize_t +store_attr_auto_config(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + int input_val = sscanf_2_int(buf_p); + + if (input_val < 0){ + return -EBFONT; + } + if ((input_val != 0) && (input_val != 1)) { + return -EBFONT; + } + auto_config = input_val; + _update_auto_config_2_trnasvr(); + return count; +} + + +/* ========== Show functions: For transceiver attribute ========== + */ +static ssize_t +_show_transvr_hex_attr(struct transvr_obj_s* tobj_p, + int (*get_func)(struct transvr_obj_s* tobj_p), + char *buf_p) { + size_t len; + int result; + + lock_transvr_obj(tobj_p); + result = get_func(tobj_p); + unlock_transvr_obj(tobj_p); + if (result < 0){ + len = snprintf(buf_p, 8, "%d\n", result); + } else { + len = snprintf(buf_p, 8, "0x%02x\n", result); + } + return len; +} + + +static ssize_t +_show_transvr_int_attr(struct transvr_obj_s* tobj_p, + int (*get_func)(struct transvr_obj_s* tobj_p), + char *buf_p) { + size_t len; + + lock_transvr_obj(tobj_p); + len = snprintf(buf_p, 16, "%d\n", get_func(tobj_p)); + unlock_transvr_obj(tobj_p); + return len; +} + + +static ssize_t +_show_transvr_str_attr(struct transvr_obj_s* tobj_p, + int (*get_func)(struct transvr_obj_s* tobj_p, char* buf), + char *buf_p) { + size_t len; + + lock_transvr_obj(tobj_p); + len = get_func(tobj_p, buf_p); + unlock_transvr_obj(tobj_p); + return len; +} + + +static ssize_t +show_attr_id(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_id, + buf_p); +} + + +static ssize_t +show_attr_ext_id(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_ext_id, + buf_p); +} + + +static ssize_t +show_attr_connector(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_connector, + buf_p); +} + + +static ssize_t +show_attr_vendor_name(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_vendor_name, + buf_p); +} + + +static ssize_t +show_attr_vendor_pn(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_vendor_pn, + buf_p); +} + + +static ssize_t +show_attr_vendor_rev(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_vendor_rev, + buf_p); +} + + +static ssize_t +show_attr_vendor_sn(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_vendor_sn, + buf_p); +} + + +static ssize_t +show_attr_power_cls(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + size_t len; + int result; + struct transvr_obj_s *tobj_p; + + tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + lock_transvr_obj(tobj_p); + result = tobj_p->get_power_cls(tobj_p); + unlock_transvr_obj(tobj_p); + if (result < 0){ + len = snprintf(buf_p, 16, "%d\n", result); + } else { + len = snprintf(buf_p, 16, "Power Class %d\n", result); + } + return len; +} + + +static ssize_t +show_attr_br(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_br, + buf_p); +} + + +static ssize_t +show_attr_len_sm(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_sm, + buf_p); +} + + +static ssize_t +show_attr_len_smf(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_smf, + buf_p); +} + + +static ssize_t +show_attr_len_om1(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_om1, + buf_p); +} + + +static ssize_t +show_attr_len_om2(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_om2, + buf_p); +} + + +static ssize_t +show_attr_len_om3(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_om3, + buf_p); +} + + +static ssize_t +show_attr_len_om4(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_len_om4, + buf_p); +} + + +static ssize_t +show_attr_comp_rev(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_rev, + buf_p); +} + + +static ssize_t +show_attr_comp_eth(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_eth_1, + buf_p); +} + + +static ssize_t +show_attr_comp_eth_10(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_eth_10, + buf_p); +} + + +static ssize_t +show_attr_comp_eth_10_40(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_eth_10_40, + buf_p); +} + + +static ssize_t +show_attr_comp_extend(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_comp_extend, + buf_p); +} + + +static ssize_t +show_attr_rate_id(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_rate_id, + buf_p); +} + + +static ssize_t +show_attr_temperature(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_curr_temp, + buf_p); +} + + +static ssize_t +show_attr_voltage(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_curr_vol, + buf_p); +} + + +static ssize_t +show_attr_tx_bias(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_tx_bias, + buf_p); +} + + +static ssize_t +show_attr_tx_power(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_tx_power, + buf_p); +} + + +static ssize_t +show_attr_tx_eq(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_tx_eq, + buf_p); +} + + +static ssize_t +show_attr_rx_power(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_rx_power, + buf_p); +} + + +static ssize_t +show_attr_rx_am(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_rx_am, + buf_p); +} + + +static ssize_t +show_attr_rx_em(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_rx_em, + buf_p); +} + + +static ssize_t +show_attr_wavelength(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_wavelength, + buf_p); +} + + +static ssize_t +show_attr_extphy_offset(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_extphy_offset, + buf_p); +} + + +static ssize_t +show_attr_extphy_reg(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_extphy_reg, + buf_p); +} + + +static ssize_t +show_attr_info(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_info, + buf_p); +} + + +static ssize_t +show_attr_if_type(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_if_type, + buf_p); +} + + +static ssize_t +show_attr_if_speed(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_if_speed, + buf_p); +} + + +static ssize_t +show_attr_if_lane(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_if_lane, + buf_p); +} + + +static ssize_t +show_attr_cdr(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_hex_attr(tobj_p, + tobj_p->get_cdr, + buf_p); +} + + +static ssize_t +show_attr_soft_rs0(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_soft_rs0, + buf_p); +} + + +static ssize_t +show_attr_soft_rs1(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_int_attr(tobj_p, + tobj_p->get_soft_rs1, + buf_p); +} + + +static ssize_t +show_attr_soft_rx_los(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_soft_rx_los, + buf_p); +} + + +static ssize_t +show_attr_soft_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_soft_tx_disable, + buf_p); +} + + +static ssize_t +show_attr_soft_tx_fault(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_soft_tx_fault, + buf_p); +} + + +static ssize_t +show_attr_auto_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if(!tobj_p){ + return -ENODEV; + } + return _show_transvr_str_attr(tobj_p, + tobj_p->get_auto_tx_disable, + buf_p); +} + + +/* ========== Store functions: transceiver (R/W) attribute ========== + */ +static ssize_t +_store_transvr_int_attr(struct transvr_obj_s* tobj_p, + int (*set_func)(struct transvr_obj_s *tobj_p, int input_val), + const char *buf_p, + size_t count) { + int input, err; + + input = sscanf_2_int(buf_p); + if (input < 0){ + return -EBFONT; + } + lock_transvr_obj(tobj_p); + err = set_func(tobj_p, input); + unlock_transvr_obj(tobj_p); + if (err < 0){ + return err; + } + return count; +} + + +static ssize_t +_store_transvr_byte_hex_attr(struct transvr_obj_s* tobj_p, + int (*set_func)(struct transvr_obj_s *tobj_p, int input_val), + const char *buf_p, + size_t count) { + int input, err; + + input = sscanf_2_int(buf_p); + if ((input < 0) || (input > 0xff)){ + return -EBFONT; + } + lock_transvr_obj(tobj_p); + err = set_func(tobj_p, input); + unlock_transvr_obj(tobj_p); + if (err < 0){ + return err; + } + return count; +} + + +static ssize_t +_store_transvr_binary_attr(struct transvr_obj_s* tobj_p, + int (*set_func)(struct transvr_obj_s *tobj_p, int input_val), + const char *buf_p, + size_t count) { + int input, err; + + input = sscanf_2_binary(buf_p); + if (input < 0){ + return -EBFONT; + } + lock_transvr_obj(tobj_p); + err = set_func(tobj_p, input); + unlock_transvr_obj(tobj_p); + if (err < 0){ + return err; + } + return count; +} + + +static ssize_t +store_attr_cdr(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_byte_hex_attr(tobj_p, + tobj_p->set_cdr, + buf_p, + count); +} + + +static ssize_t +store_attr_soft_rs0(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_binary_attr(tobj_p, + tobj_p->set_soft_rs0, + buf_p, + count); +} + + +static ssize_t +store_attr_soft_rs1(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_binary_attr(tobj_p, + tobj_p->set_soft_rs1, + buf_p, + count); +} + + +static ssize_t +store_attr_soft_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count) { + + int check = sscanf_2_int(buf_p); + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + if ((check < 0) || (check > 0xf)){ + return -EBFONT; + } + return _store_transvr_byte_hex_attr(tobj_p, + tobj_p->set_soft_tx_disable, + buf_p, + count); +} + + +static ssize_t +store_attr_auto_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count) { + + int err = -EPERM; + int input = sscanf_2_int(buf_p); + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + if ((input < 0) || (input > 0xf)){ + if (input != VAL_TRANSVR_FUNCTION_DISABLE) { + return -EBFONT; + } + } + lock_transvr_obj(tobj_p); + err = tobj_p->set_auto_tx_disable(tobj_p, input); + unlock_transvr_obj(tobj_p); + if (err < 0){ + return err; + } + return count; +} + + +static ssize_t +store_attr_tx_eq(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_tx_eq, + buf_p, + count); +} + + +static ssize_t +store_attr_rx_am(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_rx_am, + buf_p, + count); +} + + +static ssize_t +store_attr_rx_em(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_rx_em, + buf_p, + count); +} + + +static ssize_t +store_attr_extphy_offset(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_extphy_offset, + buf_p, + count); +} + + +static ssize_t +store_attr_extphy_reg(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _store_transvr_int_attr(tobj_p, + tobj_p->set_extphy_reg, + buf_p, + count); +} + +/* ========== Show functions: For I/O Expander attribute ========== + */ +static ssize_t +_show_ioexp_binary_attr(struct transvr_obj_s *tobj_p, + int (*get_func)(struct ioexp_obj_s *ioexp_p, int voffset), + char *buf_p) { + size_t len; + struct ioexp_obj_s *ioexp_p = tobj_p->ioexp_obj_p; + + if (!ioexp_p) { + SWPS_ERR(" %s: data corruption! :%s\n", __func__, tobj_p->swp_name); + return -ENODATA; + } + mutex_lock(&ioexp_p->lock); + len = snprintf(buf_p, 8, "%d\n", get_func(ioexp_p, tobj_p->ioexp_virt_offset)); + mutex_unlock(&ioexp_p->lock); + return len; +} + + +static ssize_t +show_attr_present(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_present, + buf_p); +} + + +static ssize_t +show_attr_tx_fault(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_tx_fault, + buf_p); +} + + +static ssize_t +show_attr_rxlos(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_rxlos, + buf_p); +} + + +static ssize_t +show_attr_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_tx_disable, + buf_p); +} + + +static ssize_t +show_attr_reset(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_reset, + buf_p); +} + + +static ssize_t +show_attr_lpmod(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_lpmod, + buf_p); +} + + +static ssize_t +show_attr_modsel(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_modsel, + buf_p); +} + + +static ssize_t +show_attr_hard_rs0(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_hard_rs0, + buf_p); +} + + +static ssize_t +show_attr_hard_rs1(struct device *dev_p, + struct device_attribute *attr_p, + char *buf_p){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p){ + return -ENODEV; + } + return _show_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->get_hard_rs1, + buf_p); +} + + +/* ========== Store functions: For I/O Expander (R/W) attribute ========== + */ +static ssize_t +_store_ioexp_binary_attr(struct transvr_obj_s *tobj_p, + int (*set_func)(struct ioexp_obj_s *ioexp_p, + int virt_offset, int input_val), + const char *buf_p, + size_t count) { + + int input, err; + struct ioexp_obj_s *ioexp_p = tobj_p->ioexp_obj_p; + + if (!ioexp_p) { + SWPS_ERR("%s: data corruption! :%s\n", + __func__, tobj_p->swp_name); + return -ENODATA; + } + input = sscanf_2_binary(buf_p); + if (input < 0) { + return -EBFONT; + } + mutex_lock(&ioexp_p->lock); + err = set_func(ioexp_p, tobj_p->ioexp_virt_offset, input); + mutex_unlock(&ioexp_p->lock); + if (err < 0){ + return err; + } + return count; +} + +static ssize_t +store_attr_tx_disable(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_tx_disable, + buf_p, + count); +} + + +static ssize_t +store_attr_reset(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_reset, + buf_p, + count); +} + + +static ssize_t +store_attr_lpmod(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_lpmod, + buf_p, + count); +} + + +static ssize_t +store_attr_modsel(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_modsel, + buf_p, + count); +} + + +static ssize_t +store_attr_hard_rs0(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_hard_rs0, + buf_p, + count); +} + + +static ssize_t +store_attr_hard_rs1(struct device *dev_p, + struct device_attribute *attr_p, + const char *buf_p, + size_t count){ + + struct transvr_obj_s *tobj_p = dev_get_drvdata(dev_p); + if (!tobj_p) { + return -ENODEV; + } + return _store_ioexp_binary_attr(tobj_p, + tobj_p->ioexp_obj_p->set_hard_rs1, + buf_p, + count); +} + + +/* ========== SWPS attribute: For module control ========== + */ +static DEVICE_ATTR(platform, S_IRUGO, show_attr_platform, NULL); +static DEVICE_ATTR(version, S_IRUGO, show_attr_version, NULL); +static DEVICE_ATTR(status, S_IRUGO, show_attr_status, NULL); +static DEVICE_ATTR(reset_i2c, S_IWUSR, NULL, store_attr_reset_i2c); +static DEVICE_ATTR(reset_swps, S_IWUSR, NULL, store_attr_reset_swps); +static DEVICE_ATTR(auto_config, S_IRUGO|S_IWUSR, show_attr_auto_config, store_attr_auto_config); + +/* ========== Transceiver attribute: from eeprom ========== + */ +static DEVICE_ATTR(id, S_IRUGO, show_attr_id, NULL); +static DEVICE_ATTR(ext_id, S_IRUGO, show_attr_ext_id, NULL); +static DEVICE_ATTR(connector, S_IRUGO, show_attr_connector, NULL); +static DEVICE_ATTR(vendor_name, S_IRUGO, show_attr_vendor_name, NULL); +static DEVICE_ATTR(vendor_pn, S_IRUGO, show_attr_vendor_pn, NULL); +static DEVICE_ATTR(vendor_rev, S_IRUGO, show_attr_vendor_rev, NULL); +static DEVICE_ATTR(vendor_sn, S_IRUGO, show_attr_vendor_sn, NULL); +static DEVICE_ATTR(power_cls, S_IRUGO, show_attr_power_cls, NULL); +static DEVICE_ATTR(br, S_IRUGO, show_attr_br, NULL); +static DEVICE_ATTR(len_sm, S_IRUGO, show_attr_len_sm, NULL); +static DEVICE_ATTR(len_smf, S_IRUGO, show_attr_len_smf, NULL); +static DEVICE_ATTR(len_om1, S_IRUGO, show_attr_len_om1, NULL); +static DEVICE_ATTR(len_om2, S_IRUGO, show_attr_len_om2, NULL); +static DEVICE_ATTR(len_om3, S_IRUGO, show_attr_len_om3, NULL); +static DEVICE_ATTR(len_om4, S_IRUGO, show_attr_len_om4, NULL); +static DEVICE_ATTR(comp_rev, S_IRUGO, show_attr_comp_rev, NULL); +static DEVICE_ATTR(comp_eth, S_IRUGO, show_attr_comp_eth, NULL); +static DEVICE_ATTR(comp_eth_10, S_IRUGO, show_attr_comp_eth_10, NULL); +static DEVICE_ATTR(comp_eth_10_40, S_IRUGO, show_attr_comp_eth_10_40, NULL); +static DEVICE_ATTR(comp_extend, S_IRUGO, show_attr_comp_extend, NULL); +static DEVICE_ATTR(rate_id, S_IRUGO, show_attr_rate_id, NULL); +static DEVICE_ATTR(temperature, S_IRUGO, show_attr_temperature, NULL); +static DEVICE_ATTR(voltage, S_IRUGO, show_attr_voltage, NULL); +static DEVICE_ATTR(tx_bias, S_IRUGO, show_attr_tx_bias, NULL); +static DEVICE_ATTR(tx_power, S_IRUGO, show_attr_tx_power, NULL); +static DEVICE_ATTR(rx_power, S_IRUGO, show_attr_rx_power, NULL); +static DEVICE_ATTR(info, S_IRUGO, show_attr_info, NULL); +static DEVICE_ATTR(if_type, S_IRUGO, show_attr_if_type, NULL); +static DEVICE_ATTR(if_speed, S_IRUGO, show_attr_if_speed, NULL); +static DEVICE_ATTR(if_lane, S_IRUGO, show_attr_if_lane, NULL); +static DEVICE_ATTR(soft_rx_los, S_IRUGO, show_attr_soft_rx_los, NULL); +static DEVICE_ATTR(soft_tx_fault, S_IRUGO, show_attr_soft_tx_fault, NULL); +static DEVICE_ATTR(wavelength, S_IRUGO, show_attr_wavelength, NULL); +static DEVICE_ATTR(tx_eq, S_IRUGO|S_IWUSR, show_attr_tx_eq, store_attr_tx_eq); +static DEVICE_ATTR(rx_am, S_IRUGO|S_IWUSR, show_attr_rx_am, store_attr_rx_am); +static DEVICE_ATTR(rx_em, S_IRUGO|S_IWUSR, show_attr_rx_em, store_attr_rx_em); +static DEVICE_ATTR(cdr, S_IRUGO|S_IWUSR, show_attr_cdr, store_attr_cdr); +static DEVICE_ATTR(soft_rs0, S_IRUGO|S_IWUSR, show_attr_soft_rs0, store_attr_soft_rs0); +static DEVICE_ATTR(soft_rs1, S_IRUGO|S_IWUSR, show_attr_soft_rs1, store_attr_soft_rs1); +static DEVICE_ATTR(soft_tx_disable, S_IRUGO|S_IWUSR, show_attr_soft_tx_disable, store_attr_soft_tx_disable); +static DEVICE_ATTR(auto_tx_disable, S_IRUGO|S_IWUSR, show_attr_auto_tx_disable, store_attr_auto_tx_disable); +static DEVICE_ATTR(extphy_offset, S_IRUGO|S_IWUSR, show_attr_extphy_offset, store_attr_extphy_offset); +static DEVICE_ATTR(extphy_reg, S_IRUGO|S_IWUSR, show_attr_extphy_reg, store_attr_extphy_reg); + +/* ========== IO Expander attribute: from expander ========== + */ +static DEVICE_ATTR(present, S_IRUGO, show_attr_present, NULL); +static DEVICE_ATTR(tx_fault, S_IRUGO, show_attr_tx_fault, NULL); +static DEVICE_ATTR(rxlos, S_IRUGO, show_attr_rxlos, NULL); +static DEVICE_ATTR(tx_disable, S_IRUGO|S_IWUSR, show_attr_tx_disable, store_attr_tx_disable); +static DEVICE_ATTR(reset, S_IRUGO|S_IWUSR, show_attr_reset, store_attr_reset); +static DEVICE_ATTR(lpmod, S_IRUGO|S_IWUSR, show_attr_lpmod, store_attr_lpmod); +static DEVICE_ATTR(modsel, S_IRUGO|S_IWUSR, show_attr_modsel, store_attr_modsel); +static DEVICE_ATTR(hard_rs0, S_IRUGO|S_IWUSR, show_attr_hard_rs0, store_attr_hard_rs0); +static DEVICE_ATTR(hard_rs1, S_IRUGO|S_IWUSR, show_attr_hard_rs1, store_attr_hard_rs1); + +/* ========== Functions for module handling ========== + */ +static void +clean_port_obj(void){ + + dev_t dev_num; + char dev_name[32]; + struct device *device_p; + struct transvr_obj_s *transvr_obj_p; + int minor_curr, port_id; + + for (minor_curr=0; minor_curri2c_client_p); + kfree(transvr_obj_p->vendor_name); + kfree(transvr_obj_p->vendor_pn); + kfree(transvr_obj_p->vendor_rev); + kfree(transvr_obj_p->vendor_sn); + kfree(transvr_obj_p->worker_p); + kfree(transvr_obj_p); + } + dev_num = MKDEV(port_major, minor_curr); + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); + } + SWPS_DEBUG("%s: done.\n", __func__); +} + + +static void +clean_swps_common(void){ + + dev_t dev_num; + struct device *device_p; + + device_p = get_swpdev_by_name(SWP_DEV_MODCTL); + if (device_p){ + dev_num = MKDEV(ctl_major, 1); + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); + } + cancel_delayed_work_sync(&swp_polling); + SWPS_DEBUG("%s: done.\n", __func__); +} + + +static int +get_platform_type(void){ + + int i; + int pf_total = ARRAY_SIZE(platform_map); + char log_msg[64] = "ERROR"; + + platform_p = kzalloc(sizeof(struct inv_platform_s), GFP_KERNEL); + if (!platform_p){ + snprintf(log_msg, sizeof(log_msg), "kzalloc fail"); + goto err_get_platform_type_1; + } + memset(platform_p->name, 0, sizeof(platform_p->name)); + + switch (PLATFORM_SETTINGS) { + case PLATFORM_TYPE_AUTO: + snprintf(platform_p->name, (sizeof(platform_p->name) - 1), + "%s", dmi_get_system_info(DMI_BOARD_NAME)); + for (i=0; iname, platform_map[i].name) == 0) { + platform_p->id = platform_map[i].id; + snprintf(log_msg, sizeof(log_msg), + "Auto detect platform: %d (%s)", + platform_p->id, platform_p->name); + goto ok_get_platform_type_1; + } + } + snprintf(log_msg, sizeof(log_msg), + "Auto detect fail! detect platform: %s", + platform_p->name); + goto err_get_platform_type_2; + + case PLATFORM_TYPE_MAGNOLIA: + case PLATFORM_TYPE_MAGNOLIA_FNC: + case PLATFORM_TYPE_REDWOOD: + case PLATFORM_TYPE_REDWOOD_FSL: + case PLATFORM_TYPE_HUDSON32I_GA: + case PLATFORM_TYPE_SPRUCE: + case PLATFORM_TYPE_CYPRESS_GA1: + case PLATFORM_TYPE_CYPRESS_GA2: + case PLATFORM_TYPE_CYPRESS_BAI: + case PLATFORM_TYPE_TAHOE: + case PLATFORM_TYPE_SEQUOIA_GA: + case PLATFORM_TYPE_LAVENDER_GA: + case PLATFORM_TYPE_LAVENDER_ONL: + case PLATFORM_TYPE_COTTONWOOD_RANGELEY: + case PLATFORM_TYPE_MAPLE: + platform_p->id = PLATFORM_SETTINGS; + for (i=0; iname, (sizeof(platform_p->name) - 1), + "%s", platform_map[i].name); + snprintf(log_msg, sizeof(log_msg), + "User setup platform: %d (%s)", + platform_p->id, platform_p->name); + goto ok_get_platform_type_1; + } + } + snprintf(log_msg, sizeof(log_msg), + "Internal error, can not map id:%d", + PLATFORM_SETTINGS); + goto err_get_platform_type_2; + + default: + break; + } + snprintf(log_msg, sizeof(log_msg), + "PLATFORM_SETTINGS:%d undefined", PLATFORM_SETTINGS); + goto err_get_platform_type_2; + +ok_get_platform_type_1: + SWPS_DEBUG("%s: %s, :%d\n", __func__, log_msg, PLATFORM_SETTINGS); + return 0; + +err_get_platform_type_2: + kfree(platform_p); +err_get_platform_type_1: + SWPS_ERR("%s: %s :%d\n", __func__, log_msg, PLATFORM_SETTINGS); + return -1; +} + + +static int +get_layout_info(void){ + + switch (platform_p->id) { +#ifdef SWPS_MAGNOLIA + case PLATFORM_TYPE_MAGNOLIA: + case PLATFORM_TYPE_MAGNOLIA_FNC: + gpio_rest_mux = magnolia_gpio_rest_mux; + ioexp_layout = magnolia_ioexp_layout; + port_layout = magnolia_port_layout; + ioexp_total = ARRAY_SIZE(magnolia_ioexp_layout); + port_total = ARRAY_SIZE(magnolia_port_layout); + break; +#endif +#ifdef SWPS_REDWOOD + case PLATFORM_TYPE_REDWOOD: + gpio_rest_mux = redwood_gpio_rest_mux; + ioexp_layout = redwood_ioexp_layout; + port_layout = redwood_port_layout; + ioexp_total = ARRAY_SIZE(redwood_ioexp_layout); + port_total = ARRAY_SIZE(redwood_port_layout); + break; +#endif +#ifdef SWPS_HUDSON32I_GA + case PLATFORM_TYPE_HUDSON32I_GA: + gpio_rest_mux = hudsin32iga_gpio_rest_mux; + ioexp_layout = hudson32iga_ioexp_layout; + port_layout = hudson32iga_port_layout; + ioexp_total = ARRAY_SIZE(hudson32iga_ioexp_layout); + port_total = ARRAY_SIZE(hudson32iga_port_layout); + break; +#endif +#ifdef SWPS_SPRUCE + case PLATFORM_TYPE_SPRUCE: + gpio_rest_mux = spruce_gpio_rest_mux; + ioexp_layout = spruce_ioexp_layout; + port_layout = spruce_port_layout; + ioexp_total = ARRAY_SIZE(spruce_ioexp_layout); + port_total = ARRAY_SIZE(spruce_port_layout); + break; +#endif +#ifdef SWPS_CYPRESS_GA1 + case PLATFORM_TYPE_CYPRESS_GA1: + gpio_rest_mux = cypress_ga1_gpio_rest_mux; + ioexp_layout = cypress_ga1_ioexp_layout; + port_layout = cypress_ga1_port_layout; + ioexp_total = ARRAY_SIZE(cypress_ga1_ioexp_layout); + port_total = ARRAY_SIZE(cypress_ga1_port_layout); + break; +#endif +#ifdef SWPS_CYPRESS_GA2 + case PLATFORM_TYPE_CYPRESS_GA2: + gpio_rest_mux = cypress_ga2_gpio_rest_mux; + ioexp_layout = cypress_ga2_ioexp_layout; + port_layout = cypress_ga2_port_layout; + ioexp_total = ARRAY_SIZE(cypress_ga2_ioexp_layout); + port_total = ARRAY_SIZE(cypress_ga2_port_layout); + break; +#endif +#ifdef SWPS_CYPRESS_BAI + case PLATFORM_TYPE_CYPRESS_BAI: + gpio_rest_mux = cypress_b_gpio_rest_mux; + ioexp_layout = cypress_b_ioexp_layout; + port_layout = cypress_b_port_layout; + ioexp_total = ARRAY_SIZE(cypress_b_ioexp_layout); + port_total = ARRAY_SIZE(cypress_b_port_layout); + break; +#endif +#ifdef SWPS_REDWOOD_FSL + case PLATFORM_TYPE_REDWOOD_FSL: + gpio_rest_mux = redwood_fsl_gpio_rest_mux; + ioexp_layout = redwood_fsl_ioexp_layout; + port_layout = redwood_fsl_port_layout; + ioexp_total = ARRAY_SIZE(redwood_fsl_ioexp_layout); + port_total = ARRAY_SIZE(redwood_fsl_port_layout); + break; +#endif +#ifdef SWPS_TAHOE + case PLATFORM_TYPE_TAHOE: + gpio_rest_mux = tahoe_gpio_rest_mux; + ioexp_layout = tahoe_ioexp_layout; + port_layout = tahoe_port_layout; + ioexp_total = ARRAY_SIZE(tahoe_ioexp_layout); + port_total = ARRAY_SIZE(tahoe_port_layout); + break; +#endif +#ifdef SWPS_SEQUOIA + case PLATFORM_TYPE_SEQUOIA_GA: + gpio_rest_mux = sequoia_gpio_rest_mux; + ioexp_layout = sequoia_ioexp_layout; + port_layout = sequoia_port_layout; + ioexp_total = ARRAY_SIZE(sequoia_ioexp_layout); + port_total = ARRAY_SIZE(sequoia_port_layout); + break; +#endif +#ifdef SWPS_LAVENDER + case PLATFORM_TYPE_LAVENDER_GA: + case PLATFORM_TYPE_LAVENDER_ONL: + gpio_rest_mux = lavender_gpio_rest_mux; + ioexp_layout = lavender_ioexp_layout; + port_layout = lavender_port_layout; + ioexp_total = ARRAY_SIZE(lavender_ioexp_layout); + port_total = ARRAY_SIZE(lavender_port_layout); + break; +#endif +#ifdef SWPS_COTTONWOOD_RANGELEY + case PLATFORM_TYPE_COTTONWOOD_RANGELEY: + gpio_rest_mux = cottonwood_rangeley_gpio_rest_mux; + ioexp_layout = cottonwood_rangeley_ioexp_layout; + port_layout = cottonwood_rangeley_port_layout; + ioexp_total = ARRAY_SIZE(cottonwood_rangeley_ioexp_layout); + port_total = ARRAY_SIZE(cottonwood_rangeley_port_layout); + break; +#endif +#ifdef SWPS_MAPLE + case PLATFORM_TYPE_MAPLE: + gpio_rest_mux = maple_gpio_rest_mux; + ioexp_layout = maple_ioexp_layout; + port_layout = maple_port_layout; + ioexp_total = ARRAY_SIZE(maple_ioexp_layout); + port_total = ARRAY_SIZE(maple_port_layout); + break; +#endif + default: + SWPS_ERR(" Invalid platform: %d (%s)\n", + platform_p->id, platform_p->name); + return -1; + } + SWPS_INFO("Start to initial platform: %d (%s)\n", + platform_p->id, platform_p->name); + return 0; +} + + +/* ========== Functions for objects operations ========== + */ +static int +__detect_issues_port(int minor_num) { + + struct transvr_obj_s *tobj_p; + int port_id = port_layout[minor_num].port_id; + char port_name[32] = "ERR"; + char *i2c_emsg = "detected bad transceiver/cable"; + + memset(port_name, 0, sizeof(port_name)); + snprintf(port_name, sizeof(port_name), "%s%d", SWP_DEV_PORT, port_id); + tobj_p = _get_transvr_obj(port_name); + if (!tobj_p) { + SWPS_INFO("%s: tobj_p is NULL :%d\n", __func__, minor_num); + return -1; + } + if (resync_channel_tier_2(tobj_p) < 0) { + if (check_channel_tier_1() < 0) { + alarm_msg_2_user(tobj_p, i2c_emsg); + return -2;; + } + } + return 0; +} + + +static int +_detect_issues_port(void) { + /* OK : retrun -1; + * Fail: return fail at which minor number (0~N) + */ + char *emsg = "ERR"; + int minor = 0; + int minor_2st = 1; + + /* Force moving the initial channel pointer + * Filter out case of fail at minor-0 port + */ + while (minor_2st < port_total) { + minor = minor_2st; + if (__detect_issues_port(minor_2st) < 0) { + emsg = "detect minor_2st fail"; + goto err_p_detect_issues_port; + } + minor_2st += 8; + } + /* Scan all port */ + for (minor=0; minor:%d\n", __func__, emsg, minor_err); + return -1; +} + + +static int +check_transvr_obj_one(char *dev_name){ + /* [Return] + * 0 : Doesn't need to take care + * -1 : Single error + * -2 : Critical error (I2C topology die) + * -9 : Internal error + */ + struct transvr_obj_s *tobj_p = NULL; + int retval = -9; + + tobj_p = _get_transvr_obj(dev_name); + if (!tobj_p) { + SWPS_ERR("%s: %s _get_transvr_obj fail\n", + __func__, dev_name); + return -9; + } + /* Check transceiver current status */ + lock_transvr_obj(tobj_p); + retval = tobj_p->check(tobj_p); + unlock_transvr_obj(tobj_p); + switch (retval) { + case 0: + case ERR_TRANSVR_UNPLUGGED: + case ERR_TRNASVR_BE_ISOLATED: + case ERR_TRANSVR_TASK_BUSY: + return 0; + + case ERR_TRANSVR_I2C_CRASH: + default: + break; + } + /* Identify abnormal case */ + if (check_channel_tier_1() < 0) { + SWPS_DEBUG("%s: %s critical error :%d\n", + __func__, dev_name, retval); + return -2; + } + SWPS_DEBUG("%s: %s single error :%d\n", + __func__, dev_name, retval); + return -1; +} + + +static int +check_transvr_objs(void){ + + char dev_name[32]; + int port_id, err_code; + int minor_curr = 0; + + for (minor_curr=0; minor_curr:%d\n", + __func__, dev_name, err_code); + break; + } + } + return 0; + +err_check_transvr_objs: + SWPS_ERR("%s: %s reset_i2c_topology fail.\n", + __func__, dev_name); + return -1; +} + + +static void +swp_polling_worker(struct work_struct *work){ + + /* Reset I2C */ + if (flag_i2c_reset) { + goto polling_reset_i2c; + } + /* Check IOEXP */ + if (check_ioexp_objs() < 0) { + goto polling_reset_i2c; + } + /* Check transceiver */ + if (check_transvr_objs() < 0) { + SWPS_DEBUG("%s: check_transvr_objs fail.\n", __func__); + flag_i2c_reset = 1; + } + goto polling_schedule_round; + +polling_reset_i2c: + SWPS_DEBUG("%s: reset_i2c_topology start.\n", __func__); + if (reset_i2c_topology() < 0) { + SWPS_ERR("%s: reset i2c fail!\n", __func__); + flag_i2c_reset = 1; + } else { + SWPS_DEBUG("%s: reset_i2c_topology OK.\n", __func__); + flag_i2c_reset = 0; + } +polling_schedule_round: + schedule_delayed_work(&swp_polling, _get_polling_period()); +} + + +/* ========== Functions for register something ========== + */ +static int +register_transvr_common_attr(struct device *device_p){ + + char *err_attr = NULL; + + if (device_create_file(device_p, &dev_attr_id) < 0) { + err_attr = "dev_attr_id"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_ext_id) < 0) { + err_attr = "dev_attr_ext_id"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_connector) < 0) { + err_attr = "dev_attr_connector"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_vendor_name) < 0) { + err_attr = "dev_attr_vendor_name"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_vendor_pn) < 0) { + err_attr = "dev_attr_vendor_pn"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_vendor_rev) < 0) { + err_attr = "dev_attr_vendor_rev"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_vendor_sn) < 0) { + err_attr = "dev_attr_vendor_sn"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_br) < 0) { + err_attr = "dev_attr_br"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_smf) < 0) { + err_attr = "dev_attr_len_smf"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_om1) < 0) { + err_attr = "dev_attr_len_om1"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_om2) < 0) { + err_attr = "dev_attr_len_om2"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_om3) < 0) { + err_attr = "dev_attr_len_om3"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_len_om4) < 0) { + err_attr = "dev_attr_len_om4"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_comp_extend) < 0) { + err_attr = "dev_attr_comp_extend"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_comp_eth) < 0) { + err_attr = "dev_attr_comp_eth"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_comp_rev) < 0) { + err_attr = "dev_attr_comp_rev"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_info) < 0) { + err_attr = "dev_attr_info"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_if_type) < 0) { + err_attr = "dev_attr_if_type"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_if_speed) < 0) { + err_attr = "dev_attr_if_speed"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_if_lane) < 0) { + err_attr = "dev_attr_if_lane"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_temperature) < 0) { + err_attr = "dev_attr_temperature"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_voltage) < 0) { + err_attr = "dev_attr_voltage"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_tx_bias) < 0) { + err_attr = "dev_attr_tx_bias"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_tx_power) < 0) { + err_attr = "dev_attr_tx_power"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_rx_power) < 0) { + err_attr = "dev_attr_rx_power"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_tx_eq) < 0) { + err_attr = "dev_attr_tx_eq"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_rx_em) < 0) { + err_attr = "dev_attr_rx_em"; + goto err_transvr_comm_attr; + } + if (device_create_file(device_p, &dev_attr_wavelength) < 0) { + err_attr = "dev_attr_wavelength"; + goto err_transvr_comm_attr; + } + return 0; + +err_transvr_comm_attr: + SWPS_ERR("%s: %s\n", __func__, err_attr); + return -1; +} + +static int +register_transvr_sfp_attr(struct device *device_p){ + + char *err_attr = NULL; + + if (register_transvr_common_attr(device_p) < 0) { + err_attr = "register_transvr_common_attr"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_comp_eth_10) < 0) { + err_attr = "dev_attr_comp_eth_10"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_len_sm) < 0) { + err_attr = "dev_attr_len_sm"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_rate_id) < 0) { + err_attr = "dev_attr_rate_id"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_rs0) < 0) { + err_attr = "dev_attr_soft_rs0"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_rs1) < 0) { + err_attr = "dev_attr_soft_rs1"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_extphy_offset) < 0) { + err_attr = "dev_attr_extphy_offset"; + goto err_transvr_sfp_attr; + } + if (device_create_file(device_p, &dev_attr_extphy_reg) < 0) { + err_attr = "dev_attr_extphy_reg"; + goto err_transvr_sfp_attr; + } + return 0; + +err_transvr_sfp_attr: + SWPS_ERR("%s: %s\n", __func__, err_attr); + return -1; +} + + +static int +register_transvr_qsfp_attr(struct device *device_p){ + + char *err_attr = NULL; + + if (register_transvr_common_attr(device_p) < 0) { + err_attr = "register_transvr_common_attr"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_comp_eth_10_40) < 0) { + err_attr = "dev_attr_comp_eth_10_40"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_power_cls) < 0) { + err_attr = "dev_attr_power_cls"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_rx_los) < 0) { + err_attr = "soft_rx_los"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_tx_disable) < 0) { + err_attr = "soft_tx_disable"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_auto_tx_disable) < 0) { + err_attr = "auto_tx_disable"; + goto err_transvr_qsfp_attr; + } + if (device_create_file(device_p, &dev_attr_soft_tx_fault) < 0) { + err_attr = "soft_tx_fault"; + goto err_transvr_qsfp_attr; + } + return 0; + +err_transvr_qsfp_attr: + SWPS_ERR("%s: %s\n", __func__, err_attr); + return -1; +} + + +static int +register_transvr_qsfp28_attr(struct device *device_p){ + + char *err_attr = NULL; + + if (register_transvr_qsfp_attr(device_p) < 0){ + err_attr = "register_transvr_qsfp_attr"; + goto err_transvr_qsfp28_attr; + } + if (device_create_file(device_p, &dev_attr_cdr) < 0) { + err_attr = "dev_attr_cdr"; + goto err_transvr_qsfp28_attr; + } + if (device_create_file(device_p, &dev_attr_rx_am) < 0) { + err_attr = "dev_attr_rx_am"; + goto err_transvr_qsfp28_attr; + } + return 0; + +err_transvr_qsfp28_attr: + SWPS_ERR("%s: %s\n", __func__, err_attr); + return -1; +} + + +static int +register_transvr_attr(struct device *device_p, + struct transvr_obj_s *transvr_obj){ + + switch (transvr_obj->layout){ + case TRANSVR_TYPE_SFP: + if (register_transvr_sfp_attr(device_p) < 0){ + goto err_reg_tvr_attr; + } + break; + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + if (register_transvr_qsfp_attr(device_p) < 0){ + goto err_reg_tvr_attr; + } + break; + case TRANSVR_TYPE_QSFP_28: + if (register_transvr_qsfp28_attr(device_p) < 0){ + goto err_reg_tvr_attr; + } + break; + default: + goto err_reg_tvr_attr; + } + return 0; + +err_reg_tvr_attr: + SWPS_ERR("%s: fail! type=%d \n", __func__, transvr_obj->type); + return -1; +} + + +static int +register_ioexp_attr_sfp_1(struct device *device_p){ + /* Support machine type: + * - SFP : Magnolia + */ + char *err_attr = NULL; + + if (device_create_file(device_p, &dev_attr_present) < 0) { + err_attr = "dev_attr_present"; + goto err_ioexp_sfp1_attr; + } + if (device_create_file(device_p, &dev_attr_tx_fault) < 0) { + err_attr = "dev_attr_tx_fault"; + goto err_ioexp_sfp1_attr; + } + if (device_create_file(device_p, &dev_attr_rxlos) < 0) { + err_attr = "dev_attr_rxlos"; + goto err_ioexp_sfp1_attr; + } + if (device_create_file(device_p, &dev_attr_tx_disable) < 0) { + err_attr = "dev_attr_tx_disable"; + goto err_ioexp_sfp1_attr; + } + return 0; + +err_ioexp_sfp1_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + + +static int +register_ioexp_attr_sfp_2(struct device *device_p){ + /* Support machine type: + * - SFP28 : Cypress + */ + char *err_attr = NULL; + + if (register_ioexp_attr_sfp_1(device_p) < 0){ + goto err_ioexp_sfp2_attr; + } + if (device_create_file(device_p, &dev_attr_hard_rs0) < 0) { + err_attr = "dev_attr_hard_rs0"; + goto err_ioexp_sfp2_attr; + } + if (device_create_file(device_p, &dev_attr_hard_rs1) < 0) { + err_attr = "dev_attr_hard_rs1"; + goto err_ioexp_sfp2_attr; + } + return 0; + +err_ioexp_sfp2_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + + +static int +register_ioexp_attr_qsfp_1(struct device *device_p){ + /* Support machine type: + * - QSFP : Magnolia, Redwood, Hudson32i + * - QSFP+ : Magnolia, Redwood, Hudson32i + * - QSFP28: Redwood + */ + char *err_attr = NULL; + + if (device_create_file(device_p, &dev_attr_present) < 0) { + err_attr = "dev_attr_present"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_reset) < 0) { + err_attr = "dev_attr_reset"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_lpmod) < 0) { + err_attr = "dev_attr_lpmod"; + goto err_ioexp_qsfp1_attr; + } + if (device_create_file(device_p, &dev_attr_modsel) < 0) { + err_attr = "dev_attr_modsel"; + goto err_ioexp_qsfp1_attr; + } + return 0; + +err_ioexp_qsfp1_attr: + SWPS_ERR("Add device attribute:%s failure! \n",err_attr); + return -1; +} + + +static int +register_modctl_attr(struct device *device_p){ + + char *err_msg = NULL; + + if (device_create_file(device_p, &dev_attr_platform) < 0) { + err_msg = "dev_attr_platform"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_version) < 0) { + err_msg = "dev_attr_version"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_status) < 0) { + err_msg = "dev_attr_status"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_reset_i2c) < 0) { + err_msg = "dev_attr_reset_i2c"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_reset_swps) < 0) { + err_msg = "dev_attr_reset_swps"; + goto err_reg_modctl_attr; + } + if (device_create_file(device_p, &dev_attr_auto_config) < 0) { + err_msg = "dev_attr_auto_config"; + goto err_reg_modctl_attr; + } + return 0; + +err_reg_modctl_attr: + SWPS_ERR("%s: %s\n", __func__, err_msg); + return -1; +} + + +static int +register_ioexp_attr(struct device *device_p, + struct transvr_obj_s *transvr_obj){ + + char *err_msg = "ERR"; + + switch (transvr_obj->ioexp_obj_p->ioexp_type){ + case IOEXP_TYPE_MAGINOLIA_NAB: + case IOEXP_TYPE_MAGINOLIA_4AB: + case CPLD_TYPE_COTTONWOOD: + if (register_ioexp_attr_sfp_1(device_p) < 0){ + err_msg = "register_ioexp_attr_sfp_1 fail"; + goto err_reg_ioexp_attr; + } + break; + case IOEXP_TYPE_CYPRESS_NABC: + case IOEXP_TYPE_MAPLE_NABC: + if (register_ioexp_attr_sfp_2(device_p) < 0){ + err_msg = "register_ioexp_attr_sfp_2 fail"; + goto err_reg_ioexp_attr; + } + break; + case IOEXP_TYPE_MAGINOLIA_7AB: + case IOEXP_TYPE_SPRUCE_7AB: + case IOEXP_TYPE_CYPRESS_7ABC: + case IOEXP_TYPE_REDWOOD_P01P08: + case IOEXP_TYPE_REDWOOD_P09P16: + case IOEXP_TYPE_HUDSON32IGA_P01P08: + case IOEXP_TYPE_HUDSON32IGA_P09P16: + case IOEXP_TYPE_TAHOE_5A: + case IOEXP_TYPE_TAHOE_6ABC: + case IOEXP_TYPE_SEQUOIA_NABC: + case IOEXP_TYPE_LAVENDER_P65: + case IOEXP_TYPE_MAPLE_0ABC: + if (register_ioexp_attr_qsfp_1(device_p) < 0){ + err_msg = "register_ioexp_attr_qsfp_1 fail"; + goto err_reg_ioexp_attr; + } + break; + + default: + err_msg = "Unknow type"; + goto err_reg_ioexp_attr; + } + return 0; + +err_reg_ioexp_attr: + SWPS_ERR("%s: %s :%d \n", + __func__, err_msg, transvr_obj->ioexp_obj_p->ioexp_type); + return -1; +} + + +static int +register_modctl_device(void) { + + struct device *device_p = NULL; + int minor_comm = 0; /* Default minor number for common device */ + dev_t dev_num = MKDEV(ctl_major, minor_comm); + char *err_msg = "ERROR"; + + device_p = device_create(swp_class_p, /* struct class *cls */ + NULL, /* struct device *parent */ + dev_num, /* dev_t devt */ + NULL, /* void *private_data */ + SWP_DEV_MODCTL); /* const char *fmt */ + if (IS_ERR(device_p)){ + err_msg = "device_create fail"; + goto err_register_modctl_device_1; + } + if (register_modctl_attr(device_p) < 0) { + err_msg = "register_modctl_attr fail"; + goto err_register_modctl_device_2; + } + return 0; + +err_register_modctl_device_2: + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); +err_register_modctl_device_1: + SWPS_ERR("%s: %s\n", __func__, err_msg); + return -1; +} + + +static int +register_port_device(char *dev_name, + dev_t dev_num, + struct transvr_obj_s *transvr_obj){ + + struct device *device_p = NULL; + device_p = device_create(swp_class_p, /* struct class *cls */ + NULL, /* struct device *parent */ + dev_num, /* dev_t devt */ + transvr_obj, /* void *private_data */ + dev_name); /* const char *fmt */ + if (IS_ERR(device_p)){ + goto err_regswp_create_dev; + } + if (register_transvr_attr(device_p, transvr_obj) < 0){ + goto err_regswp_reg_attr; + } + if (register_ioexp_attr(device_p, transvr_obj) < 0){ + goto err_regswp_reg_attr; + } + return 0; + +err_regswp_reg_attr: + device_unregister(device_p); + device_destroy(swp_class_p, dev_num); +err_regswp_create_dev: + SWPS_ERR("%s fail! :%s\n", __func__, dev_name); + return -1; +} + + +static int +register_swp_module(void){ + + dev_t ctl_devt = 0; + dev_t port_devt = 0; + int dev_total = port_total + 1; /* char_dev for module control */ + + /* Register device number */ + if (alloc_chrdev_region(&ctl_devt, 0, 1, SWP_DEV_MODCTL) < 0){ + SWPS_WARN("Allocate CTL MAJOR failure! \n"); + goto err_register_swp_module_1; + } + if (alloc_chrdev_region(&port_devt, 0, dev_total, SWP_CLS_NAME) < 0){ + SWPS_WARN("Allocate PORT MAJOR failure! \n"); + goto err_register_swp_module_2; + } + ctl_major = MAJOR(ctl_devt); + port_major = MAJOR(port_devt); + + /* Create class object */ + swp_class_p = class_create(THIS_MODULE, SWP_CLS_NAME); + if (IS_ERR(swp_class_p)) { + SWPS_ERR("Create class failure! \n"); + goto err_register_swp_module_3; + } + return 0; + +err_register_swp_module_3: + unregister_chrdev_region(MKDEV(port_major, 0), port_total); +err_register_swp_module_2: + unregister_chrdev_region(MKDEV(ctl_major, 0), 1); +err_register_swp_module_1: + return -1; +} + + +/* ========== Module initial relate ========== + */ +static int +create_ioexp_objs(void) { + + int i, run_mod; + + /* Clean IOEXP object */ + clean_ioexp_objs(); + /* Get running mode */ + run_mod = IOEXP_MODE_DIRECT; + if (SWP_POLLING_ENABLE){ + run_mod = IOEXP_MODE_POLLING; + } + /* Create IOEXP object */ + for(i=0; i devlen_max) { + snprintf(err_msg, sizeof(err_msg), + "SWP_DEV_PORT too long!"); + goto err_initport_create_tranobj; + } + memset(dev_name, 0, sizeof(dev_name)); + snprintf(dev_name, devlen_max, "%s%d", SWP_DEV_PORT, port_id); + /* Create transceiver object */ + ioexp_obj_p = get_ioexp_obj(ioexp_id); + if (!ioexp_obj_p){ + snprintf(err_msg, sizeof(err_msg), + "IOEXP object:%d not exist", ioexp_id); + goto err_initport_create_tranobj; + } + transvr_obj_p = create_transvr_obj(dev_name, chan_id, ioexp_obj_p, + ioexp_virt_offset, transvr_type, + chipset_type, run_mod); + if (!transvr_obj_p){ + snprintf(err_msg, sizeof(err_msg), + "Create transceiver object fail :%s", dev_name); + goto err_initport_create_tranobj; + } + /* Setup Lane_ID mapping */ + i = ARRAY_SIZE(port_layout[minor_curr].lane_id); + j = ARRAY_SIZE(transvr_obj_p->lane_id); + if (i != j) { + snprintf(err_msg, sizeof(err_msg), + "Lane_id size inconsistent %d/%d", i, j); + goto err_initport_reg_device; + } + memcpy(transvr_obj_p->lane_id, port_layout[minor_curr].lane_id, i*sizeof(int)); + /* Create and register device object */ + if (register_port_device(dev_name, MKDEV(port_major, minor_curr), transvr_obj_p) < 0){ + snprintf(err_msg, sizeof(err_msg), + "register_port_device fail"); + goto err_initport_reg_device; + } + /* Setup device_ptr of transvr_obj */ + dev_p = get_swpdev_by_name(dev_name); + if (!dev_p){ + snprintf(err_msg, sizeof(err_msg), + "get_swpdev_by_name fail"); + goto err_initport_reg_device; + } + transvr_obj_p->transvr_dev_p = dev_p; + /* Success */ + ok_count++; + } + SWPS_INFO("%s: initialed %d port-dev",__func__, ok_count); + return 0; + +err_initport_reg_device: + kfree(transvr_obj_p); +err_initport_create_tranobj: + clean_port_obj(); + SWPS_ERR("%s: %s", __func__, err_msg); + SWPS_ERR("Dump: :%d :%d :%d :%d :%d :%d\n", + port_id, chan_id, ioexp_id, ioexp_virt_offset, transvr_type, run_mod); + return -1; +} + + +static int +init_dev_topology(void){ + + int err; + char *emsg = "ERR"; + flag_mod_state = SWP_STATE_NORMAL; + + err = init_ioexp_objs(); + switch(err){ + case 0: /* Normal */ + SWPS_DEBUG("%s: normal case\n", __func__); + break; + + case -1: /* topology error */ + SWPS_DEBUG("%s: detect tier-1 topology initial failure :%d\n", + __func__, err); + /* Reset and isolate */ + err = reset_i2c_topology(); + if (err < 0) { + emsg = "reset i2c topology fail"; + goto err_init_dev_topology; + } + /* Re-initial again */ + err = init_ioexp_objs(); + if (err < 0) { + emsg = "re-init ioexp objects fail"; + goto err_init_dev_topology; + } + break; + + case -2: /* Internal error */ + SWPS_DEBUG("%s: internal error case\n", __func__); + err = -2; + emsg = "internal error"; + goto err_init_dev_topology; + + default: + SWPS_DEBUG("%s: undefined error case\n", __func__); + emsg = "undefined error case"; + goto err_init_dev_topology; + } + SWPS_DEBUG("%s: initial I2C topology success\n", __func__); + return 0; + +err_init_dev_topology: + SWPS_ERR("%s: %s :%d\n", __func__, emsg, err); + return -1; +} + + +static int +init_polling_task(void){ + + if (SWP_POLLING_ENABLE){ + schedule_delayed_work(&swp_polling, _get_polling_period()); + } + return 0; +} + + +static int +init_swps_common(void){ + + char *err_msg = "ERR"; + + auto_config = 0; + if ((SWP_AUTOCONFIG_ENABLE) && (SWP_POLLING_ENABLE)){ + auto_config = 1; + } + if (register_modctl_device() < 0) { + err_msg = "register_modctl_device fail"; + goto err_init_swps_common_1; + } + if (_update_auto_config_2_trnasvr() < 0) { + err_msg = "_update_auto_config_2_trnasvr fail"; + goto err_init_swps_common_1; + } + if (init_polling_task() < 0){ + err_msg = "init_polling_task fail"; + goto err_init_swps_common_1; + } + return 0; + +err_init_swps_common_1: + clean_swps_common(); + SWPS_ERR("%s: %s\n", __func__, err_msg); + return -1; +} + + +static int __init +swp_module_init(void){ + + if (get_platform_type() < 0){ + goto err_init_out; + } + if (get_layout_info() < 0){ + goto err_init_out; + } + if (register_swp_module() < 0){ + goto err_init_out; + } + if (create_ioexp_objs() < 0){ + goto err_init_ioexp; + } + if (create_port_objs() < 0){ + goto err_init_portobj; + } + if (init_mux_gpio(gpio_rest_mux) < 0){ + goto err_init_mux; + } + if (init_dev_topology() < 0){ + goto err_init_topology; + } + if (init_swps_common() < 0){ + goto err_init_topology; + } + SWPS_INFO("Inventec switch-port module V.%s initial success.\n", SWP_VERSION); + return 0; + + +err_init_topology: + clean_mux_gpio(); +err_init_mux: + clean_port_obj(); +err_init_portobj: + clean_ioexp_objs(); +err_init_ioexp: + class_unregister(swp_class_p); + class_destroy(swp_class_p); + unregister_chrdev_region(MKDEV(ctl_major, 0), 1); + unregister_chrdev_region(MKDEV(port_major, 0), port_total); +err_init_out: + SWPS_ERR("Inventec switch-port module V.%s initial failure.\n", SWP_VERSION); + return -1; +} + + +static void __exit +swp_module_exit(void){ + + clean_swps_common(); + clean_port_obj(); + clean_ioexp_objs(); + clean_mux_gpio(); + class_unregister(swp_class_p); + class_destroy(swp_class_p); + unregister_chrdev_region(MKDEV(ctl_major, 0), 1); + unregister_chrdev_region(MKDEV(port_major, 0), port_total); + SWPS_INFO("Remove Inventec switch-port module success.\n"); +} + + +/* Module information */ +MODULE_AUTHOR(SWP_AUTHOR); +MODULE_DESCRIPTION(SWP_DESC); +MODULE_VERSION(SWP_VERSION); +MODULE_LICENSE(SWP_LICENSE); + +module_init(swp_module_init); +module_exit(swp_module_exit); + + + + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_swps.h b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_swps.h new file mode 100644 index 000000000000..d28a0a3c968e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/inv_swps.h @@ -0,0 +1,1164 @@ +/* + * 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. + */ + +#ifndef INV_SWPS_H +#define INV_SWPS_H + +#include "transceiver.h" +#include "io_expander.h" +#include "inv_mux.h" + +/* Module settings */ +#define SWP_CLS_NAME "swps" +#define SWP_DEV_PORT "port" +#define SWP_DEV_MODCTL "module" +#define SWP_RESET_PWD "inventec" +#define SWP_POLLING_PERIOD (300) /* msec */ +#define SWP_POLLING_ENABLE (1) +#define SWP_AUTOCONFIG_ENABLE (1) + +/* Module information */ +#define SWP_AUTHOR "Neil " +#define SWP_DESC "Inventec port and transceiver driver" +#define SWP_VERSION "4.2.9" +#define SWP_LICENSE "GPL" + +/* Module status define */ +#define SWP_STATE_NORMAL (0) +#define SWP_STATE_I2C_DIE (-91) + +/* [Note]: + * Functions and mechanism for auto-detect platform type is ready, + * But HW and BIOS not ready! We need to wait them. + * So, please do not use PLATFORM_TYPE_AUTO until they are ready. + * (2016.06.13) + */ +#define PLATFORM_TYPE_AUTO (100) +#define PLATFORM_TYPE_MAGNOLIA (111) +#define PLATFORM_TYPE_MAGNOLIA_FNC (112) +#define PLATFORM_TYPE_REDWOOD (121) +#define PLATFORM_TYPE_REDWOOD_FSL (122) +#define PLATFORM_TYPE_HUDSON32I_GA (131) +#define PLATFORM_TYPE_SPRUCE (141) +#define PLATFORM_TYPE_CYPRESS_GA1 (151) /* Up -> Down */ +#define PLATFORM_TYPE_CYPRESS_GA2 (152) /* Down -> Up */ +#define PLATFORM_TYPE_CYPRESS_BAI (153) /* Down -> Up */ +#define PLATFORM_TYPE_TAHOE (161) +#define PLATFORM_TYPE_SEQUOIA_GA (171) +#define PLATFORM_TYPE_LAVENDER_GA (181) +#define PLATFORM_TYPE_LAVENDER_ONL (182) +#define PLATFORM_TYPE_COTTONWOOD_RANGELEY (191) +#define PLATFORM_TYPE_MAPLE (201) +/* Current running platfrom */ +#define PLATFORM_SETTINGS PLATFORM_TYPE_MAPLE + +/* Define platform flag and kernel version */ +#if (PLATFORM_SETTINGS == PLATFORM_TYPE_MAGNOLIA) + #define SWPS_MAGNOLIA (1) + #define SWPS_KERN_VER_BF_3_8 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_MAGNOLIA_FNC) + #define SWPS_MAGNOLIA (1) + #define SWPS_KERN_VER_AF_3_10 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_REDWOOD) + #define SWPS_REDWOOD (1) + #define SWPS_KERN_VER_BF_3_8 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_REDWOOD_FSL) + #define SWPS_REDWOOD_FSL (1) + #define SWPS_KERN_VER_BF_3_8 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_HUDSON32I_GA) + #define SWPS_HUDSON32I_GA (1) + #define SWPS_KERN_VER_BF_3_8 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_SPRUCE) + #define SWPS_SPRUCE (1) + #define SWPS_KERN_VER_BF_3_8 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_CYPRESS_GA1) + #define SWPS_CYPRESS_GA1 (1) + #define SWPS_KERN_VER_BF_3_8 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_CYPRESS_GA2) + #define SWPS_CYPRESS_GA2 (1) + #define SWPS_KERN_VER_BF_3_8 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_CYPRESS_BAI) + #define SWPS_CYPRESS_BAI (1) + #define SWPS_KERN_VER_AF_3_10 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_TAHOE) + #define SWPS_TAHOE (1) + #define SWPS_KERN_VER_AF_3_10 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_SEQUOIA_GA) + #define SWPS_SEQUOIA (1) + #define SWPS_KERN_VER_BF_3_8 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_LAVENDER_GA) + #define SWPS_LAVENDER (1) + #define SWPS_KERN_VER_AF_3_10 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_LAVENDER_ONL) + #define SWPS_LAVENDER (1) + #define SWPS_KERN_VER_AF_3_10 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_COTTONWOOD_RANGELEY) + #define SWPS_COTTONWOOD_RANGELEY (1) + #define SWPS_KERN_VER_AF_3_10 (1) +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_MAPLE) + #define SWPS_MAPLE (1) + #define SWPS_KERN_VER_AF_3_10 (1) +#endif + + +struct inv_platform_s { + int id; + char name[64]; +}; + +struct inv_ioexp_layout_s { + int ioexp_id; + int ioexp_type; + struct ioexp_addr_s addr[4]; +}; + +struct inv_port_layout_s { + int port_id; + int chan_id; + int ioexp_id; + int ioexp_offset; + int transvr_type; + int chipset_type; + int lane_id[8]; +}; + + +/* ========================================== + * Inventec Platform Settings + * ========================================== + */ +struct inv_platform_s platform_map[] = { + {PLATFORM_TYPE_AUTO, "Auto-Detect" }, + {PLATFORM_TYPE_MAGNOLIA, "Magnolia" }, + {PLATFORM_TYPE_MAGNOLIA_FNC, "Magnolia_FNC" }, + {PLATFORM_TYPE_REDWOOD, "Redwood" }, + {PLATFORM_TYPE_REDWOOD_FSL, "Redwood_FSL" }, + {PLATFORM_TYPE_HUDSON32I_GA, "Hudson32i" }, + {PLATFORM_TYPE_SPRUCE, "Spruce" }, + {PLATFORM_TYPE_CYPRESS_GA1, "Cypress_GA1" }, + {PLATFORM_TYPE_CYPRESS_GA2, "Cypress_GA2" }, + {PLATFORM_TYPE_CYPRESS_BAI, "Cypress_BAI" }, + {PLATFORM_TYPE_TAHOE, "Tahoe" }, + {PLATFORM_TYPE_SEQUOIA_GA, "Sequoia_GA" }, + {PLATFORM_TYPE_LAVENDER_GA, "Lavender_GA" }, + {PLATFORM_TYPE_LAVENDER_ONL, "Lavender_ONL" }, + {PLATFORM_TYPE_COTTONWOOD_RANGELEY, "Cottonwood_RANGELEY" }, + {PLATFORM_TYPE_MAPLE, "Maple" }, +}; + + +/* ========================================== + * Magnolia Layout configuration + * ========================================== + */ +#ifdef SWPS_MAGNOLIA +unsigned magnolia_gpio_rest_mux = MUX_RST_GPIO_48_PAC9548; + +struct inv_ioexp_layout_s magnolia_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_MAGINOLIA_NAB, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, }, /* addr[1] = I/O Expander N B */ + }, + {1, IOEXP_TYPE_MAGINOLIA_NAB, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, }, /* addr[1] = I/O Expander N B */ + }, + {2, IOEXP_TYPE_MAGINOLIA_NAB, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, }, /* addr[1] = I/O Expander N B */ + }, + {3, IOEXP_TYPE_MAGINOLIA_4AB, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander 4 A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xf0, 0xff}, {0xf0, 0xff}, }, }, /* addr[1] = I/O Expander 4 B */ + }, + {4, IOEXP_TYPE_MAGINOLIA_NAB, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {6, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, }, /* addr[1] = I/O Expander N B */ + }, + {5, IOEXP_TYPE_MAGINOLIA_NAB, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, }, /* addr[1] = I/O Expander N B */ + }, + {6, IOEXP_TYPE_MAGINOLIA_7AB, { {8, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 7 A */ + {8, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xf0, 0x33}, }, }, /* addr[1] = I/O Expander 7 B */ + }, +}; + +struct inv_port_layout_s magnolia_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 10, 0, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 16} }, + { 1, 11, 0, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 15} }, + { 2, 12, 0, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 14} }, + { 3, 13, 0, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 13} }, + { 4, 14, 0, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 24} }, + { 5, 15, 0, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 23} }, + { 6, 16, 0, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 22} }, + { 7, 17, 0, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 21} }, + { 8, 18, 1, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 28} }, + { 9, 19, 1, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 27} }, + {10, 20, 1, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 26} }, + {11, 21, 1, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 25} }, + {12, 22, 1, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 32} }, + {13, 23, 1, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 31} }, + {14, 24, 1, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 30} }, + {15, 25, 1, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 29} }, + {16, 26, 2, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 48} }, + {17, 27, 2, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 47} }, + {18, 28, 2, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 46} }, + {19, 29, 2, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 45} }, + {20, 30, 2, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 52} }, + {21, 31, 2, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 51} }, + {22, 32, 2, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 50} }, + {23, 33, 2, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 49} }, + {24, 34, 3, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 56} }, + {25, 35, 3, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 55} }, + {26, 36, 3, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 54} }, + {27, 37, 3, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 53} }, + {28, 38, 3, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 60} }, + {29, 39, 3, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 59} }, + {30, 40, 3, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 58} }, + {31, 41, 3, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 57} }, + {32, 42, 4, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 64} }, + {33, 43, 4, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 63} }, + {34, 44, 4, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 62} }, + {35, 45, 4, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 61} }, + {36, 46, 4, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 68} }, + {37, 47, 4, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 67} }, + {38, 48, 4, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 66} }, + {39, 49, 4, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 65} }, + {40, 50, 5, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 72} }, + {41, 51, 5, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 71} }, + {42, 52, 5, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 70} }, + {43, 53, 5, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 69} }, + {44, 54, 5, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 76} }, + {45, 55, 5, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 75} }, + {46, 56, 5, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 74} }, + {47, 57, 5, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_2, { 73} }, + {48, 58, 6, 0, TRANSVR_TYPE_QSFP, BCM_CHIP_TYPE_TRIDENT_2, { 81, 82, 83, 84} }, + {49, 59, 6, 1, TRANSVR_TYPE_QSFP, BCM_CHIP_TYPE_TRIDENT_2, { 77, 78, 79, 80} }, + {50, 60, 6, 2, TRANSVR_TYPE_QSFP, BCM_CHIP_TYPE_TRIDENT_2, { 97, 98, 99,100} }, + {51, 61, 6, 3, TRANSVR_TYPE_QSFP, BCM_CHIP_TYPE_TRIDENT_2, {101,102,103,104} }, + {52, 62, 6, 4, TRANSVR_TYPE_QSFP, BCM_CHIP_TYPE_TRIDENT_2, {105,106,107,108} }, + {53, 63, 6, 5, TRANSVR_TYPE_QSFP, BCM_CHIP_TYPE_TRIDENT_2, {109,110,111,112} }, +}; +#endif + + +/* ========================================== + * Redwood Layout configuration + * ========================================== + */ +#ifdef SWPS_REDWOOD +unsigned redwood_gpio_rest_mux = MUX_RST_GPIO_48_PAC9548; + +struct inv_ioexp_layout_s redwood_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_REDWOOD_P01P08, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x25, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, + {1, IOEXP_TYPE_REDWOOD_P09P16, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x25, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, + {2, IOEXP_TYPE_REDWOOD_P01P08, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x24, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, + {3, IOEXP_TYPE_REDWOOD_P09P16, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x24, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, +}; + +struct inv_port_layout_s redwood_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 22, 0, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 1, 2, 3, 4} }, + { 1, 23, 0, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 5, 6, 7, 8} }, + { 2, 24, 0, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 9, 10, 11, 12} }, + { 3, 25, 0, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 13, 14, 15, 16} }, + { 4, 26, 0, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 17, 18, 19, 20} }, + { 5, 27, 0, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 21, 22, 23, 24} }, + { 6, 28, 0, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 25, 26, 27, 28} }, + { 7, 29, 0, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 29, 30, 31, 32} }, + { 8, 30, 1, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 33, 34, 35, 36} }, + { 9, 31, 1, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 37, 38, 39, 40} }, + {10, 32, 1, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 41, 42, 43, 44} }, + {11, 33, 1, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 45, 46, 47, 48} }, + {12, 34, 1, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 49, 50, 51, 52} }, + {13, 35, 1, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 53, 54, 55, 56} }, + {14, 36, 1, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 57, 58, 59, 60} }, + {15, 37, 1, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 61, 62, 63, 64} }, + {16, 6, 2, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 65, 66, 67, 68} }, + {17, 7, 2, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 69, 70, 71, 72} }, + {18, 8, 2, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 73, 74, 75, 76} }, + {19, 9, 2, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 77, 78, 79, 80} }, + {20, 10, 2, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 81, 82, 83, 84} }, + {21, 11, 2, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 85, 86, 87, 88} }, + {22, 12, 2, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 89, 90, 91, 92} }, + {23, 13, 2, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 93, 94, 95, 96} }, + {24, 14, 3, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 97, 98, 99,100} }, + {25, 15, 3, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {101,102,103,104} }, + {26, 16, 3, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {105,106,107,108} }, + {27, 17, 3, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {109,110,111,112} }, + {28, 18, 3, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {113,114,115,116} }, + {29, 19, 3, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {117,118,119,120} }, + {30, 20, 3, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {121,122,123,124} }, + {31, 21, 3, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {125,126,127,128} }, +}; +#endif + + +/* ========================================== + * Hudson32i Layout configuration + * ========================================== + */ +#ifdef SWPS_HUDSON32I_GA +unsigned hudsin32iga_gpio_rest_mux = MUX_RST_GPIO_48_PAC9548; + +struct inv_ioexp_layout_s hudson32iga_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_HUDSON32IGA_P01P08, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander B */ + {0, 0x24, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 0x24 */ + }, + {1, IOEXP_TYPE_HUDSON32IGA_P09P16, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander B */ + {0, 0x24, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 0x24 */ + }, + {2, IOEXP_TYPE_HUDSON32IGA_P01P08, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander B */ + {0, 0x25, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 0x25 */ + }, + {3, IOEXP_TYPE_HUDSON32IGA_P09P16, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander B */ + {0, 0x25, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 0x25 */ + }, +}; + +struct inv_port_layout_s hudson32iga_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 6, 0, 0, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 1, 2, 3, 4} }, + { 1, 7, 0, 1, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 5, 6, 7, 8} }, + { 2, 8, 0, 2, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 9, 10, 11, 12} }, + { 3, 9, 0, 3, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 13, 14, 15, 16} }, + { 4, 10, 0, 4, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 17, 18, 19, 20} }, + { 5, 11, 0, 5, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 21, 22, 23, 24} }, + { 6, 12, 0, 6, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 25, 26, 27, 28} }, + { 7, 13, 0, 7, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 29, 30, 31, 32} }, + { 8, 14, 1, 0, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 33, 34, 35, 36} }, + { 9, 15, 1, 1, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 37, 38, 39, 40} }, + {10, 16, 1, 2, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 41, 42, 43, 44} }, + {11, 17, 1, 3, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 45, 46, 47, 48} }, + {12, 18, 1, 4, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 49, 50, 51, 52} }, + {13, 19, 1, 5, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 53, 54, 55, 56} }, + {14, 20, 1, 6, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 57, 58, 59, 60} }, + {15, 21, 1, 7, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 61, 62, 63, 64} }, + {16, 22, 2, 0, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 65, 66, 67, 68} }, + {17, 23, 2, 1, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 69, 70, 71, 72} }, + {18, 24, 2, 2, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 73, 74, 75, 76} }, + {19, 25, 2, 3, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 77, 78, 79, 80} }, + {20, 26, 2, 4, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 81, 82, 83, 84} }, + {21, 27, 2, 5, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 85, 86, 87, 88} }, + {22, 28, 2, 6, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 89, 90, 91, 92} }, + {23, 29, 2, 7, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 93, 94, 95, 96} }, + {24, 30, 3, 0, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 97, 98, 99,100} }, + {25, 31, 3, 1, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {101,102,103,104} }, + {26, 32, 3, 2, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {105,106,107,108} }, + {27, 33, 3, 3, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {109,110,111,112} }, + {28, 34, 3, 4, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {113,114,115,116} }, + {29, 35, 3, 5, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {117,118,119,120} }, + {30, 36, 3, 6, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {121,122,123,124} }, + {31, 37, 3, 7, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {125,126,127,128} }, +}; +#endif + + +/* ========================================== + * Spruce Layout configuration + * ========================================== + */ +#ifdef SWPS_SPRUCE +unsigned spruce_gpio_rest_mux = MUX_RST_GPIO_48_PAC9548; + +struct inv_ioexp_layout_s spruce_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_SPRUCE_7AB, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 7A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xf0, 0x33}, }, }, /* addr[2] = I/O Expander 7B */ + }, +}; + +struct inv_port_layout_s spruce_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 6, 0, 0, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 81, 82, 83, 84} }, + { 1, 7, 0, 1, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 77, 78, 79, 80} }, + { 2, 8, 0, 2, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, { 97, 98, 99,100} }, + { 3, 9, 0, 3, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {101,102,103,104} }, + { 4, 10, 0, 4, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {105,106,107,108} }, + { 5, 11, 0, 5, TRANSVR_TYPE_QSFP_PLUS, BCM_CHIP_TYPE_TRIDENT_2, {109,110,111,112} }, +}; +#endif + + +/* ========================================== + * Cypress Layout configuration (Inventec version [Up->Down]) + * ========================================== + */ +#ifdef SWPS_CYPRESS_GA1 +unsigned cypress_ga1_gpio_rest_mux = MUX_RST_GPIO_69_PAC9548; + +struct inv_ioexp_layout_s cypress_ga1_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_CYPRESS_NABC, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {2, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {1, IOEXP_TYPE_CYPRESS_NABC, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {3, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {2, IOEXP_TYPE_CYPRESS_NABC, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {4, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {3, IOEXP_TYPE_CYPRESS_NABC, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {5, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {4, IOEXP_TYPE_CYPRESS_NABC, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {6, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {6, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {5, IOEXP_TYPE_CYPRESS_NABC, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {7, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {6, IOEXP_TYPE_CYPRESS_7ABC, { {8, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xc0, 0xc0}, }, /* addr[0] = I/O Expander 7 A */ + {8, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xc0, 0xc0}, {0xff, 0xc0}, }, /* addr[1] = I/O Expander 7 B */ + {8, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 7 C */ + }, +}; + +struct inv_port_layout_s cypress_ga1_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 10, 0, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 1} }, + { 1, 11, 0, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 2} }, + { 2, 12, 0, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 3} }, + { 3, 13, 0, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 4} }, + { 4, 14, 0, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 5} }, + { 5, 15, 0, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 6} }, + { 6, 16, 0, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 7} }, + { 7, 17, 0, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 8} }, + { 8, 18, 1, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 9} }, + { 9, 19, 1, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 10} }, + {10, 20, 1, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 11} }, + {11, 21, 1, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 12} }, + {12, 22, 1, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 21} }, + {13, 23, 1, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 22} }, + {14, 24, 1, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 23} }, + {15, 25, 1, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 24} }, + {16, 26, 2, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 33} }, + {17, 27, 2, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 34} }, + {18, 28, 2, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 35} }, + {19, 29, 2, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 36} }, + {20, 30, 2, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 37} }, + {21, 31, 2, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 38} }, + {22, 32, 2, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 39} }, + {23, 33, 2, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 40} }, + {24, 34, 3, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 41} }, + {25, 35, 3, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 42} }, + {26, 36, 3, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 43} }, + {27, 37, 3, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 44} }, + {28, 38, 3, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 49} }, + {29, 39, 3, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 50} }, + {30, 40, 3, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 51} }, + {31, 41, 3, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 52} }, + {32, 42, 4, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 53} }, + {33, 43, 4, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 54} }, + {34, 44, 4, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 55} }, + {35, 45, 4, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 56} }, + {36, 46, 4, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 65} }, + {37, 47, 4, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 66} }, + {38, 48, 4, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 67} }, + {39, 49, 4, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 68} }, + {40, 50, 5, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 69} }, + {41, 51, 5, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 70} }, + {42, 52, 5, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 71} }, + {43, 53, 5, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 72} }, + {44, 54, 5, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 81} }, + {45, 55, 5, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 82} }, + {46, 56, 5, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 83} }, + {47, 57, 5, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 84} }, + {48, 58, 6, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 97, 98, 99,100} }, + {49, 59, 6, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 85, 86, 87, 88} }, + {50, 60, 6, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {101,102,103,104} }, + {51, 61, 6, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {105,106,107,108} }, + {52, 62, 6, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {109,110,111,112} }, + {53, 63, 6, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {117,118,119,120} }, +}; +#endif + + +/* ========================================== + * Cypress Layout configuration (Inventec version [Down->Up]) + * ========================================== + */ +#ifdef SWPS_CYPRESS_GA2 +unsigned cypress_ga2_gpio_rest_mux = MUX_RST_GPIO_FORCE_HEDERA; + +struct inv_ioexp_layout_s cypress_ga2_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_CYPRESS_NABC, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {2, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {1, IOEXP_TYPE_CYPRESS_NABC, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {3, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {2, IOEXP_TYPE_CYPRESS_NABC, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {4, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {3, IOEXP_TYPE_CYPRESS_NABC, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {5, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {4, IOEXP_TYPE_CYPRESS_NABC, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {6, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {6, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {5, IOEXP_TYPE_CYPRESS_NABC, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {7, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {6, IOEXP_TYPE_CYPRESS_7ABC, { {8, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xc0, 0xc0}, }, /* addr[0] = I/O Expander 7 A */ + {8, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xc0, 0xc0}, {0xff, 0xc0}, }, /* addr[1] = I/O Expander 7 B */ + {8, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 7 C */ + }, +}; + +struct inv_port_layout_s cypress_ga2_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 11, 0, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 2} }, + { 1, 10, 0, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 1} }, + { 2, 13, 0, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 4} }, + { 3, 12, 0, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 3} }, + { 4, 15, 0, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 6} }, + { 5, 14, 0, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 5} }, + { 6, 17, 0, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 8} }, + { 7, 16, 0, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 7} }, + { 8, 19, 1, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 10} }, + { 9, 18, 1, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 9} }, + {10, 21, 1, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 12} }, + {11, 20, 1, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 11} }, + {12, 23, 1, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 22} }, + {13, 22, 1, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 21} }, + {14, 25, 1, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 24} }, + {15, 24, 1, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 23} }, + {16, 27, 2, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 34} }, + {17, 26, 2, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 33} }, + {18, 29, 2, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 36} }, + {19, 28, 2, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 35} }, + {20, 31, 2, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 38} }, + {21, 30, 2, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 37} }, + {22, 33, 2, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 40} }, + {23, 32, 2, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 39} }, + {24, 35, 3, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 42} }, + {25, 34, 3, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 41} }, + {26, 37, 3, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 44} }, + {27, 36, 3, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 43} }, + {28, 39, 3, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 50} }, + {29, 38, 3, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 49} }, + {30, 41, 3, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 52} }, + {31, 40, 3, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 51} }, + {32, 43, 4, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 54} }, + {33, 42, 4, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 53} }, + {34, 45, 4, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 56} }, + {35, 44, 4, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 55} }, + {36, 47, 4, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 66} }, + {37, 46, 4, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 65} }, + {38, 49, 4, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 68} }, + {39, 48, 4, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 67} }, + {40, 51, 5, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 70} }, + {41, 50, 5, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 69} }, + {42, 53, 5, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 72} }, + {43, 52, 5, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 71} }, + {44, 55, 5, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 82} }, + {45, 54, 5, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 81} }, + {46, 57, 5, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 84} }, + {47, 56, 5, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 83} }, + {48, 59, 6, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 85, 86, 87, 88} }, + {49, 58, 6, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 97, 98, 99,100} }, + {50, 61, 6, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {105,106,107,108} }, + {51, 60, 6, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {101,102,103,104} }, + {52, 63, 6, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {117,118,119,120} }, + {53, 62, 6, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {109,110,111,112} }, +}; +#endif + + +/* ========================================== + * Cypress Layout configuration (BaiDu version) + * ========================================== + */ +#ifdef SWPS_CYPRESS_BAI +unsigned cypress_b_gpio_rest_mux = MUX_RST_GPIO_FORCE_HEDERA; + +struct inv_ioexp_layout_s cypress_b_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_CYPRESS_NABC, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {2, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {1, IOEXP_TYPE_CYPRESS_NABC, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {3, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {2, IOEXP_TYPE_CYPRESS_NABC, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {4, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {3, IOEXP_TYPE_CYPRESS_NABC, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {5, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {4, IOEXP_TYPE_CYPRESS_NABC, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {6, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {6, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {5, IOEXP_TYPE_CYPRESS_NABC, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {7, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {6, IOEXP_TYPE_CYPRESS_7ABC, { {8, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xc0, 0xc0}, }, /* addr[0] = I/O Expander 7 A */ + {8, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xc0, 0xc0}, {0xff, 0xc0}, }, /* addr[1] = I/O Expander 7 B */ + {8, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 7 C */ + }, +}; + +struct inv_port_layout_s cypress_b_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 1, 11, 0, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 2} }, + { 2, 10, 0, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 1} }, + { 3, 13, 0, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 4} }, + { 4, 12, 0, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 3} }, + { 5, 15, 0, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 6} }, + { 6, 14, 0, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 5} }, + { 7, 17, 0, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 8} }, + { 8, 16, 0, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 7} }, + { 9, 19, 1, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 10} }, + {10, 18, 1, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 9} }, + {11, 21, 1, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 12} }, + {12, 20, 1, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 11} }, + {13, 23, 1, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 22} }, + {14, 22, 1, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 21} }, + {15, 25, 1, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 24} }, + {16, 24, 1, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 23} }, + {17, 27, 2, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 34} }, + {18, 26, 2, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 33} }, + {19, 29, 2, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 36} }, + {20, 28, 2, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 35} }, + {21, 31, 2, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 38} }, + {22, 30, 2, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 37} }, + {23, 33, 2, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 40} }, + {24, 32, 2, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 39} }, + {25, 35, 3, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 42} }, + {26, 34, 3, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 41} }, + {27, 37, 3, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 44} }, + {28, 36, 3, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 43} }, + {29, 39, 3, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 50} }, + {30, 38, 3, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 49} }, + {31, 41, 3, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 52} }, + {32, 40, 3, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 51} }, + {33, 43, 4, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 54} }, + {34, 42, 4, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 53} }, + {35, 45, 4, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 56} }, + {36, 44, 4, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 55} }, + {37, 47, 4, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 66} }, + {38, 46, 4, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 65} }, + {39, 49, 4, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 68} }, + {40, 48, 4, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 67} }, + {41, 51, 5, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 70} }, + {42, 50, 5, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 69} }, + {43, 53, 5, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 72} }, + {44, 52, 5, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 71} }, + {45, 55, 5, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 82} }, + {46, 54, 5, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 81} }, + {47, 57, 5, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 84} }, + {48, 56, 5, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 83} }, + {49, 59, 6, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 85, 86, 87, 88} }, + {50, 58, 6, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 97, 98, 99,100} }, + {51, 61, 6, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {105,106,107,108} }, + {52, 60, 6, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {101,102,103,104} }, + {53, 63, 6, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {117,118,119,120} }, + {54, 62, 6, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {109,110,111,112} }, +}; +#endif + + +/* ========================================== + * Redwood_fsl Layout configuration + * ========================================== + */ +#ifdef SWPS_REDWOOD_FSL +unsigned redwood_fsl_gpio_rest_mux = MUX_RST_GPIO_48_PAC9548; + +struct inv_ioexp_layout_s redwood_fsl_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_REDWOOD_P01P08, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x25, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, + {1, IOEXP_TYPE_REDWOOD_P09P16, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x25, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, + {2, IOEXP_TYPE_REDWOOD_P01P08, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x24, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, + {3, IOEXP_TYPE_REDWOOD_P09P16, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[0] = I/O Expander 1-4 A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0x0f}, }, /* addr[1] = I/O Expander 1-4 B */ + {0, 0x24, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 B */ + }, +}; + + +struct inv_port_layout_s redwood_fsl_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 22, 0, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 1, 2, 3, 4} }, + { 1, 23, 0, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 5, 6, 7, 8} }, + { 2, 24, 0, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 9, 10, 11, 12} }, + { 3, 25, 0, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 13, 14, 15, 16} }, + { 4, 26, 0, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 17, 18, 19, 20} }, + { 5, 27, 0, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 21, 22, 23, 24} }, + { 6, 28, 0, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 25, 26, 27, 28} }, + { 7, 29, 0, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 29, 30, 31, 32} }, + { 8, 30, 1, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 33, 34, 35, 36} }, + { 9, 31, 1, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 37, 38, 39, 40} }, + {10, 32, 1, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 41, 42, 43, 44} }, + {11, 33, 1, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 45, 46, 47, 48} }, + {12, 34, 1, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 49, 50, 51, 52} }, + {13, 35, 1, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 53, 54, 55, 56} }, + {14, 36, 1, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 57, 58, 59, 60} }, + {15, 37, 1, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 61, 62, 63, 64} }, + {16, 6, 2, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 65, 66, 67, 68} }, + {17, 7, 2, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 69, 70, 71, 72} }, + {18, 8, 2, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 73, 74, 75, 76} }, + {19, 9, 2, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 77, 78, 79, 80} }, + {20, 10, 2, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 81, 82, 83, 84} }, + {21, 11, 2, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 85, 86, 87, 88} }, + {22, 12, 2, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 89, 90, 91, 92} }, + {23, 13, 2, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 93, 94, 95, 96} }, + {24, 14, 3, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 97, 98, 99,100} }, + {25, 15, 3, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {101,102,103,104} }, + {26, 16, 3, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {105,106,107,108} }, + {27, 17, 3, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {109,110,111,112} }, + {28, 18, 3, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {113,114,115,116} }, + {29, 19, 3, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {117,118,119,120} }, + {30, 20, 3, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {121,122,123,124} }, + {31, 21, 3, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {125,126,127,128} }, +}; +#endif + + +/* ========================================== + * Tahoe Layout configuration + * ========================================== + */ +#ifdef SWPS_TAHOE +unsigned tahoe_gpio_rest_mux = MUX_RST_GPIO_249_PCA9548; + +struct inv_ioexp_layout_s tahoe_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_TAHOE_6ABC, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xce, 0xb9}, {0x18, 0xe3}, }, /* addr[0] = I/O Expander 6 A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xce, 0xb9}, {0x18, 0xe3}, }, /* addr[1] = I/O Expander 6 B */ + {7, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xce, 0xb9}, {0x18, 0xe3}, }, }, /* addr[2] = I/O Expander 6 C */ + }, + {1, IOEXP_TYPE_TAHOE_5A, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xce, 0xb9}, {0x18, 0xe3}, }, }, /* addr[0] = I/O Expander 5 A */ + }, +}; + + +struct inv_port_layout_s tahoe_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 12, 1, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 65, 66, 67, 68} }, + { 1, 11, 1, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 53, 54, 55, 56} }, + { 2, 22, 0, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 69, 70, 71, 72} }, + { 3, 21, 0, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 81, 82, 83, 84} }, + { 4, 24, 0, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 97, 98, 99, 100} }, + { 5, 23, 0, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 85, 86, 87, 88} }, + { 6, 18, 0, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {101, 102, 103, 104} }, + { 7, 17, 0, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {105, 106, 107, 108} }, + { 8, 20, 0, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {113, 114, 115, 116} }, + { 9, 19, 0, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {109, 110, 111, 112} }, +}; +#endif + + +/* ========================================== + * Sequoia Layout configuration + * ========================================== + */ +#ifdef SWPS_SEQUOIA +unsigned sequoia_gpio_rest_mux = MUX_RST_GPIO_69_PAC9548; + +struct inv_ioexp_layout_s sequoia_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_SEQUOIA_NABC, { {1, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 0 A */ + {1, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 0 B */ + {1, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 0 C */ + }, + {1, IOEXP_TYPE_SEQUOIA_NABC, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 1 A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 1 B */ + {2, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 1 C */ + }, + {2, IOEXP_TYPE_SEQUOIA_NABC, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 2 A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 2 B */ + {3, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 2 C */ + }, + {3, IOEXP_TYPE_SEQUOIA_NABC, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 3 A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 3 B */ + {4, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 3 C */ + }, + {4, IOEXP_TYPE_SEQUOIA_NABC, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 4 A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 4 B */ + {5, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 4 C */ + }, + {5, IOEXP_TYPE_SEQUOIA_NABC, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 5 A */ + {6, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 5 B */ + {6, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 C */ + }, + {6, IOEXP_TYPE_SEQUOIA_NABC, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 6 A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 6 B */ + {7, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 6 C */ + }, + {7, IOEXP_TYPE_SEQUOIA_NABC, { {8, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 7 A */ + {8, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 7 B */ + {8, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 7 C */ + }, +}; + + +struct inv_port_layout_s sequoia_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 9, 0, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 9, 10, 11, 12} }, + { 1, 10, 0, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 1, 2, 3, 4} }, + { 2, 11, 0, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 25, 26, 27, 28} }, + { 3, 12, 0, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 17, 18, 19, 20} }, + { 4, 13, 0, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 41, 42, 43, 44} }, + { 5, 14, 0, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 33, 34, 35, 36} }, + { 6, 15, 0, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 57, 58, 59, 60} }, + { 7, 16, 0, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 49, 50, 51, 52} }, + { 8, 17, 1, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 73, 74, 75, 76} }, + { 9, 18, 1, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 65, 66, 67, 68} }, + {10, 19, 1, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 89, 90, 91, 92} }, + {11, 20, 1, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 81, 82, 83, 84} }, + {12, 21, 1, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {105, 106, 107, 108} }, + {13, 22, 1, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 97, 98, 99, 100} }, + {14, 23, 1, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {121, 122, 123, 124} }, + {15, 24, 1, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {113, 114, 115, 116} }, + {16, 25, 2, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {137, 138, 139, 140} }, + {17, 26, 2, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {129, 130, 131, 132} }, + {18, 27, 2, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {153, 154, 155, 156} }, + {19, 28, 2, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {145, 146, 147, 148} }, + {20, 29, 2, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {169, 170, 171, 172} }, + {21, 30, 2, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {161, 162, 163, 164} }, + {22, 31, 2, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {185, 186, 187, 188} }, + {23, 32, 2, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {177, 178, 179, 180} }, + {24, 33, 3, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {201, 202, 203, 204} }, + {25, 34, 3, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {193, 194, 195, 196} }, + {26, 35, 3, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {217, 218, 219, 220} }, + {27, 36, 3, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {209, 210, 211, 212} }, + {28, 37, 3, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {233, 234, 235, 236} }, + {29, 38, 3, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {225, 226, 227, 228} }, + {30, 39, 3, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {249, 250, 251, 252} }, + {31, 40, 3, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {241, 242, 243, 244} }, + {32, 44, 4, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 13, 14, 15, 16} }, + {33, 43, 4, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 5, 6, 7, 8} }, + {34, 42, 4, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 29, 30, 31, 32} }, + {35, 41, 4, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 21, 22, 23, 24} }, + {36, 48, 4, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 45, 46, 47, 48} }, + {37, 47, 4, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 37, 38, 39, 40} }, + {38, 46, 4, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 61, 62, 63, 64} }, + {39, 45, 4, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 53, 54, 55, 56} }, + {40, 52, 5, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 77, 78, 79, 80} }, + {41, 51, 5, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 69, 70, 71, 72} }, + {42, 50, 5, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 93, 94, 95, 96} }, + {43, 49, 5, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, { 85, 86, 87, 88} }, + {44, 56, 5, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {109, 110, 111, 112} }, + {45, 55, 5, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {101, 102, 103, 104} }, + {46, 54, 5, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {125, 126, 127, 128} }, + {47, 53, 5, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {117, 118, 119, 120} }, + {48, 60, 6, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {141, 142, 143, 144} }, + {49, 59, 6, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {133, 134, 135, 136} }, + {50, 58, 6, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {157, 158, 159, 160} }, + {51, 57, 6, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {149, 150, 151, 152} }, + {52, 64, 6, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {173, 174, 175, 176} }, + {53, 63, 6, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {165, 166, 167, 168} }, + {54, 62, 6, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {189, 190, 191, 192} }, + {55, 61, 6, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {181, 182, 183, 184} }, + {56, 68, 7, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {205, 206, 207, 208} }, + {57, 67, 7, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {197, 198, 199, 200} }, + {58, 66, 7, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {221, 222, 223, 224} }, + {59, 65, 7, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {213, 214, 215, 216} }, + {60, 72, 7, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {237, 238, 239, 240} }, + {61, 71, 7, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {229, 230, 231, 232} }, + {62, 70, 7, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {253, 254, 255, 256} }, + {63, 69, 7, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TOMAHAWK, {245, 246, 247, 248} }, +}; +#endif + + +/* ========================================== + * Lavender Layout configuration + * ========================================== + */ +#if (PLATFORM_SETTINGS == PLATFORM_TYPE_LAVENDER_GA) +unsigned lavender_gpio_rest_mux = MUX_RST_GPIO_505_PCA9548; +#elif (PLATFORM_SETTINGS == PLATFORM_TYPE_LAVENDER_ONL) +unsigned lavender_gpio_rest_mux = MUX_RST_GPIO_69_PAC9548; +#endif + +#ifdef SWPS_LAVENDER +struct inv_ioexp_layout_s lavender_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_SEQUOIA_NABC, { { 1, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 0 A */ + { 1, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 0 B */ + { 1, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 0 C */ + }, + {1, IOEXP_TYPE_SEQUOIA_NABC, { { 2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 1 A */ + { 2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 1 B */ + { 2, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 1 C */ + }, + {2, IOEXP_TYPE_SEQUOIA_NABC, { { 3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 2 A */ + { 3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 2 B */ + { 3, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 2 C */ + }, + {3, IOEXP_TYPE_SEQUOIA_NABC, { { 4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 3 A */ + { 4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 3 B */ + { 4, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 3 C */ + }, + {4, IOEXP_TYPE_SEQUOIA_NABC, { { 9, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 4 A */ + { 9, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 4 B */ + { 9, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 4 C */ + }, + {5, IOEXP_TYPE_SEQUOIA_NABC, { {10, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 5 A */ + {10, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 5 B */ + {10, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 5 C */ + }, + {6, IOEXP_TYPE_SEQUOIA_NABC, { {11, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 6 A */ + {11, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 6 B */ + {11, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 6 C */ + }, + {7, IOEXP_TYPE_SEQUOIA_NABC, { {12, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 7 A */ + {12, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0x00}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 7 B */ + {12, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 7 C */ + }, + {8, IOEXP_TYPE_LAVENDER_P65, { { 5, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xF6, 0xff}, {0xF8, 0xff}, }, }, /* addr[0] = I/O Expander CPU */ + }, +}; + + +struct inv_port_layout_s lavender_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 17, 0, 0, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {188, 189, 190, 191} }, + { 1, 18, 0, 1, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {184, 185, 186, 187} }, + { 2, 19, 0, 2, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {180, 181, 182, 183} }, + { 3, 20, 0, 3, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {176, 177, 178, 179} }, + { 4, 21, 0, 4, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {172, 173, 174, 175} }, + { 5, 22, 0, 5, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {168, 169, 170, 171} }, + { 6, 23, 0, 6, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {164, 165, 166, 167} }, + { 7, 24, 0, 7, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {160, 161, 162, 163} }, + { 8, 25, 1, 0, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {156, 157, 158, 159} }, + { 9, 26, 1, 1, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {152, 153, 154, 155} }, + {10, 27, 1, 2, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {148, 149, 150, 151} }, + {11, 28, 1, 3, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {144, 145, 146, 147} }, + {12, 29, 1, 4, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {140, 141, 142, 143} }, + {13, 30, 1, 5, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {136, 137, 138, 139} }, + {14, 31, 1, 6, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {132, 133, 134, 135} }, + {15, 32, 1, 7, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {128, 129, 130, 131} }, + {16, 33, 2, 0, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 0, 1, 2, 3} }, + {17, 34, 2, 1, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 4, 5, 6, 7} }, + {18, 35, 2, 2, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 8, 9, 10, 11} }, + {19, 36, 2, 3, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 12, 13, 14, 15} }, + {20, 37, 2, 4, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 16, 17, 18, 19} }, + {21, 38, 2, 5, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 20, 21, 22, 23} }, + {22, 39, 2, 6, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 24, 25, 26, 27} }, + {23, 40, 2, 7, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 28, 29, 30, 31} }, + {24, 41, 3, 0, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 32, 33, 34, 35} }, + {25, 42, 3, 1, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 36, 37, 38, 39} }, + {26, 43, 3, 2, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 40, 41, 42, 43} }, + {27, 44, 3, 3, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 44, 45, 46, 47} }, + {28, 45, 3, 4, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 48, 49, 50, 51} }, + {29, 46, 3, 5, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 52, 53, 54, 55} }, + {30, 47, 3, 6, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 56, 57, 58, 59} }, + {31, 48, 3, 7, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 60, 61, 62, 63} }, + {32, 49, 4, 0, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {256, 257, 258, 259} }, + {33, 50, 4, 1, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {260, 261, 262, 263} }, + {34, 51, 4, 2, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {264, 265, 266, 267} }, + {35, 52, 4, 3, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {268, 269, 270, 271} }, + {36, 53, 4, 4, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {272, 273, 274, 275} }, + {37, 54, 4, 5, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {276, 277, 278, 279} }, + {38, 55, 4, 6, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {280, 281, 282, 283} }, + {39, 56, 4, 7, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {284, 285, 286, 287} }, + {40, 57, 5, 0, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {288, 289, 290, 291} }, + {41, 58, 5, 1, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {292, 293, 294, 295} }, + {42, 59, 5, 2, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {296, 297, 298, 299} }, + {43, 60, 5, 3, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {300, 301, 302, 303} }, + {44, 61, 5, 4, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {304, 305, 306, 307} }, + {45, 62, 5, 5, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {308, 309, 310, 311} }, + {46, 63, 5, 6, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {312, 313, 314, 315} }, + {47, 64, 5, 7, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {316, 317, 318, 319} }, + {48, 65, 6, 0, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {444, 445, 446, 447} }, + {49, 66, 6, 1, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {440, 441, 442, 443} }, + {50, 67, 6, 2, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {436, 437, 438, 439} }, + {51, 68, 6, 3, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {432, 433, 434, 435} }, + {52, 69, 6, 4, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {428, 429, 430, 431} }, + {53, 70, 6, 5, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {424, 425, 426, 427} }, + {54, 71, 6, 6, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {420, 421, 422, 423} }, + {55, 72, 6, 7, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {416, 417, 418, 419} }, + {56, 73, 7, 0, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {412, 413, 414, 415} }, + {57, 74, 7, 1, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {408, 409, 410, 411} }, + {58, 75, 7, 2, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {404, 405, 406, 407} }, + {59, 76, 7, 3, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {400, 401, 402, 403} }, + {60, 77, 7, 4, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {396, 397, 398, 399} }, + {61, 78, 7, 5, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {392, 393, 394, 395} }, + {62, 79, 7, 6, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {388, 389, 390, 391} }, + {63, 80, 7, 7, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, {384, 385, 386, 387} }, + {64, 5, 8, 0, TRANSVR_TYPE_QSFP_28, BF_CHIP_TYPE_TOFINO, { 64, 65, 66, 67} }, +}; +#endif + +/* =========================================================== + * Cottonwood Layout configuration Rangeley (Rangeley CPU board) + * =========================================================== + */ +#ifdef SWPS_COTTONWOOD_RANGELEY +unsigned cottonwood_rangeley_gpio_rest_mux = MUX_RST_GPIO_500_PAC9548; + +struct inv_ioexp_layout_s cottonwood_rangeley_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, CPLD_TYPE_COTTONWOOD,{ {1, 0x55, {22, 23, 24, 25}, {22, 23, 24, 25}, {-1, -1, -1, -1}, {0xee, 0xee, 0x99, 0x99}, {0x00, 0x00, 0x00, 0x00}, }, + }, + }, +}; + + +struct inv_port_layout_s cottonwood_rangeley_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHI_TYPE / LANE_ID */ + { 0, 2, 0, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 75} }, + { 1, 3, 0, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 77} }, + { 2, 4, 0, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 79} }, + { 3, 5, 0, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TOMAHAWK, { 81} }, +}; +#endif + +/* =========================================================== + * Maple Layout configuration + * =========================================================== + */ +#ifdef SWPS_MAPLE +unsigned maple_gpio_rest_mux = 249; + +struct inv_ioexp_layout_s maple_ioexp_layout[] = { + /* IOEXP_ID / IOEXP_TYPE / { Chan_ID, Chip_addr, Read_offset, Write_offset, config_offset, data_default, conf_default } */ + {0, IOEXP_TYPE_MAPLE_0ABC, { {2, 0x20, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0x00, 0x00}, }, /* addr[0] = I/O Expander 0 A */ + {2, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0xff}, }, /* addr[1] = I/O Expander 0 B */ + {2, 0x22, {0, 1}, {2, 3}, {6, 7}, {0x00, 0xff}, {0xff, 0xff}, }, }, /* addr[2] = I/O Expander 0 C */ + }, + {1, IOEXP_TYPE_MAPLE_NABC, { {3, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {3, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {3, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {2, IOEXP_TYPE_MAPLE_NABC, { {4, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {4, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {4, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {3, IOEXP_TYPE_MAPLE_NABC, { {5, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {5, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {5, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {4, IOEXP_TYPE_MAPLE_NABC, { {6, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {6, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {6, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {5, IOEXP_TYPE_MAPLE_NABC, { {7, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {7, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {7, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, + {6, IOEXP_TYPE_MAPLE_NABC, { {8, 0x20, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[0] = I/O Expander N A */ + {8, 0x21, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xf0}, {0xff, 0xf0}, }, /* addr[1] = I/O Expander N B */ + {8, 0x22, {0, 1}, {2, 3}, {6, 7}, {0xff, 0xff}, {0x00, 0x00}, }, }, /* addr[2] = I/O Expander N C */ + }, +}; + +struct inv_port_layout_s maple_port_layout[] = { + /* Port_ID / Chan_ID / IOEXP_ID / IOEXP_VIRT_OFFSET / TRANSCEIVER_TYPE / BCM_CHIP_TYPE / LANE_ID */ + { 0, 18, 1, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 1} }, + { 1, 19, 1, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 2} }, + { 2, 20, 1, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 3} }, + { 3, 21, 1, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 4} }, + { 4, 22, 1, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 5} }, + { 5, 23, 1, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 6} }, + { 6, 24, 1, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 7} }, + { 7, 25, 1, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 8} }, + { 8, 26, 2, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 13} }, + { 9, 27, 2, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 14} }, + {10, 28, 2, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 15} }, + {11, 29, 2, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 16} }, + {12, 30, 2, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 21} }, + {13, 31, 2, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 22} }, + {14, 32, 2, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 23} }, + {15, 33, 2, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 24} }, + {16, 34, 3, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 29} }, + {17, 35, 3, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 30} }, + {18, 36, 3, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 31} }, + {19, 37, 3, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 32} }, + {20, 38, 3, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 33} }, + {21, 39, 3, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 34} }, + {22, 40, 3, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 35} }, + {23, 41, 3, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 36} }, + {24, 42, 4, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 41} }, + {25, 43, 4, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 42} }, + {26, 44, 4, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 43} }, + {27, 45, 4, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 44} }, + {28, 46, 4, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 49} }, + {29, 47, 4, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 50} }, + {30, 48, 4, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 51} }, + {31, 49, 4, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 52} }, + {32, 50, 5, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 57} }, + {33, 51, 5, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 58} }, + {34, 52, 5, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 59} }, + {35, 53, 5, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 60} }, + {36, 54, 5, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 61} }, + {37, 55, 5, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 62} }, + {38, 56, 5, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 63} }, + {39, 57, 5, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 64} }, + {40, 58, 6, 0, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 65} }, + {41, 59, 6, 1, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 66} }, + {42, 60, 6, 2, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 67} }, + {43, 61, 6, 3, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 68} }, + {44, 62, 6, 4, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 69} }, + {45, 63, 6, 5, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 70} }, + {46, 64, 6, 6, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 71} }, + {47, 65, 6, 7, TRANSVR_TYPE_SFP, BCM_CHIP_TYPE_TRIDENT_3, { 72} }, + {48, 10, 0, 0, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TRIDENT_3, { 77, 78, 79, 80} }, + {49, 11, 0, 1, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TRIDENT_3, { 85, 86, 87, 88} }, + {50, 12, 0, 2, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TRIDENT_3, { 93, 94, 95, 96} }, + {51, 13, 0, 3, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TRIDENT_3, { 97, 98, 99,100} }, + {52, 14, 0, 4, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TRIDENT_3, {105,106,107,108} }, + {53, 15, 0, 5, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TRIDENT_3, {113,114,115,116} }, + {54, 16, 0, 6, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TRIDENT_3, {121,122,123,124} }, + {55, 17, 0, 7, TRANSVR_TYPE_QSFP_28, BCM_CHIP_TYPE_TRIDENT_3, {125,126,127,128} }, +}; +#endif + +#endif /* INV_SWPS_H */ + + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/io_expander.c b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/io_expander.c new file mode 100644 index 000000000000..4564b5855fd8 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/io_expander.c @@ -0,0 +1,2046 @@ +#include +#include +#include "io_expander.h" + +static struct ioexp_obj_s *ioexp_head_p = NULL; +static struct ioexp_obj_s *ioexp_tail_p = NULL; + + +/* ========== Register IOEXP layout ========== + */ +struct ioexp_map_s ioexp_map_magnolia_nab = { + + .chip_amount = 2, + .data_width = 2, + + .map_present = { {0, 0, 4}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 0, 5}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 0, 6}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 0, 7}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {1, 0, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {1, 0, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_tx_disable = { {0, 1, 0}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 1, 1}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 2}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 3}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + {1, 1, 0}, /* map_tx_disable[4] = TXDISABLE_SFP+_P(X+4) */ + {1, 1, 1}, /* map_tx_disable[5] = TXDISABLE_SFP+_P(X+5) */ + {1, 1, 2}, /* map_tx_disable[6] = TXDISABLE_SFP+_P(X+6) */ + {1, 1, 3}, /* map_tx_disable[7] = TXDISABLE_SFP+_P(X+7) */ + }, + .map_tx_fault = { {0, 0, 0}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 0, 1}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 0, 2}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 0, 3}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + {1, 0, 0}, /* map_tx_fault[4] = TXFAULT_SFP+_P(X+4) */ + {1, 0, 1}, /* map_tx_fault[5] = TXFAULT_SFP+_P(X+5) */ + {1, 0, 2}, /* map_tx_fault[6] = TXFAULT_SFP+_P(X+6) */ + {1, 0, 3}, /* map_tx_fault[7] = TXFAULT_SFP+_P(X+7) */ + }, + .map_rxlos = { {0, 1, 4}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 1, 5}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 1, 6}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 1, 7}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + {1, 1, 4}, /* map_rxlos[4] = OPRXLOS_PORT(X+4) */ + {1, 1, 5}, /* map_rxlos[5] = OPRXLOS_PORT(X+5) */ + {1, 1, 6}, /* map_rxlos[6] = OPRXLOS_PORT(X+6) */ + {1, 1, 7}, /* map_rxlos[7] = OPRXLOS_PORT(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_magnolia_4ab = { + + .chip_amount = 2, + .data_width = 2, + + .map_present = { {0, 0, 4}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 0, 5}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 0, 6}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 0, 7}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {1, 0, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {1, 0, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_tx_disable = { {0, 1, 0}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 1, 1}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 2}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 3}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + {1, 0, 0}, /* map_tx_disable[4] = TXDISABLE_SFP+_P(X+4) */ + {1, 0, 1}, /* map_tx_disable[5] = TXDISABLE_SFP+_P(X+5) */ + {1, 0, 2}, /* map_tx_disable[6] = TXDISABLE_SFP+_P(X+6) */ + {1, 0, 3}, /* map_tx_disable[7] = TXDISABLE_SFP+_P(X+7) */ + }, + .map_tx_fault = { {0, 0, 0}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 0, 1}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 0, 2}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 0, 3}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + {1, 1, 0}, /* map_tx_fault[4] = TXFAULT_SFP+_P(X+4) */ + {1, 1, 1}, /* map_tx_fault[5] = TXFAULT_SFP+_P(X+5) */ + {1, 1, 2}, /* map_tx_fault[6] = TXFAULT_SFP+_P(X+6) */ + {1, 1, 3}, /* map_tx_fault[7] = TXFAULT_SFP+_P(X+7) */ + }, + .map_rxlos = { {0, 1, 4}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 1, 5}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 1, 6}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 1, 7}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + {1, 1, 4}, /* map_rxlos[4] = OPRXLOS_PORT(X+4) */ + {1, 1, 5}, /* map_rxlos[5] = OPRXLOS_PORT(X+5) */ + {1, 1, 6}, /* map_rxlos[6] = OPRXLOS_PORT(X+6) */ + {1, 1, 7}, /* map_rxlos[7] = OPRXLOS_PORT(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_magnolia_7ab = { + + .chip_amount = 2, + .data_width = 2, + + .map_present = { {1, 0, 4}, /* map_present[0] = MOD_ABS_PORT(X) */ + {1, 0, 5}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {1, 0, 6}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {1, 0, 7}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 1, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 1, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + }, + .map_reset = { {0, 0, 0}, /* map_reset[0] = QRESET_QSFP_N_P(X) */ + {0, 0, 1}, /* map_reset[1] = QRESET_QSFP_N_P(X+1) */ + {0, 0, 2}, /* map_reset[2] = QRESET_QSFP_N_P(X+2) */ + {0, 0, 3}, /* map_reset[3] = QRESET_QSFP_N_P(X+3) */ + {1, 0, 0}, /* map_reset[4] = QRESET_QSFP_N_P(X+4) */ + {1, 0, 1}, /* map_reset[5] = QRESET_QSFP_N_P(X+5) */ + }, + .map_lpmod = { {0, 0, 4}, /* map_lpmod[0] = LPMODE_QSFP_P(X) */ + {0, 0, 5}, /* map_lpmod[1] = LPMODE_QSFP_P(X+1) */ + {0, 0, 6}, /* map_lpmod[2] = LPMODE_QSFP_P(X+2) */ + {0, 0, 7}, /* map_lpmod[3] = LPMODE_QSFP_P(X+3) */ + {1, 0, 2}, /* map_lpmod[4] = LPMODE_QSFP_P(X+4) */ + {1, 0, 3}, /* map_lpmod[5] = LPMODE_QSFP_P(X+5) */ + }, + .map_modsel = { {0, 1, 4}, /* map_modsel[0] = MODSEL_QSFP_N_P(X) */ + {0, 1, 5}, /* map_modsel[1] = MODSEL_QSFP_N_P(X+1) */ + {0, 1, 6}, /* map_modsel[2] = MODSEL_QSFP_N_P(X+2) */ + {0, 1, 7}, /* map_modsel[3] = MODSEL_QSFP_N_P(X+3) */ + {1, 1, 4}, /* map_modsel[4] = MODSEL_QSFP_N_P(X+4) */ + {1, 1, 5}, /* map_modsel[5] = MODSEL_QSFP_N_P(X+5) */ + }, +}; + + +struct ioexp_map_s ioexp_map_redwood_p01p08_p17p24 = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 0, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {2, 0, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {2, 0, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {2, 0, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {2, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {2, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {2, 0, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {2, 0, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_reset = { {0, 0, 0}, /* map_reset[0] = QRESET_QSFP28_N_P(X) */ + {0, 0, 1}, /* map_reset[1] = QRESET_QSFP28_N_P(X+1) */ + {0, 0, 2}, /* map_reset[2] = QRESET_QSFP28_N_P(X+2) */ + {0, 0, 3}, /* map_reset[3] = QRESET_QSFP28_N_P(X+3) */ + {1, 0, 0}, /* map_reset[4] = QRESET_QSFP28_N_P(X+4) */ + {1, 0, 1}, /* map_reset[5] = QRESET_QSFP28_N_P(X+5) */ + {1, 0, 2}, /* map_reset[6] = QRESET_QSFP28_N_P(X+6) */ + {1, 0, 3}, /* map_reset[7] = QRESET_QSFP28_N_P(X+7) */ + }, + .map_lpmod = { {0, 0, 4}, /* map_lpmod[0] = LPMODE_QSFP28_P(X) */ + {0, 0, 5}, /* map_lpmod[1] = LPMODE_QSFP28_P(X+1) */ + {0, 0, 6}, /* map_lpmod[2] = LPMODE_QSFP28_P(X+2) */ + {0, 0, 7}, /* map_lpmod[3] = LPMODE_QSFP28_P(X+3) */ + {1, 0, 4}, /* map_lpmod[4] = LPMODE_QSFP28_P(X+4) */ + {1, 0, 5}, /* map_lpmod[5] = LPMODE_QSFP28_P(X+5) */ + {1, 0, 6}, /* map_lpmod[6] = LPMODE_QSFP28_P(X+6) */ + {1, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP28_P(X+7) */ + }, + .map_modsel = { {0, 1, 4}, /* map_modsel[0] = MODSEL_QSFP28_N_P(X) */ + {0, 1, 5}, /* map_modsel[1] = MODSEL_QSFP28_N_P(X+1) */ + {0, 1, 6}, /* map_modsel[2] = MODSEL_QSFP28_N_P(X+2) */ + {0, 1, 7}, /* map_modsel[3] = MODSEL_QSFP28_N_P(X+3) */ + {1, 1, 4}, /* map_modsel[4] = MODSEL_QSFP28_N_P(X+4) */ + {1, 1, 5}, /* map_modsel[5] = MODSEL_QSFP28_N_P(X+5) */ + {1, 1, 6}, /* map_modsel[6] = MODSEL_QSFP28_N_P(X+6) */ + {1, 1, 7}, /* map_modsel[7] = MODSEL_QSFP28_N_P(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_redwood_p09p16_p25p32 = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 1, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {2, 1, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {2, 1, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {2, 1, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {2, 1, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {2, 1, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {2, 1, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {2, 1, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_reset = { {0, 0, 0}, /* map_reset[0] = QRESET_QSFP28_N_P(X) */ + {0, 0, 1}, /* map_reset[1] = QRESET_QSFP28_N_P(X+1) */ + {0, 0, 2}, /* map_reset[2] = QRESET_QSFP28_N_P(X+2) */ + {0, 0, 3}, /* map_reset[3] = QRESET_QSFP28_N_P(X+3) */ + {1, 0, 0}, /* map_reset[4] = QRESET_QSFP28_N_P(X+4) */ + {1, 0, 1}, /* map_reset[5] = QRESET_QSFP28_N_P(X+5) */ + {1, 0, 2}, /* map_reset[6] = QRESET_QSFP28_N_P(X+6) */ + {1, 0, 3}, /* map_reset[7] = QRESET_QSFP28_N_P(X+7) */ + }, + .map_lpmod = { {0, 0, 4}, /* map_lpmod[0] = LPMODE_QSFP28_P(X) */ + {0, 0, 5}, /* map_lpmod[1] = LPMODE_QSFP28_P(X+1) */ + {0, 0, 6}, /* map_lpmod[2] = LPMODE_QSFP28_P(X+2) */ + {0, 0, 7}, /* map_lpmod[3] = LPMODE_QSFP28_P(X+3) */ + {1, 0, 4}, /* map_lpmod[4] = LPMODE_QSFP28_P(X+4) */ + {1, 0, 5}, /* map_lpmod[5] = LPMODE_QSFP28_P(X+5) */ + {1, 0, 6}, /* map_lpmod[6] = LPMODE_QSFP28_P(X+6) */ + {1, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP28_P(X+7) */ + }, + .map_modsel = { {0, 1, 4}, /* map_modsel[0] = MODSEL_QSFP28_N_P(X) */ + {0, 1, 5}, /* map_modsel[1] = MODSEL_QSFP28_N_P(X+1) */ + {0, 1, 6}, /* map_modsel[2] = MODSEL_QSFP28_N_P(X+2) */ + {0, 1, 7}, /* map_modsel[3] = MODSEL_QSFP28_N_P(X+3) */ + {1, 1, 4}, /* map_modsel[4] = MODSEL_QSFP28_N_P(X+4) */ + {1, 1, 5}, /* map_modsel[5] = MODSEL_QSFP28_N_P(X+5) */ + {1, 1, 6}, /* map_modsel[6] = MODSEL_QSFP28_N_P(X+6) */ + {1, 1, 7}, /* map_modsel[7] = MODSEL_QSFP28_N_P(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_hudson32iga_p01p08_p17p24 = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 0, 0}, /* map_present[0] = MODABS_QSFP(X) */ + {2, 0, 1}, /* map_present[1] = MODABS_QSFP(X+1) */ + {2, 0, 2}, /* map_present[2] = MODABS_QSFP(X+2) */ + {2, 0, 3}, /* map_present[3] = MODABS_QSFP(X+3) */ + {2, 0, 4}, /* map_present[4] = MODABS_QSFP(X+4) */ + {2, 0, 5}, /* map_present[5] = MODABS_QSFP(X+5) */ + {2, 0, 6}, /* map_present[6] = MODABS_QSFP(X+6) */ + {2, 0, 7}, /* map_present[7] = MODABS_QSFP(X+7) */ + }, + .map_reset = { {0, 0, 0}, /* map_reset[0] = QRESET_QSFP(X) */ + {0, 0, 1}, /* map_reset[1] = QRESET_QSFP(X+1) */ + {0, 0, 2}, /* map_reset[2] = QRESET_QSFP(X+2) */ + {0, 0, 3}, /* map_reset[3] = QRESET_QSFP(X+3) */ + {1, 0, 0}, /* map_reset[4] = QRESET_QSFP(X+4) */ + {1, 0, 1}, /* map_reset[5] = QRESET_QSFP(X+5) */ + {1, 0, 2}, /* map_reset[6] = QRESET_QSFP(X+6) */ + {1, 0, 3}, /* map_reset[7] = QRESET_QSFP(X+7) */ + }, + .map_lpmod = { {0, 0, 4}, /* map_lpmod[0] = LPMODE_QSFP(X) */ + {0, 0, 5}, /* map_lpmod[1] = LPMODE_QSFP(X+1) */ + {0, 0, 6}, /* map_lpmod[2] = LPMODE_QSFP(X+2) */ + {0, 0, 7}, /* map_lpmod[3] = LPMODE_QSFP(X+3) */ + {1, 0, 4}, /* map_lpmod[4] = LPMODE_QSFP(X+4) */ + {1, 0, 5}, /* map_lpmod[5] = LPMODE_QSFP(X+5) */ + {1, 0, 6}, /* map_lpmod[6] = LPMODE_QSFP(X+6) */ + {1, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP(X+7) */ + }, + .map_modsel = { {0, 1, 4}, /* map_modsel[0] = MODSEL_QSFP(X) */ + {0, 1, 5}, /* map_modsel[1] = MODSEL_QSFP(X+1) */ + {0, 1, 6}, /* map_modsel[2] = MODSEL_QSFP(X+2) */ + {0, 1, 7}, /* map_modsel[3] = MODSEL_QSFP(X+3) */ + {1, 1, 4}, /* map_modsel[4] = MODSEL_QSFP(X+4) */ + {1, 1, 5}, /* map_modsel[5] = MODSEL_QSFP(X+5) */ + {1, 1, 6}, /* map_modsel[6] = MODSEL_QSFP(X+6) */ + {1, 1, 7}, /* map_modsel[7] = MODSEL_QSFP(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_hudson32iga_p09p16_p25p32 = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 1, 0}, /* map_present[0] = MODABS_QSFP(X) */ + {2, 1, 1}, /* map_present[1] = MODABS_QSFP(X+1) */ + {2, 1, 2}, /* map_present[2] = MODABS_QSFP(X+2) */ + {2, 1, 3}, /* map_present[3] = MODABS_QSFP(X+3) */ + {2, 1, 4}, /* map_present[4] = MODABS_QSFP(X+4) */ + {2, 1, 5}, /* map_present[5] = MODABS_QSFP(X+5) */ + {2, 1, 6}, /* map_present[6] = MODABS_QSFP(X+6) */ + {2, 1, 7}, /* map_present[7] = MODABS_QSFP(X+7) */ + }, + .map_reset = { {0, 0, 0}, /* map_reset[0] = QRESET_QSFP(X) */ + {0, 0, 1}, /* map_reset[1] = QRESET_QSFP(X+1) */ + {0, 0, 2}, /* map_reset[2] = QRESET_QSFP(X+2) */ + {0, 0, 3}, /* map_reset[3] = QRESET_QSFP(X+3) */ + {1, 0, 0}, /* map_reset[4] = QRESET_QSFP(X+4) */ + {1, 0, 1}, /* map_reset[5] = QRESET_QSFP(X+5) */ + {1, 0, 2}, /* map_reset[6] = QRESET_QSFP(X+6) */ + {1, 0, 3}, /* map_reset[7] = QRESET_QSFP(X+7) */ + }, + .map_lpmod = { {0, 0, 4}, /* map_lpmod[0] = LPMODE_QSFP(X) */ + {0, 0, 5}, /* map_lpmod[1] = LPMODE_QSFP(X+1) */ + {0, 0, 6}, /* map_lpmod[2] = LPMODE_QSFP(X+2) */ + {0, 0, 7}, /* map_lpmod[3] = LPMODE_QSFP(X+3) */ + {1, 0, 4}, /* map_lpmod[4] = LPMODE_QSFP(X+4) */ + {1, 0, 5}, /* map_lpmod[5] = LPMODE_QSFP(X+5) */ + {1, 0, 6}, /* map_lpmod[6] = LPMODE_QSFP(X+6) */ + {1, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP(X+7) */ + }, + .map_modsel = { {0, 1, 4}, /* map_modsel[0] = MODSEL_QSFP(X) */ + {0, 1, 5}, /* map_modsel[1] = MODSEL_QSFP(X+1) */ + {0, 1, 6}, /* map_modsel[2] = MODSEL_QSFP(X+2) */ + {0, 1, 7}, /* map_modsel[3] = MODSEL_QSFP(X+3) */ + {1, 1, 4}, /* map_modsel[4] = MODSEL_QSFP(X+4) */ + {1, 1, 5}, /* map_modsel[5] = MODSEL_QSFP(X+5) */ + {1, 1, 6}, /* map_modsel[6] = MODSEL_QSFP(X+6) */ + {1, 1, 7}, /* map_modsel[7] = MODSEL_QSFP(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_cypress_nabc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {0, 0, 4}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 0, 5}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 0, 6}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 0, 7}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {1, 0, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {1, 0, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_tx_disable = { {0, 1, 0}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 1, 1}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 2}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 3}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + {1, 1, 0}, /* map_tx_disable[4] = TXDISABLE_SFP+_P(X+4) */ + {1, 1, 1}, /* map_tx_disable[5] = TXDISABLE_SFP+_P(X+5) */ + {1, 1, 2}, /* map_tx_disable[6] = TXDISABLE_SFP+_P(X+6) */ + {1, 1, 3}, /* map_tx_disable[7] = TXDISABLE_SFP+_P(X+7) */ + }, + .map_tx_fault = { {0, 0, 0}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 0, 1}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 0, 2}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 0, 3}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + {1, 0, 0}, /* map_tx_fault[4] = TXFAULT_SFP+_P(X+4) */ + {1, 0, 1}, /* map_tx_fault[5] = TXFAULT_SFP+_P(X+5) */ + {1, 0, 2}, /* map_tx_fault[6] = TXFAULT_SFP+_P(X+6) */ + {1, 0, 3}, /* map_tx_fault[7] = TXFAULT_SFP+_P(X+7) */ + }, + .map_rxlos = { {0, 1, 4}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 1, 5}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 1, 6}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 1, 7}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + {1, 1, 4}, /* map_rxlos[4] = OPRXLOS_PORT(X+4) */ + {1, 1, 5}, /* map_rxlos[5] = OPRXLOS_PORT(X+5) */ + {1, 1, 6}, /* map_rxlos[6] = OPRXLOS_PORT(X+6) */ + {1, 1, 7}, /* map_rxlos[7] = OPRXLOS_PORT(X+7) */ + }, + .map_hard_rs0 = { {2, 0, 0}, /* map_hard_rs0[0] = RS0_SFP28_P(X) */ + {2, 0, 2}, /* map_hard_rs0[1] = RS0_SFP28_P(X+1) */ + {2, 0, 4}, /* map_hard_rs0[2] = RS0_SFP28_P(X+2) */ + {2, 0, 6}, /* map_hard_rs0[3] = RS0_SFP28_P(X+3) */ + {2, 1, 0}, /* map_hard_rs0[4] = RS0_SFP28_P(X+4) */ + {2, 1, 2}, /* map_hard_rs0[5] = RS0_SFP28_P(X+5) */ + {2, 1, 4}, /* map_hard_rs0[6] = RS0_SFP28_P(X+6) */ + {2, 1, 6}, /* map_hard_rs0[7] = RS0_SFP28_P(X+7) */ + }, + .map_hard_rs1 = { {2, 0, 1}, /* map_hard_rs1[0] = RS1_SFP28_P(X) */ + {2, 0, 3}, /* map_hard_rs1[1] = RS1_SFP28_P(X+1) */ + {2, 0, 5}, /* map_hard_rs1[2] = RS1_SFP28_P(X+2) */ + {2, 0, 7}, /* map_hard_rs1[3] = RS1_SFP28_P(X+3) */ + {2, 1, 1}, /* map_hard_rs1[4] = RS1_SFP28_P(X+4) */ + {2, 1, 3}, /* map_hard_rs1[5] = RS1_SFP28_P(X+5) */ + {2, 1, 5}, /* map_hard_rs1[6] = RS1_SFP28_P(X+6) */ + {2, 1, 7}, /* map_hard_rs1[7] = RS1_SFP28_P(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_cypress_7abc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 0, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {2, 0, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {2, 0, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {2, 0, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {2, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {2, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + }, + .map_reset = { {0, 0, 0}, /* map_reset[0] = QRESET_QSFP_N_P(X) */ + {0, 0, 1}, /* map_reset[1] = QRESET_QSFP_N_P(X+1) */ + {0, 0, 2}, /* map_reset[2] = QRESET_QSFP_N_P(X+2) */ + {0, 0, 3}, /* map_reset[3] = QRESET_QSFP_N_P(X+3) */ + {0, 0, 4}, /* map_reset[4] = QRESET_QSFP_N_P(X+4) */ + {0, 0, 5}, /* map_reset[5] = QRESET_QSFP_N_P(X+5) */ + }, + .map_lpmod = { {0, 1, 0}, /* map_lpmod[0] = LPMODE_QSFP_P(X) */ + {0, 1, 1}, /* map_lpmod[1] = LPMODE_QSFP_P(X+1) */ + {0, 1, 2}, /* map_lpmod[2] = LPMODE_QSFP_P(X+2) */ + {0, 1, 3}, /* map_lpmod[3] = LPMODE_QSFP_P(X+3) */ + {0, 1, 4}, /* map_lpmod[4] = LPMODE_QSFP_P(X+4) */ + {0, 1, 5}, /* map_lpmod[5] = LPMODE_QSFP_P(X+5) */ + }, + .map_modsel = { {1, 1, 0}, /* map_modsel[0] = MODSEL_QSFP_N_P(X) */ + {1, 1, 1}, /* map_modsel[1] = MODSEL_QSFP_N_P(X+1) */ + {1, 1, 2}, /* map_modsel[2] = MODSEL_QSFP_N_P(X+2) */ + {1, 1, 3}, /* map_modsel[3] = MODSEL_QSFP_N_P(X+3) */ + {1, 1, 4}, /* map_modsel[4] = MODSEL_QSFP_N_P(X+4) */ + {1, 1, 5}, /* map_modsel[5] = MODSEL_QSFP_N_P(X+5) */ + }, +}; + + +struct ioexp_map_s ioexp_map_tahoe_5a = { + + .chip_amount = 1, + .data_width = 2, + + .map_present = { {0, 0, 3}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 1, 0}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 1, 5}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + }, + .map_reset = { {0, 0, 1}, /* map_reset[0] = QRESET_QSFP_N_P(X) */ + {0, 0, 6}, /* map_reset[1] = QRESET_QSFP_N_P(X+1) */ + {0, 1, 3}, /* map_reset[2] = QRESET_QSFP_N_P(X+2) */ + }, + .map_lpmod = { {0, 0, 2}, /* map_lpmod[0] = LPMODE_QSFP_P(X) */ + {0, 0, 7}, /* map_lpmod[1] = LPMODE_QSFP_P(X+1) */ + {0, 1, 4}, /* map_lpmod[2] = LPMODE_QSFP_P(X+2) */ + }, + .map_modsel = { {0, 0, 0}, /* map_modsel[0] = MODSEL_QSFP_N_P(X) */ + {0, 0, 5}, /* map_modsel[1] = MODSEL_QSFP_N_P(X+1) */ + {0, 1, 2}, /* map_modsel[2] = MODSEL_QSFP_N_P(X+2) */ + }, +}; + + +struct ioexp_map_s ioexp_map_tahoe_6abc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {0, 0, 3}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 1, 0}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 1, 5}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {1, 0, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 1, 0}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 1, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {2, 0, 3}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {2, 1, 0}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + {2, 1, 5}, /* map_present[8] = MOD_ABS_PORT(X+8) */ + }, + .map_reset = { {0, 0, 1}, /* map_reset[0] = QRESET_QSFP28_N_P(X) */ + {0, 0, 6}, /* map_reset[1] = QRESET_QSFP28_N_P(X+1) */ + {0, 1, 3}, /* map_reset[2] = QRESET_QSFP28_N_P(X+2) */ + {1, 0, 1}, /* map_reset[3] = QRESET_QSFP28_N_P(X+3) */ + {1, 0, 6}, /* map_reset[4] = QRESET_QSFP28_N_P(X+4) */ + {1, 1, 3}, /* map_reset[5] = QRESET_QSFP28_N_P(X+5) */ + {2, 0, 1}, /* map_reset[6] = QRESET_QSFP28_N_P(X+6) */ + {2, 0, 6}, /* map_reset[7] = QRESET_QSFP28_N_P(X+7) */ + {2, 1, 3}, /* map_reset[7] = QRESET_QSFP28_N_P(X+7) */ + }, + .map_lpmod = { {0, 0, 2}, /* map_lpmod[0] = LPMODE_QSFP28_P(X) */ + {0, 0, 7}, /* map_lpmod[1] = LPMODE_QSFP28_P(X+1) */ + {0, 1, 4}, /* map_lpmod[2] = LPMODE_QSFP28_P(X+2) */ + {1, 0, 2}, /* map_lpmod[3] = LPMODE_QSFP28_P(X+3) */ + {1, 0, 7}, /* map_lpmod[4] = LPMODE_QSFP28_P(X+4) */ + {1, 1, 4}, /* map_lpmod[5] = LPMODE_QSFP28_P(X+5) */ + {2, 0, 2}, /* map_lpmod[6] = LPMODE_QSFP28_P(X+6) */ + {2, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP28_P(X+7) */ + {2, 1, 4}, /* map_lpmod[7] = LPMODE_QSFP28_P(X+8) */ + }, + .map_modsel = { {0, 0, 0}, /* map_modsel[0] = MODSEL_QSFP28_N_P(X) */ + {0, 0, 5}, /* map_modsel[1] = MODSEL_QSFP28_N_P(X+1) */ + {0, 1, 2}, /* map_modsel[2] = MODSEL_QSFP28_N_P(X+2) */ + {1, 0, 0}, /* map_modsel[3] = MODSEL_QSFP28_N_P(X+3) */ + {1, 0, 5}, /* map_modsel[4] = MODSEL_QSFP28_N_P(X+4) */ + {1, 1, 2}, /* map_modsel[5] = MODSEL_QSFP28_N_P(X+5) */ + {2, 0, 0}, /* map_modsel[6] = MODSEL_QSFP28_N_P(X+6) */ + {2, 0, 5}, /* map_modsel[7] = MODSEL_QSFP28_N_P(X+7) */ + {2, 1, 2}, /* map_modsel[7] = MODSEL_QSFP28_N_P(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_sequoia_nabc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 1, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {2, 1, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {2, 1, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {2, 1, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {2, 1, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {2, 1, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {2, 1, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {2, 1, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_reset = { {0, 1, 0}, /* map_reset[0] = QRESET_QSFP28_N_P(X) */ + {0, 1, 1}, /* map_reset[1] = QRESET_QSFP28_N_P(X+1) */ + {0, 1, 2}, /* map_reset[2] = QRESET_QSFP28_N_P(X+2) */ + {0, 1, 3}, /* map_reset[3] = QRESET_QSFP28_N_P(X+3) */ + {0, 1, 4}, /* map_reset[4] = QRESET_QSFP28_N_P(X+4) */ + {0, 1, 5}, /* map_reset[5] = QRESET_QSFP28_N_P(X+5) */ + {0, 1, 6}, /* map_reset[6] = QRESET_QSFP28_N_P(X+6) */ + {0, 1, 7}, /* map_reset[7] = QRESET_QSFP28_N_P(X+7) */ + }, + .map_lpmod = { {1, 0, 0}, /* map_lpmod[0] = LPMODE_QSFP28_P(X) */ + {1, 0, 1}, /* map_lpmod[1] = LPMODE_QSFP28_P(X+1) */ + {1, 0, 2}, /* map_lpmod[2] = LPMODE_QSFP28_P(X+2) */ + {1, 0, 3}, /* map_lpmod[3] = LPMODE_QSFP28_P(X+3) */ + {1, 0, 4}, /* map_lpmod[4] = LPMODE_QSFP28_P(X+4) */ + {1, 0, 5}, /* map_lpmod[5] = LPMODE_QSFP28_P(X+5) */ + {1, 0, 6}, /* map_lpmod[6] = LPMODE_QSFP28_P(X+6) */ + {1, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP28_P(X+7) */ + }, + .map_modsel = { {0, 0, 0}, /* map_modsel[0] = MODSEL_QSFP28_N_P(X) */ + {0, 0, 1}, /* map_modsel[1] = MODSEL_QSFP28_N_P(X+1) */ + {0, 0, 2}, /* map_modsel[2] = MODSEL_QSFP28_N_P(X+2) */ + {0, 0, 3}, /* map_modsel[3] = MODSEL_QSFP28_N_P(X+3) */ + {0, 0, 4}, /* map_modsel[4] = MODSEL_QSFP28_N_P(X+4) */ + {0, 0, 5}, /* map_modsel[5] = MODSEL_QSFP28_N_P(X+5) */ + {0, 0, 6}, /* map_modsel[6] = MODSEL_QSFP28_N_P(X+6) */ + {0, 0, 7}, /* map_modsel[7] = MODSEL_QSFP28_N_P(X+7) */ + }, +}; + + +struct ioexp_map_s ioexp_map_lavender_p65 = { + + .chip_amount = 1, + .data_width = 1, + + .map_present = { {0, 0, 4}, }, /* map_present[0] = MOD_ABS_PORT(X) */ + .map_reset = { {0, 0, 1}, }, /* map_reset[0] = QRESET_QSFP28_N_P(X) */ + .map_lpmod = { {0, 0, 2}, }, /* map_lpmod[0] = LPMODE_QSFP28_P(X) */ + .map_modsel = { {0, 0, 0}, }, /* map_modsel[0] = MODSEL_QSFP28_N_P(X) */ +}; + + +struct ioexp_map_s cpld_map_cottonwood = { + + .chip_amount = 1, + .data_width = 4, + + .map_present = { {0, 2, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 2, 4}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 3, 0}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 3, 4}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + }, + .map_tx_disable = { {0, 0, 0}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 0, 4}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 0}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 4}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + }, + .map_tx_fault = { {0, 2, 2}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 2, 6}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 3, 2}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 3, 6}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + }, + .map_rxlos = { {0, 2, 1}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 2, 5}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 3, 1}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 3, 5}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + }, + .map_hard_rs0 = { {0, 0, 2}, /* map_hard_rs0[0] = RS0_SFP28_P(X) */ + {0, 0, 6}, /* map_hard_rs0[1] = RS0_SFP28_P(X+1) */ + {0, 1, 2}, /* map_hard_rs0[2] = RS0_SFP28_P(X+2) */ + {0, 1, 6}, /* map_hard_rs0[3] = RS0_SFP28_P(X+3) */ + }, + .map_hard_rs1 = { {0, 0, 2}, /* map_hard_rs1[0] = RS1_SFP28_P(X) */ + {0, 0, 6}, /* map_hard_rs1[1] = RS1_SFP28_P(X+1) */ + {0, 1, 2}, /* map_hard_rs1[2] = RS1_SFP28_P(X+2) */ + {0, 1, 6}, /* map_hard_rs1[3] = RS1_SFP28_P(X+3) */ + }, +}; + +struct ioexp_map_s ioexp_map_maple_0abc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {2, 1, 0}, /* map_present[0] = MOD_ABS_PORT(X) */ + {2, 1, 1}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {2, 1, 2}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {2, 1, 3}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {2, 1, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {2, 1, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {2, 1, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {2, 1, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_reset = { {0, 1, 0}, /* map_reset[0] = QRESET_QSFP_N_P(X) */ + {0, 1, 1}, /* map_reset[1] = QRESET_QSFP_N_P(X+1) */ + {0, 1, 2}, /* map_reset[2] = QRESET_QSFP_N_P(X+2) */ + {0, 1, 3}, /* map_reset[3] = QRESET_QSFP_N_P(X+3) */ + {0, 1, 4}, /* map_reset[4] = QRESET_QSFP_N_P(X+4) */ + {0, 1, 5}, /* map_reset[5] = QRESET_QSFP_N_P(X+5) */ + {0, 1, 6}, /* map_reset[6] = QRESET_QSFP_N_P(X+6) */ + {0, 1, 7}, /* map_reset[7] = QRESET_QSFP_N_P(X+7) */ + }, + .map_lpmod = { {1, 0, 0}, /* map_lpmod[0] = LPMODE_QSFP_P(X) */ + {1, 0, 1}, /* map_lpmod[1] = LPMODE_QSFP_P(X+1) */ + {1, 0, 2}, /* map_lpmod[2] = LPMODE_QSFP_P(X+2) */ + {1, 0, 3}, /* map_lpmod[3] = LPMODE_QSFP_P(X+3) */ + {1, 0, 4}, /* map_lpmod[4] = LPMODE_QSFP_P(X+4) */ + {1, 0, 5}, /* map_lpmod[5] = LPMODE_QSFP_P(X+5) */ + {1, 0, 6}, /* map_lpmod[6] = LPMODE_QSFP_P(X+6) */ + {1, 0, 7}, /* map_lpmod[7] = LPMODE_QSFP_P(X+7) */ + }, + .map_modsel = { {0, 0, 0}, /* map_modsel[0] = MODSEL_QSFP_N_P(X) */ + {0, 0, 1}, /* map_modsel[1] = MODSEL_QSFP_N_P(X+1) */ + {0, 0, 2}, /* map_modsel[2] = MODSEL_QSFP_N_P(X+2) */ + {0, 0, 3}, /* map_modsel[3] = MODSEL_QSFP_N_P(X+3) */ + {0, 0, 4}, /* map_modsel[4] = MODSEL_QSFP_N_P(X+4) */ + {0, 0, 5}, /* map_modsel[5] = MODSEL_QSFP_N_P(X+5) */ + {0, 0, 6}, /* map_modsel[6] = MODSEL_QSFP_N_P(X+6) */ + {0, 0, 7}, /* map_modsel[7] = MODSEL_QSFP_N_P(X+7) */ + }, +}; + +struct ioexp_map_s ioexp_map_maple_nabc = { + + .chip_amount = 3, + .data_width = 2, + + .map_present = { {0, 0, 4}, /* map_present[0] = MOD_ABS_PORT(X) */ + {0, 0, 5}, /* map_present[1] = MOD_ABS_PORT(X+1) */ + {0, 0, 6}, /* map_present[2] = MOD_ABS_PORT(X+2) */ + {0, 0, 7}, /* map_present[3] = MOD_ABS_PORT(X+3) */ + {1, 0, 4}, /* map_present[4] = MOD_ABS_PORT(X+4) */ + {1, 0, 5}, /* map_present[5] = MOD_ABS_PORT(X+5) */ + {1, 0, 6}, /* map_present[6] = MOD_ABS_PORT(X+6) */ + {1, 0, 7}, /* map_present[7] = MOD_ABS_PORT(X+7) */ + }, + .map_tx_disable = { {0, 1, 0}, /* map_tx_disable[0] = TXDISABLE_SFP+_P(X) */ + {0, 1, 1}, /* map_tx_disable[1] = TXDISABLE_SFP+_P(X+1) */ + {0, 1, 2}, /* map_tx_disable[2] = TXDISABLE_SFP+_P(X+2) */ + {0, 1, 3}, /* map_tx_disable[3] = TXDISABLE_SFP+_P(X+3) */ + {1, 1, 0}, /* map_tx_disable[4] = TXDISABLE_SFP+_P(X+4) */ + {1, 1, 1}, /* map_tx_disable[5] = TXDISABLE_SFP+_P(X+5) */ + {1, 1, 2}, /* map_tx_disable[6] = TXDISABLE_SFP+_P(X+6) */ + {1, 1, 3}, /* map_tx_disable[7] = TXDISABLE_SFP+_P(X+7) */ + }, + .map_tx_fault = { {0, 0, 0}, /* map_tx_fault[0] = TXFAULT_SFP+_P(X) */ + {0, 0, 1}, /* map_tx_fault[1] = TXFAULT_SFP+_P(X+1) */ + {0, 0, 2}, /* map_tx_fault[2] = TXFAULT_SFP+_P(X+2) */ + {0, 0, 3}, /* map_tx_fault[3] = TXFAULT_SFP+_P(X+3) */ + {1, 0, 0}, /* map_tx_fault[4] = TXFAULT_SFP+_P(X+4) */ + {1, 0, 1}, /* map_tx_fault[5] = TXFAULT_SFP+_P(X+5) */ + {1, 0, 2}, /* map_tx_fault[6] = TXFAULT_SFP+_P(X+6) */ + {1, 0, 3}, /* map_tx_fault[7] = TXFAULT_SFP+_P(X+7) */ + }, + .map_rxlos = { {0, 1, 4}, /* map_rxlos[0] = OPRXLOS_PORT(X) */ + {0, 1, 5}, /* map_rxlos[1] = OPRXLOS_PORT(X+1) */ + {0, 1, 6}, /* map_rxlos[2] = OPRXLOS_PORT(X+2) */ + {0, 1, 7}, /* map_rxlos[3] = OPRXLOS_PORT(X+3) */ + {1, 1, 4}, /* map_rxlos[4] = OPRXLOS_PORT(X+4) */ + {1, 1, 5}, /* map_rxlos[5] = OPRXLOS_PORT(X+5) */ + {1, 1, 6}, /* map_rxlos[6] = OPRXLOS_PORT(X+6) */ + {1, 1, 7}, /* map_rxlos[7] = OPRXLOS_PORT(X+7) */ + }, + .map_hard_rs0 = { {2, 0, 0}, /* map_hard_rs0[0] = RS0_SFP28_P(X) */ + {2, 0, 2}, /* map_hard_rs0[1] = RS0_SFP28_P(X+1) */ + {2, 0, 4}, /* map_hard_rs0[2] = RS0_SFP28_P(X+2) */ + {2, 0, 6}, /* map_hard_rs0[3] = RS0_SFP28_P(X+3) */ + {2, 1, 0}, /* map_hard_rs0[4] = RS0_SFP28_P(X+4) */ + {2, 1, 2}, /* map_hard_rs0[5] = RS0_SFP28_P(X+5) */ + {2, 1, 4}, /* map_hard_rs0[6] = RS0_SFP28_P(X+6) */ + {2, 1, 6}, /* map_hard_rs0[7] = RS0_SFP28_P(X+7) */ + }, + .map_hard_rs1 = { {2, 0, 1}, /* map_hard_rs1[0] = RS1_SFP28_P(X) */ + {2, 0, 3}, /* map_hard_rs1[1] = RS1_SFP28_P(X+1) */ + {2, 0, 5}, /* map_hard_rs1[2] = RS1_SFP28_P(X+2) */ + {2, 0, 7}, /* map_hard_rs1[3] = RS1_SFP28_P(X+3) */ + {2, 1, 1}, /* map_hard_rs1[4] = RS1_SFP28_P(X+4) */ + {2, 1, 3}, /* map_hard_rs1[5] = RS1_SFP28_P(X+5) */ + {2, 1, 5}, /* map_hard_rs1[6] = RS1_SFP28_P(X+6) */ + {2, 1, 7}, /* map_hard_rs1[7] = RS1_SFP28_P(X+7) */ + }, +}; + +/* ========== Private functions ========== + */ +int check_channel_tier_1(void); + +struct i2c_client * +_get_i2c_client(struct ioexp_obj_s *self, + int chip_id){ + + struct ioexp_i2c_s *i2c_curr_p = self->i2c_head_p; + + if (!(i2c_curr_p)){ + SWPS_ERR("%s: i2c_curr_p is NULL\n", __func__); + return NULL; + } + while (i2c_curr_p){ + if ((i2c_curr_p->chip_id) == chip_id){ + return i2c_curr_p->i2c_client_p; + } + i2c_curr_p = i2c_curr_p->next; + } + SWPS_ERR("%s: not exist! :%d\n", __func__, chip_id); + return NULL; +} + + +static int +_common_ioexp_update_one(struct ioexp_obj_s *self, + struct ioexp_addr_s *ioexp_addr, + int chip_id, + int data_width, + int show_err, + char *caller_name) { + int buf = 0; + int err = 0; + int data_id = 0; + int r_offset = 0; + + for(data_id=0; data_idread_offset[data_id]; + buf = i2c_smbus_read_byte_data(_get_i2c_client(self, chip_id), r_offset); + /* Check error */ + if (buf < 0) { + err = 1; + if (show_err) { + SWPS_INFO("IOEXP-%d read fail! :%d \n", self->ioexp_id, buf); + SWPS_INFO("Dump: :%d :0x%02x :%d, :%s\n", + ioexp_addr->chan_id, ioexp_addr->chip_addr, + ioexp_addr->read_offset[data_id], caller_name); + } + continue; + } + /* Update IOEXP object */ + self->chip_data[chip_id].data[data_id] = (uint8_t)buf; + } + if (err) { + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +static int +common_ioexp_update_all(struct ioexp_obj_s *self, + int show_err, + char *caller_name){ + + int err = 0; + int chip_id = 0; + int chip_amount = self->ioexp_map_p->chip_amount; + + for (chip_id=0; chip_idioexp_map_p->map_addr[chip_id]), + chip_id, + self->ioexp_map_p->data_width, + show_err, + caller_name) < 0) { + err = 1; + } + } + if (err) { + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +static int +_common_check_by_mode(struct ioexp_obj_s *self){ + + switch (self->mode){ + case IOEXP_MODE_DIRECT: + return self->fsm_4_direct(self); + + case IOEXP_MODE_POLLING: + if (self->state >= 0){ + return 0; + } + switch (self->state){ + case STATE_IOEXP_INIT: + return ERR_IOEXP_UNINIT; + case STATE_IOEXP_ABNORMAL: + return ERR_IOEXP_ABNORMAL; + default: + return ERR_IOEXP_NOSTATE; + } + break; + + default: + break; + } + SWPS_ERR("%s: Exception occurs. :%d \n", __func__, self->mode); + return ERR_IOEXP_UNEXCPT; +} + + +static int +_common_get_bit(struct ioexp_obj_s *self, + struct ioexp_bitmap_s *bitmap_obj_p, + char *func_mane){ + uint8_t buf; + int err_code; + + /* Check and get address */ + err_code = _common_check_by_mode(self); + if (err_code < 0){ + return err_code; + } + if (!bitmap_obj_p){ + SWPS_ERR("Layout config incorrect! :%d :%s\n", + self->ioexp_id, func_mane); + return ERR_IOEXP_BADCONF; + } + /* Get data form cache */ + buf = self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset]; + return (int)(buf >> bitmap_obj_p->bit_shift & 0x01); +} + + +static int +_common_set_bit(struct ioexp_obj_s *self, + struct ioexp_bitmap_s *bitmap_obj_p, + int input_val, + char *func_mane){ + int err_code, target_offset; + uint8_t origin_byte; + uint8_t modify_byte; + + /* Check and get address */ + err_code = _common_check_by_mode(self); + if (err_code < 0){ + return err_code; + } + if (!bitmap_obj_p){ + SWPS_ERR("Layout config incorrect! :%d :%s\n", + self->ioexp_id, func_mane); + return ERR_IOEXP_BADCONF; + } + /* Prepare write date */ + origin_byte = self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset]; + switch (input_val) { + case 0: + modify_byte = origin_byte; + SWP_BIT_CLEAR(modify_byte, bitmap_obj_p->bit_shift); + break; + case 1: + modify_byte = origin_byte; + SWP_BIT_SET(modify_byte, bitmap_obj_p->bit_shift); + break; + default: + SWPS_ERR("Input value incorrect! :%d :%d :%s\n", + input_val, self->ioexp_id, func_mane); + return ERR_IOEXP_BADINPUT; + } + /* Setup i2c client */ + target_offset = self->ioexp_map_p->map_addr[bitmap_obj_p->chip_id].write_offset[bitmap_obj_p->ioexp_voffset]; + /* Write byte to chip via I2C */ + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, bitmap_obj_p->chip_id), + target_offset, + modify_byte); + /* Update or bollback object */ + if (err_code < 0){ + self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset] = origin_byte; + SWPS_ERR("I2C write fail! :%d :%d :%s :%d\n", + input_val, self->ioexp_id, func_mane, err_code); + return err_code; + } + self->chip_data[bitmap_obj_p->chip_id].data[bitmap_obj_p->ioexp_voffset] = modify_byte; + return 0; +} + + +/* ========== Object public functions ========== + */ +int +common_get_present(struct ioexp_obj_s *self, + int virt_offset){ + + int UNPLUG = 1; + int retval = ERR_IOEXP_UNEXCPT; + + retval = _common_get_bit(self, + &(self->ioexp_map_p->map_present[virt_offset]), + "common_get_present"); + if (retval < 0) { + /* [Note] + * => Transceiver object does not need to handle IOEXP layer issues. + */ + return UNPLUG; + } + return retval; +} + + +int +common_get_tx_fault(struct ioexp_obj_s *self, + int virt_offset){ + /* [Transmit Fault (Tx_Fault)] + * A catastrophic laser fault will activate the transmitter signal, + * TX_FAULT, and disable the laser. This signal is an open collector + * output (pull-up required on the host board). A low signal indicates + * normal laser operation and a high signal indicates a fault. The + * TX_FAULT will be latched high when a laser fault occurs and is + * cleared by toggling the TX_DISABLE input or power cycling the + * transceiver. The transmitter fault condition can also be monitored + * via the two-wire serial interface. + * (address A2, byte 110, bit 2). + * + * 0: Normal + * 1: Abnormal + */ + return _common_get_bit(self, + &(self->ioexp_map_p->map_tx_fault[virt_offset]), + "common_get_tx_fault"); +} + + +int +common_get_rxlos(struct ioexp_obj_s *self, + int virt_offset){ + /* [Receiver Loss of Signal (Rx_LOS)] + * The post-amplification IC also includes transition detection circuitry + * which monitors the ac level of incoming optical signals and provides a + * TTL/CMOS compatible status signal to the host (pin 8). An adequate optical + * input results in a low Rx_LOS output while a high Rx_LOS output indicates + * an unusable optical input. The Rx_LOS thresholds are factory set so that + * a high output indicates a definite optical fault has occurred. Rx_LOS can + * also be monitored via the two-wire serial interface + * (address A2h, byte 110, bit 1). + * + * 0: Normal + * 1: Abnormal + */ + return _common_get_bit(self, + &(self->ioexp_map_p->map_rxlos[virt_offset]), + "common_get_rxlos"); +} + + +int +common_get_tx_disable(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_tx_disable[virt_offset]), + "common_get_tx_disable"); +} + + +int +common_get_reset(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_reset[virt_offset]), + "common_get_reset"); +} + + +int +common_get_lpmod(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_lpmod[virt_offset]), + "common_get_lpmod"); +} + + +int +common_get_modsel(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_modsel[virt_offset]), + "common_get_modsel"); +} + + +int +common_get_hard_rs0(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_hard_rs0[virt_offset]), + "common_get_hard_rs0"); +} + + +int +common_get_hard_rs1(struct ioexp_obj_s *self, + int virt_offset){ + + return _common_get_bit(self, + &(self->ioexp_map_p->map_hard_rs1[virt_offset]), + "common_get_hard_rs1"); +} + + +int +common_set_tx_disable(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_tx_disable[virt_offset]), + input_val, + "common_set_tx_disable"); +} + + +int +common_set_reset(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_reset[virt_offset]), + input_val, + "common_set_reset"); +} + + +int +common_set_lpmod(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_lpmod[virt_offset]), + input_val, + "common_set_lpmod"); +} + + +int +common_set_modsel(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_modsel[virt_offset]), + input_val, + "common_set_modsel"); +} + + +int +common_set_hard_rs0(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_hard_rs0[virt_offset]), + input_val, + "common_set_hard_rs0"); +} + + +int +common_set_hard_rs1(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + + return _common_set_bit(self, + &(self->ioexp_map_p->map_hard_rs1[virt_offset]), + input_val, + "common_set_hard_rs1"); +} + + +int +ioexp_get_not_support(struct ioexp_obj_s *self, + int virt_offset){ + return ERR_IOEXP_NOTSUPPORT; +} + + +int +ioexp_set_not_support(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + return ERR_IOEXP_NOTSUPPORT; +} + + +int +fake_ioexp_init(struct ioexp_obj_s *self){ + return 1; +} + +int +fake_ioexp_update(struct ioexp_obj_s *self){ + return 1; +} + + +int +fake_update_func(struct ioexp_obj_s *self){ + return 1; +} + +int +fake_get_func(struct ioexp_obj_s *self, + int virt_offset){ + SWPS_WARN("Someone called fake_get_func\n"); + return -1; +} + +int +fake_set_func(struct ioexp_obj_s *self, + int virt_offset, + int input_val){ + SWPS_WARN("Someone called fake_set_func\n"); + return -1; +} + + +/* ========== Initial functions for IO Expander ========== + */ +int +common_ioexp_init(struct ioexp_obj_s *self) { + + int chip_id, offset, err_code; + struct ioexp_addr_s *addr_p; + + if (self->mode == IOEXP_MODE_DIRECT) { + goto update_common_ioexp_init; + } + /* Setup default value to each physical IO Expander */ + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + /* Get address mapping */ + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + if (!addr_p){ + SWPS_ERR("%s: IOEXP config incorrect! :%d \n", + __func__, chip_id); + return -1; + } + /* Setup default value */ + for (offset=0; offset<(self->ioexp_map_p->data_width); offset++){ + + /* [Desc] Skip the setup default value behavior + [Note] Setup default value = -1 if you don't want to write the value to IOEXP or CPLD + */ + if(addr_p->write_offset[offset] < 0){ + SWPS_DEBUG("skip a write_offset <%d>\n", addr_p->conf_offset[offset]); + continue; + } + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, chip_id), + addr_p->write_offset[offset], + addr_p->data_default[offset]); + if (err_code < 0){ + SWPS_ERR("%s: set default fail! :%d \n", + __func__, err_code); + return ERR_IOEXP_UNEXCPT; + } + } + } +update_common_ioexp_init: + /* Check and update info to object */ + err_code = self->update_all(self, 1, "common_ioexp_init"); + if (err_code < 0) { + SWPS_ERR("%s: update_all() fail! :%d \n", + __func__, err_code); + return ERR_IOEXP_UNEXCPT; + } + return 0; +} + + +/* ========== Object functions for Final State Machine ========== + */ +int +_is_channel_ready(struct ioexp_obj_s *self){ + + int buf = 0; + int chip_id = 0; /* Use first chip which be registered */ + int data_id = 0; /* Use first byte which be registered */ + struct ioexp_addr_s *ioexp_addr = NULL; + + ioexp_addr = &(self->ioexp_map_p->map_addr[chip_id]); + if (!ioexp_addr){ + SWPS_ERR("%s: config incorrect!\n", __func__); + return ERR_IOEXP_UNEXCPT; + } + buf = i2c_smbus_read_byte_data(_get_i2c_client(self, chip_id), + ioexp_addr->read_offset[data_id]); + if (buf >= 0){ + return 1; + } + return 0; +} + +int +_ioexp_init_handler(struct ioexp_obj_s *self){ + + int return_val; + + switch (self->mode) { + case IOEXP_MODE_DIRECT: + return_val = self->init(self); + if (return_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + } else { + self->state = STATE_IOEXP_NORMAL; + } + return return_val; + + case IOEXP_MODE_POLLING: + /* Check system and channel is ready */ + if (self->state == STATE_IOEXP_INIT){ + if (!_is_channel_ready(self)){ + self->state = STATE_IOEXP_INIT; + SWPS_WARN("%s: IOEXP:%d channel not ready.\n", + __func__, self->ioexp_id); + return 0; + } + } + /* Execute initial callback */ + return_val = self->init(self); + if (return_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + } else { + self->state = STATE_IOEXP_NORMAL; + } + return return_val; + + default: + break; + } + SWPS_ERR("%s: exception occur :%d\n", __func__, self->mode); + return ERR_IOEXP_UNEXCPT; +} + + +int +common_ioexp_fsm_4_direct(struct ioexp_obj_s *self){ + + int result_val; + int show_err = 1; + char *func_mane = "common_ioexp_fsm_4_direct"; + + switch (self->state){ + case STATE_IOEXP_INIT: + result_val = _ioexp_init_handler(self); + /* Exception case: terminate initial procedure */ + if(result_val < 0){ + /* Initial fail */ + return result_val; + } + if(self->state == STATE_IOEXP_INIT){ + /* Keep in INIT state, and return error */ + return ERR_IOEXP_UNINIT; + } + /* Case: Initial done */ + return 0; + + case STATE_IOEXP_NORMAL: + result_val = self->update_all(self, show_err, func_mane); + if (result_val < 0){ + SWPS_INFO("%s: NORMAL -> ABNORMAL :%d\n", + __func__, result_val); + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + self->state = STATE_IOEXP_NORMAL; + return 0; + + case STATE_IOEXP_ABNORMAL: + result_val = self->update_all(self, show_err, func_mane); + if (result_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + SWPS_DEBUG("%s: ABNORMAL -> NORMAL :%d\n", + __func__, result_val); + self->state = STATE_IOEXP_NORMAL; + return 0; + + default: + break; + } + SWPS_ERR("%s: Exception occurs :%d\n", + __func__, self->state); + return ERR_IOEXP_UNEXCPT; +} + + +int +common_ioexp_fsm_4_polling(struct ioexp_obj_s *self){ + + int result_val, i, show_e; + int fail_retry = 3; + char *func_name = "common_ioexp_fsm_4_polling"; + +#ifdef DEBUG_SWPS + show_e = 1; +#else + show_e = 0; +#endif + + switch (self->state){ + case STATE_IOEXP_INIT: + result_val = _ioexp_init_handler(self); + /* Exception case: terminate initial procedure */ + if(result_val < 0){ + /* Initial fail */ + return result_val; + } + /* Case: System (Channel) not ready */ + if(self->state == STATE_IOEXP_INIT){ + /* Keep in INIT state, wait and retry */ + return 0; + } + /* Case: Initial done */ + SWPS_INFO("IOEXP-%d: initial done. :%d\n", + self->ioexp_id, self->ioexp_type); + return result_val; + + case STATE_IOEXP_NORMAL: + /* Retry mechanism for case of i2c topology not stable */ + for (i=0; iupdate_all(self, show_e, func_name); + if (result_val >= 0) { + self->state = STATE_IOEXP_NORMAL; + return 0; + } + if (check_channel_tier_1() < 0) { + SWPS_INFO("%s: detect I2C crash :%d\n", + __func__, self->ioexp_id); + break; + } + SWPS_DEBUG("IOEXP-%d: unstable :%d\n", + self->ioexp_id, result_val); + } + SWPS_INFO("IOEXP-%d: NORMAL -> ABNORMAL :%d\n", + self->ioexp_id, result_val); + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + + case STATE_IOEXP_ABNORMAL: + result_val = self->update_all(self, show_e, func_name); + if (result_val < 0){ + self->state = STATE_IOEXP_ABNORMAL; + return result_val; + } + SWPS_INFO("IOEXP-%d: ABNORMAL -> NORMAL :%d\n", + self->ioexp_id, result_val); + self->state = STATE_IOEXP_NORMAL; + return 0; + + default: + break; + } + SWPS_ERR("IOEXP-%d: Exception occurs :%d\n", + self->ioexp_id, self->state); + return ERR_IOEXP_UNEXCPT; +} + + +/* ========== Object private functions for check & update ========== + */ +int +common_ioexp_check(struct ioexp_obj_s *self){ + + int result; + + if (self->mode != IOEXP_MODE_POLLING){ + SWPS_ERR("%s: not polling mode :%d\n", + __func__, self->mode); + return ERR_IOEXP_NOTSUPPORT; + } + mutex_lock(&self->lock); + result = self->fsm_4_polling(self); + mutex_unlock(&self->lock); + return result; +} + + +/* ========== Functions for Factory pattern ========== + */ +static struct ioexp_map_s * +get_ioexp_map(int ioexp_type){ + switch (ioexp_type){ + case IOEXP_TYPE_MAGINOLIA_NAB: + return &ioexp_map_magnolia_nab; + case IOEXP_TYPE_MAGINOLIA_4AB: + return &ioexp_map_magnolia_4ab; + case IOEXP_TYPE_MAGINOLIA_7AB: + case IOEXP_TYPE_SPRUCE_7AB: + return &ioexp_map_magnolia_7ab; + case IOEXP_TYPE_REDWOOD_P01P08: + return &ioexp_map_redwood_p01p08_p17p24; + case IOEXP_TYPE_REDWOOD_P09P16: + return &ioexp_map_redwood_p09p16_p25p32; + case IOEXP_TYPE_HUDSON32IGA_P01P08: + return &ioexp_map_hudson32iga_p01p08_p17p24; + case IOEXP_TYPE_HUDSON32IGA_P09P16: + return &ioexp_map_hudson32iga_p09p16_p25p32; + case IOEXP_TYPE_CYPRESS_NABC: + return &ioexp_map_cypress_nabc; + case IOEXP_TYPE_CYPRESS_7ABC: + return &ioexp_map_cypress_7abc; + case IOEXP_TYPE_TAHOE_5A: + return &ioexp_map_tahoe_5a; + case IOEXP_TYPE_TAHOE_6ABC: + return &ioexp_map_tahoe_6abc; + case IOEXP_TYPE_SEQUOIA_NABC: + return &ioexp_map_sequoia_nabc; + case IOEXP_TYPE_LAVENDER_P65: + return &ioexp_map_lavender_p65; + case CPLD_TYPE_COTTONWOOD: + return &cpld_map_cottonwood; + case IOEXP_TYPE_MAPLE_0ABC: + return &ioexp_map_maple_0abc; + case IOEXP_TYPE_MAPLE_NABC: + return &ioexp_map_maple_nabc; + default: + return NULL; + } +} + + +int +setup_ioexp_ssize_attr(struct ioexp_obj_s *self, + struct ioexp_map_s *ioexp_map_p, + int ioexp_id, + int ioexp_type, + int run_mode){ + switch (run_mode){ + case IOEXP_MODE_POLLING: /* Direct access device mode */ + case IOEXP_MODE_DIRECT: /* Polling mode, read from cache */ + self->mode = run_mode; + break; + default: + SWPS_ERR("%s: non-defined run_mode:%d\n", + __func__, run_mode); + self->mode = ERR_IOEXP_UNEXCPT; + return ERR_IOEXP_UNEXCPT; + } + /* Setup mapping structure */ + self->ioexp_map_p = kzalloc(sizeof(*ioexp_map_p), GFP_KERNEL); + if (!(self->ioexp_map_p)) { + SWPS_ERR("%s: kzalloc ioexp_map_p fail\n", __func__); + return -1; + } + memcpy(self->ioexp_map_p, ioexp_map_p, sizeof(*ioexp_map_p)); + /* Setup attributes */ + self->ioexp_id = ioexp_id; + self->ioexp_type = ioexp_type; + self->state = STATE_IOEXP_INIT; + mutex_init(&self->lock); + return 0; +} + + +static int +setup_addr_mapping(struct ioexp_obj_s *self, + struct ioexp_addr_s *addr_map_p, + int chip_amount){ + struct ioexp_addr_s *tmp_p; + if (!addr_map_p){ + SWPS_ERR("%s: map is null\n", __func__); + return -1; + } + tmp_p = kzalloc((sizeof(*addr_map_p) * chip_amount), GFP_KERNEL); + if (!tmp_p){ + SWPS_ERR("%s: kzalloc fail.\n", __func__); + return -1; + } + memcpy(tmp_p, addr_map_p, (sizeof(*addr_map_p) * chip_amount)); + self->ioexp_map_p->map_addr = tmp_p; + + return 0; +} + + +static int +setup_ioexp_public_cb(struct ioexp_obj_s *self, + int ioexp_type){ + + switch (ioexp_type){ + case IOEXP_TYPE_MAGINOLIA_NAB: + case IOEXP_TYPE_MAGINOLIA_4AB: + case CPLD_TYPE_COTTONWOOD: + self->get_present = common_get_present; + self->get_tx_fault = common_get_tx_fault; + self->get_rxlos = common_get_rxlos; + self->get_tx_disable = common_get_tx_disable; + self->get_reset = ioexp_get_not_support; + self->get_lpmod = ioexp_get_not_support; + self->get_modsel = ioexp_get_not_support; + self->get_hard_rs0 = ioexp_get_not_support; + self->get_hard_rs1 = ioexp_get_not_support; + self->set_tx_disable = common_set_tx_disable; + self->set_reset = ioexp_set_not_support; + self->set_lpmod = ioexp_set_not_support; + self->set_modsel = ioexp_set_not_support; + self->set_hard_rs0 = ioexp_set_not_support; + self->set_hard_rs1 = ioexp_set_not_support; + return 0; + case IOEXP_TYPE_CYPRESS_NABC: + case IOEXP_TYPE_MAPLE_NABC: + self->get_present = common_get_present; + self->get_tx_fault = common_get_tx_fault; + self->get_rxlos = common_get_rxlos; + self->get_tx_disable = common_get_tx_disable; + self->get_reset = ioexp_get_not_support; + self->get_lpmod = ioexp_get_not_support; + self->get_modsel = ioexp_get_not_support; + self->get_hard_rs0 = common_get_hard_rs0; + self->get_hard_rs1 = common_get_hard_rs1; + self->set_tx_disable = common_set_tx_disable; + self->set_reset = ioexp_set_not_support; + self->set_lpmod = ioexp_set_not_support; + self->set_modsel = ioexp_set_not_support; + self->set_hard_rs0 = common_set_hard_rs0; + self->set_hard_rs1 = common_set_hard_rs1; + return 0; + case IOEXP_TYPE_MAGINOLIA_7AB: + case IOEXP_TYPE_SPRUCE_7AB: + case IOEXP_TYPE_REDWOOD_P01P08: + case IOEXP_TYPE_REDWOOD_P09P16: + case IOEXP_TYPE_HUDSON32IGA_P01P08: + case IOEXP_TYPE_HUDSON32IGA_P09P16: + case IOEXP_TYPE_CYPRESS_7ABC: + case IOEXP_TYPE_TAHOE_5A: + case IOEXP_TYPE_TAHOE_6ABC: + case IOEXP_TYPE_SEQUOIA_NABC: + case IOEXP_TYPE_LAVENDER_P65: + case IOEXP_TYPE_MAPLE_0ABC: + self->get_present = common_get_present; + self->get_tx_fault = ioexp_get_not_support; + self->get_rxlos = ioexp_get_not_support; + self->get_tx_disable = ioexp_get_not_support; + self->get_reset = common_get_reset; + self->get_lpmod = common_get_lpmod; + self->get_modsel = common_get_modsel; + self->get_hard_rs0 = ioexp_get_not_support; + self->get_hard_rs1 = ioexp_get_not_support; + self->set_tx_disable = ioexp_set_not_support; + self->set_reset = common_set_reset; + self->set_lpmod = common_set_lpmod; + self->set_modsel = common_set_modsel; + self->set_hard_rs0 = ioexp_set_not_support; + self->set_hard_rs1 = ioexp_set_not_support; + return 0; + + default: + SWPS_ERR("%s: type:%d incorrect!\n", __func__, ioexp_type); + break; + } + return ERR_IOEXP_UNEXCPT; +} + + +static int +setup_ioexp_private_cb(struct ioexp_obj_s *self, + int ioexp_type){ + + switch (ioexp_type){ + case IOEXP_TYPE_MAGINOLIA_NAB: + case IOEXP_TYPE_MAGINOLIA_4AB: + case IOEXP_TYPE_MAGINOLIA_7AB: + case IOEXP_TYPE_SPRUCE_7AB: + case IOEXP_TYPE_REDWOOD_P01P08: + case IOEXP_TYPE_REDWOOD_P09P16: + case IOEXP_TYPE_HUDSON32IGA_P01P08: + case IOEXP_TYPE_HUDSON32IGA_P09P16: + case IOEXP_TYPE_CYPRESS_NABC: + case IOEXP_TYPE_CYPRESS_7ABC: + case IOEXP_TYPE_TAHOE_5A: + case IOEXP_TYPE_TAHOE_6ABC: + case IOEXP_TYPE_SEQUOIA_NABC: + case IOEXP_TYPE_LAVENDER_P65: + case CPLD_TYPE_COTTONWOOD: + case IOEXP_TYPE_MAPLE_NABC: + case IOEXP_TYPE_MAPLE_0ABC: + self->init = common_ioexp_init; + self->check = common_ioexp_check; + self->update_all = common_ioexp_update_all; + self->fsm_4_direct = common_ioexp_fsm_4_direct; + self->fsm_4_polling = common_ioexp_fsm_4_polling; + return 0; + + default: + SWPS_ERR("%s: type:%d incorrect!\n", __func__, ioexp_type); + break; + } + return ERR_IOEXP_UNEXCPT; +} + + +static int +setup_i2c_client_one(struct ioexp_obj_s *self, + int chip_id){ + + char *err_msg = "ERROR"; + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + struct ioexp_i2c_s *i2c_obj_p = NULL; + struct ioexp_i2c_s *i2c_curr_p = NULL; + + int chan_id = self->ioexp_map_p->map_addr[chip_id].chan_id; + adap = i2c_get_adapter(chan_id); + if(!adap){ + err_msg = "Can not get adap!"; + goto err_ioexp_setup_i2c_1; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + err_msg = "Can not kzalloc client!"; + goto err_ioexp_setup_i2c_1; + } + i2c_obj_p = kzalloc(sizeof(*i2c_obj_p), GFP_KERNEL); + if (!i2c_obj_p){ + err_msg = "Can not kzalloc i2c_obj_p!"; + goto err_ioexp_setup_i2c_2; + } + client->adapter = adap; + client->addr = self->ioexp_map_p->map_addr[chip_id].chip_addr; + i2c_obj_p->i2c_client_p = client; + i2c_obj_p->chip_id = chip_id; + i2c_obj_p->next = NULL; + if (!self->i2c_head_p){ + self->i2c_head_p = i2c_obj_p; + } else { + i2c_curr_p = self->i2c_head_p; + while (i2c_curr_p->next){ + i2c_curr_p = i2c_curr_p->next; + } + i2c_curr_p->next = i2c_obj_p; + } + return 0; + +err_ioexp_setup_i2c_2: + kfree(client); +err_ioexp_setup_i2c_1: + SWPS_ERR("%s: %s :%d\n", __func__, err_msg, chan_id); + return -1; +} + + +static int +setup_i2c_client(struct ioexp_obj_s* self){ + + int result; + int chip_id = 0; + + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + result = setup_i2c_client_one(self, chip_id); + if (result < 0){ + SWPS_ERR("%s fail! :%d\n", __func__, chip_id); + return -1; + } + } + return 0; +} + + +static int +setup_ioexp_config(struct ioexp_obj_s *self) { + + int chip_id, offset, err_code; + struct ioexp_addr_s *addr_p; + + for (chip_id=0; chip_id<(self->ioexp_map_p->chip_amount); chip_id++){ + addr_p = &(self->ioexp_map_p->map_addr[chip_id]); + if (!addr_p){ + SWPS_ERR("IOEXP config incorrect! :%d \n",chip_id); + return -1; + } + for (offset=0; offset<(self->ioexp_map_p->data_width); offset++){ + + /* [Desc] Skip the setup config value behavior + [Note] Setup config value = -1 if you don't want to write the value to IOEXP or CPLD + */ + if(addr_p->conf_offset[offset] < 0){ + SWPS_DEBUG("skip a config_offset <%d>\n", addr_p->conf_offset[offset]); + continue; + } + err_code = i2c_smbus_write_byte_data(_get_i2c_client(self, chip_id), + addr_p->conf_offset[offset], + addr_p->conf_default[offset]); + + if (err_code < 0){ + SWPS_INFO("%s: set conf fail! :%d \n", __func__, err_code); + return -2; + } + } + } + return 0; +} + + +struct ioexp_obj_s * +_create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode){ + + struct ioexp_map_s* ioexp_map_p; + struct ioexp_obj_s* result_p; + struct ioexp_i2c_s *i2c_curr_p; + struct ioexp_i2c_s *i2c_next_p; + + /* Get layout */ + ioexp_map_p = get_ioexp_map(ioexp_type); + if (!ioexp_map_p){ + SWPS_ERR("%s: Invalid ioexp_type\n", __func__); + goto err_create_ioexp_fail; + } + /* Prepare IOEXP object */ + result_p = kzalloc(sizeof(*result_p), GFP_KERNEL); + if (!result_p){ + SWPS_ERR("%s: kzalloc failure!\n", __func__); + goto err_create_ioexp_fail; + } + /* Prepare static size attributes */ + if (setup_ioexp_ssize_attr(result_p, + ioexp_map_p, + ioexp_id, + ioexp_type, + run_mode) < 0){ + goto err_create_ioexp_setup_attr_fail; + } + /* Prepare address mapping */ + if (setup_addr_mapping(result_p, addr_map_p, ioexp_map_p->chip_amount) < 0){ + goto err_create_ioexp_setup_attr_fail; + } + if (setup_i2c_client(result_p) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + /* Prepare call back functions of object */ + if (setup_ioexp_public_cb(result_p, ioexp_type) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + if (setup_ioexp_private_cb(result_p, ioexp_type) < 0){ + goto err_create_ioexp_setup_i2c_fail; + } + return result_p; + +err_create_ioexp_setup_i2c_fail: + i2c_curr_p = result_p->i2c_head_p; + i2c_next_p = result_p->i2c_head_p; + while (i2c_curr_p){ + i2c_next_p = i2c_curr_p->next; + kfree(i2c_curr_p->i2c_client_p); + kfree(i2c_curr_p); + i2c_curr_p = i2c_next_p; + } +err_create_ioexp_setup_attr_fail: + kfree(result_p); +err_create_ioexp_fail: + SWPS_ERR("%s: fail! :%d :%d \n", + __func__, ioexp_id, ioexp_type); + return NULL; +} + + +int +create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode){ + + struct ioexp_obj_s *ioexp_p = NULL; + + ioexp_p = _create_ioexp_obj(ioexp_id, ioexp_type, + addr_map_p, run_mode); + if (!ioexp_p){ + return -1; + } + if (ioexp_head_p == NULL){ + ioexp_head_p = ioexp_p; + ioexp_tail_p = ioexp_p; + return 0; + } + ioexp_tail_p->next = ioexp_p; + ioexp_tail_p = ioexp_p; + return 0; +} + + +static int +_init_ioexp_obj(struct ioexp_obj_s* self) { + + char *err_msg = "ERR"; + char *func_name = "_init_ioexp_obj"; + + /* Setup IOEXP configure byte */ + if (setup_ioexp_config(self) < 0){ + err_msg = "setup_ioexp_config fail"; + goto err_init_ioexp_obj; + } + /* Setup default data */ + if (_ioexp_init_handler(self) < 0){ + err_msg = "_ioexp_init_handler fail"; + goto err_init_ioexp_obj; + } + /* Update all */ + if (self->state == STATE_IOEXP_NORMAL){ + if (self->update_all(self, 1, func_name) < 0){ + err_msg = "update_all() fail"; + goto err_init_ioexp_obj; + } + } + return 0; + +err_init_ioexp_obj: + SWPS_DEBUG("%s: %s\n", __func__, err_msg); + return -1; +} + + +int +init_ioexp_objs(void){ + /* Return value: + * 0: Success + * -1: Detect topology error + * -2: SWPS internal error + */ + + struct ioexp_obj_s *curr_p = ioexp_head_p; + + if (!curr_p) { + SWPS_ERR("%s: ioexp_head_p is NULL\n", __func__); + return -2; + } + while (curr_p) { + if (_init_ioexp_obj(curr_p) < 0) { + SWPS_DEBUG("%s: _init_ioexp_obj() fail\n", __func__); + return -1; + } + curr_p = curr_p->next; + } + SWPS_DEBUG("%s: done.\n", __func__); + return 0; +} + + +void +clean_ioexp_objs(void){ + + struct ioexp_i2c_s *i2c_curr_p = NULL; + struct ioexp_i2c_s *i2c_next_p = NULL; + struct ioexp_obj_s *ioexp_next_p = NULL; + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + if (ioexp_head_p == NULL){ + ioexp_tail_p = NULL; + return; + } + while(ioexp_curr_p){ + ioexp_next_p = ioexp_curr_p->next; + if (ioexp_curr_p->ioexp_map_p) { + if (ioexp_curr_p->ioexp_map_p->map_addr) { + kfree(ioexp_curr_p->ioexp_map_p->map_addr); + } + kfree(ioexp_curr_p->ioexp_map_p); + } + + i2c_curr_p = ioexp_curr_p->i2c_head_p; + while (i2c_curr_p) { + i2c_next_p = i2c_curr_p->next; + kfree(i2c_curr_p->i2c_client_p); + kfree(i2c_curr_p); + i2c_curr_p = i2c_next_p; + } + kfree(ioexp_curr_p); + ioexp_curr_p = ioexp_next_p; + } + ioexp_tail_p = NULL; + SWPS_DEBUG("%s: done.\n", __func__); +} + + +int +check_ioexp_objs(void){ + + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while (ioexp_curr_p){ + if ( (ioexp_curr_p->check(ioexp_curr_p)) < 0){ + SWPS_INFO("check IOEXP-%d fail! :%d\n", + ioexp_curr_p->ioexp_id, ioexp_curr_p->ioexp_type); + return -1; + } + ioexp_curr_p = ioexp_curr_p->next; + } + return 0; +} + + +struct ioexp_obj_s * +get_ioexp_obj(int ioexp_id){ + + struct ioexp_obj_s *result_p = NULL; + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while(ioexp_curr_p){ + if (ioexp_curr_p->ioexp_id == ioexp_id){ + result_p = ioexp_curr_p; + break; + } + ioexp_curr_p = ioexp_curr_p->next; + } + return result_p; +} + + +void +unlock_ioexp_all(void) { + + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while(ioexp_curr_p){ + mutex_unlock(&ioexp_curr_p->lock); + ioexp_curr_p = ioexp_curr_p->next; + } +} + + +int +lock_ioexp_all(void) { + + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + + while(ioexp_curr_p){ + mutex_lock(&ioexp_curr_p->lock); + ioexp_curr_p = ioexp_curr_p->next; + } + return 0; +} + + +int +check_channel_tier_1(void) { + + if ( (!_is_channel_ready(ioexp_head_p)) && + (!_is_channel_ready(ioexp_tail_p)) ){ + return -1; + } + return 0; +} + + +static int +_scan_channel_tier_1(int force, + int show_err) { + + struct ioexp_obj_s *ioexp_curr_p = ioexp_head_p; + int ready = 0; + + if (!ioexp_curr_p) { + goto err_scan_tier_1_channel; + } + while(ioexp_curr_p) { + ready = _is_channel_ready(ioexp_curr_p); + if ((!ready) && (!force)) { + goto err_scan_tier_1_channel; + } + ioexp_curr_p = ioexp_curr_p->next; + } + return 0; + +err_scan_tier_1_channel: + if (show_err) { + if (ioexp_curr_p) { + SWPS_INFO("%s: IOEXP-%d fail\n", __func__, ioexp_curr_p->ioexp_id); + } else { + SWPS_INFO("%s: IOEXP is null.\n", __func__); + } + } + return -1; +} + + +static int +_scan_channel_tier_1_single(void) { + + int ret = 0; + int chan_id = 0; + int fake_cid = 0; + int fake_offs = 0; + int fake_addr = 0; + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + + if (ioexp_head_p->ioexp_id != ioexp_tail_p->ioexp_id) { + return 0; + } + /* Setup i2c_client */ + chan_id = ioexp_head_p->ioexp_map_p->map_addr[fake_cid].chan_id; + fake_addr = ioexp_head_p->ioexp_map_p->map_addr[fake_cid].chip_addr; + adap = i2c_get_adapter((chan_id + 1)); + if(!adap){ + SWPS_INFO("%s: Can not get adap!\n", __func__); + return 0; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + SWPS_INFO("%s: Can not kzalloc client!\n", __func__); + return 0; + } + client->adapter = adap; + client->addr = fake_addr; + /* Fouce move ioexp ptr to next */ + ret = i2c_smbus_read_byte_data(client, fake_offs); + SWPS_DEBUG("%s: move ioexp_ptr done. :%d\n", __func__, ret); + kfree(client); + return 1; +} + + +int +resync_channel_tier_1(void) { + + char *emsg = "ERR"; + + if (!ioexp_head_p) { + emsg = "ioexp_head_p is NULL"; + goto err_resync_ioexp_status_1; + } + /* Run all */ + if (ioexp_head_p->ioexp_id == ioexp_tail_p->ioexp_id) { + _scan_channel_tier_1_single(); + } else { + _scan_channel_tier_1(1, 0); + } + /* Check all */ + if (_scan_channel_tier_1(0, 1) < 0) { + emsg = "resync tier-1 channel fail"; + goto err_resync_ioexp_status_1; + } + return 0; + +err_resync_ioexp_status_1: + SWPS_ERR("%s: %s\n", __func__, emsg); + return -1; +} + + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/io_expander.h b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/io_expander.h new file mode 100644 index 000000000000..1af909e2466a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/io_expander.h @@ -0,0 +1,187 @@ +/* + * 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. + */ + +#ifndef IO_EXPANDER_H +#define IO_EXPANDER_H + +#include + + +/* IOEXP type define (SFP series) */ +#define IOEXP_TYPE_MAGINOLIA_NAB (10101) +#define IOEXP_TYPE_MAGINOLIA_4AB (10102) +#define IOEXP_TYPE_CYPRESS_NABC (10103) +#define IOEXP_TYPE_MAPLE_NABC (10104) + +/* IOEXP type define (QSFP series) */ +#define IOEXP_TYPE_MAGINOLIA_7AB (10201) +#define IOEXP_TYPE_REDWOOD_P01P08 (10202) +#define IOEXP_TYPE_REDWOOD_P09P16 (10203) +#define IOEXP_TYPE_HUDSON32IGA_P01P08 (10204) +#define IOEXP_TYPE_HUDSON32IGA_P09P16 (10205) +#define IOEXP_TYPE_SPRUCE_7AB (10206) +#define IOEXP_TYPE_CYPRESS_7ABC (10207) +#define IOEXP_TYPE_TAHOE_5A (10208) +#define IOEXP_TYPE_TAHOE_6ABC (10209) +#define IOEXP_TYPE_SEQUOIA_NABC (10210) +#define IOEXP_TYPE_LAVENDER_P65 (10211) +#define IOEXP_TYPE_MAPLE_0ABC (10212) + +/* CPLD type define */ +#define CPLD_TYPE_COTTONWOOD (10301) + +/* IOEXP mode define */ +#define IOEXP_MODE_POLLING (19000) +#define IOEXP_MODE_DIRECT (19001) + +/* IOEXP state define */ +#define STATE_IOEXP_NORMAL (0) +#define STATE_IOEXP_INIT (-1) +#define STATE_IOEXP_ABNORMAL (-2) + +/* IOEXP error code define */ +#define ERR_IOEXP_NOTSUPPORT (-100) +#define ERR_IOEXP_UNINIT (-101) +#define ERR_IOEXP_BADCONF (-102) +#define ERR_IOEXP_ABNORMAL (-103) +#define ERR_IOEXP_NOSTATE (-104) +#define ERR_IOEXP_BADINPUT (-105) +#define ERR_IOEXP_UNEXCPT (-199) + +#define SWPS_INFO(fmt, args...) printk( KERN_INFO "[SWPS] " fmt, ##args) +#define SWPS_WARN(fmt, args...) printk( KERN_WARNING "[SWPS] " fmt, ##args) +#define SWPS_ERR(fmt, args...) printk( KERN_ERR "[SWPS] " fmt, ##args) + +#ifdef DEBUG_SWPS +# define SWPS_DEBUG(fmt, args...) printk( KERN_DEBUG "[SWPS] " fmt, ##args) +#else +# define SWPS_DEBUG(fmt, args...) +#endif + + +struct ioexp_addr_s { + int chan_id; + int chip_addr; + int read_offset[8]; + int write_offset[8]; + int conf_offset[8]; + uint8_t data_default[8]; + uint8_t conf_default[8]; +}; + +struct ioexp_i2c_s { + int chip_id; + struct i2c_client *i2c_client_p; + struct ioexp_i2c_s *next; +}; + + +struct ioexp_bitmap_s { + int chip_id; /* IOEXP chip id */ + int ioexp_voffset; /* IOEXP virtual offset */ + int bit_shift; +}; + +struct ioexp_map_s { + int chip_amount; /* Number of chips that IOEXP object content */ + int data_width; /* Number of (Read/Write/Config) bytes */ + struct ioexp_addr_s *map_addr; /* Chip address info */ + struct ioexp_bitmap_s map_present[10]; /* IOEXP for SFP / QSFP */ + struct ioexp_bitmap_s map_tx_disable[10]; /* IOEXP for SFP */ + struct ioexp_bitmap_s map_tx_fault[10]; /* IOEXP for SFP */ + struct ioexp_bitmap_s map_rxlos[10]; /* IOEXP for SFP */ + struct ioexp_bitmap_s map_reset[10]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_lpmod[10]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_modsel[10]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_hard_rs0[10]; /* IOEXP for QSFP */ + struct ioexp_bitmap_s map_hard_rs1[10]; /* IOEXP for QSFP */ +}; + +struct ioexp_data_s { + uint8_t data[8]; +}; + +struct ioexp_obj_s { + + /* ============================ + * Object public property + * ============================ + */ + int ioexp_id; + int ioexp_type; + + /* ============================ + * Object private property + * ============================ + */ + struct ioexp_data_s chip_data[16]; /* Max: 8-ioexp in one virt-ioexp(ioexp_obj) */ + struct ioexp_map_s *ioexp_map_p; + struct ioexp_obj_s *next; + struct ioexp_i2c_s *i2c_head_p; + struct mutex lock; + int mode; + int state; + + /* =========================================== + * Object public functions + * =========================================== + */ + int (*get_present)(struct ioexp_obj_s *self, int virt_offset); + int (*get_tx_fault)(struct ioexp_obj_s *self, int virt_offset); + int (*get_rxlos)(struct ioexp_obj_s *self, int virt_offset); + int (*get_tx_disable)(struct ioexp_obj_s *self, int virt_offset); + int (*get_reset)(struct ioexp_obj_s *self, int virt_offset); + int (*get_lpmod)(struct ioexp_obj_s *self, int virt_offset); + int (*get_modsel)(struct ioexp_obj_s *self, int virt_offset); + int (*get_hard_rs0)(struct ioexp_obj_s *self, int virt_offset); + int (*get_hard_rs1)(struct ioexp_obj_s *self, int virt_offset); + int (*set_tx_disable)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_reset)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_lpmod)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_modsel)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_hard_rs0)(struct ioexp_obj_s *self, int virt_offset, int input_val); + int (*set_hard_rs1)(struct ioexp_obj_s *self, int virt_offset, int input_val); + + /* =========================================== + * Object private functions + * =========================================== + */ + int (*init)(struct ioexp_obj_s *self); + int (*check)(struct ioexp_obj_s *self); + int (*update_all)(struct ioexp_obj_s *self, int show_err, char *caller_name); + int (*fsm_4_direct)(struct ioexp_obj_s* self); + int (*fsm_4_polling)(struct ioexp_obj_s* self); +}; + + +struct ioexp_obj_s* get_ioexp_obj(int ioexp_id); +int create_ioexp_obj(int ioexp_id, + int ioexp_type, + struct ioexp_addr_s *addr_map_p, + int run_mode); +int init_ioexp_objs(void); +int check_ioexp_objs(void); +void clean_ioexp_objs(void); + +void unlock_ioexp_all(void); +int lock_ioexp_all(void); + +int check_channel_tier_1(void); +int resync_channel_tier_1(void); + +/* Macro for bit control */ +#define SWP_BIT_SET(byte_val,bit_shift) ((byte_val) |= (1<<(bit_shift))) +#define SWP_BIT_CLEAR(byte_val,bit_shift) ((byte_val) &= ~(1<<(bit_shift))) + + +#endif /* IO_EXPANDER_H */ + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/transceiver.c b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/transceiver.c new file mode 100644 index 000000000000..6fe8f599fb48 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/transceiver.c @@ -0,0 +1,8389 @@ +/* + * 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. + */ + +#include +#include +#include +#include +#include "io_expander.h" +#include "transceiver.h" + + +/* ========== Register EEPROM address mapping ========== + */ +struct eeprom_map_s eeprom_map_sfp = { + .addr_br =0x50, .page_br =-1, .offset_br =12, .length_br =1, + .addr_cdr =-1, .page_cdr =-1, .offset_cdr =-1, .length_cdr =-1, + .addr_comp_rev =0x50, .page_comp_rev =-1, .offset_comp_rev =94, .length_comp_rev =1, + .addr_connector =0x50, .page_connector =-1, .offset_connector =2, .length_connector =1, + .addr_diag_type =0x50, .page_diag_type =-1, .offset_diag_type =92 , .length_diag_type =1, + .addr_extbr =-1, .page_extbr =-1, .offset_extbr =-1, .length_extbr =-1, + .addr_ext_id =0x50, .page_ext_id =-1, .offset_ext_id =1, .length_ext_id =1, + .addr_id =0x50, .page_id =-1, .offset_id =0, .length_id =1, + .addr_len_sm =0x50, .page_len_sm =-1, .offset_len_sm =15, .length_len_sm =1, + .addr_len_smf =0x50, .page_len_smf =-1, .offset_len_smf =14, .length_len_smf =1, + .addr_len_om1 =0x50, .page_len_om1 =-1, .offset_len_om1 =17, .length_len_om1 =1, + .addr_len_om2 =0x50, .page_len_om2 =-1, .offset_len_om2 =16, .length_len_om2 =1, + .addr_len_om3 =0x50, .page_len_om3 =-1, .offset_len_om3 =19, .length_len_om3 =1, + .addr_len_om4 =0x50, .page_len_om4 =-1, .offset_len_om4 =18, .length_len_om4 =1, + .addr_option =0x50, .page_option =-1, .offset_option =64, .length_option =2, + .addr_rate_id =0x50, .page_rate_id =-1, .offset_rate_id =13, .length_rate_id =1, + .addr_rx_am =-1, .page_rx_am =-1, .offset_rx_am =-1, .length_rx_am =-1, + .addr_rx_em =0x51, .page_rx_em =-1, .offset_rx_em =115, .length_rx_em =1, + .addr_rx_los =-1, .page_rx_los =-1, .offset_rx_los =-1, .length_rx_los =-1, + .addr_rx_power =0x51, .page_rx_power =-1, .offset_rx_power =104, .length_rx_power =2, + .addr_soft_rs0 =0x51, .page_soft_rs0 =-1, .offset_soft_rs0 =110, .length_soft_rs0 =1, + .addr_soft_rs1 =0x51, .page_soft_rs1 =-1, .offset_soft_rs1 =118, .length_soft_rs0 =1, + .addr_temp =0x51, .page_temp =-1, .offset_temp =96, .length_temp =2, + .addr_trancomp =0x50, .page_trancomp =-1, .offset_trancomp =3, .length_trancomp =8, + .addr_trancomp_ext =0x50, .page_trancomp_ext =-1, .offset_trancomp_ext =36, .length_trancomp_ext =1, + .addr_tx_bias =0x51, .page_tx_bias =-1, .offset_tx_bias =100, .length_tx_bias =2, + .addr_tx_disable =-1, .page_tx_disable =-1, .offset_tx_disable =-1, .length_tx_disable =-1, + .addr_tx_eq =0x51, .page_tx_eq =-1, .offset_tx_eq =114, .length_tx_eq =1, + .addr_tx_fault =-1, .page_tx_fault =-1, .offset_tx_fault =-1, .length_tx_fault =-1, + .addr_tx_power =0x51, .page_tx_power =-1, .offset_tx_power =102, .length_tx_power =2, + .addr_vendor_name =0x50, .page_vendor_name =-1, .offset_vendor_name =20, .length_vendor_name =16, + .addr_vendor_pn =0x50, .page_vendor_pn =-1, .offset_vendor_pn =40, .length_vendor_pn =16, + .addr_vendor_rev =0x50, .page_vendor_rev =-1, .offset_vendor_rev =56, .length_vendor_rev =4, + .addr_vendor_sn =0x50, .page_vendor_sn =-1, .offset_vendor_sn =68, .length_vendor_sn =16, + .addr_voltage =0x51, .page_voltage =-1, .offset_voltage =98, .length_voltage =2, + .addr_wavelength =0x50, .page_wavelength =-1, .offset_wavelength =60, .length_wavelength =2, +}; + +struct eeprom_map_s eeprom_map_qsfp = { + .addr_br =0x50, .page_br =0, .offset_br =140, .length_br =1, + .addr_cdr =-1, .page_cdr =-1, .offset_cdr =-1, .length_cdr =-1, + .addr_comp_rev =0x50, .page_comp_rev =-1, .offset_comp_rev =1, .length_comp_rev =1, + .addr_connector =0x50, .page_connector =0, .offset_connector =130, .length_connector =1, + .addr_diag_type =0x50, .page_diag_type =0, .offset_diag_type =220, .length_diag_type =1, + .addr_extbr =0x50, .page_extbr =0, .offset_extbr =222, .length_extbr =1, + .addr_ext_id =0x50, .page_ext_id =0, .offset_ext_id =129, .length_ext_id =1, + .addr_id =0x50, .page_id =0, .offset_id =128, .length_id =1, + .addr_len_sm =-1, .page_len_sm =-1, .offset_len_sm =-1, .length_len_sm =-1, + .addr_len_smf =0x50, .page_len_smf =0, .offset_len_smf =142, .length_len_smf =1, + .addr_len_om1 =0x50, .page_len_om1 =0, .offset_len_om1 =145, .length_len_om1 =1, + .addr_len_om2 =0x50, .page_len_om2 =0, .offset_len_om2 =144, .length_len_om2 =1, + .addr_len_om3 =0x50, .page_len_om3 =0, .offset_len_om3 =143, .length_len_om3 =1, + .addr_len_om4 =0x50, .page_len_om4 =0, .offset_len_om4 =146, .length_len_om4 =1, + .addr_option =0x50, .page_option =0, .offset_option =193, .length_option =3, + .addr_rate_id =-1, .page_rate_id =-1, .offset_rate_id =-1, .length_rate_id =-1, + .addr_rx_am =-1, .page_rx_am =-1, .offset_rx_am =-1, .length_rx_am =-1, + .addr_rx_em =-1, .page_rx_em =-1, .offset_rx_em =-1, .length_rx_em =-1, + .addr_rx_los =0x50, .page_rx_los =-1, .offset_rx_los =3, .length_rx_los =1, + .addr_rx_power =0x50, .page_rx_power =-1, .offset_rx_power =34, .length_rx_power =8, + .addr_soft_rs0 =-1, .page_soft_rs0 =-1, .offset_soft_rs0 =-1, .length_soft_rs0 =-1, + .addr_soft_rs1 =-1, .page_soft_rs1 =-1, .offset_soft_rs1 =-1, .length_soft_rs0 =-1, + .addr_temp =0x50, .page_temp =-1, .offset_temp =22, .length_temp =2, + .addr_trancomp =0x50, .page_trancomp =0, .offset_trancomp =131, .length_trancomp =8, + .addr_trancomp_ext =0x50, .page_trancomp_ext =0, .offset_trancomp_ext =192, .length_trancomp_ext =1, + .addr_tx_bias =0x50, .page_tx_bias =-1, .offset_tx_bias =42, .length_tx_bias =8, + .addr_tx_disable =0x50, .page_tx_disable =-1, .offset_tx_disable =86, .length_tx_disable =1, + .addr_tx_eq =-1, .page_tx_eq =-1, .offset_tx_eq =-1, .length_tx_eq =-1, + .addr_tx_fault =0x50, .page_tx_fault =-1, .offset_tx_fault =4, .length_tx_fault =1, + .addr_tx_power =0x50, .page_tx_power =-1, .offset_tx_power =50, .length_tx_power =8, + .addr_vendor_name =0x50, .page_vendor_name =0, .offset_vendor_name =148, .length_vendor_name =16, + .addr_vendor_pn =0x50, .page_vendor_pn =0, .offset_vendor_pn =168, .length_vendor_pn =16, + .addr_vendor_rev =0x50, .page_vendor_rev =0, .offset_vendor_rev =184, .length_vendor_rev =2, + .addr_vendor_sn =0x50, .page_vendor_sn =0, .offset_vendor_sn =196, .length_vendor_sn =16, + .addr_voltage =0x50, .page_voltage =-1, .offset_voltage =26, .length_voltage =2, + .addr_wavelength =0x50, .page_wavelength =0, .offset_wavelength =186, .length_wavelength =2, +}; + +struct eeprom_map_s eeprom_map_qsfp28 = { + .addr_br =0x50, .page_br =0, .offset_br =140, .length_br =1, + .addr_cdr =0x50, .page_cdr =-1, .offset_cdr =98, .length_cdr =1, + .addr_comp_rev =0x50, .page_comp_rev =-1, .offset_comp_rev =1, .length_comp_rev =1, + .addr_connector =0x50, .page_connector =0, .offset_connector =130, .length_connector =1, + .addr_diag_type =0x50, .page_diag_type =0, .offset_diag_type =220, .length_diag_type =1, + .addr_extbr =0x50, .page_extbr =0, .offset_extbr =222, .length_extbr =1, + .addr_ext_id =0x50, .page_ext_id =0, .offset_ext_id =129, .length_ext_id =1, + .addr_id =0x50, .page_id =0, .offset_id =128, .length_id =1, + .addr_len_sm =-1, .page_len_sm =-1, .offset_len_sm =-1, .length_len_sm =-1, + .addr_len_smf =0x50, .page_len_smf =0, .offset_len_smf =142, .length_len_smf =1, + .addr_len_om1 =0x50, .page_len_om1 =0, .offset_len_om1 =145, .length_len_om1 =1, + .addr_len_om2 =0x50, .page_len_om2 =0, .offset_len_om2 =144, .length_len_om2 =1, + .addr_len_om3 =0x50, .page_len_om3 =0, .offset_len_om3 =143, .length_len_om3 =1, + .addr_len_om4 =0x50, .page_len_om4 =0, .offset_len_om4 =146, .length_len_om4 =1, + .addr_option =0x50, .page_option =0, .offset_option =193, .length_option =3, + .addr_rate_id =-1, .page_rate_id =-1, .offset_rate_id =-1, .length_rate_id =-1, + .addr_rx_am =0x50, .page_rx_am =3, .offset_rx_am =238, .length_rx_am =2, + .addr_rx_em =0x50, .page_rx_em =3, .offset_rx_em =236, .length_rx_em =2, + .addr_rx_los =0x50, .page_rx_los =-1, .offset_rx_los =3, .length_rx_los =1, + .addr_rx_power =0x50, .page_rx_power =-1, .offset_rx_power =34, .length_rx_power =8, + .addr_soft_rs0 =-1, .page_soft_rs0 =-1, .offset_soft_rs0 =-1, .length_soft_rs0 =-1, + .addr_soft_rs1 =-1, .page_soft_rs1 =-1, .offset_soft_rs1 =-1, .length_soft_rs0 =-1, + .addr_temp =0x50, .page_temp =-1, .offset_temp =22, .length_temp =2, + .addr_trancomp =0x50, .page_trancomp =0, .offset_trancomp =131, .length_trancomp =8, + .addr_trancomp_ext =0x50, .page_trancomp_ext =0, .offset_trancomp_ext =192, .length_trancomp_ext =1, + .addr_tx_bias =0x50, .page_tx_bias =-1, .offset_tx_bias =42, .length_tx_bias =8, + .addr_tx_disable =0x50, .page_tx_disable =-1, .offset_tx_disable =86, .length_tx_disable =1, + .addr_tx_eq =0x50, .page_tx_eq =3, .offset_tx_eq =234, .length_tx_eq =2, + .addr_tx_fault =0x50, .page_tx_fault =-1, .offset_tx_fault =4, .length_tx_fault =1, + .addr_tx_power =0x50, .page_tx_power =-1, .offset_tx_power =50, .length_tx_power =8, + .addr_vendor_name =0x50, .page_vendor_name =0, .offset_vendor_name =148, .length_vendor_name =16, + .addr_vendor_pn =0x50, .page_vendor_pn =0, .offset_vendor_pn =168, .length_vendor_pn =16, + .addr_vendor_rev =0x50, .page_vendor_rev =0, .offset_vendor_rev =184, .length_vendor_rev =2, + .addr_vendor_sn =0x50, .page_vendor_sn =0, .offset_vendor_sn =196, .length_vendor_sn =16, + .addr_voltage =0x50, .page_voltage =-1, .offset_voltage =26, .length_voltage =2, + .addr_wavelength =0x50, .page_wavelength =0, .offset_wavelength =186, .length_wavelength =2, +}; + + +/* ========== Utility Functions ========== + */ +static int +get_bit(uint8_t origin_byte, int bit_shift) { + return (int)((origin_byte >> bit_shift) & 0x1); +} + +static int +transform_word_to_int(uint8_t hight_byte, + uint8_t low_byte) { + return ((((int)hight_byte) << 8) + (int)low_byte); +} + +void +alarm_msg_2_user(struct transvr_obj_s *self, + char *emsg) { + + SWPS_ERR("%s on %s.\n", emsg, self->swp_name); +} + + +/* ========== Private functions ========== + */ +static int +_reload_transvr_obj(struct transvr_obj_s *self,int new_type); + +static int +reload_transvr_obj(struct transvr_obj_s *self,int new_type); + +static int +_is_transvr_support_ctle(struct transvr_obj_s *self); + +static int +_transvr_init_handler(struct transvr_obj_s *self); + +int +_transvr_clean_handler(struct transvr_obj_s *self); + +int +_sfp_detect_class_by_1g_ethernet(struct transvr_obj_s* self); + + +void +lock_transvr_obj(struct transvr_obj_s *self) { + + mutex_lock(&self->lock); + self->curr_page = VAL_TRANSVR_PAGE_FREE; +} + + +void +unlock_transvr_obj(struct transvr_obj_s *self) { + + self->curr_page = VAL_TRANSVR_PAGE_FREE; + mutex_unlock(&self->lock); +} + + +static int +_check_by_mode(struct transvr_obj_s *self, + int (*attr_update_func)(struct transvr_obj_s *self, int show_err), + char *caller_name){ + + int return_val = ERR_TRANSVR_UNEXCPT; + + switch (self->mode){ + case TRANSVR_MODE_POLLING: + switch (self->state){ + case STATE_TRANSVR_CONNECTED: + goto ok_check_by_mode_1; + case STATE_TRANSVR_NEW: + case STATE_TRANSVR_INIT: + return ERR_TRANSVR_UNINIT; + case STATE_TRANSVR_DISCONNECTED: + return ERR_TRANSVR_UNPLUGGED; + case STATE_TRANSVR_UNEXCEPTED: + return ERR_TRANSVR_ABNORMAL; + case STATE_TRANSVR_ISOLATED: + return ERR_TRNASVR_BE_ISOLATED; + default: + goto err_check_by_mode_1; + } + goto ok_check_by_mode_1; + + case TRANSVR_MODE_DIRECT: + return_val = self->fsm_4_direct(self, caller_name); + if (return_val < 0){ + return return_val; + } + goto ok_check_by_mode_1; + + default: + goto err_check_by_mode_1; + } + goto ok_check_by_mode_1; + +ok_check_by_mode_1: + return attr_update_func(self, 0); + +err_check_by_mode_1: + SWPS_INFO("_check_by_mode: mode:%d state:%d\n", self->mode, self->state); + return ERR_TRANSVR_UNEXCPT; +} + + +static void +_transvr_clean_retry(struct transvr_obj_s *self) { + self->retry = 0; +} + + +static int +_transvr_handle_retry(struct transvr_obj_s *self, int retry) { + /* Return: 0: keep retry + * -1: stop retry + */ + if (self->retry == 0) { + self->retry = retry; + } + self->retry -= 1; + if (self->retry <= 0) { + _transvr_clean_retry(self); + return -1; + } + return 0; +} + + +static int +_common_setup_page(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + int show_e) { + /* return: + * 0 : OK + * -1 : EEPROM settings incorrect + * -2 : I2C R/W failure + * -3 : Undefined case + */ + int retval = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + /* Check */ + if ((addr < 0) || (offset < 0) || (len < 0)) { + emsg = "EEPROM settings incorrect"; + retval = -1; + goto err_common_setup_page; + } + /* Case1: continue access */ + if ((self->i2c_client_p->addr == addr) && + (self->curr_page == page)) { + return 0; + } + self->i2c_client_p->addr = addr; + /* Case2: select lower page */ + if (page == -1) { + self->curr_page = page; + return 0; + } + /* Case3: select upper page */ + if (page >= 0) { + goto upper_common_setup_page; + } + /* Unexpected case */ + show_e = 1; + emsg = "Unexpected case"; + retval = -3; + goto err_common_setup_page; + +upper_common_setup_page: + if (i2c_smbus_write_byte_data(self->i2c_client_p, + VAL_TRANSVR_PAGE_SELECT_OFFSET, + page) < 0) { + emsg = "I2C R/W failure"; + retval = -2; + goto err_common_setup_page; + } + self->curr_page = page; + mdelay(VAL_TRANSVR_PAGE_SELECT_DELAY); + return 0; + +err_common_setup_page: + if (show_e) { + SWPS_INFO("%s: %s", __func__, emsg); + SWPS_INFO("%s: :0x%02x :%d :%d :%d\n", + __func__, addr, page, offset, len); + } + return retval; +} + +/* +static int +_common_setup_password(struct transvr_obj_s *self, + int addr, + int page, + int offs, + uint8_t pwd[4], + int show_e) { + int i = 0; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offs, 4, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_setup_password; + } + for (i=0; i<4; i++) { + err = i2c_smbus_write_byte_data(self->i2c_client_p, + (offs + i), + pwd[i]); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_setup_password; + } + } + return 0; + +err_common_setup_password: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, err); + } + return ERR_TRANSVR_UPDATE_FAIL; +} +*/ + +static int +_common_update_uint8_attr(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + uint8_t *buf, + char *caller, + int show_e){ + + int i; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offset, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_update_uint8_attr; + } + for (i=0; ii2c_client_p, (offset + i)); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_update_uint8_attr; + } + buf[i] = err; + } + return 0; + +err_common_update_uint8_attr: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d\n", + __func__, emsg, caller, err); + } + buf[0] = DEBUG_TRANSVR_HEX_VAL; + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_update_int_attr(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + int *buf, + char *caller, + int show_e){ + + int i; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offset, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_update_int_attr; + } + for (i=0; ii2c_client_p, (offset + i)); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_update_int_attr; + } + buf[i] = (int)err; + } + return 0; + +err_common_update_int_attr: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d\n", + __func__, emsg, caller, err); + } + buf[0] = DEBUG_TRANSVR_INT_VAL; + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_update_string_attr(struct transvr_obj_s *self, + int addr, + int page, + int offset, + int len, + char buf[], + char *caller, + int show_e){ + + int i; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offset, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_update_string_attr; + } + for (i=0; ii2c_client_p, (offset + i)); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_update_string_attr; + } + buf[i] = (char)err; + } + return 0; + +err_common_update_string_attr: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d\n", + __func__, emsg, caller, err); + } + buf[0] = 'e'; + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_set_uint8_attr(struct transvr_obj_s *self, + int addr, + int page, + int offset, + uint8_t update, + uint8_t *buf, + char *caller, + int show_e){ + int len = 1; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + if ((*buf) == update){ + return 0; + } + err = _common_setup_page(self, addr, page, offset, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_set_uint8_attr_1; + } + err = i2c_smbus_write_byte_data(self->i2c_client_p, + offset, + update); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_set_uint8_attr_1; + } + (*buf) = update; + return 0; + +err_common_set_uint8_attr_1: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d\n", + __func__, emsg, caller, err); + } + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_set_uint8_array(struct transvr_obj_s *self, + int addr, + int page, + int offs, + int len, + uint8_t update[], + uint8_t buf[], + char *caller, + int show_e){ + int i = 0; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + err = _common_setup_page(self, addr, page, offs, len, show_e); + if (err < 0){ + emsg = "setup EEPROM page fail"; + goto err_common_set_uint8_attr_1; + } + for (i=0; ii2c_client_p, + (offs + i), + update[i]); + if (err < 0){ + emsg = "I2C R/W fail!"; + goto err_common_set_uint8_attr_1; + } + buf[i] = update[i]; + } + return 0; + +err_common_set_uint8_attr_1: + if (show_e) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + __func__, emsg, caller, err, i); + } + return ERR_TRANSVR_UPDATE_FAIL; +} + + +static int +_common_update_attr_id(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_id, + self->eeprom_map_p->page_id, + self->eeprom_map_p->offset_id, + self->eeprom_map_p->length_id, + &(self->id), + "_common_update_attr_id", + show_err); +} + + +static int +_common_update_attr_extended_id(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_ext_id, + self->eeprom_map_p->page_ext_id, + self->eeprom_map_p->offset_ext_id, + self->eeprom_map_p->length_ext_id, + &(self->ext_id), + "_common_update_attr_extended_id", + show_err); +} + + +static int +_common_update_attr_connector(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_connector, + self->eeprom_map_p->page_connector, + self->eeprom_map_p->offset_connector, + self->eeprom_map_p->length_connector, + &(self->connector), + "_common_update_attr_connector", + show_err); +} + + +static int +_common_update_attr_transvr_comp(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_trancomp, + self->eeprom_map_p->page_trancomp, + self->eeprom_map_p->offset_trancomp, + self->eeprom_map_p->length_trancomp, + self->transvr_comp, + "_common_update_attr_transvr_comp", + show_err); +} + + +static int +_common_update_attr_transvr_comp_ext(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_trancomp_ext, + self->eeprom_map_p->page_trancomp_ext, + self->eeprom_map_p->offset_trancomp_ext, + self->eeprom_map_p->length_trancomp_ext, + &(self->transvr_comp_ext), + "_common_update_attr_transvr_comp_ext", + show_err); +} + + +static int +_common_update_attr_vendor_name(struct transvr_obj_s *self, + int show_err){ + return _common_update_string_attr(self, + self->eeprom_map_p->addr_vendor_name, + self->eeprom_map_p->page_vendor_name, + self->eeprom_map_p->offset_vendor_name, + self->eeprom_map_p->length_vendor_name, + self->vendor_name, + "_common_update_attr_vendor_name", + show_err); +} + + +static int +_common_update_attr_vendor_pn(struct transvr_obj_s *self, + int show_err){ + return _common_update_string_attr(self, + self->eeprom_map_p->addr_vendor_pn, + self->eeprom_map_p->page_vendor_pn, + self->eeprom_map_p->offset_vendor_pn, + self->eeprom_map_p->length_vendor_pn, + self->vendor_pn, + "_common_update_attr_vendor_pn", + show_err); +} + + +static int +_common_update_attr_vendor_rev(struct transvr_obj_s *self, + int show_err){ + return _common_update_string_attr(self, + self->eeprom_map_p->addr_vendor_rev, + self->eeprom_map_p->page_vendor_rev, + self->eeprom_map_p->offset_vendor_rev, + self->eeprom_map_p->length_vendor_rev, + self->vendor_rev, + "_common_update_attr_vendor_rev", + show_err); +} + + +static int +_common_update_attr_vendor_sn(struct transvr_obj_s *self, + int show_err){ + return _common_update_string_attr(self, + self->eeprom_map_p->addr_vendor_sn, + self->eeprom_map_p->page_vendor_sn, + self->eeprom_map_p->offset_vendor_sn, + self->eeprom_map_p->length_vendor_sn, + self->vendor_sn, + "_common_update_attr_vendor_sn", + show_err); +} + + +static int +_common_update_attr_br(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_br, + self->eeprom_map_p->page_br, + self->eeprom_map_p->offset_br, + self->eeprom_map_p->length_br, + &(self->br), + "_common_update_attr_br", + show_err); +} + + +static int +_common_update_attr_len_smf(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_smf, + self->eeprom_map_p->page_len_smf, + self->eeprom_map_p->offset_len_smf, + self->eeprom_map_p->length_len_smf, + &(self->len_smf), + "_common_update_attr_len_smf", + show_err); +} + + +static int +_common_update_attr_len_om1(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_om1, + self->eeprom_map_p->page_len_om1, + self->eeprom_map_p->offset_len_om1, + self->eeprom_map_p->length_len_om1, + &(self->len_om1), + "_common_update_attr_len_om1", + show_err); +} + +static int +_common_update_attr_len_om2(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_om2, + self->eeprom_map_p->page_len_om2, + self->eeprom_map_p->offset_len_om2, + self->eeprom_map_p->length_len_om2, + &(self->len_om2), + "_common_update_attr_len_om2", + show_err); +} + +static int +_common_update_attr_len_om3(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_om3, + self->eeprom_map_p->page_len_om3, + self->eeprom_map_p->offset_len_om3, + self->eeprom_map_p->length_len_om3, + &(self->len_om3), + "_common_update_attr_len_om3", + show_err); +} + + +static int +_common_update_attr_len_om4(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_om4, + self->eeprom_map_p->page_len_om4, + self->eeprom_map_p->offset_len_om4, + self->eeprom_map_p->length_len_om4, + &(self->len_om4), + "_common_update_attr_len_om4", + show_err); +} + + +static int +_common_update_attr_option(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_option, + self->eeprom_map_p->page_option, + self->eeprom_map_p->offset_option, + self->eeprom_map_p->length_option, + self->option, + "_common_update_attr_option", + show_err); +} + + +static int +_common_update_attr_comp_rev(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_comp_rev, + self->eeprom_map_p->page_comp_rev, + self->eeprom_map_p->offset_comp_rev, + self->eeprom_map_p->length_comp_rev, + &(self->comp_rev), + "_common_update_attr_comp_rev", + show_err); +} + + +static int +_common_update_attr_diag_type(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_diag_type, + self->eeprom_map_p->page_diag_type, + self->eeprom_map_p->offset_diag_type, + self->eeprom_map_p->length_diag_type, + &(self->diag_type), + "_common_update_attr_diag_type", + show_err); +} + + +static int +_common_update_attr_wavelength(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_wavelength, + self->eeprom_map_p->page_wavelength, + self->eeprom_map_p->offset_wavelength, + self->eeprom_map_p->length_wavelength, + self->wavelength, + "_common_update_attr_wavelength", + show_err); +} + + +int +_common_get_option_value(struct transvr_obj_s *self, + int offset, + int bit_shift) { + /* SFP: + * - option[0] = A0h / 64 + * - option[1] = A0h / 65 + * QSFP: + * - option[0] = 00h / 193 + * - option[1] = 00h / 194 + * - option[2] = 00h / 195 + */ + return (self->option[offset] & (1 << bit_shift)); +} + + +static int +_sfp_update_attr_len_sm(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_len_sm, + self->eeprom_map_p->page_len_sm, + self->eeprom_map_p->offset_len_sm, + self->eeprom_map_p->length_len_sm, + &(self->len_sm), + "_common_update_attr_len_sm", + show_err); +} + + +static int +_sfp_update_attr_rate_id(struct transvr_obj_s *self, + int show_err){ + return _common_update_int_attr(self, + self->eeprom_map_p->addr_rate_id, + self->eeprom_map_p->page_rate_id, + self->eeprom_map_p->offset_rate_id, + self->eeprom_map_p->length_rate_id, + &(self->rate_id), + "_sfp_update_attr_rate_id", + show_err); +} + + +static int +_sfp_update_attr_soft_rs0(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_soft_rs0, + self->eeprom_map_p->page_soft_rs0, + self->eeprom_map_p->offset_soft_rs0, + self->eeprom_map_p->length_soft_rs0, + &(self->soft_rs0), + "_sfp_update_attr_soft_rs0", + show_err); +} + + +static int +_sfp_update_attr_soft_rs1(struct transvr_obj_s *self, + int show_err){ + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_soft_rs1, + self->eeprom_map_p->page_soft_rs1, + self->eeprom_map_p->offset_soft_rs1, + self->eeprom_map_p->length_soft_rs1, + &(self->soft_rs1), + "_sfp_update_attr_soft_rs1", + show_err); +} + + +int +_sfp_is_diag_support(struct transvr_obj_s *self){ + + uint8_t bit_mask = 0xC0; /* 1100 0000 */ + uint8_t en_val = 0x40; /* 0100 0000 */ + uint8_t checkval = (self->diag_type & bit_mask); + + if (checkval == en_val) { + return 1; + } + return 0; +} + + +static int +_sfp_update_attr_curr_temp(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_temp, + self->eeprom_map_p->page_temp, + self->eeprom_map_p->offset_temp, + self->eeprom_map_p->length_temp, + self->curr_temp, + "_sfp_update_attr_curr_temp", + show_err); +} + + +static int +_sfp_update_attr_curr_voltage(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_voltage, + self->eeprom_map_p->page_voltage, + self->eeprom_map_p->offset_voltage, + self->eeprom_map_p->length_voltage, + self->curr_voltage, + "_sfp_update_attr_curr_voltage", + show_err); +} + + +static int +_sfp_update_attr_curr_tx_bias(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_bias, + self->eeprom_map_p->page_tx_bias, + self->eeprom_map_p->offset_tx_bias, + self->eeprom_map_p->length_tx_bias, + self->curr_tx_bias, + "_sfp_update_attr_curr_tx_bias", + show_err); +} + + +static int +_sfp_update_attr_curr_tx_power(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_power, + self->eeprom_map_p->page_tx_power, + self->eeprom_map_p->offset_tx_power, + self->eeprom_map_p->length_tx_power, + self->curr_tx_power, + "_sfp_update_attr_curr_tx_power", + show_err); +} + + +static int +_sfp_update_attr_curr_rx_power(struct transvr_obj_s *self, + int show_err){ + + if (!(_sfp_is_diag_support(self))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_power, + self->eeprom_map_p->page_rx_power, + self->eeprom_map_p->offset_rx_power, + self->eeprom_map_p->length_rx_power, + self->curr_rx_power, + "_sfp_update_attr_curr_rx_power", + show_err); +} + + +static int +_sfp_update_attr_rx_em(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_em, + self->eeprom_map_p->page_rx_em, + self->eeprom_map_p->offset_rx_em, + self->eeprom_map_p->length_rx_em, + self->rx_em, + "_sfp_update_attr_rx_em", + show_err); +} + + +static int +_sfp_update_attr_tx_eq(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_eq, + self->eeprom_map_p->page_tx_eq, + self->eeprom_map_p->offset_tx_eq, + self->eeprom_map_p->length_tx_eq, + self->tx_eq, + "_sfp_update_attr_tx_eq", + show_err); +} + + +static int +_qsfp_update_attr_cdr(struct transvr_obj_s *self, + int show_err){ + if (self->type != TRANSVR_TYPE_QSFP_28){ + self->cdr = DEBUG_TRANSVR_HEX_VAL; + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_cdr, + self->eeprom_map_p->page_cdr, + self->eeprom_map_p->offset_cdr, + self->eeprom_map_p->length_cdr, + &(self->cdr), + "_common_update_attr_cdr", + show_err); +} + + +static int +_qsfg_update_attr_extbr(struct transvr_obj_s *self, + int show_err) { + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_extbr, + self->eeprom_map_p->page_extbr, + self->eeprom_map_p->offset_extbr, + self->eeprom_map_p->length_extbr, + &(self->extbr), + "_common_update_attr_extbr", + show_err); +} + + +static int +_qsfp_is_diag_support(struct transvr_obj_s *self, + int diag_type) { + /* Input Parm: diag_type + * => 1 : temperature + * => 2 : voltage + * => 3 : tx relate + * => 4 : rx relate + */ + uint8_t mask_b2 = 0x04; /* 0000 0100 */ + uint8_t mask_b3 = 0x08; /* 0000 1000 */ + + switch (diag_type) { + case 1: /* temperature */ + case 2: /* voltage */ + /* Direct access target, because of spec not defined */ + return 1; + case 3: + case 4: + /* [Note] + * Due to lot of transceiver vendor defined it not rigorously and + * consider of general support, we seem it as supported if there + * are bit-2 OR bit-3 defined by transceiver vendor. + */ + if ( ((self->diag_type & mask_b2) == mask_b2 ) || + ((self->diag_type & mask_b3) == mask_b3 ) ){ + return 1; + } + return 0; + default: + SWPS_INFO("%s: undefined diag_type:%d\n", + __func__, diag_type); + break; + } + return 0; +} + + +int +_qsfp_is_implement_tx_disable(struct transvr_obj_s *self) { + /* + * 00h / Byte-195 / Bit-4 + */ + int byte = 2; + int bit = 4; + return _common_get_option_value(self, byte, bit); +} + + +int +_qsfp_is_implement_tx_fault(struct transvr_obj_s *self) { + /* + * 00h / Byte-195 / Bit-3 + */ + int byte = 2; + int bit = 3; + return _common_get_option_value(self, byte, bit); +} + + +static int +_qsfp_update_attr_curr_temp(struct transvr_obj_s *self, + int show_err){ + int diag_type = 1; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_temp, + self->eeprom_map_p->page_temp, + self->eeprom_map_p->offset_temp, + self->eeprom_map_p->length_temp, + self->curr_temp, + "_qsfp_update_attr_curr_temp", + show_err); +} + + +static int +_qsfp_update_attr_curr_voltage(struct transvr_obj_s *self, + int show_err){ + int diag_type = 2; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_voltage, + self->eeprom_map_p->page_voltage, + self->eeprom_map_p->offset_voltage, + self->eeprom_map_p->length_voltage, + self->curr_voltage, + "_qsfp_update_attr_curr_voltage", + show_err); +} + + +static int +_qsfp_update_attr_curr_tx_bias(struct transvr_obj_s *self, + int show_err){ + int diag_type = 3; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_bias, + self->eeprom_map_p->page_tx_bias, + self->eeprom_map_p->offset_tx_bias, + self->eeprom_map_p->length_tx_bias, + self->curr_tx_bias, + "_qsfp_update_attr_curr_tx_bias", + show_err); +} + + +static int +_qsfp_update_attr_curr_tx_power(struct transvr_obj_s *self, + int show_err){ + int diag_type = 3; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_power, + self->eeprom_map_p->page_tx_power, + self->eeprom_map_p->offset_tx_power, + self->eeprom_map_p->length_tx_power, + self->curr_tx_power, + "_qsfp_update_attr_curr_tx_power", + show_err); +} + + +static int +_qsfp_update_attr_curr_rx_power(struct transvr_obj_s *self, + int show_err){ + int diag_type = 4; + + if (!(_qsfp_is_diag_support(self, diag_type))) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_power, + self->eeprom_map_p->page_rx_power, + self->eeprom_map_p->offset_rx_power, + self->eeprom_map_p->length_rx_power, + self->curr_rx_power, + "_qsfp_update_attr_curr_rx_power", + show_err); +} + + +static int +_qsfp_update_attr_soft_rx_los(struct transvr_obj_s *self, + int show_err){ + + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_los, + self->eeprom_map_p->page_rx_los, + self->eeprom_map_p->offset_rx_los, + self->eeprom_map_p->length_rx_los, + &(self->rx_los), + "_qsfp_update_attr_soft_rx_los", + show_err); +} + + +static int +_qsfp_update_attr_soft_tx_disable(struct transvr_obj_s *self, + int show_err){ + + if (!_qsfp_is_implement_tx_disable(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + self->eeprom_map_p->length_tx_disable, + &(self->tx_disable), + "_qsfp_update_attr_soft_tx_disable", + show_err); +} + + +static int +_qsfp_update_attr_soft_tx_fault(struct transvr_obj_s *self, + int show_err){ + + if (!_qsfp_is_implement_tx_fault(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_fault, + self->eeprom_map_p->page_tx_fault, + self->eeprom_map_p->offset_tx_fault, + self->eeprom_map_p->length_tx_fault, + &(self->tx_fault), + "_qsfp_update_attr_soft_tx_fault", + show_err); +} + + +static int +_qsfp_update_attr_tx_eq(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_eq, + self->eeprom_map_p->page_tx_eq, + self->eeprom_map_p->offset_tx_eq, + self->eeprom_map_p->length_tx_eq, + self->tx_eq, + "_qsfp_update_attr_tx_eq", + show_err); +} + + +static int +_qsfp_update_attr_rx_am(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_am, + self->eeprom_map_p->page_rx_am, + self->eeprom_map_p->offset_rx_am, + self->eeprom_map_p->length_rx_am, + self->rx_am, + "_qsfp_update_attr_rx_am", + show_err); +} + + +static int +_qsfp_update_attr_rx_em(struct transvr_obj_s *self, + int show_err){ + + if (!_is_transvr_support_ctle(self)) { + return ERR_TRANSVR_NOTSUPPORT; + } + return _common_update_uint8_attr(self, + self->eeprom_map_p->addr_rx_em, + self->eeprom_map_p->page_rx_em, + self->eeprom_map_p->offset_rx_em, + self->eeprom_map_p->length_rx_em, + self->rx_em, + "_qsfp_update_attr_rx_em", + show_err); +} + + +int +_common_update_attr_all(struct transvr_obj_s *self, + int show_err){ + + char *err_str = "err"; + + if (_common_update_attr_id(self, show_err) < 0) { + err_str = "_common_update_attr_id"; + goto err_common_update_attr_all; + } + if (_common_update_attr_extended_id(self, show_err) < 0) { + err_str = "_common_update_attr_extended_id"; + goto err_common_update_attr_all; + } + if (_common_update_attr_connector(self, show_err) < 0) { + err_str = "_common_update_attr_connector"; + goto err_common_update_attr_all; + } + if (_common_update_attr_transvr_comp(self, show_err) < 0) { + err_str = "_common_update_attr_transvr_comp"; + goto err_common_update_attr_all; + } + if (_common_update_attr_transvr_comp_ext(self, show_err) < 0) { + err_str = "_common_update_attr_transvr_comp_ext"; + goto err_common_update_attr_all; + } + if (_common_update_attr_vendor_name(self, show_err) < 0) { + err_str = "_common_update_attr_vendor_name"; + goto err_common_update_attr_all; + } + if (_common_update_attr_vendor_pn(self, show_err) < 0) { + err_str = "_common_update_attr_vendor_pn"; + goto err_common_update_attr_all; + } + if (_common_update_attr_vendor_rev(self, show_err) < 0) { + err_str = "_common_update_attr_vendor_rev"; + goto err_common_update_attr_all; + } + if (_common_update_attr_vendor_sn(self, show_err) < 0) { + err_str = "_common_update_attr_vendor_sn"; + goto err_common_update_attr_all; + } + if (_common_update_attr_br(self, show_err) < 0) { + err_str = "_common_update_attr_br"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_smf(self, show_err) < 0) { + err_str = "_common_update_attr_len_smf"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_om1(self, show_err) < 0) { + err_str = "_common_update_attr_len_om1"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_om2(self, show_err) < 0) { + err_str = "_common_update_attr_len_om2"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_om3(self, show_err) < 0) { + err_str = "_common_update_attr_len_om3"; + goto err_common_update_attr_all; + } + if (_common_update_attr_len_om4(self, show_err) < 0) { + err_str = "_common_update_attr_len_om4"; + goto err_common_update_attr_all; + } + if (_common_update_attr_option(self, show_err) < 0) { + err_str = "_common_update_attr_option"; + goto err_common_update_attr_all; + } + if (_common_update_attr_comp_rev(self, show_err) < 0) { + err_str = "_common_update_attr_comp_rev"; + goto err_common_update_attr_all; + } + if (_common_update_attr_diag_type(self, show_err) < 0) { + err_str = "_common_update_attr_diag_type"; + goto err_common_update_attr_all; + } + if (_common_update_attr_wavelength(self, show_err) < 0) { + err_str = "_common_update_attr_wavelength"; + goto err_common_update_attr_all; + } + return 0; + +err_common_update_attr_all: + if (show_err){ + SWPS_INFO("%s: fail at:%s :%s\n", __func__, err_str, self->swp_name); + } + return -1; +} + + +int +_sfp_update_attr_all(struct transvr_obj_s *self, + int show_err){ + + char *err_str = DEBUG_TRANSVR_STR_VAL; + + if (_common_update_attr_all(self, show_err) < 0){ + err_str = "_common_update_attr_all"; + goto err_sfp_update_attr_all; + } + if (_sfp_update_attr_len_sm(self, show_err) < 0) { + err_str = "_sfp_update_attr_len_sm"; + goto err_sfp_update_attr_all; + } + if (_sfp_update_attr_rate_id(self, show_err) < 0) { + err_str = "_sfp_update_attr_rate_id"; + goto err_sfp_update_attr_all; + } + if ((self->rate_id) > 0) { + if (_sfp_update_attr_soft_rs0(self, show_err) < 0) { + err_str = "_sfp_update_attr_soft_rs0"; + goto err_sfp_update_attr_all; + } + if (_sfp_update_attr_soft_rs1(self, show_err) < 0) { + err_str = "_sfp_update_attr_soft_rs1"; + goto err_sfp_update_attr_all; + } + } + return 0; + +err_sfp_update_attr_all: + if (show_err){ + SWPS_INFO("%s: fail at:%s :%s\n", __func__, err_str, self->swp_name); + } + return -1; +} + + +int +_qsfp_update_attr_all(struct transvr_obj_s *self, + int show_err){ + + char *err_str = DEBUG_TRANSVR_STR_VAL; + + if (_common_update_attr_all(self, show_err) < 0){ + err_str = "_common_update_attr_all"; + goto err_qsfp_update_attr_all; + } + if (_qsfg_update_attr_extbr(self, show_err) < 0) { + err_str = "_qsfg_update_attr_extbr"; + goto err_qsfp_update_attr_all; + } + if (self->type == TRANSVR_TYPE_QSFP_28) { + if (_qsfp_update_attr_cdr(self, 1) < 0) { + err_str = "_qsfp_update_attr_cdr"; + goto err_qsfp_update_attr_all; + } + } + return 0; + +err_qsfp_update_attr_all: + if (show_err){ + SWPS_INFO("%s: fail at:%s :%s\n", __func__, err_str, self->swp_name); + } + return -1; +} + + +/* ========== Object functions for common type ========== + */ +int +_common_count_temp(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + int sign = 0; + int high = 0; + int low = 0; + int lmax = 8; + + /* Count high */ + sign = get_bit(high_byte,7); + SWP_BIT_CLEAR(high_byte, 7); + high = (int)high_byte; + if (sign == 1) { + high = 0 - high; + } + /* Count low */ + low = (get_bit(low_byte, 7) * 500); + low += (get_bit(low_byte, 6) * 250); + low += (get_bit(low_byte, 5) * 125); + low += (get_bit(low_byte, 4) * 62); + low = (low / 100); + /* Integrate High and Low */ + return snprintf(buf_p, lmax, "%d.%d\n", high, low); +} + + +int +_common_count_voltage(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + /* [Note]: + * Internally measured transceiver supply voltage. Represented + * as a 16 bit unsigned integer with the voltage defined as the + * full 16 bit value (0-65535) with LSB equal to 100 uVolt, + * yielding a total range of 0 to +6.55 Volts. Practical + * considerations to be defined by transceiver manufacturer will + * tend to limit the actual bounds of the supply voltage measurement. + * Accuracy is vendor specific but must be better than 3% of the + * manufacturer's nominal value over specified operating temperature + * and voltage. Note that in some transceivers, transmitter supply + * voltage and receiver supply voltage are isolated. In that case, + * only one supply is monitored. Refer to the device specification + * for more detail. + */ + int total = 0; + int lmax = 8; + int val_i = 0; + int val_f = 0; + /* unit: 100 uV (1mV=1000uV) */ + total = transform_word_to_int(high_byte, low_byte); + val_i = ((total/10) / 1000); + val_f = ((total/10) - (val_i*1000)); + /* Return Unit: 1 Volt */ + return snprintf(buf_p, lmax, "%d.%03d\n", val_i, val_f); +} + + +int +_common_count_tx_bias(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + /* [Note] + * Measured TX bias current in uA. Represented as a 16 bit unsigned + * integer with the current defined as the full 16 bit value (0-65535) + * with LSB equal to 2 uA, yielding a total range of 0 to 131 mA. + * Accuracy is vendor specific but must be better than 10% of the + * manufacturer's nominal value over specified operating temperature + * and voltage. + */ + int total = 0; + int lmax = 8; + int val_i = 0; + int val_f = 0; + /* unit: 2 uA (1mA=1000uA) */ + total = transform_word_to_int(high_byte, low_byte); + val_i = ((total*2) / 1000); + val_f = (((total*2) - (val_i*1000)) / 100); + /* Return Unit: 1 mA */ + return snprintf(buf_p, lmax, "%d.%01d\n", val_i, val_f); +} + + +int +_common_count_tx_power(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + /* [Note] + * Measured TX output power in mW. Represented as a 16 bit unsigned + * integer with the power defined as the full 16 bit value (0-65535) + * with LSB equal to 0.1 uW, yielding a total range of 0 to 6.5535 mW + * (~ -40 to +8.2 dBm). Data is assumed to be based on measurement of + * laser monitor photodiode current. It is factory calibrated to absolute + * units using the most representative fiber output type. Accuracy is + * vendor specific but must be better than 3dB over specified temperature + * and voltage. Data is not valid when the transmitter is disabled. + */ + int total = 0; + int lmax = 8; + int val_i = 0; + int val_f = 0; + /* unit: 0.1 uW (1mW=1000uW) */ + total = transform_word_to_int(high_byte, low_byte); + val_i = ((total/10) / 1000); + val_f = ((total/10) - (val_i*1000)); + /* Return Unit: 1 mW */ + return snprintf(buf_p, lmax, "%d.%03d\n", val_i, val_f); +} + + +int +_common_count_rx_power(uint8_t high_byte, + uint8_t low_byte, + char *buf_p) { + /* [Note] + * Measured RX received optical power in mW. Value can represent either + * average received power or OMA depending upon how bit 3 of byte 92 (A0h) + * is set. Represented as a 16 bit unsigned integer with the power defined + * as the full 16 bit value (0-65535) with LSB equal to 0.1 uW, yielding a + * total range of 0 to 6.5535 mW (~ -40 to +8.2 dBm). Absolute accuracy is + * dependent upon the exact optical wavelength. For the vendor specified + * wavelength, accuracy shall be better than 3dB over specified temperature + * and voltage. + */ + int total = 0; + int lmax = 8; + int val_i = 0; + int val_f = 0; + /* unit: 0.1 uW (1mW=1000uW) */ + total = transform_word_to_int(high_byte, low_byte); + val_i = ((total/10) / 1000); + val_f = ((total/10) - (val_i*1000)); + /* Return Unit: 1 mW */ + return snprintf(buf_p, lmax, "%d.%03d\n", val_i, val_f); +} + + +int +_common_count_wavelength(struct transvr_obj_s *self, + uint8_t high_byte, + uint8_t low_byte) { + /* [Note] + * SFP : uint 1 um. + * QSFP: unit 0.05 um. + */ + int total = 0; + + total = transform_word_to_int(high_byte, low_byte); + switch (self->type) { + case TRANSVR_TYPE_SFP: + return total; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + return (total/20); + + default: + break; + } + return ERR_TRANSVR_UNDEFINED; +} + + +int +common_get_id(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_id, + "common_get_id"); + if (err_code < 0){ + return err_code; + } + /* Transform to INT to show error case */ + return (int)self->id; +} + + +int +common_get_ext_id(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_extended_id, + "common_get_ext_id"); + if (err_code < 0){ + return err_code; + } + /* Transform to INT to show error case */ + return (int)self->ext_id; +} + + +int +common_get_connector(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_connector, + "common_get_connector"); + if (err_code < 0){ + return err_code; + } + /* Transform to INT to show error case */ + return (int)self->connector; +} + + +int +common_get_vendor_name(struct transvr_obj_s *self, char *buf){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_name); + } + err = _check_by_mode(self, + &_common_update_attr_vendor_name, + "common_get_vendor_name"); + memset(buf, 0, LEN_TRANSVR_M_STR); + if (err < 0){ + return snprintf(buf, LEN_TRANSVR_M_STR, "%d\n", err); + } + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_name); +} + + +int +common_get_vendor_pn(struct transvr_obj_s *self, char *buf) { + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_pn); + } + err = _check_by_mode(self, + &_common_update_attr_vendor_pn, + "common_get_vendor_pn"); + memset(buf, 0, LEN_TRANSVR_M_STR); + if (err < 0){ + return snprintf(buf, LEN_TRANSVR_M_STR, "%d\n", err); + } + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_pn); +} + + +int +common_get_vendor_rev(struct transvr_obj_s *self, char *buf) { + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_rev); + } + err = _check_by_mode(self, + &_common_update_attr_vendor_rev, + "common_get_vendor_rev"); + memset(buf, 0, LEN_TRANSVR_M_STR); + if (err < 0){ + return snprintf(buf, LEN_TRANSVR_M_STR, "%d\n", err); + } + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_rev); +} + + +int +common_get_vendor_sn(struct transvr_obj_s *self, char *buf) { + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_sn); + } + err = _check_by_mode(self, + &_common_update_attr_vendor_sn, + "common_get_vendor_sn"); + memset(buf, 0, LEN_TRANSVR_M_STR); + if (err < 0){ + return snprintf(buf, LEN_TRANSVR_M_STR, "%d\n", err); + } + return snprintf(buf, LEN_TRANSVR_M_STR, "%s\n", self->vendor_sn); +} + + +int +common_get_br(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return (int)self->br; + } + err = _check_by_mode(self, + &_common_update_attr_br, + "common_get_br"); + if (err < 0){ + return err; + } + /* Transform to INT to show error case */ + return (int)self->br; +} + + +int +common_get_len_smf(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_smf; + } + err = _check_by_mode(self, + &_common_update_attr_len_smf, + "common_get_len_smf"); + if (err < 0){ + return err; + } + return self->len_smf; +} + + +int +common_get_len_om1(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_om1; + } + err = _check_by_mode(self, + &_common_update_attr_len_om1, + "common_get_len_om1"); + if (err < 0){ + return err; + } + return self->len_om1; +} + + +int +common_get_len_om2(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_om2; + } + + err = _check_by_mode(self, + &_common_update_attr_len_om2, + "common_get_len_om2"); + if (err < 0){ + return err; + } + return self->len_om2; +} + + +int +common_get_len_om3(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_om3; + } + + err = _check_by_mode(self, + &_common_update_attr_len_om3, + "common_get_len_om3"); + if (err < 0){ + return err; + } + return self->len_om3; +} + + +int +common_get_len_om4(struct transvr_obj_s *self){ + + int err = DEBUG_TRANSVR_INT_VAL; + + if (self->state == STATE_TRANSVR_CONNECTED && + self->mode == TRANSVR_MODE_POLLING && + TRANSVR_INFO_CACHE_ENABLE) { + return self->len_om4; + } + err = _check_by_mode(self, + &_common_update_attr_len_om4, + "common_get_len_om4"); + if (err < 0){ + return err; + } + return self->len_om4; +} + + +int +common_get_comp_extended(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp_ext, + "common_get_comp_extended"); + if (err_code < 0){ + return err_code; + } + return self->transvr_comp_ext; +} + + +int +common_get_comp_rev(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_comp_rev, + "common_get_comp_rev"); + if (err_code < 0){ + return err_code; + } + return self->comp_rev; +} + + +int +common_get_info(struct transvr_obj_s *self){ + + if (self->state != STATE_TRANSVR_CONNECTED) { + return self->state; + } + return self->info; +} + + +int +_common_get_if_lane(struct transvr_obj_s *self, + char *result){ + int i = 0; + int tmp_val = 0; + char tmp_str[LEN_TRANSVR_M_STR] = DEBUG_TRANSVR_STR_VAL; + + memset(result, 0, LEN_TRANSVR_M_STR); + + for (i=0; ilane_id); i++) { + tmp_val = self->lane_id[i]; + if (tmp_val < 1) { + break; + } + memset(tmp_str, 0, LEN_TRANSVR_M_STR); + if (i == 0) { + snprintf(tmp_str, LEN_TRANSVR_M_STR, "%d", tmp_val); + } else { + snprintf(tmp_str, LEN_TRANSVR_M_STR, ",%d", tmp_val); + } + strncat(result, tmp_str, LEN_TRANSVR_M_STR); + } + if (i == 0) { + return EVENT_TRANSVR_TASK_FAIL; + } + return 0; +} + + +int +common_get_if_lane(struct transvr_obj_s *self, + char *buf_p){ + + char tmp_str[LEN_TRANSVR_M_STR] = DEBUG_TRANSVR_STR_VAL; + + if (self->ioexp_obj_p->state != STATE_IOEXP_NORMAL) { + return snprintf(buf_p, LEN_TRANSVR_M_STR, "%d\n", ERR_TRANSVR_ABNORMAL); + } + if (_common_get_if_lane(self, tmp_str) < 0) { + return snprintf(buf_p, LEN_TRANSVR_M_STR, "%d\n" ,ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, LEN_TRANSVR_M_STR, "%s\n" ,tmp_str); +} + + +int +sfp_get_len_sm(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_sfp_update_attr_len_sm, + "sfp_get_len_sm"); + if (err_code < 0){ + return err_code; + } + return self->len_sm; +} + + +int +sfp_get_rate_id(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_sfp_update_attr_rate_id, + "sfp_get_rate_id"); + if (err_code < 0){ + return err_code; + } + return self->rate_id; +} + + +int +sfp_get_soft_rs0(struct transvr_obj_s *self){ + /* Note: + * SFP Soft Rate_Select Select [aka. "RS(0)"] address + * A2h, offset: 110, bit 3 (begin form 0) + */ + int err_code = DEBUG_TRANSVR_INT_VAL; + int bit_shift = 3; + uint8_t result = 0x00; + uint8_t bitmask = (1 << bit_shift); + + /* Check rate identifier is supported */ + err_code = self->get_rate_id(self); + if (err_code <= 0) { + return ERR_TRANSVR_NOTSUPPORT; + } + /* Update and check */ + err_code = _check_by_mode(self, + &_sfp_update_attr_soft_rs0, + "sfp_get_soft_rs0"); + if (err_code <0){ + return err_code; + } + result = (self->soft_rs0 & bitmask); + if (result == bitmask) { + return 1; + } + if (result == 0) { + return 0; + } + return ERR_TRANSVR_UNEXCPT; +} + + +int +sfp_get_soft_rs1(struct transvr_obj_s *self){ + /* Note: + * SFP Soft RS(1) Select address + * A2h, offset: 118, bit 3 (begin form 0) + */ + int err_code = DEBUG_TRANSVR_INT_VAL; + int bit_shift = 3; + uint8_t result = 0x00; + uint8_t bitmask = (1 << bit_shift); + + /* Check rate identifier is supported */ + err_code = self->get_rate_id(self); + if (err_code <= 0) { + return ERR_TRANSVR_NOTSUPPORT; + } + /* Update and check */ + err_code = _check_by_mode(self, + &_sfp_update_attr_soft_rs1, + "sfp_get_soft_rs1"); + if (err_code <0){ + return err_code; + } + result = (self->soft_rs1 & bitmask); + if (result == bitmask) { + return 1; + } + if (result == 0) { + return 0; + } + return ERR_TRANSVR_UNEXCPT; +} + + +int +sfp_get_transvr_temp(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_temp, + "sfp_get_transvr_temp"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_temp[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return _common_count_temp(self->curr_temp[0], + self->curr_temp[1], + buf_p); +} + + +int +sfp_get_transvr_voltage(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_voltage, + "sfp_get_transvr_voltage"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_voltage[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 Volt */ + return _common_count_voltage(self->curr_voltage[0], + self->curr_voltage[1], + buf_p); +} + + +int +sfp_get_transvr_tx_bias(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_tx_bias, + "sfp_get_transvr_tx_bias"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_bias[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mA */ + return _common_count_tx_bias(self->curr_tx_bias[0], + self->curr_tx_bias[1], + buf_p); +} + + +int +sfp_get_transvr_tx_power(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_tx_power, + "sfp_get_transvr_tx_power"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_bias[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mW */ + return _common_count_tx_power(self->curr_tx_power[0], + self->curr_tx_power[1], + buf_p); +} + + +int +sfp_get_transvr_rx_power(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_sfp_update_attr_curr_rx_power, + "sfp_get_transvr_rx_power"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_bias[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mW */ + return _common_count_rx_power(self->curr_rx_power[0], + self->curr_rx_power[0], + buf_p); +} + + +int +sfp_get_transvr_rx_em(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_sfp_update_attr_rx_em, + "sfp_get_transvr_rx_em"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->tx_eq[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x\n", self->rx_em[0]); +} + + +int +sfp_get_transvr_tx_eq(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_sfp_update_attr_tx_eq, + "sfp_get_transvr_tx_eq"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->tx_eq[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x\n", self->tx_eq[0]); +} + + +int +_sfp_get_comp_extended(struct transvr_obj_s *self) { + /* Address: A0h / 36 + * Reference: SFF-8024 TABLE 4-4 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->transvr_comp_ext); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +__sfp_get_comp_attr(struct transvr_obj_s *self, + int array_offset) { + /* SFP Specification Compliance: A0h / 3-10 + * transvr_comp[0-7] = 3 - 10 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->transvr_comp[array_offset]); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +_sfp_get_comp_10g_eth_comp(struct transvr_obj_s *self) { + /* transvr_comp[0] = address A0h / 3 + * + * 3 7: 10G Base-ER + * 3 6: 10GBASE-LRM + * 3 5: 10GBASE-LR + * 3 4: 10GBASE-SR + */ + int bitmask = 0xf0; /* 11110000 */ + return (__sfp_get_comp_attr(self, 0) & bitmask); +} + + +int +_sfp_get_comp_1g_eth_comp(struct transvr_obj_s *self) { + /* transvr_comp[3] = address A0h / 6 + * + * 6 7: BASE-PX *3 + * 6 6: BASE-BX10 *3 + * 6 5: 100BASE-FX + * 6 4: 100BASE-LX/LX10 + * 6 3: 1000BASE-T + * 6 2: 1000BASE-CX + * 6 1: 1000BASE-LX *3 + * 6 0: 1000BASE-SX + */ + return __sfp_get_comp_attr(self, 3); +} + + +int +_sfp_get_cable_tech(struct transvr_obj_s *self) { + /* transvr_comp[5] = address A0h / 8 + * + * 8 3: Active Cable *8 + * 8 2: Passive Cable *8 + */ + int bitmask = 0x0c; /* 00001100 */ + return (__sfp_get_comp_attr(self, 5) & bitmask); +} + + +int +sfp_get_comp_eth_1(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp, + "sfp_get_comp_eth_1"); + if (err_code < 0){ + return err_code; + } + return _sfp_get_comp_1g_eth_comp(self); +} + + +int +sfp_get_comp_eth_10(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp, + "sfp_get_comp_eth_10"); + if (err_code < 0){ + return err_code; + } + return _sfp_get_comp_10g_eth_comp(self); +} + + +int +_sfp_get_connector_type(struct transvr_obj_s *self) { + /* Address: A0h / 2 + * Reference: SFF-8024 TABLE 4-3 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->connector); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +sfp_get_wavelength(struct transvr_obj_s *self, + char *buf_p) { + /* [Note] Optical and Cable Variants Specification Compliance (SFF-8472) + * [Addr] A0h, Bytes 60-61 + * [Note] For optical variants, as defined by having zero's in A0h Byte 8 + * bits 2 and 3, Bytes 60 and 61 denote nominal transmitter output + * wavelength at room temperature. 16 bit value with byte 60 as high + * order byte and byte 61 as low order byte. The laser wavelength is + * equal to the 16 bit integer value in nm. This field allows the user + * to read the laser wavelength directly, so it is not necessary to + * infer it from the Transceiver Codes A0h Bytes 3 to 10 (see Table + * 5-3). This also allows specification of wavelengths not covered + * in the Transceiver Codes, such as those used in coarse WDM systems. + * + * For passive and active cable variants, a value of 00h for both A0h + * Byte 60 and Byte 61 denotes laser wavelength or cable specification + * compliance is unspecified. + */ + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_common_update_attr_wavelength, + "common_get_wavelength"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->wavelength[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* unit: 1 um */ + return snprintf(buf_p, lmax, "%d\n", + _common_count_wavelength(self, + self->wavelength[0], + self->wavelength[1])); +} + + +int +sfp_get_1g_rj45_extphy_offset(struct transvr_obj_s *self, char *buf) { + + if (self->state != STATE_TRANSVR_CONNECTED) { + return ERR_TRANSVR_UNPLUGGED; + } + if ((self->info != TRANSVR_CLASS_BASE_T_1000) && + (self->info != TRANSVR_CLASS_BASE_T_1000_up) ){ + return ERR_TRANSVR_NOTSUPPORT; + } + return snprintf(buf, LEN_TRANSVR_S_STR, "0x%02x\n", self->extphy_offset); +} + + +int +sfp_get_1g_rj45_extphy_reg(struct transvr_obj_s *self, char *buf) { + + int i = 0; + int ret = 0; + int retry = 3; + int delay = 200; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return ERR_TRANSVR_UNPLUGGED; + } + if ((self->info != TRANSVR_CLASS_BASE_T_1000) && + (self->info != TRANSVR_CLASS_BASE_T_1000_up) ){ + return ERR_TRANSVR_NOTSUPPORT; + } + if (_common_setup_page(self, VAL_TRANSVR_EXTPHY_ADDR_56, + -1, self->extphy_offset, 1, 0) < 0) { + return -EIO; + } + for (i=0; ii2c_client_p, self->extphy_offset); + if (ret >=0) { + goto ok_sfp_get_1g_rj45_extphy_reg; + } + msleep(delay); + } + SWPS_INFO("%s: retry:%d fail :%s :0x%02x\n", + __func__, retry, self->swp_name, self->extphy_offset); + return -EIO; + +ok_sfp_get_1g_rj45_extphy_reg: + ret = ((ret & 0x00ff) << 8) | ((ret & 0xff00) >> 8); + return snprintf(buf, LEN_TRANSVR_S_STR, "0x%04x\n", ret); +} + + +int +__qsfp_get_power_cls(struct transvr_obj_s *self, + int direct_access){ + + int err_code; + uint8_t detect_val; + + /* Detect and Update power class attribute */ + if (direct_access){ + err_code = _check_by_mode(self, + &_common_update_attr_extended_id, + "__qsfp_get_power_cls"); + } else { + err_code = self->ext_id; + } + if (err_code <0){ + return err_code; + } + if (err_code == DEBUG_TRANSVR_HEX_VAL){ + return ERR_TRANSVR_UPDATE_FAIL; + } + /* Clean data */ + detect_val = self->ext_id; + SWP_BIT_CLEAR(detect_val, 2); /* Bit2: CDR RX present */ + SWP_BIT_CLEAR(detect_val, 3); /* Bit3: CDR TX present */ + SWP_BIT_CLEAR(detect_val, 4); /* Bit4: CLEI present */ + SWP_BIT_CLEAR(detect_val, 5); /* Bit5: reserved */ + /* Identify power class */ + switch (detect_val) { + case 0: /* Class_1: 00000000 */ + return 1; + case 64: /* Class_2: 01000000 */ + return 2; + case 128: /* Class_3: 10000000 */ + return 3; + case 192: /* Class_4: 11000000 */ + return 4; + case 1: /* Class_5: 00000001 */ + case 193: /* Class_5: 11000001 */ + return 5; + case 2: /* Class_6: 00000010 */ + case 194: /* Class_6: 11000010 */ + return 6; + case 3: /* Class_7: 00000011 */ + case 195: /* Class_7: 11000011 */ + return 7; + default: + break; + } + SWPS_INFO("%s: Detect undefined power class:%d\n", __func__, detect_val); + return ERR_TRANSVR_UNDEFINED; +} + + +int +qsfp_get_power_cls(struct transvr_obj_s *self) { + return __qsfp_get_power_cls(self, 1); +} + + +int +__qsfp_get_cdr_present(struct transvr_obj_s *self, + int direct_access){ + + int retval; + int BIT_SHIFT = 2; + int BIT_MASK = 0x3; + + /* Detect and Update power class attribute */ + if (direct_access) { + retval = _check_by_mode(self, + &_common_update_attr_extended_id, + "__qsfp_get_cdr_present"); + if (retval < 0){ + return retval; + } + } + retval = self->ext_id; + if (retval == DEBUG_TRANSVR_HEX_VAL){ + return ERR_TRANSVR_UPDATE_FAIL; + } + /* Clean data and return */ + return (int)(retval >> BIT_SHIFT & BIT_MASK); +} + + +int +qsfp_get_cdr_present(struct transvr_obj_s *self) { + return __qsfp_get_cdr_present(self, 1); +} + + +int +qsfp_get_cdr(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_qsfp_update_attr_cdr, + "qsfp_get_cdr"); + if (err_code <0){ + return err_code; + } + + return self->cdr; +} + + +int +__qsfp_get_comp_attr(struct transvr_obj_s *self, + int array_offset) { + /* QSFP Specification Compliance: 00h / 131-138 + * transvr_comp[0-7] = 131 - 138 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->transvr_comp[array_offset]); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +_qsfp_get_comp_10_40_100_ethernet(struct transvr_obj_s *self) { + /* transvr_comp[0] = address 00h / 131 + * + * 131 7: Extended: See section 6.3.23. The Extended Specification Compliance + * Codes are maintained in the Transceiver Management section of SFF- + * 8024. + * 131 6: 10GBASE-LRM + * 131 5: 10GBASE-LR + * 131 4: 10GBASE-SR + * 131 3: 40GBASE-CR4 + * 131 2: 40GBASE-SR4 + * 131 1: 40GBASE-LR4 + * 131 0: 40G Active Cable (XLPPI) + */ + return __qsfp_get_comp_attr(self, 0); +} + + +int +_qsfp_get_comp_sonet(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 132 7-3: Reserved + * 132 2: OC 48, long reach + * 132 1: OC 48, intermediate reach + * 132 0: OC 48 short reach + */ + return __qsfp_get_comp_attr(self, 1); +} + + +int +_qsfp_get_comp_sas_sata(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 133 7: SAS 24.0 Gb/s + * 133 6: SAS 12.0 Gb/s + * 133 5: SAS 6.0 Gb/s + * 133 4: SAS 3.0 Gb/s + * 133 3-0: Reserved + */ + return __qsfp_get_comp_attr(self, 2); +} + + +int +_qsfp_get_comp_ethernet(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 134 7-4: Reserved + * 134 3: 1000BASE-T + * 134 2: 1000BASE-CX + * 134 1: 1000BASE-LX + * 134 0: 1000BASE-SX + */ + return __qsfp_get_comp_attr(self, 3); +} + + +int +_qsfp_get_comp_fc_link_length(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 135 7: Very long distance (V) + * 135 6: Short distance (S) + * 135 5: Intermediate distance (I) + * 135 4: Long distance (L) + * 135 3: Medium (M) + */ + int mask = 0xFC; /* 11111100 */ + return (__qsfp_get_comp_attr(self, 4) & mask); +} + + +int +_qsfp_get_comp_fc_trans_tech(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 135 2: Reserved + * 135 1: Longwave laser (LC) + * 135 0: Electrical inter-enclosure (EL) + * + * 136 7: Electrical intra-enclosure + * 136 6: Shortwave laser w/o OFC (SN) + * 136 5: Shortwave laser w OFC (SL) + * 136 4: Longwave Laser (LL) + * 136 3-0: Reserved + * + * return value = [bit 8-15:addr 135][bit 0-7:addr 136] + */ + int mask_135 = 7; /* 00000111 */ + int val_135 = (__qsfp_get_comp_attr(self, 4) & mask_135); + int val_136 = __qsfp_get_comp_attr(self, 5); + return ((val_135 << 7) + val_136); +} + + +int +_qsfp_get_comp_fc_trans_media(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 137 7: Twin Axial Pair (TW) + * 137 6: Shielded Twisted Pair (TP) + * 137 5: Miniature Coax (MI) + * 137 4: Video Coax (TV) + * 137 3: Multi-mode 62.5 m (M6) + * 137 2: Multi-mode 50 m (M5) + * 137 1: Multi-mode 50 um (OM3) + * 137 0: Single Mode (SM) + */ + return __qsfp_get_comp_attr(self, 6); +} + + +int +_qsfp_get_comp_fc_speed(struct transvr_obj_s *self) { + /* transvr_comp[1] = address 00h / 132 + * + * 138 7: 1200 MBps (per channel) + * 138 6: 800 MBps + * 138 5: 1600 MBps (per channel) + * 138 4: 400 MBps + * 138 3: 3200 MBps (per channel) + * 138 2: 200 MBps + * 138 1: Extended: See section 6.3.23. The Extended Specification + * Compliance Codes are maintained in the Transceiver Management + * section of SFF-8024. + * 138 0: 100 MBps + */ + return __qsfp_get_comp_attr(self, 7); +} + + +int +_qsfp_get_comp_extended(struct transvr_obj_s *self) { + /* Address: 00h / 192 + * Reference: SFF-8024 TABLE 4-4 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->transvr_comp_ext); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +qsfp_get_comp_eth(struct transvr_obj_s *self){ + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp, + "qsfp_get_comp_eth"); + if (err_code < 0){ + return err_code; + } + return _qsfp_get_comp_ethernet(self); +} + + +int +qsfp_get_comp_10_40(struct transvr_obj_s *self) { + + int err_code = _check_by_mode(self, + &_common_update_attr_transvr_comp, + "qsfp_get_comp_10_40"); + if (err_code < 0){ + return err_code; + } + return _qsfp_get_comp_10_40_100_ethernet(self); +} + + +int +_qsfp_get_connector_type(struct transvr_obj_s *self) { + /* Address: 00h / 130 + * Reference: SFF-8024 TABLE 4-3 + */ + if ((self->state == STATE_TRANSVR_CONNECTED) || + (self->state == STATE_TRANSVR_INIT) ) { + return (int)(self->connector); + } + return ERR_TRANSVR_ABNORMAL; +} + + +int +qsfp_get_transvr_temp(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_temp, + "qsfp_get_transvr_temp"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_temp[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return _common_count_temp(self->curr_temp[0], + self->curr_temp[1], + buf_p); +} + + +int +qsfp_get_transvr_voltage(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_voltage, + "qsfp_get_transvr_voltage"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_voltage[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 Volt */ + return _common_count_voltage(self->curr_voltage[0], + self->curr_voltage[1], + buf_p); +} + + +int +qsfp_get_transvr_tx_eq(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_qsfp_update_attr_tx_eq, + "qsfp_get_transvr_tx_eq"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->tx_eq[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x%02x\n", + self->tx_eq[0], self->tx_eq[1]); +} + + +int +qsfp_get_transvr_rx_am(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_qsfp_update_attr_rx_am, + "qsfp_get_transvr_rx_am"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->rx_am[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x%02x\n", + self->rx_am[0], self->rx_am[1]); +} + + +int +qsfp_get_transvr_rx_em(struct transvr_obj_s *self, + char *buf_p) { + + int limt = 8; + int err = DEBUG_TRANSVR_INT_VAL; + + err = _check_by_mode(self, + &_qsfp_update_attr_rx_em, + "qsfp_get_transvr_rx_em"); + if (err < 0) { + return snprintf(buf_p, limt, "%d\n", err); + } + if ((self->rx_em[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, limt, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + return snprintf(buf_p, limt, "0x%02x%02x\n", + self->rx_em[0], self->rx_em[1]); +} + + +int +_qsfp_get_channel_diag(uint8_t *data_array, + int (*count_func)(uint8_t high_byte, uint8_t low_byte, char *buf_p), + char *ch_name, + char *result_p) { + int i, high, low; + int len_max = 128; + char ch_buf[4][16] = { DEBUG_TRANSVR_STR_VAL, + DEBUG_TRANSVR_STR_VAL, + DEBUG_TRANSVR_STR_VAL, + DEBUG_TRANSVR_STR_VAL }; + + for (i=0; i<4; i++) { + high = (i*2); + low = ((i*2) + 1); + count_func(data_array[high], data_array[low], ch_buf[i]); + } + return snprintf(result_p, len_max, + "%s-%d:%s%s-%d:%s%s-%d:%s%s-%d:%s", + ch_name, 1, ch_buf[0], + ch_name, 2, ch_buf[1], + ch_name, 3, ch_buf[2], + ch_name, 4, ch_buf[3]); +} + + +int +qsfp_get_soft_rx_los(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int mask = 0x0f; /* Bit 0 ~ Bit 3 */ + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_soft_rx_los, + "qsfp_get_soft_rx_los"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + return snprintf(buf_p, lmax, "0x%02x\n", (self->rx_los & mask)); +} + + +int +qsfp_get_soft_tx_disable(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int mask = 0x0f; /* Bit 0 ~ Bit 3 */ + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_soft_tx_disable, + "qsfp_get_soft_tx_disable"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + return snprintf(buf_p, lmax, "0x%02x\n", (self->tx_disable & mask)); +} + + +int +qsfp_get_soft_tx_fault(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int mask = 0x0f; /* Bit 0 ~ Bit 3 */ + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_soft_tx_fault, + "qsfp_get_soft_tx_fault"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + return snprintf(buf_p, lmax, "0x%02x\n", (self->tx_fault & mask)); +} + + +int +qsfp_get_auto_tx_disable(struct transvr_obj_s *self, + char *buf_p) { + + if (self->auto_tx_disable == VAL_TRANSVR_FUNCTION_DISABLE) { + return snprintf(buf_p, LEN_TRANSVR_S_STR, + "%d\n", ERR_TRANSVR_FUNC_DISABLE); + } + return snprintf(buf_p, LEN_TRANSVR_S_STR, + "0x%02x\n", self->auto_tx_disable); +} + + +int +qsfp_get_transvr_tx_bias(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *ch_name = "TX"; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_tx_bias, + "qsfp_get_transvr_tx_bias"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_bias[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mA */ + return _qsfp_get_channel_diag(self->curr_tx_bias, + _common_count_tx_bias, + ch_name, + buf_p); +} + + +int +qsfp_get_transvr_tx_power(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *ch_name = "TX"; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_tx_power, + "qsfp_get_transvr_tx_power"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_power[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mW */ + return _qsfp_get_channel_diag(self->curr_tx_power, + _common_count_tx_power, + ch_name, + buf_p); +} + + +int +qsfp_get_transvr_rx_power(struct transvr_obj_s *self, + char *buf_p) { + + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *ch_name = "RX"; + + err_code = _check_by_mode(self, + &_qsfp_update_attr_curr_rx_power, + "qsfp_get_transvr_rx_power"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->curr_tx_power[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* Return Unit: 1 mW */ + return _qsfp_get_channel_diag(self->curr_rx_power, + _common_count_rx_power, + ch_name, + buf_p); +} + + +int +qsfp_get_wavelength(struct transvr_obj_s *self, + char *buf_p) { + /* [Desc] Wavelength or Copper Cable Attenuation (SFF-8636) + * [Addr] 00h 186-187 + * [Note] + * For optical free side devices, this parameter identifies the nominal + * transmitter output wavelength at room temperature. This parameter is + * a 16-bit hex value with Byte 186 as high order byte and Byte 187 as + * low order byte. The laser wavelength is equal to the 16-bit integer value + * divided by 20 in nm (units of 0.05 nm). This resolution should be adequate + * to cover all relevant wavelengths yet provide enough resolution for all + * expected DWDM applications. For accurate representation of controlled + * wavelength applications, this value should represent the center of the + * guaranteed wavelength range. + * If the free side device is identified as copper cable these registers will + * be used to define the cable attenuation. An indication of 0 dB attenuation + * refers to the case where the attenuation is not known or is unavailable. + * Byte 186 (00-FFh) is the copper cable attenuation at 2.5 GHz in units of 1 dB. + * Byte 187 (00-FFh) is the copper cable attenuation at 5.0 GHz in units of 1 dB. + */ + int lmax = 8; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _check_by_mode(self, + &_common_update_attr_wavelength, + "common_get_wavelength"); + if (err_code < 0) { + return snprintf(buf_p, lmax, "%d\n", err_code); + } + if ((self->wavelength[0]) == DEBUG_TRANSVR_HEX_VAL) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_UPDATE_FAIL); + } + /* unit: 1 um */ + return snprintf(buf_p, lmax, "%d\n", + _common_count_wavelength(self, + self->wavelength[0], + self->wavelength[1])); +} + + +/* Public Function for Setup Features + */ +static int +__sfp_set_soft_rs(struct transvr_obj_s *self, + int input_val, + int address, + int page, + int offset, + int bit_shift, + uint8_t *attr_p, + char *caller, + int show_err) { + + int retval = ERR_TRANSVR_UNEXCPT; + int err_code = ERR_TRANSVR_UNEXCPT; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + uint8_t update_val = (*attr_p); + + switch (input_val) { + case 0: + SWP_BIT_CLEAR(update_val, bit_shift); + break; + case 1: + SWP_BIT_SET(update_val, bit_shift); + break; + default: + retval = ERR_TRANSVR_UNEXCPT; + err_code = ERR_TRANSVR_UNEXCPT; + err_msg = "Exception occurs"; + goto err_private_sfp_set_soft_rs_1; + } + err_code = _common_set_uint8_attr(self, + address, + page, + offset, + update_val, + attr_p, + caller, + show_err); + if (err_code < 0) { + retval = err_code; + err_msg = "Write data via i2c fail!"; + goto err_private_sfp_set_soft_rs_1; + } + (*attr_p) = update_val; + return 0; + +err_private_sfp_set_soft_rs_1: + if (show_err) { + SWPS_INFO("%s: %s :%d :%s\n :%d\n", + __func__, err_msg, err_code, self->swp_name, input_val); + } + return retval; +} + + +static int +_sfp_set_soft_rs(struct transvr_obj_s *self, + int input_val, + int address, + int page, + int offset, + int bit_shift, + int (*attr_update_func)(struct transvr_obj_s *self, int show_err), + uint8_t *attr_p, + char *caller, + int show_err) { + + int retval = ERR_TRANSVR_UNEXCPT; + int err_code = ERR_TRANSVR_UNEXCPT; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + + /* Check input value */ + if ((input_val != 0) && (input_val != 1)){ + retval = ERR_TRANSVR_BADINPUT; + err_code = ERR_TRANSVR_BADINPUT; + err_msg = "Input range incorrect!"; + goto err_common_sfp_set_soft_rs_1; + } + /* Check rate identifier is supported */ + err_code = self->get_rate_id(self); + if (err_code <= 0) { + switch (err_code) { + case 0: + retval = ERR_TRANSVR_NOTSUPPORT; + err_msg = "Not support this feature"; + break; + case ERR_TRANSVR_UNINIT: + retval = ERR_TRANSVR_UNINIT; + err_msg = "Check CDR present fail!"; + break; + case ERR_TRANSVR_UNPLUGGED: + retval = ERR_TRANSVR_UNPLUGGED; + err_msg = "Transceiver unplugged!"; + break; + default: + retval = err_code; + err_msg = "Check Rate_ID fail!"; + break; + } + goto err_common_sfp_set_soft_rs_1; + } + /* Check and update */ + err_code = _check_by_mode(self, + attr_update_func, + caller); + if ( (err_code < 0) || + ((*attr_p) == DEBUG_TRANSVR_HEX_VAL) ){ + retval = err_code; + err_msg = "Get current value fail!"; + goto err_common_sfp_set_soft_rs_1; + } + /* Generate and update value */ + return __sfp_set_soft_rs(self, + input_val, + address, + page, + offset, + bit_shift, + attr_p, + caller, + show_err); + +err_common_sfp_set_soft_rs_1: + if (show_err) { + SWPS_INFO("%s: %s :%d :%s\n :%d\n", + __func__, err_msg, err_code, self->swp_name, input_val); + } + return retval; +} + + +int +sfp_set_soft_rs0(struct transvr_obj_s *self, + int input_val) { + /* Note: + * SFP Soft Rate_Select Select RX ["RS(0)"] address + * A2h, offset: 110, bit 3 + */ + int bit_shift = 3; + int show_err = 1; + return _sfp_set_soft_rs(self, + input_val, + self->eeprom_map_p->addr_soft_rs0, + self->eeprom_map_p->page_soft_rs0, + self->eeprom_map_p->offset_soft_rs0, + bit_shift, + &_sfp_update_attr_soft_rs0, + &(self->soft_rs0), + "sfp_set_soft_rs0", + show_err); +} + + +int +sfp_set_soft_rs1(struct transvr_obj_s *self, + int input_val) { + /* Note: + * SFP Soft Rate_Select Select RX ["RS(1)"] address + * A2h, offset: 118, bit 3 + */ + int bit_shift = 3; + int show_err = 1; + return _sfp_set_soft_rs(self, + input_val, + self->eeprom_map_p->addr_soft_rs1, + self->eeprom_map_p->page_soft_rs1, + self->eeprom_map_p->offset_soft_rs1, + bit_shift, + &_sfp_update_attr_soft_rs1, + &(self->soft_rs1), + "sfp_set_soft_rs1", + show_err); +} + + +int +__sfp_set_tx_eq(struct transvr_obj_s *self, + int input, + int show_e) { + + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv = DEBUG_TRANSVR_HEX_VAL; + + if ((input < 0) || (input > 0xFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_sfp_set_tx_eq; + } + setv = (uint8_t)input; + if (self->tx_eq[0] == setv) { + return 0; + } + err = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_tx_eq, + self->eeprom_map_p->page_tx_eq, + self->eeprom_map_p->offset_tx_eq, + setv, + &(self->tx_eq[0]), + "_sfp_set_tx_eq", + show_e); + if (err < 0) { + emsg = "set_uint8_attr fail"; + goto err_sfp_set_tx_eq; + } + return 0; + +err_sfp_set_tx_eq: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_sfp_set_tx_eq(struct transvr_obj_s *self, + int input, + int show_e) { + + uint8_t tmp; + int i = 0; + int retry = 3; + + for (i=0; itx_eq[0]; + if (_sfp_update_attr_tx_eq(self, show_e) < 0){ + continue; + } + if (self->tx_eq[0] == tmp){ + return 0; + } + } + return ERR_TRANSVR_UPDATE_FAIL; +} + + +int +sfp_set_tx_eq(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_sfp_update_attr_tx_eq, + "sfp_set_tx_eq"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _sfp_set_tx_eq(self, input, 1); +} + + +int +__sfp_set_rx_em(struct transvr_obj_s *self, + int input, + int show_e) { + + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv = DEBUG_TRANSVR_HEX_VAL; + + if ((input < 0) || (input > 0xFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_sfp_set_rx_em; + } + setv = (uint8_t)input; + if (self->rx_em[0] == setv) { + return 0; + } + err = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_rx_em, + self->eeprom_map_p->page_rx_em, + self->eeprom_map_p->offset_rx_em, + setv, + &(self->rx_em[0]), + "_sfp_set_rx_em", + show_e); + if (err < 0) { + emsg = "set_uint8_attr fail"; + goto err_sfp_set_rx_em; + } + return 0; + +err_sfp_set_rx_em: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_sfp_set_rx_em(struct transvr_obj_s *self, + int input, + int show_e) { + + uint8_t tmp; + int i = 0; + int retry = 3; + + for (i=0; irx_em[0]; + if (_sfp_update_attr_rx_em(self, show_e) < 0){ + continue; + } + if (self->rx_em[0] == tmp){ + return 0; + } + } + return -1; +} + + +int +sfp_set_rx_em(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_sfp_update_attr_rx_em, + "sfp_set_rx_em"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _sfp_set_rx_em(self, input, 1); +} + + +int +sfp_set_1g_rj45_extphy_offset(struct transvr_obj_s *self, + int input) { + + if (self->state != STATE_TRANSVR_CONNECTED) { + return ERR_TRANSVR_UNPLUGGED; + } + if ((self->info != TRANSVR_CLASS_BASE_T_1000) && + (self->info != TRANSVR_CLASS_BASE_T_1000_up) ){ + return ERR_TRANSVR_NOTSUPPORT; + } + if ((input < 0) || (input > 0xff)) { + return ERR_TRANSVR_BADINPUT; + } + self->extphy_offset = (uint8_t)input; + return 0; +} + + +int +sfp_set_1g_rj45_extphy_reg(struct transvr_obj_s *self, + int input) { + + int i = 0; + int retry = 3; + int delay = 200; + uint16_t tmp = 0; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return ERR_TRANSVR_UNPLUGGED; + } + if ((self->info != TRANSVR_CLASS_BASE_T_1000) && + (self->info != TRANSVR_CLASS_BASE_T_1000_up) ){ + return ERR_TRANSVR_NOTSUPPORT; + } + if ((input < 0) || (input > 0xffff)) { + return ERR_TRANSVR_BADINPUT; + } + tmp = ((input & 0x00ff) << 8) | ((input & 0xff00) >> 8); + if (_common_setup_page(self, VAL_TRANSVR_EXTPHY_ADDR_56, + -1, self->extphy_offset, 1, 0) < 0) { + return -EIO; + } + for (i=0; i<=retry; i++) { + if (i2c_smbus_write_word_data(self->i2c_client_p, + self->extphy_offset, + tmp) >= 0) { + return 0; + } + msleep(delay); + } + SWPS_INFO("%s: retry:%d fail :%s :0x%02x\n", + __func__, retry, self->swp_name, self->extphy_offset); + return -EIO; +} + + +static int +__qsfp_set_cdr(struct transvr_obj_s *self, + int input_val, + int show_err) { + + uint8_t update_val; + int CDR_FEATURE_SUPPORTED = 0x3; + int retval = ERR_TRANSVR_UNEXCPT; + int err_code = ERR_TRANSVR_UNEXCPT; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + char *func_name = "__qsfp_set_cdr"; + + /* Check input value */ + if ((input_val < 0) || (input_val > 0xff)){ + retval = ERR_TRANSVR_BADINPUT; + err_code = ERR_TRANSVR_BADINPUT; + err_msg = "Input range incorrect!"; + goto err_qsfp_set_cdr_1; + } + update_val = (uint8_t)input_val; + /* Check CDR supported by transceiver */ + err_code = qsfp_get_cdr_present(self); + if (err_code < 0) { + retval = err_code; + switch (err_code) { + case ERR_TRANSVR_UNINIT: + err_msg = "Check CDR present fail!"; + break; + case ERR_TRANSVR_UNPLUGGED: + err_msg = "Transceiver unplugged!"; + break; + default: + err_msg = "Check CDR present fail!"; + break; + } + goto err_qsfp_set_cdr_1; + } + if (err_code != CDR_FEATURE_SUPPORTED) { + retval = ERR_TRANSVR_NOTSUPPORT; + err_msg = "This transceiver not support CDR!"; + goto err_qsfp_set_cdr_1; + } + /* Check and update */ + err_code = _check_by_mode(self, + &_qsfp_update_attr_cdr, + func_name); + if ( (err_code < 0) || + (self->cdr == DEBUG_TRANSVR_HEX_VAL) ){ + retval = err_code; + err_msg = "Get current value fail!"; + goto err_qsfp_set_cdr_1; + } + /* Write input value to transceiver */ + return _common_set_uint8_attr(self, + self->eeprom_map_p->addr_cdr, + self->eeprom_map_p->page_cdr, + self->eeprom_map_p->offset_cdr, + update_val, + &(self->cdr), + func_name, + show_err); + +err_qsfp_set_cdr_1: + if (show_err) { + SWPS_INFO("%s: %s :%d :%s\n :%d\n", + __func__, err_msg, err_code, self->swp_name, input_val); + } + return retval; +} + + +int +qsfp_set_cdr(struct transvr_obj_s *self, + int input_val) { + return __qsfp_set_cdr(self, input_val, 1); +} + + +int +qsfp_set_soft_tx_disable(struct transvr_obj_s *self, + int input_val) { + + int show_err = 1; + int in_max = 0xf; /* 1111 */ + int in_min = 0x0; /* 0000 */ + int retval = DEBUG_TRANSVR_INT_VAL; + int update_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + retval = _check_by_mode(self, + &_qsfp_update_attr_soft_tx_disable, + "qsfp_set_soft_tx_disable"); + if (retval < 0) { + snprintf(err_msg, 63, "Not ready. err:%d", retval); + goto err_qsfp_set_soft_tx_disable; + } + if ((input_val > in_max) || + (input_val < in_min) ){ + retval = ERR_TRANSVR_BADINPUT; + snprintf(err_msg, 63, "Input value:%d incorrect!", input_val); + goto err_qsfp_set_soft_tx_disable; + } + if ((self->tx_disable & 0x0f) == input_val) { + return 0; + } + update_val = ((self->tx_disable & 0xf0) & input_val); + retval = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + input_val, + &(self->tx_disable), + "qsfp_set_tx_disable", + show_err); + if (retval < 0) { + snprintf(err_msg, 63, "_common_set_uint8_attr:%d fail!", retval); + goto err_qsfp_set_soft_tx_disable; + } + return 0; + +err_qsfp_set_soft_tx_disable: + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + return retval; +} + + +int +_qsfp_set_auto_tx_disable(struct transvr_obj_s *self, + uint8_t update) { + + uint8_t tx_enable = 0x0; + int show_e = 1; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + /* Handle timing issues */ + if (update != tx_enable) { + /* Note: + * Because there are some txvr has timing issues, + * therefore we need to execute reset cycle first. + * (enable -> other settings) + */ + err = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + tx_enable, + &(self->tx_disable), + "_qsfp_set_auto_tx_disable", + show_e); + if (err < 0) { + emsg = "I2C set reset value fail"; + goto err_qsfp_set_auto_tx_disable; + } + mdelay(10); + } + /* Setup target value */ + err = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + self->auto_tx_disable, + &(self->tx_disable), + "_qsfp_set_auto_tx_disable", + show_e); + if (err < 0) { + emsg = "I2C set target value fail"; + goto err_qsfp_set_auto_tx_disable; + } + /* Check and update */ + err = _common_update_uint8_attr(self, + self->eeprom_map_p->addr_tx_disable, + self->eeprom_map_p->page_tx_disable, + self->eeprom_map_p->offset_tx_disable, + self->eeprom_map_p->length_tx_disable, + &(self->tx_disable), + "_qsfp_set_auto_tx_disable", + show_e); + if (err < 0) { + emsg = "I2C get value fail"; + goto err_qsfp_set_auto_tx_disable; + } + if (self->tx_disable != update) { + emsg = "data not become effective"; + goto err_qsfp_set_auto_tx_disable; + } + return 0; + +err_qsfp_set_auto_tx_disable: + SWPS_DEBUG("%s: %s :%s\n", + __func__, emsg, self->swp_name); + return ERR_TRANSVR_UPDATE_FAIL; +} + + +int +qsfp_set_auto_tx_disable(struct transvr_obj_s *self, + int input_val) { + + int in_max = 0xf; /* 1111 */ + int in_min = 0x0; /* 0000 */ + int retval = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + + /* Update settings*/ + if (input_val == VAL_TRANSVR_FUNCTION_DISABLE) { + emsg = "User disable auto tx_disable"; + self->auto_tx_disable = VAL_TRANSVR_FUNCTION_DISABLE; + goto out_qsfp_set_auto_tx_disable; + } + if ((input_val > in_max) || (input_val < in_min) ){ + SWPS_INFO("%s: Input value:%d incorrect! :%s\n", + __func__, input_val, self->swp_name); + return ERR_TRANSVR_BADINPUT; + } + self->auto_tx_disable = input_val; + /* Check current soft tx_disable */ + retval = _check_by_mode(self, + &_qsfp_update_attr_soft_tx_disable, + "qsfp_set_auto_tx_disable"); + switch (retval) { + case 0: + break; + case ERR_TRANSVR_UNPLUGGED: + emsg = "Doesn't need to update"; + goto out_qsfp_set_auto_tx_disable; + default: + SWPS_INFO("%s: setup fail :%d :%s\n", + __func__, retval, self->swp_name); + return retval; + } + return _qsfp_set_auto_tx_disable(self, input_val); + +out_qsfp_set_auto_tx_disable: + SWPS_DEBUG("%s: %s :%s :%d\n :%d", + __func__, emsg, self->swp_name, input_val, retval); + return 0; +} + + +int +__qsfp_set_tx_eq(struct transvr_obj_s *self, + int input, + int show_e) { + /* [Note] + * 0x + */ + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv[2] = {0x00, 0x00}; + + if ((input < 0) || (input > 0xFFFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_qsfp_set_tx_eq; + } + setv[0] = (uint8_t)((input & 0xFF00) >> 8); + setv[1] = (uint8_t)(input & 0xFF); + if ((self->tx_eq[0] == setv[0]) && + (self->tx_eq[1] == setv[1]) ) { + return 0; + } + err = _common_set_uint8_array(self, + self->eeprom_map_p->addr_tx_eq, + self->eeprom_map_p->page_tx_eq, + self->eeprom_map_p->offset_tx_eq, + self->eeprom_map_p->length_tx_eq, + setv, + self->tx_eq, + "_qsfp_set_tx_eq", + show_e); + if (err < 0) { + emsg = "set_uint8_array fail"; + goto err_qsfp_set_tx_eq; + } + return 0; + +err_qsfp_set_tx_eq: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_qsfp_set_tx_eq(struct transvr_obj_s *self, + int input, + int show_e) { + + int i = 0; + int retry = 3; + uint8_t tmp[2]; + + for (i=0; itx_eq[0]; + tmp[1] = self->tx_eq[1]; + if (_qsfp_update_attr_tx_eq(self, show_e) < 0){ + continue; + } + if ((self->tx_eq[0] == tmp[0]) && + (self->tx_eq[1] == tmp[1]) ){ + return 0; + } + } + return -1; +} + + +int +qsfp_set_tx_eq(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_qsfp_update_attr_tx_eq, + "qsfp_set_tx_eq"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _qsfp_set_tx_eq(self, input, 1); +} + + +int +__qsfp_set_rx_am(struct transvr_obj_s *self, + int input, + int show_e) { + /* [Note] + * 0x + */ + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv[2] = {0x00, 0x00}; + + if ((input < 0) || (input > 0xFFFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_qsfp_set_rx_am; + } + setv[0] = (uint8_t)((input & 0xFF00) >> 8); + setv[1] = (uint8_t)(input & 0xFF); + if ((self->rx_am[0] == setv[0]) && + (self->rx_am[1] == setv[1]) ) { + return 0; + } + err = _common_set_uint8_array(self, + self->eeprom_map_p->addr_rx_am, + self->eeprom_map_p->page_rx_am, + self->eeprom_map_p->offset_rx_am, + self->eeprom_map_p->length_rx_am, + setv, + self->rx_am, + "_qsfp_set_rx_am", + show_e); + if (err < 0) { + emsg = "set_uint8_array fail"; + goto err_qsfp_set_rx_am; + } + return 0; + +err_qsfp_set_rx_am: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_qsfp_set_rx_am(struct transvr_obj_s *self, + int input, + int show_e) { + + int i = 0; + int retry = 3; + uint8_t tmp[2]; + + for (i=0; irx_am[0]; + tmp[1] = self->rx_am[1]; + if (_qsfp_update_attr_rx_am(self, show_e) < 0){ + continue; + } + if ((self->rx_am[0] == tmp[0]) && + (self->rx_am[1] == tmp[1]) ){ + return 0; + } + } + return -1; +} + + +int +qsfp_set_rx_am(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_qsfp_update_attr_rx_am, + "qsfp_set_rx_am"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _qsfp_set_rx_am(self, input, 1); +} + + +int +__qsfp_set_rx_em(struct transvr_obj_s *self, + int input, + int show_e) { + /* [Note] + * 0x + */ + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t setv[2] = {0x00, 0x00}; + + if ((input < 0) || (input > 0xFFFF)) { + emsg = "input incorrect"; + err = ERR_TRANSVR_BADINPUT; + goto err_qsfp_set_rx_em; + } + setv[0] = (uint8_t)((input & 0xFF00) >> 8); + setv[1] = (uint8_t)(input & 0xFF); + if ((self->rx_em[0] == setv[0]) && + (self->rx_em[1] == setv[1]) ) { + return 0; + } + err = _common_set_uint8_array(self, + self->eeprom_map_p->addr_rx_em, + self->eeprom_map_p->page_rx_em, + self->eeprom_map_p->offset_rx_em, + self->eeprom_map_p->length_rx_em, + setv, + self->rx_em, + "_qsfp_set_rx_em", + show_e); + if (err < 0) { + emsg = "set_uint8_array fail"; + goto err_qsfp_set_rx_em; + } + return 0; + +err_qsfp_set_rx_em: + if (show_e) { + SWPS_INFO("%s: %s :%d\n", __func__, emsg, input); + } + return err; +} + + +int +_qsfp_set_rx_em(struct transvr_obj_s *self, + int input, + int show_e) { + + int i = 0; + int retry = 3; + uint8_t tmp[2]; + + for (i=0; irx_em[0]; + tmp[1] = self->rx_em[1]; + if (_qsfp_update_attr_rx_em(self, show_e) < 0){ + continue; + } + if ((self->rx_em[0] == tmp[0]) && + (self->rx_em[1] == tmp[1]) ){ + return 0; + } + } + return -1; +} + + +int +qsfp_set_rx_em(struct transvr_obj_s *self, + int input) { + + int err = _check_by_mode(self, + &_qsfp_update_attr_rx_em, + "qsfp_set_rx_em"); + if (err < 0) { + SWPS_DEBUG("%s: check fail :%d\n", __func__, err); + return err; + } + return _qsfp_set_rx_em(self, input, 1); +} + + +int +common_transvr_dump(struct transvr_obj_s* self){ + + char *type_name = "Undefined"; + + if (TRANSVR_INFO_DUMP_ENABLE != 1) { + return 0; + } + switch (self->type) { + case TRANSVR_TYPE_SFP: + type_name = STR_TRANSVR_SFP; + break; + case TRANSVR_TYPE_QSFP: + type_name = STR_TRANSVR_QSFP; + break; + case TRANSVR_TYPE_QSFP_PLUS: + type_name = STR_TRANSVR_QSFP_PLUS; + break; + case TRANSVR_TYPE_QSFP_28: + type_name = STR_TRANSVR_QSFP28; + break; + case TRANSVR_TYPE_FAKE: + type_name = "FAKE"; + goto ok_common_transvr_dump; + case TRANSVR_TYPE_UNPLUGGED: + type_name = "UNPLUGGED"; + goto err_common_transvr_dump; + case TRANSVR_TYPE_INCONSISTENT: + type_name = "INCONSISTENT"; + goto err_common_transvr_dump; + case TRANSVR_TYPE_ERROR: + type_name = "ERROR"; + goto err_common_transvr_dump; + + default: + type_name = "UNEXPECTED"; + goto err_common_transvr_dump; + } + printk(KERN_INFO "[SWPS] Dump %s information:\n", self->swp_name); + printk(KERN_INFO " |- :%s\n", type_name); + printk(KERN_INFO " |- :%s\n", self->vendor_name); + printk(KERN_INFO " |- :%s\n", self->vendor_pn); + printk(KERN_INFO " |- :%s\n", self->vendor_rev); + printk(KERN_INFO " |- :%s\n", self->vendor_sn); + printk(KERN_INFO " |- :0x%02x\n", self->br); + printk(KERN_INFO " |- :0x%02x\n", self->comp_rev); + printk(KERN_INFO " |- :%d\n", self->len_om1); + printk(KERN_INFO " |- :%d\n", self->len_om2); + printk(KERN_INFO " |- :%d\n", self->len_om3); + printk(KERN_INFO " |- :%d\n", self->len_om4); + return 0; + +ok_common_transvr_dump: + SWPS_INFO("%s: %s is %s\n", __func__, self->swp_name, type_name); + return 0; + +err_common_transvr_dump: + SWPS_INFO("%s: %s is %s\n", __func__, self->swp_name, type_name); + return -1; +} + + +int +sfp_transvr_dump(struct transvr_obj_s* self) { + + if (TRANSVR_INFO_DUMP_ENABLE != 1) { + return 0; + } + if (common_transvr_dump(self) < 0) { + return -1; + } + printk(KERN_INFO " |- :%d\n", self->len_sm); + printk(KERN_INFO " |- :%d\n", self->len_smf); + printk(KERN_INFO " '- :0x%02x\n", self->rate_id); + return 0; +} + + +int +qsfp_transvr_dump(struct transvr_obj_s* self) { + + if (TRANSVR_INFO_DUMP_ENABLE != 1) { + return 0; + } + if (common_transvr_dump(self) < 0) { + return -1; + } + printk(KERN_INFO " |- :%d\n", self->len_smf); + printk(KERN_INFO " '- :Class_%d\n", __qsfp_get_power_cls(self, 0)); + return 0; +} + + +int +fake_transvr_dump(struct transvr_obj_s* self) { + + printk(KERN_INFO "[SWPS] Dump transceiver information: %s\n", self->swp_name); + printk(KERN_INFO " |- :FAKE\n"); + printk(KERN_INFO " |- :FAKE_VENDER_NAME\n"); + printk(KERN_INFO " |- :FAKE_VENDER_PN\n"); + printk(KERN_INFO " |- :FAKE_VENDER_REV\n"); + printk(KERN_INFO " |- :FAKE_VENDER_SN\n"); + printk(KERN_INFO " |- :0x99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " |- :99\n"); + printk(KERN_INFO " '- :0x99\n"); + return 0; +} + + +/* ========== Object functions for fake type ========== + */ +int +fake_transvr_update(struct transvr_obj_s *self, + int show_err){ + self->state = STATE_TRANSVR_CONNECTED; + return 0; +} + + +int +fake_get_binary(struct transvr_obj_s *self){ + return 1; +} + +int +fake_get_int(struct transvr_obj_s *self){ + return 99; +} + + +int +fake_get_hex(struct transvr_obj_s *self){ + return 0x0f; +} + + +int +fake_get_str(struct transvr_obj_s *self, char *buf) { + return snprintf(buf, 16, "fake_get_str\n"); +} + + +int +fake_set_int(struct transvr_obj_s *self, int input){ + SWPS_INFO("%s: %d\n", __func__, input); + return 0; +} + + +int +fake_set_hex(struct transvr_obj_s *self, int input){ + SWPS_INFO("%s: 0x%02x\n", __func__, input); + return 0; +} + + +/* ========== Object functions for unsupported ========== + */ +int +unsupported_get_func(struct transvr_obj_s *self){ + return ERR_TRANSVR_NOTSUPPORT; +} + + +int +unsupported_get_func2(struct transvr_obj_s *self, + char *buf_p) { + int len = snprintf(buf_p, 8, "%d\n", ERR_TRANSVR_NOTSUPPORT); + return len; +} + + +int +unsupported_set_func(struct transvr_obj_s *self, + int input_val){ + return ERR_TRANSVR_NOTSUPPORT; +} + + + +/* ========== Object functions for long term task ========== + * + * [Note] + * SWPS transceiver worker is likely the green-thread (coroutine). + * Due to resource and performance considerations. SWPS run all + * features in one kthread at the same time, and handle by it self. + */ + +/* For Transceiver Task Handling + */ +static struct transvr_worker_s * +transvr_task_get(struct transvr_obj_s *self, + char *func_name) { + + struct transvr_worker_s *curr_p = self->worker_p; + + while(curr_p != NULL){ + if (strcmp((curr_p->func_name), func_name) == 0 ) { + return curr_p; + } + curr_p = curr_p->next_p; + } + return NULL; +} + + +static struct transvr_worker_s* +transvr_task_creat(struct transvr_obj_s *self, + int (*main_task)(struct transvr_worker_s *task), + int (*post_task)(struct transvr_worker_s *task), + char *caller) { + + struct transvr_worker_s *task_p = NULL; + struct transvr_worker_s *curr_p = NULL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Check task not exist */ + task_p = transvr_task_get(self, caller); + if (task_p) { + snprintf(err_msg, sizeof(err_msg), "Task already created!"); + goto err_transvr_task_creat; + } + /* Create task worker */ + task_p = kzalloc(sizeof(struct transvr_worker_s), GFP_KERNEL); + if (!task_p){ + snprintf(err_msg, sizeof(err_msg), "kzalloc fail"); + goto err_transvr_task_creat; + } + /* Setup task data */ + task_p->transvr_p = self; + task_p->next_p = NULL; + task_p->trigger_time = 0; + task_p->retry = 1; + task_p->state = STATE_T_TASK_INIT; + task_p->main_task = main_task; + task_p->post_task = post_task; + task_p->p_data = NULL; + snprintf(task_p->func_name, sizeof(task_p->func_name), "%s", caller); + /* Setup Link List */ + if (self->worker_p) { + curr_p = self->worker_p; + while(curr_p->next_p != NULL) { + curr_p = curr_p->next_p; + } + curr_p->next_p = task_p; + task_p->pre_p = curr_p; + } else { + self->worker_p = task_p; + task_p->pre_p = NULL; + } + return task_p; + +err_transvr_task_creat: + SWPS_ERR("%s: %s :%s :%s\n", + __func__, err_msg, caller, self->swp_name); + return NULL; +} + + +static void +transvr_task_free_one(struct transvr_worker_s *task_p){ + + struct transvr_worker_s *pre_p = NULL; + struct transvr_worker_s *next_p = NULL; + + if (task_p) { + pre_p = task_p->pre_p; + next_p = task_p->next_p; + + if ((pre_p) && (next_p)) { + pre_p->next_p = next_p; + next_p->pre_p = pre_p; + + } else if ((!pre_p) && (next_p)) { + next_p->pre_p = NULL; + + } else if ((pre_p) && (!next_p)) { + pre_p->next_p = NULL; + + } else if ((!pre_p) && (!next_p)) { + task_p->transvr_p->worker_p = NULL; + } else { + SWPS_ERR("%s: Unexcept case!\n :%s", + __func__, task_p->transvr_p->swp_name); + } + kfree(task_p->p_data); + kfree(task_p); + } +} + + +static void +transvr_task_free_all(struct transvr_obj_s *self) { + + struct transvr_worker_s *curr_p = NULL; + struct transvr_worker_s *next_p = NULL; + + if (self->worker_p) { + curr_p = self->worker_p; + while(curr_p) { + next_p = curr_p->next_p; + transvr_task_free_one(curr_p); + curr_p = next_p; + } + self->worker_p = NULL; + } +} + + +static void +transvr_cache_free_all(struct transvr_obj_s *self) { + + memset(self->vendor_name, 0, (LEN_TRANSVR_M_STR * sizeof(char)) ); + memset(self->vendor_rev, 0, (LEN_TRANSVR_M_STR * sizeof(char)) ); + memset(self->vendor_pn, 0, (LEN_TRANSVR_M_STR * sizeof(char)) ); + memset(self->vendor_sn, 0, (LEN_TRANSVR_M_STR * sizeof(char)) ); + self->extphy_offset = 0; +} + +static int +_transvr_task_run_main(struct transvr_worker_s *task_p) { + + int retval = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + if (!task_p){ + snprintf(err_msg, sizeof(err_msg), "main_task is NULL!"); + goto main_transvr_task_err; + } + if ((task_p->trigger_time) == 0){ + goto main_transvr_task_run; + } + if (time_before(jiffies, task_p->trigger_time)){ + goto main_transvr_task_wait; + } + goto main_transvr_task_run; + +main_transvr_task_run: + if (task_p->retry != VAL_TRANSVR_TASK_RETRY_FOREVER) { + task_p->retry -= 1; + } + retval = task_p->main_task(task_p); + if (retval < 0) { + if (task_p->retry > 0) { + task_p->state = STATE_T_TASK_WAIT; + return EVENT_TRANSVR_TASK_WAIT; + } + snprintf(err_msg, sizeof(err_msg), "Run main_task fail!"); + goto main_transvr_task_err; + } + goto main_transvr_task_identify; + +main_transvr_task_identify: + switch (retval) { + case EVENT_TRANSVR_TASK_WAIT: + task_p->state = STATE_T_TASK_WAIT; + return EVENT_TRANSVR_TASK_WAIT; + + case EVENT_TRANSVR_TASK_DONE: + task_p->state = STATE_T_TASK_DONE; + return EVENT_TRANSVR_TASK_DONE; + + default: + break; + } + snprintf(err_msg, sizeof(err_msg), "Run main_task fail!"); + goto main_transvr_task_err; + +main_transvr_task_wait: + task_p->state = STATE_T_TASK_WAIT; + return EVENT_TRANSVR_TASK_WAIT; + +main_transvr_task_err: + task_p->state = STATE_T_TASK_FAIL; + SWPS_INFO("%s: %s :%d :%s\n", + __func__, err_msg, retval, task_p->transvr_p->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +static int +_transvr_task_run_post(struct transvr_worker_s *task_p) { + + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + if ((task_p->post_task) == NULL) { + return EVENT_TRANSVR_TASK_DONE; + } + switch (task_p->state) { + case STATE_T_TASK_WAIT: + case STATE_T_TASK_INIT: + goto post_transvr_task_wait; + + case STATE_T_TASK_DONE: + case STATE_T_TASK_FAIL: + goto post_transvr_task_run; + + default: + break; + } + snprintf(err_msg, sizeof(err_msg), "Unexcept task state"); + goto post_transvr_task_err; + +post_transvr_task_run: + task_p->post_task(task_p); + return EVENT_TRANSVR_TASK_DONE; + +post_transvr_task_wait: + return EVENT_TRANSVR_TASK_WAIT; + +post_transvr_task_err: + SWPS_INFO("%s: %s :%d :%s\n", + __func__, err_msg, task_p->state, task_p->transvr_p->swp_name); + return EVENT_TRANSVR_TASK_FAIL; +} + + +static int +transvr_task_run_one(struct transvr_worker_s *task_p) { + + int retval_main = DEBUG_TRANSVR_INT_VAL; + int retval_post = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + retval_main = _transvr_task_run_main(task_p); + if (retval_main < 0) { + snprintf(err_msg, sizeof(err_msg), "Execute main_task fail!"); + goto err_transvr_task_run_one; + } + retval_post = _transvr_task_run_post(task_p); + if (retval_post < 0) { + snprintf(err_msg, sizeof(err_msg), "Execute post_task fail!"); + goto err_transvr_task_run_one; + } + return retval_main; + +err_transvr_task_run_one: + SWPS_INFO("%s: %s
:%d :%d :%s :%s\n", + __func__, err_msg, retval_main, retval_post, + task_p->func_name, task_p->transvr_p->swp_name); + return EVENT_TRANSVR_TASK_FAIL; +} + + +static int +transvr_task_run_all(struct transvr_obj_s *self) { + + int haserr = 0; + int retval = DEBUG_TRANSVR_INT_VAL; + struct transvr_worker_s *curr_p = NULL; + struct transvr_worker_s *next_p = NULL; + + if ((self->worker_p) == NULL) { + return EVENT_TRANSVR_TASK_DONE; + } + curr_p = self->worker_p; + while (curr_p != NULL) { + next_p = curr_p->next_p; + retval = transvr_task_run_one(curr_p); + if (curr_p->retry == VAL_TRANSVR_TASK_RETRY_FOREVER) { + curr_p = next_p; + continue; + } + switch (retval) { + case EVENT_TRANSVR_TASK_WAIT: + break; + case EVENT_TRANSVR_TASK_DONE: + transvr_task_free_one(curr_p); + break; + case EVENT_TRANSVR_TASK_FAIL: + + default: + haserr = 1; + transvr_task_free_one(curr_p); + break; + } + curr_p = next_p; + } + if (haserr) { + return EVENT_TRANSVR_TASK_FAIL; + } + return EVENT_TRANSVR_TASK_DONE; +} + + +static void +transvr_task_set_delay(struct transvr_worker_s *task_p, + unsigned long delay_msec) { + + task_p->trigger_time = (jiffies + (delay_msec * (HZ/1000))); +} + + +static void +transvr_task_set_retry(struct transvr_worker_s *task_p, + unsigned long retry_times) { + + task_p->retry = retry_times; +} + + +/* For Transceiver Post Task + */ +int +taskfunc_post_do_nothing(struct transvr_worker_s *task_p) { + + return EVENT_TRANSVR_TASK_DONE; +} + + +int +taskfunc_post_handle_task_state(struct transvr_worker_s *task_p) { + + struct transvr_obj_s* tp = task_p->transvr_p; + + switch (task_p->state) { + case STATE_T_TASK_INIT: + case STATE_T_TASK_WAIT: + return EVENT_TRANSVR_TASK_WAIT; + + case STATE_T_TASK_DONE: + tp->state = STATE_TRANSVR_CONNECTED; + tp->send_uevent(tp, KOBJ_ADD); + return EVENT_TRANSVR_TASK_DONE; + + case STATE_T_TASK_FAIL: + tp->state = STATE_TRANSVR_UNEXCEPTED; + return EVENT_TRANSVR_TASK_FAIL; + + default: + break; + } + return EVENT_TRANSVR_TASK_FAIL; +} + + +/* For Transceiver Main Task + */ +int +_taskfunc_sfp_setup_soft_rs(struct transvr_worker_s *task_p, + int input_val, + int address, + int page, + int offset, + int bit_shift, + uint8_t *attr_p, + char *caller) { + + int show_err = 0; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *err_str = DEBUG_TRANSVR_STR_VAL; + char *func_str = "_taskfunc_sfp_setup_soft_rs"; + + err_code = _sfp_update_attr_soft_rs0(task_p->transvr_p, 0); + if (err_code < 0) { + err_str = "Get current soft_rs0 fail!"; + goto err_taskfunc_sfp_setup_soft_rs_1; + } + err_code = __sfp_set_soft_rs(task_p->transvr_p, + input_val, + address, + page, + offset, + bit_shift, + attr_p, + caller, + show_err); + if (err_code < 0) { + err_str = "Get current soft_rs0 fail!"; + goto err_taskfunc_sfp_setup_soft_rs_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_taskfunc_sfp_setup_soft_rs_1: + if ((task_p->retry) == 0) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + func_str, err_str, task_p->transvr_p->swp_name, input_val, err_code); + } + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +__taskfunc_sfp_setup_hard_rs(struct transvr_worker_s *task_p, + int input_val, + int (*get_func)(struct ioexp_obj_s *self, int virt_offset), + int (*set_func)(struct ioexp_obj_s *self, int virt_offset, int input_val)) { + + int err_val = EVENT_TRANSVR_EXCEP_EXCEP; + char *err_str = DEBUG_TRANSVR_STR_VAL; + + err_val = get_func(task_p->transvr_p->ioexp_obj_p, + task_p->transvr_p->ioexp_virt_offset); + + if (err_val < 0) { + if (err_val == ERR_IOEXP_NOTSUPPORT) { + return EVENT_TRANSVR_TASK_DONE; + } + err_str = "Get current hard_rs fail!"; + goto err_p_taskfunc_sfp_setup_hard_rs_1; + } + if (err_val == input_val) { + return EVENT_TRANSVR_TASK_DONE; + } + err_val = set_func(task_p->transvr_p->ioexp_obj_p, + task_p->transvr_p->ioexp_virt_offset, + input_val); + if (err_val < 0) { + err_str = "Setup hard_rs fail!"; + goto err_p_taskfunc_sfp_setup_hard_rs_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_p_taskfunc_sfp_setup_hard_rs_1: + if ((task_p->retry) == 0) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + __func__, err_str, task_p->transvr_p->swp_name, input_val, err_val); + } + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +_taskfunc_sfp_setup_hard_rs0(struct transvr_worker_s *task_p, + int input_val) { + + return __taskfunc_sfp_setup_hard_rs(task_p, + input_val, + task_p->transvr_p->ioexp_obj_p->get_hard_rs0, + task_p->transvr_p->ioexp_obj_p->set_hard_rs0); +} + + +int +_taskfunc_sfp_setup_hard_rs1(struct transvr_worker_s *task_p, + int input_val) { + + return __taskfunc_sfp_setup_hard_rs(task_p, + input_val, + task_p->transvr_p->ioexp_obj_p->get_hard_rs1, + task_p->transvr_p->ioexp_obj_p->set_hard_rs1); +} + + +int +_taskfunc_sfp_setup_rs0(struct transvr_worker_s *task_p, + int input_val) { + + int bit_shift = 3; + int old_val = DEBUG_TRANSVR_INT_VAL; + int err_val = EVENT_TRANSVR_EXCEP_EXCEP; + char *err_str = DEBUG_TRANSVR_STR_VAL; + char *func_str = "_taskfunc_sfp_setup_rs0"; + + err_val = _taskfunc_sfp_setup_hard_rs0(task_p, + input_val); + if (err_val < 0) { + err_str = "Setup hard_rs0 fail!"; + goto err_private_taskfunc_sfp_setup_rs0_1; + } + old_val = err_val; + err_val = _taskfunc_sfp_setup_soft_rs(task_p, + input_val, + task_p->transvr_p->eeprom_map_p->addr_soft_rs0, + task_p->transvr_p->eeprom_map_p->page_soft_rs0, + task_p->transvr_p->eeprom_map_p->offset_soft_rs0, + bit_shift, + &(task_p->transvr_p->soft_rs0), + func_str); + if (err_val < 0) { + err_str = "Setup soft_rs0 fail!"; + goto err_private_taskfunc_sfp_setup_rs0_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_private_taskfunc_sfp_setup_rs0_1: + if ((task_p->retry) == 0) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + func_str, err_str, task_p->transvr_p->swp_name, input_val, err_val); + } + _taskfunc_sfp_setup_hard_rs0(task_p, old_val); + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +_taskfunc_sfp_setup_rs1(struct transvr_worker_s *task_p, + int input_val) { + + int bit_shift = 3; + int old_val = DEBUG_TRANSVR_INT_VAL; + int err_val = EVENT_TRANSVR_EXCEP_EXCEP; + char *err_str = DEBUG_TRANSVR_STR_VAL; + char *func_str = "_taskfunc_sfp_setup_rs1"; + + err_val = _taskfunc_sfp_setup_hard_rs1(task_p, + input_val); + if (err_val < 0) { + err_str = "Setup hard_rs1 fail!"; + goto err_private_taskfunc_sfp_setup_rs1_1; + } + old_val = err_val; + err_val = _taskfunc_sfp_setup_soft_rs(task_p, + input_val, + task_p->transvr_p->eeprom_map_p->addr_soft_rs1, + task_p->transvr_p->eeprom_map_p->page_soft_rs1, + task_p->transvr_p->eeprom_map_p->offset_soft_rs1, + bit_shift, + &(task_p->transvr_p->soft_rs1), + func_str); + if (err_val < 0) { + err_str = "Setup soft_rs1 fail!"; + goto err_private_taskfunc_sfp_setup_rs1_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_private_taskfunc_sfp_setup_rs1_1: + if ((task_p->retry) == 0) { + SWPS_INFO("%s: %s :%s :%d :%d\n", + func_str, err_str, task_p->transvr_p->swp_name, input_val, err_val); + } + _taskfunc_sfp_setup_hard_rs1(task_p, old_val); + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +taskfunc_sfp_setup_SFF8431_case1(struct transvr_worker_s *task_p) { + /* SFF-8431 (8/4/2G Rx Rate_Select only) */ + int update_val = 1; + + return _taskfunc_sfp_setup_rs0(task_p, update_val); +} + + + +int +taskfunc_sfp_setup_SFF8431_case2(struct transvr_worker_s *task_p) { + /* SFF-8431 (8/4/2G Tx Rate_Select only) */ + int update_val = 1; + + return _taskfunc_sfp_setup_rs1(task_p, update_val); +} + + +int +taskfunc_sfp_setup_SFF8431_case3(struct transvr_worker_s *task_p) { + /* SFF-8431 (8/4/2G Independent Rx & Tx Rate_select) */ + int update_rs0 = 1; + int update_rs1 = 1; + int err_code = DEBUG_TRANSVR_INT_VAL; + + err_code = _taskfunc_sfp_setup_rs0(task_p, update_rs0); + if (err_code < 0) { + return err_code; + } + return _taskfunc_sfp_setup_rs1(task_p, update_rs1); +} + + +int +taskfunc_sfp_handle_1g_rj45(struct transvr_worker_s *task_p) { + + /* Not all of platform support 0x56 for transceiver + * external PHY, Support list as below: + * => 1. Magnolia-PVT (PS: EVT & DVT not ready) + */ + int ext_phy_addr = 0x56; + int ext_phy_page = -1; + int ext_phy_offs = 0x11; + int ext_phy_len = 1; + int lstate_mask = 0x04; /* 00000100 */ + int show_err = 0; + int fail_retry = 5; + int fail_delay = 1000; /* msec */ + int err_code = DEBUG_TRANSVR_INT_VAL; + uint8_t detect_val = DEBUG_TRANSVR_HEX_VAL; + char err_str[64] = DEBUG_TRANSVR_STR_VAL; + int *tmp_p = NULL; + char *func_name = "taskfunc_sfp_handle_1g_rj45"; + + if (task_p->transvr_p->state != STATE_TRANSVR_CONNECTED) { + return EVENT_TRANSVR_TASK_DONE; + } + if ( (task_p->transvr_p->info != TRANSVR_CLASS_BASE_T_1000) && + (task_p->transvr_p->info != TRANSVR_CLASS_BASE_T_1000_up) ) { + goto err_taskfunc_sfp_handle_1g_rj45_1; + } + err_code = _common_update_uint8_attr(task_p->transvr_p, + ext_phy_addr, + ext_phy_page, + ext_phy_offs, + ext_phy_len, + &detect_val, + func_name, + show_err); + if ( (err_code < 0) || + (detect_val == DEBUG_TRANSVR_HEX_VAL) ) { + snprintf(err_str, sizeof(err_str), "Detect external link status fail"); + goto err_taskfunc_sfp_handle_1g_rj45_2; + } + if ((detect_val & lstate_mask) == lstate_mask) { + goto ok_taskfunc_sfp_handle_1g_rj45_link_up; + } + goto ok_taskfunc_sfp_handle_1g_rj45_link_down; + +ok_taskfunc_sfp_handle_1g_rj45_link_up: + /* Filter out noise */ + if (!(task_p->p_data)) { + tmp_p = kzalloc(sizeof(int), GFP_KERNEL); + if (!tmp_p) { + snprintf(err_str, sizeof(err_str), "kzalloc p_data fail"); + goto err_taskfunc_sfp_handle_1g_rj45_2; + } + *tmp_p = TRANSVR_CLASS_BASE_T_1000_up; + task_p->p_data = tmp_p; + goto ok_taskfunc_sfp_handle_1g_rj45_done; + } + if ((*(int *)(task_p->p_data)) != TRANSVR_CLASS_BASE_T_1000_up) { + kfree(task_p->p_data); + task_p->p_data = NULL; + snprintf(err_str, sizeof(err_str), "Internal error"); + goto err_taskfunc_sfp_handle_1g_rj45_2; + } + task_p->transvr_p->info = TRANSVR_CLASS_BASE_T_1000_up; + kfree(task_p->p_data); + task_p->p_data = NULL; + goto ok_taskfunc_sfp_handle_1g_rj45_done; + +ok_taskfunc_sfp_handle_1g_rj45_link_down: + if (task_p->p_data) { + kfree(task_p->p_data); + task_p->p_data = NULL; + } + task_p->transvr_p->info = TRANSVR_CLASS_BASE_T_1000; + goto ok_taskfunc_sfp_handle_1g_rj45_done; + +ok_taskfunc_sfp_handle_1g_rj45_done: + if (task_p->retry != VAL_TRANSVR_TASK_RETRY_FOREVER) { + transvr_task_set_retry(task_p, VAL_TRANSVR_TASK_RETRY_FOREVER); + } + return EVENT_TRANSVR_TASK_DONE; + +err_taskfunc_sfp_handle_1g_rj45_1: + snprintf(err_str, sizeof(err_str), "Detect transceiver:%d not Base-T, remove task.", + task_p->transvr_p->info); + SWPS_INFO("%s: %s :%s\n", __func__, err_str, task_p->transvr_p->swp_name); + transvr_task_set_retry(task_p, 0); + return EVENT_TRANSVR_TASK_DONE; + +err_taskfunc_sfp_handle_1g_rj45_2: + if (task_p->retry == VAL_TRANSVR_TASK_RETRY_FOREVER) { + transvr_task_set_retry(task_p, fail_retry); + } + if ((task_p->retry) == 0) { + /* Error case: + * => In this case, SWPS will stop external Link state monitor features + * and keeps transvr_p->info on TRANSVR_CLASS_BASE_T_1000_up. + * Upper layer will see it always Linkup that because of these type of + * transceiver has external phy, BCM chip see it as Loopback transceiver. + */ + SWPS_WARN("%s can not access external PHY of Base-T SFP transceiver\n", + task_p->transvr_p->swp_name); + task_p->transvr_p->info = TRANSVR_CLASS_BASE_T_1000_up; + return EVENT_TRANSVR_TASK_DONE; + } else { + transvr_task_set_delay(task_p, fail_delay); + } + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +_taskfunc_qsfp_setup_power_mod(struct transvr_obj_s *self, + int setup_val) { + + int curr_val = DEBUG_TRANSVR_INT_VAL; + int err_val = DEBUG_TRANSVR_INT_VAL; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + + curr_val = self->ioexp_obj_p->get_lpmod(self->ioexp_obj_p, + self->ioexp_virt_offset); + if (curr_val < 0){ + err_msg = "Get current value fail!"; + goto err_private_taskfunc_qsfp_setup_power_mod_1; + } + if (curr_val == setup_val){ + return EVENT_TRANSVR_TASK_DONE; + } + err_val = self->ioexp_obj_p->set_lpmod(self->ioexp_obj_p, + self->ioexp_virt_offset, + setup_val); + if (err_val < 0){ + err_msg = "Setup power mode fail!"; + goto err_private_taskfunc_qsfp_setup_power_mod_1; + } + return EVENT_TRANSVR_TASK_DONE; + +err_private_taskfunc_qsfp_setup_power_mod_1: + SWPS_INFO("%s: %s :%d :%d :%d\n", + __func__, err_msg, err_val, curr_val, setup_val); + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +taskfunc_qsfp_handle_tx_disable(struct transvr_worker_s *task_p) { + + int i = 0; + int retry = 5; + int delay_ms = 100; + + if (task_p->transvr_p->auto_tx_disable == VAL_TRANSVR_FUNCTION_DISABLE) { + return EVENT_TRANSVR_TASK_DONE; + } + if (!_qsfp_is_implement_tx_disable(task_p->transvr_p)) { + return EVENT_TRANSVR_TASK_DONE; + } + for (i=0; itransvr_p, + task_p->transvr_p->auto_tx_disable) + == EVENT_TRANSVR_TASK_DONE) { + goto ok_taskfunc_qsfp_handle_tx_disable; + } + mdelay(delay_ms); + } + SWPS_INFO("%s auto setup tx_disable:0x%02x fail.\n", + task_p->transvr_p->swp_name, + task_p->transvr_p->auto_tx_disable); + return EVENT_TRANSVR_INIT_FAIL; + +ok_taskfunc_qsfp_handle_tx_disable: + SWPS_INFO("%s auto setup tx_disable:0x%02x ok.\n", + task_p->transvr_p->swp_name, + task_p->transvr_p->auto_tx_disable); + return EVENT_TRANSVR_TASK_DONE; +} + + +int +taskfunc_qsfp_set_hpmod(struct transvr_worker_s *task_p) { + + int err = DEBUG_TRANSVR_INT_VAL; + int HIGH_POWER_MODE = 0; + + /* Handle power mode */ + err = _taskfunc_qsfp_setup_power_mod(task_p->transvr_p, + HIGH_POWER_MODE); + if (err < 0) { + SWPS_INFO("%s: setup hpmod fail :%d :%s\n", + __func__, err, task_p->transvr_p->swp_name); + return err; + } + /* Handle auto tx_disable + * [Note] + * => Because there are some transceiver have timing issues or + * setup sequence issues, therefore we handle auto tx_disable + * after handle power mode. + */ + mdelay(100); + return taskfunc_qsfp_handle_tx_disable(task_p); +} + + +int +taskfunc_qsfp_set_lpmod(struct transvr_worker_s *task_p) { + + int LOW_POWER_MODE = 1; + return _taskfunc_qsfp_setup_power_mod(task_p->transvr_p, + LOW_POWER_MODE); +} + + +static int +initfunc_sfp_handle_multi_rate_mode(struct transvr_obj_s *self) { + + int task_retry = 3; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *err_str = DEBUG_TRANSVR_STR_VAL; + char *func_str = "sfp_handle_multi_rate_mode"; + struct transvr_worker_s *task_p = NULL; + + switch (self->rate_id) { + case 0x00: /* Unspecified */ + case 0x03: /* Unspecified */ + case 0x05: /* Unspecified */ + case 0x07: /* Unspecified */ + case 0x09: /* Unspecified */ + case 0x0B: /* Unspecified */ + case 0x0D: /* Unspecified */ + case 0x0F: /* Unspecified */ + goto sfp_handle_multi_rate_mode_4_unspecified; + + case 0x02: /* SFF-8431 (8/4/2G Rx Rate_Select only) */ + task_p = transvr_task_creat(self, + taskfunc_sfp_setup_SFF8431_case1, + taskfunc_post_handle_task_state, + func_str); + goto sfp_handle_multi_rate_mode_4_sff8431; + + case 0x04: /* SFF-8431 (8/4/2G Tx Rate_Select only) */ + task_p = transvr_task_creat(self, + taskfunc_sfp_setup_SFF8431_case2, + taskfunc_post_handle_task_state, + func_str); + goto sfp_handle_multi_rate_mode_4_sff8431; + + case 0x06: /* SFF-8431 (8/4/2G Independent Rx & Tx Rate_select) */ + task_p = transvr_task_creat(self, + taskfunc_sfp_setup_SFF8431_case3, + taskfunc_post_handle_task_state, + func_str); + goto sfp_handle_multi_rate_mode_4_sff8431; + + case 0x01: /* SFF-8079 (4/2/1G Rate_Select & AS0/AS1) */ + err_str = "SFF-8079 (4/2/1G Rate_Select & AS0/AS1)"; + goto sfp_handle_multi_rate_mode_4_not_support; + + case 0x08: /* FC-PI-5 (16/8/4G Rx Rate_select only) + * High=16G only, Low=8G/4G + */ + err_str = "FC-PI-5 (16/8/4G Rx Rate_select only)"; + goto sfp_handle_multi_rate_mode_4_not_support; + + case 0x0A: /* FC-PI-5 (16/8/4G Independent Rx, Tx Rate_select) + * High=16G only, Low=8G/4G + */ + err_str = "FC-PI-5 (16/8/4G Independent Rx, Tx Rate_select)"; + goto sfp_handle_multi_rate_mode_4_not_support; + + case 0x0C: /* FC-PI-6 (32/16/8G Independent Rx, Tx Rate_Select) + * High=32G only, Low = 16G/8G + */ + err_str = "FC-PI-6 (32/16/8G Independent Rx, Tx Rate_Select)"; + goto sfp_handle_multi_rate_mode_4_not_support; + + case 0x0E: /* 10/8G Rx and Tx Rate_Select controlling the operation or + * locking modes of the internal signal conditioner, retimer + * or CDR, according to the logic table defined in Table 10-2, + * High Bit Rate (10G) =9.95-11.3 Gb/s; Low Bit Rate (8G) = + * 8.5 Gb/s. In this mode, the default value of bit 110.3 (Soft + * Rate Select RS(0), Table 9-11) and of bit 118.3 (Soft Rate + * Select RS(1), Table 10-1) is 1. + */ + err_str = "cable type: 0x0E"; + goto sfp_handle_multi_rate_mode_4_not_support; + + default: + err_str = "cable type: UNKNOW"; + goto sfp_handle_multi_rate_mode_4_not_support; + } + +sfp_handle_multi_rate_mode_4_sff8431: + if (!task_p) { + err_str = "Create task fail!"; + goto sfp_handle_multi_rate_mode_4_fail_1; + } + transvr_task_set_retry(task_p, task_retry); + return EVENT_TRANSVR_TASK_WAIT; + +sfp_handle_multi_rate_mode_4_unspecified: + return EVENT_TRANSVR_TASK_DONE; + +sfp_handle_multi_rate_mode_4_not_support: + SWPS_INFO("%s: Does not support %s :%s :0x%02x\n", + func_str, err_str, self->swp_name, self->rate_id); + return EVENT_TRANSVR_TASK_DONE; + +sfp_handle_multi_rate_mode_4_fail_1: + SWPS_INFO("%s: %s :%s :0x%02x, :%d\n", + func_str, err_str, self->swp_name, self->rate_id, err_code); + return EVENT_TRANSVR_INIT_FAIL; +} + + +static int +initfunc_sfp_handle_1g_rj45(struct transvr_obj_s *self) { + + struct transvr_worker_s *task_p = NULL; + int detect_cls = DEBUG_TRANSVR_INT_VAL; + char err_str[64] = DEBUG_TRANSVR_STR_VAL; + char *func_str = "initfunc_sfp_handle_1g_rj45"; + + + if (self->info == TRANSVR_CLASS_BASE_T_1000) { + task_p = transvr_task_creat(self, + taskfunc_sfp_handle_1g_rj45, + taskfunc_post_do_nothing, + func_str); + if (!task_p) { + snprintf(err_str, sizeof(err_str), "Create task fail"); + goto err_initfunc_sfp_handle_1g_rj45; + } + transvr_task_set_retry(task_p, VAL_TRANSVR_TASK_RETRY_FOREVER); + } + return EVENT_TRANSVR_TASK_DONE; + +err_initfunc_sfp_handle_1g_rj45: + SWPS_INFO("%s: %s :%s :%d\n", + __func__, err_str, self->swp_name, detect_cls); + return EVENT_TRANSVR_TASK_FAIL; +} + + +static int +initfunc_qsfp_handle_power_mode(struct transvr_obj_s *self) { + + int err_code = EVENT_TRANSVR_EXCEP_INIT; + int power_class = DEBUG_TRANSVR_INT_VAL; + int hpmod_retry = 3; + int lpower_config = 1; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + unsigned long hpmod_delay = 500; /* msec */ + struct transvr_worker_s *task_p = NULL; + + /* Handle power mode for IOEXP */ + power_class = __qsfp_get_power_cls(self, 0); + switch (power_class) { + case 1: /* Case: Low power mode (Class = 1) */ + err_code = _taskfunc_qsfp_setup_power_mod(self, lpower_config); + if (err_code < 0){ + snprintf(err_msg, sizeof(err_msg), "Setup lpmod fail :%d", err_code); + goto err_initfunc_qsfp_handle_power_mode; + } + return EVENT_TRANSVR_TASK_DONE; + + case 2: /* Case: High power mode (Class > 1) */ + case 3: + case 4: + case 5: + case 6: + case 7: + task_p = transvr_task_creat(self, + taskfunc_qsfp_set_hpmod, + taskfunc_post_handle_task_state, + "transvr_init_qsfp"); + if (!task_p) { + snprintf(err_msg, sizeof(err_msg), "Setup lpmod fail :%d", err_code); + goto err_initfunc_qsfp_handle_power_mode; + } + transvr_task_set_retry(task_p, hpmod_retry); + transvr_task_set_delay(task_p, hpmod_delay); + return EVENT_TRANSVR_TASK_WAIT; + + default: + break; + } + snprintf(err_msg, sizeof(err_msg), "Exception case"); + goto err_initfunc_qsfp_handle_power_mode; + +err_initfunc_qsfp_handle_power_mode: + SWPS_INFO("%s: %s :%s \n", __func__, err_msg, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +int +initfunc_qsfp28_handle_cdr(struct transvr_obj_s *self) { + + uint8_t DEFAULT_VAL_CDR = 0xff; + int CDR_FUNC_EXISTED = 0x3; + int show_err = 1; + int err_val = EVENT_TRANSVR_TASK_FAIL; + char *err_msg = DEBUG_TRANSVR_STR_VAL; + char *func_str = "initfunc_qsfp28_handle_cdr"; + + err_val = __qsfp_get_cdr_present(self, 0); + if ( (err_val < 0) || + (err_val == DEBUG_TRANSVR_HEX_VAL) ) { + err_msg = "detect cdr_present fail!"; + goto err_taskfunc_qsfp_handle_cdr_1; + } + if (err_val == CDR_FUNC_EXISTED) { + err_val = _common_set_uint8_attr(self, + self->eeprom_map_p->addr_cdr, + self->eeprom_map_p->addr_cdr, + self->eeprom_map_p->offset_cdr, + DEFAULT_VAL_CDR, + &(self->cdr), + func_str, + show_err); + if (err_val < 0) { + err_msg = "set CDR fail!"; + goto err_taskfunc_qsfp_handle_cdr_1; + } + } + return EVENT_TRANSVR_TASK_DONE; + +err_taskfunc_qsfp_handle_cdr_1: + SWPS_INFO("%s: %s :%d :%s\n", + func_str, err_msg, err_val, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + +/* ========== Object functions for Final State Machine ========== + */ +int +is_plugged(struct transvr_obj_s *self){ + + int limit = 63; + int present = DEBUG_TRANSVR_INT_VAL; + char emsg[64] = DEBUG_TRANSVR_STR_VAL; + struct ioexp_obj_s *ioexp_p = self->ioexp_obj_p; + + if (!ioexp_p) { + snprintf(emsg, limit, "ioexp_p is null!"); + goto err_is_plugged_1; + } + present = ioexp_p->get_present(ioexp_p, self->ioexp_virt_offset); + switch (present){ + case 0: + return 1; + case 1: + return 0; + case ERR_IOEXP_UNINIT: + snprintf(emsg, limit, "ioexp_p not ready!"); + goto err_is_plugged_1; + default: + if (ioexp_p->state == STATE_IOEXP_INIT){ + snprintf(emsg, limit, "ioexp_p not ready!"); + goto err_is_plugged_1; + } + break; + } + SWPS_INFO("%s: Exception case! :%d :%d\n", + __func__, present, ioexp_p->state); + return 0; + +err_is_plugged_1: + SWPS_DEBUG("%s: %s\n", __func__, emsg); + return 0; +} + + +static int +detect_transvr_type(struct transvr_obj_s* self){ + + int type = TRANSVR_TYPE_ERROR; + + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + type = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + + /* Case: 1. Wait transceiver I2C module. + * 2. Transceiver I2C module failure. + * Note: 1. SFF allow maximum transceiver initial time is 2 second. So, there + * are exist some case that we need to wait transceiver. + * For these case, we keeps status on "TRANSVR_TYPE_UNPLUGGED", than + * state machine will keep trace with it. + * 2. There exist some I2C failure case we need to handle. Such as user + * insert the failure transceiver, or any reason cause it abnormal. + */ + if (type < 0){ + switch (type) { + case -EIO: + SWPS_DEBUG("%s: %s smbus return:-5 (I/O error)\n", + __func__, self->swp_name); + return TRANSVR_TYPE_UNPLUGGED; + case -ENXIO: + SWPS_DEBUG("%s: %s smbus return:-6 (No such device or address)\n", + __func__, self->swp_name); + return TRANSVR_TYPE_UNPLUGGED; + default: + break; + } + SWPS_INFO("%s: %s unexpected smbus return:%d \n", + __func__, self->swp_name, type); + return TRANSVR_TYPE_ERROR; + } + /* Identify valid transceiver type */ + switch (type){ + case TRANSVR_TYPE_SFP: + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + break; + case TRANSVR_TYPE_UNKNOW_1: + case TRANSVR_TYPE_UNKNOW_2: + type = TRANSVR_TYPE_UNKNOW_2; + break; + default: + SWPS_DEBUG("%s: unknow type:0x%02x \n", __func__, type); + type = TRANSVR_TYPE_ERROR; + break; + } + return type; +} + + +static int +detect_transvr_state(struct transvr_obj_s *self, + int result[2]){ + /* [return] [result-0] [result-1] + * 0 STATE_TRANSVR_CONNECTED TRANSVR_TYPE_FAKE + * 0 STATE_TRANSVR_DISCONNECTED TRANSVR_TYPE_UNPLUGGED + * 0 STATE_TRANSVR_ISOLATED TRANSVR_TYPE_ERROR + * 0 STATE_TRANSVR_INIT / + * 0 STATE_TRANSVR_SWAPPED + * 0 STATE_TRANSVR_CONNECTED + * ERR_TRNASVR_BE_ISOLATED STATE_TRANSVR_ISOLATED TRANSVR_TYPE_ERROR + * ERR_TRANSVR_I2C_CRASH STATE_TRANSVR_UNEXCEPTED TRANSVR_TYPE_ERROR + * ERR_TRANSVR_UNEXCPT STATE_TRANSVR_UNEXCEPTED TRANSVR_TYPE_UNKNOW_1/2 + */ + result[0] = STATE_TRANSVR_UNEXCEPTED; /* For return state */ + result[1] = TRANSVR_TYPE_ERROR; /* For return type */ + + /* Case1: Fake type */ + if (self->type == TRANSVR_TYPE_FAKE){ + result[0] = STATE_TRANSVR_CONNECTED; + result[1] = TRANSVR_TYPE_FAKE; + return 0; + } + /* Case2: Transceiver unplugged */ + if (!is_plugged(self)){ + result[0] = STATE_TRANSVR_DISCONNECTED; + result[1] = TRANSVR_TYPE_UNPLUGGED; + return 0; + } + /* Case3: Transceiver be isolated */ + if (self->state == STATE_TRANSVR_ISOLATED){ + result[0] = STATE_TRANSVR_ISOLATED; + result[1] = TRANSVR_TYPE_ERROR; + return ERR_TRNASVR_BE_ISOLATED; + } + /* Case4: Transceiver plugged */ + result[1] = detect_transvr_type(self); + /* Case4.1: I2C topology crash + * Note : There are some I2C issues cause by transceiver/cables. + * We need to check topology status when user insert it. + * But in this step, we can't not ensure this is the issues + * port. So, it return the ERR_TRANSVR_I2C_CRASH, then upper + * layer will diagnostic I2C topology. + */ + if (check_channel_tier_1() < 0) { + SWPS_INFO("%s: %s detect I2C crash :%d\n", + __func__, self->swp_name, self->state); + result[0] = STATE_TRANSVR_UNEXCEPTED; + result[1] = TRANSVR_TYPE_ERROR; + return ERR_TRANSVR_I2C_CRASH; + } + /* Case4.2: System initial not ready, + * Note : Sometime i2c channel or transceiver EEPROM will delay that will + * cause system in inconsistent state between EEPROM and IOEXP. + * In this case, SWP transceiver object keep state at LINK_DOWN + * to wait system ready. + * By the way, State Machine will handle these case. + */ + if (result[1] == TRANSVR_TYPE_UNPLUGGED){ + result[0] = STATE_TRANSVR_DISCONNECTED; + return 0; + } + /* Case4.3: Error transceiver type */ + if (result[1] == TRANSVR_TYPE_ERROR){ + result[0] = STATE_TRANSVR_ISOLATED; + SWPS_INFO("%s: %s detect error type\n", __func__, self->swp_name); + alarm_msg_2_user(self, "detected transceiver/cables not meet SFF standard!"); + return ERR_TRNASVR_BE_ISOLATED; + } + /* Case3.3: Unknow transceiver type */ + if ((result[1] == TRANSVR_TYPE_UNKNOW_1) || + (result[1] == TRANSVR_TYPE_UNKNOW_2) ){ + result[0] = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_UNEXCPT; + } + /* Case3.4: During initial process */ + if (self->state == STATE_TRANSVR_INIT){ + result[0] = STATE_TRANSVR_INIT; + return 0; + } + /* Case3.5: Transceiver be swapped */ + if (self->type != result[1]){ + result[0] = STATE_TRANSVR_SWAPPED; + return 0; + } + /* Case3.6: Link up state */ + result[0] = STATE_TRANSVR_CONNECTED; + return 0; +} + + +int +_sfp_detect_class_by_extend_comp(struct transvr_obj_s* self) { + /* Reference: SFF-8024 (v3.8) + */ + int detect_val = _sfp_get_comp_extended(self); + + switch(detect_val) { + case 0x00: /* Unspecified */ + return TRANSVR_CLASS_UNSPECIFIED; + + case 0x01: /* 100G AOC (Active Optical Cable) or 25GAUI C2M */ + case 0x18: /* 100G AOC or 25GAUI C2M AOC. */ + return TRANSVR_CLASS_OPTICAL_25G_AOC; + + case 0x02: /* 100GBASE-SR4 or 25GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_25G_SR; + + case 0x03: /* 100GBASE-LR4 or 25GBASE-LR */ + return TRANSVR_CLASS_OPTICAL_25G_LR; + + case 0x04: /* 100GBASE-ER4 or 25GBASE-ER */ + return TRANSVR_CLASS_OPTICAL_25G_ER; + + case 0x08: /* 100G ACC (Active Copper Cable) or 25GAUI C2M ACC. */ + case 0x0b: /* 100GBASE-CR4 or 25GBASE-CR CA-L */ + case 0x0c: /* 25GBASE-CR CA-S */ + case 0x0d: /* 25GBASE-CR CA-N */ + case 0x19: /* 100G ACC or 25GAUI C2M ACC. */ + return TRANSVR_CLASS_COPPER_L1_25G; + + default: + break; + } + SWPS_INFO("%s: Unexcept value:0x%02x\n :%s", + __func__, detect_val, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_sfp_detect_class_by_10_ethernet(struct transvr_obj_s* self) { + /* Reference: SFF-8472 (v12.2) + */ + int detect_val = DEBUG_TRANSVR_INT_VAL; + + detect_val = _sfp_get_comp_10g_eth_comp(self); + /* Case: Unspecified */ + if (detect_val == 0x00) { + return TRANSVR_CLASS_UNSPECIFIED; + } + /* Case: 10G Optical (x1) */ + if ((detect_val & 0x10) == 0x10) { /* 00010000 : 10GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_10G_S_SR; + } + if ( ((detect_val & 0x20) == 0x20) || /* 00100000 : 10GBASE-LR */ + ((detect_val & 0x40) == 0x40) ){ /* 01000000 : 10GBASE-LRM */ + return TRANSVR_CLASS_OPTICAL_10G_S_LR; + } + if ((detect_val & 0x80) == 0x80) { /* 10000000 : 10GBASE-ER */ + return TRANSVR_CLASS_OPTICAL_10G_S_ER; + } + /* Case: ERROR */ + SWPS_INFO("%s: Unexcept value:0x%02x\n :%s", + __func__, detect_val, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_sfp_detect_if_sp_by_br(struct transvr_obj_s* self) { + + int lower_bound_1g = 0x0b; + int upper_bound_1g = 0x1A; + int lower_bound_10g = 0x60; + int upper_bound_10g = 0x75; + int lower_bound_25g = 0xf0; + int upper_bound_25g = 0xff; + int notmal_br = DEBUG_TRANSVR_INT_VAL; + + notmal_br = (int)(self->br); /* updated by update_all() */ + /* Check 25G */ + if ((notmal_br >= lower_bound_25g) && + (notmal_br <= upper_bound_25g) ) { + return TRANSVR_CLASS_25G; + } + /* Check 10G */ + if ((notmal_br >= lower_bound_10g) && + (notmal_br <= upper_bound_10g) ) { + return TRANSVR_CLASS_10G; + } + /* Check 1G */ + if ((notmal_br >= lower_bound_1g) && + (notmal_br <= upper_bound_1g) ) { + return TRANSVR_CLASS_1G; + } + return TRANSVR_CLASS_UNSPECIFIED; +} + + +int +_sfp_detect_class_by_1g_ethernet(struct transvr_obj_s* self) { + /* Reference: SFF-8472 (v12.2) + */ + int detect_val = DEBUG_TRANSVR_INT_VAL; + int speed_br = DEBUG_TRANSVR_INT_VAL; + int speed_tmp = DEBUG_TRANSVR_INT_VAL; + char err_str[64] = DEBUG_TRANSVR_STR_VAL; + + speed_br = _sfp_detect_if_sp_by_br(self); + detect_val = _sfp_get_comp_1g_eth_comp(self); + + if (detect_val < 0) { + snprintf(err_str, sizeof(err_str), "Detect abnormal value:%d", detect_val); + goto err_p_sfp_detect_class_by_1g_ethernet; + } + /* Case: Unspecified */ + if (detect_val == 0x00) { + return TRANSVR_CLASS_UNSPECIFIED; + } + /* Case: 1G (x1) */ + if ((detect_val & 0x01) == 0x01) { /* 00000001 : 1000BASE-SX */ + speed_tmp = TRANSVR_CLASS_OPTICAL_1G_SX; + goto ok_sfp_detect_class_by_1g_ethernet_4_check_br_10g; + } + if ((detect_val & 0x02) == 0x02) { /* 00000010 : 1000BASE-LX *3 */ + speed_tmp = TRANSVR_CLASS_OPTICAL_1G_LX; + goto ok_sfp_detect_class_by_1g_ethernet_4_check_br_10g; + } + if ((detect_val & 0x04) == 0x04) { /* 00000100 : 1000BASE-CX */ + speed_tmp = TRANSVR_CLASS_COPPER_L1_1G; + goto ok_sfp_detect_class_by_1g_ethernet_4_check_br_10g; + } + /* Case: 1000 Base-T (x1) */ + if ((detect_val & 0x08) == 0x08) { /* 00001000 : 1000BASE-T */ + return TRANSVR_CLASS_BASE_T_1000; + } + /* Case: 100 Base */ + if ( ((detect_val & 0x10) == 0x10) || /* 00010000 : 100BASE-LX/LX10 */ + ((detect_val & 0x20) == 0x20) || /* 00100000 : 100BASE-FX */ + ((detect_val & 0x40) == 0x40) || /* 01000000 : BASE-BX10 *3 */ + ((detect_val & 0x80) == 0x80) ){ /* 10000000 : BASE-PX *3 */ + return TRANSVR_CLASS_OPTICAL_100; + } + /* Case: ERROR */ + snprintf(err_str, sizeof(err_str), "Case:ERROR, value:%d", detect_val); + goto err_p_sfp_detect_class_by_1g_ethernet; + +ok_sfp_detect_class_by_1g_ethernet_4_check_br_10g: + switch (speed_br) { + case TRANSVR_CLASS_UNSPECIFIED: + case TRANSVR_CLASS_1G: + return speed_tmp; + case TRANSVR_CLASS_10G: + goto ok_sfp_detect_class_by_1g_ethernet_4_transfer_10G; + } + +ok_sfp_detect_class_by_1g_ethernet_4_transfer_10G: + switch (speed_tmp) { + case TRANSVR_CLASS_OPTICAL_1G_SX: + return TRANSVR_CLASS_OPTICAL_10G_S_SR; + case TRANSVR_CLASS_OPTICAL_1G_LX: + return TRANSVR_CLASS_OPTICAL_10G_S_LR; + case TRANSVR_CLASS_COPPER_L1_1G: + return TRANSVR_CLASS_COPPER_L1_10G; + default: + break; + } + snprintf(err_str, sizeof(err_str), "transfer_1to10 fail, speed:%d", speed_tmp); + goto err_p_sfp_detect_class_by_1g_ethernet; + +err_p_sfp_detect_class_by_1g_ethernet: + SWPS_INFO("%s: %s :%s", __func__, err_str, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_sfp_detect_class_by_feature(struct transvr_obj_s* self) { + /* Reference: SFF-8024 (v3.8) + */ + int is_active = 0; + int conn_val = DEBUG_TRANSVR_INT_VAL; + int check_val = DEBUG_TRANSVR_INT_VAL; + int wave_len = DEBUG_TRANSVR_INT_VAL; + int speed_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + speed_val = _sfp_detect_if_sp_by_br(self); + conn_val = _sfp_get_connector_type(self); + + switch(conn_val) { + case 0x00: /* Unspecified */ + goto ok_sfp_detect_class_by_feature_4_check_active_passive; + case 0x07: /* LC (Lucent Connector) */ + case 0x0b: /* Optical Pigtail */ + case 0x0c: /* MPO 1x12 */ + case 0x0d: /* MPO 2x16 */ + /* + * ToDo: Need verify Optical Pigtail + */ + goto ok_sfp_detect_class_by_feature_4_optiocal; + case 0x21: /* Copper pigtail */ + /* + * ToDo: Need check ACC use case + */ + goto ok_sfp_detect_class_by_feature_4_check_active_passive; + case 0x23: /* No separable connector */ + /* + * ToDo: Standard not clear, not all transceiver vendor + * have the same defined + */ + goto ok_sfp_detect_class_by_feature_4_check_active_passive; + default: + break; + } + goto ok_sfp_detect_class_by_feature_4_unknow; + +ok_sfp_detect_class_by_feature_4_check_active_passive: + check_val = _sfp_get_cable_tech(self); + switch(check_val) { + case 0x00: /* Unspecified */ + goto ok_sfp_detect_class_by_feature_4_unknow; + case 0x04: /* Passive */ + goto ok_sfp_detect_class_by_feature_4_copper; + case 0x08: /* Active */ + is_active = 1; + goto ok_sfp_detect_class_by_feature_4_aoc; + default: + snprintf(err_msg, sizeof(err_msg), + "_sfp_get_cable_tech return Non define value:%d", + check_val); + break; + } + goto err_sfp_detect_class_by_feature_1; + +ok_sfp_detect_class_by_feature_4_optiocal: + wave_len = _common_count_wavelength(self, + self->wavelength[0], + self->wavelength[1]); + switch(speed_val) { + case TRANSVR_CLASS_25G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_25G_SR; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_25G_LR; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_25G_ER; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_25G; + + case TRANSVR_CLASS_10G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_10G_S_SR; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_10G_S_LR; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_10G_S_ER; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_10G; + + case TRANSVR_CLASS_1G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_1G_SX; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_1G_LX; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_1G_EX; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_1G; + + default: + return TRANSVR_CLASS_OPTICAL; + } + +ok_sfp_detect_class_by_feature_4_aoc: + switch(speed_val) { + case TRANSVR_CLASS_25G: + return TRANSVR_CLASS_OPTICAL_25G_AOC; + case TRANSVR_CLASS_10G: + return TRANSVR_CLASS_OPTICAL_10G_S_AOC; + case TRANSVR_CLASS_1G: + return TRANSVR_CLASS_OPTICAL_1G_AOC; + default: + break; + } + goto ok_sfp_detect_class_by_feature_4_unknow; + +ok_sfp_detect_class_by_feature_4_copper: + switch(speed_val) { + case TRANSVR_CLASS_25G: + return TRANSVR_CLASS_COPPER_L1_25G; + case TRANSVR_CLASS_10G: + return TRANSVR_CLASS_COPPER_L1_10G; + case TRANSVR_CLASS_1G: + return TRANSVR_CLASS_COPPER_L1_1G; + default: + return TRANSVR_CLASS_COPPER; + } + +ok_sfp_detect_class_by_feature_4_unknow: + return TRANSVR_CLASS_UNSPECIFIED; + +err_sfp_detect_class_by_feature_1: + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +sft_detect_transvr_class(struct transvr_obj_s* self) { + + int detect_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Check Extended Compliance */ + detect_val = _sfp_detect_class_by_extend_comp(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_COPPER_L1_25G: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined extend_comp:%d", + detect_val); + goto err_sft_detect_transceiver_class_1; + } + /* Check 10G Compliance */ + detect_val = _sfp_detect_class_by_10_ethernet(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined 10G_eth:%d", + detect_val); + goto err_sft_detect_transceiver_class_1; + } + /* Check 1G Compliance */ + detect_val = _sfp_detect_class_by_1g_ethernet(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_COPPER_L1_1G: + case TRANSVR_CLASS_BASE_T_1000: + case TRANSVR_CLASS_OPTICAL_100: + /* + * ToDo: Need Check 0.1G + */ + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_COPPER_L1_10G: + /* Transfer speed case + * => Example: Raycom 10G DAC + */ + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined 1G_eth:%d", + detect_val); + goto err_sft_detect_transceiver_class_1; + } + /* Check by connector, br, wavelength */ + detect_val = _sfp_detect_class_by_feature(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL: + case TRANSVR_CLASS_OPTICAL_1G: + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_OPTICAL_1G_EX: + case TRANSVR_CLASS_OPTICAL_1G_AOC: + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + case TRANSVR_CLASS_OPTICAL_10G_S_AOC: + case TRANSVR_CLASS_OPTICAL_25G: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_COPPER: + case TRANSVR_CLASS_COPPER_L1_1G: + case TRANSVR_CLASS_COPPER_L1_10G: + case TRANSVR_CLASS_COPPER_L1_25G: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined get_connector:%d", + detect_val); + goto err_sft_detect_transceiver_class_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_sft_detect_transceiver_class_1; + +err_sft_detect_transceiver_class_1: + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_sfp_set_trident2_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result){ + + int lmax = 8; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + switch(transvr_cls) { + case TRANSVR_CLASS_ERROR: + case TRANSVR_CLASS_UNSPECIFIED: + break; + /* 25G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_25G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 25G COPPER */ + case TRANSVR_CLASS_COPPER_L1_25G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 10G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_10G_S_AOC: + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + case TRANSVR_CLASS_OPTICAL_10G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 10G COPPER */ + case TRANSVR_CLASS_COPPER_L1_10G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 1G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_1G_AOC: + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_OPTICAL_1G_EX: + case TRANSVR_CLASS_OPTICAL_1G: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 1G COPPER */ + case TRANSVR_CLASS_COPPER_L1_1G: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 1G BASE_T */ + case TRANSVR_CLASS_BASE_T_1000: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 100 Base */ + case TRANSVR_CLASS_OPTICAL_100: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + transvr_cls); + goto err_sfp_set_trident2_if_type_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_sfp_set_trident2_if_type_1; + +err_sfp_set_trident2_if_type_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +_sfp_set_tomahawk_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result) { + + int lmax = 8; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + switch(transvr_cls) { + case TRANSVR_CLASS_ERROR: + case TRANSVR_CLASS_UNSPECIFIED: + break; + /* 25G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_25G: + return snprintf(result, lmax, TRANSVR_IF_SR); + /* 25G COPPER */ + case TRANSVR_CLASS_COPPER_L1_25G: + return snprintf(result, lmax, TRANSVR_IF_KR); + /* 10G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_10G_S_AOC: + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + case TRANSVR_CLASS_OPTICAL_10G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 10G COPPER */ + case TRANSVR_CLASS_COPPER_L1_10G: + return snprintf(result, lmax, TRANSVR_IF_SFI); + /* 1G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_1G_AOC: + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_OPTICAL_1G_EX: + case TRANSVR_CLASS_OPTICAL_1G: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 1G COPPER */ + case TRANSVR_CLASS_COPPER_L1_1G: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 1G BASE_T */ + case TRANSVR_CLASS_BASE_T_1000: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + /* 100 Base */ + case TRANSVR_CLASS_OPTICAL_100: + return snprintf(result, lmax, TRANSVR_IF_IF_GMII); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + transvr_cls); + goto err_sfp_set_tomahawk_if_type_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_sfp_set_tomahawk_if_type_1; + +err_sfp_set_tomahawk_if_type_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +_sfp_set_bf_tofino_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result) { + /* (TBD) + * Due to BF looks like doesn't have interface type. + * We bypass it currently. + */ + int lmax = 8; + return snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); +} + + +int +_sfp_detect_if_type(struct transvr_obj_s* self, + char *result){ + + int lmax = 8; + int detect_cls = DEBUG_TRANSVR_INT_VAL; + + detect_cls = sft_detect_transvr_class(self); + switch (self->chipset_type) { + case BCM_CHIP_TYPE_TRIDENT_2: + return _sfp_set_trident2_if_type(self, detect_cls, result); + + case BCM_CHIP_TYPE_TRIDENT_3: + case BCM_CHIP_TYPE_TOMAHAWK: + return _sfp_set_tomahawk_if_type(self, detect_cls, result); + + case BF_CHIP_TYPE_TOFINO: + return _sfp_set_bf_tofino_if_type(self, detect_cls, result); + + default: + SWPS_INFO("%s: non-defined chipset_type:%d :%s\n", + __func__, self->chipset_type, self->swp_name); + break; + } + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + return ERR_TRANSVR_ABNORMAL; +} + + +int +sfp_get_if_type(struct transvr_obj_s *self, + char *buf_p){ + + int lmax = 16; + char tmp_result[16] = DEBUG_TRANSVR_STR_VAL; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return snprintf(buf_p, lmax, "%d\n", self->state); + } + if (_sfp_detect_if_type(self, tmp_result) < 0) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, lmax, "%s\n", tmp_result); +} + + +int +_sfp_detect_if_speed(struct transvr_obj_s* self, + char *result){ + + int lmax = 16; + int detect_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + detect_val = sft_detect_transvr_class(self); + switch(detect_val) { + case TRANSVR_CLASS_ERROR: + case TRANSVR_CLASS_UNSPECIFIED: + break; + /* 25G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_25G: + return snprintf(result, lmax, TRANSVR_IF_SP_25G); + /* 25G COPPER */ + case TRANSVR_CLASS_COPPER_L1_25G: + return snprintf(result, lmax, TRANSVR_IF_SP_25G); + /* 10G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_10G_S_AOC: + case TRANSVR_CLASS_OPTICAL_10G_S_SR: + case TRANSVR_CLASS_OPTICAL_10G_S_LR: + case TRANSVR_CLASS_OPTICAL_10G_S_ER: + case TRANSVR_CLASS_OPTICAL_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + /* 10G COPPER */ + case TRANSVR_CLASS_COPPER_L1_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + /* 1G OPTICAL */ + case TRANSVR_CLASS_OPTICAL_1G_AOC: + case TRANSVR_CLASS_OPTICAL_1G_SX: + case TRANSVR_CLASS_OPTICAL_1G_LX: + case TRANSVR_CLASS_OPTICAL_1G_EX: + case TRANSVR_CLASS_OPTICAL_1G: + return snprintf(result, lmax, TRANSVR_IF_SP_1G); + /* 1G COPPER */ + case TRANSVR_CLASS_COPPER_L1_1G: + return snprintf(result, lmax, TRANSVR_IF_SP_1G); + /* 1G BASE_T */ + case TRANSVR_CLASS_BASE_T_1000: + return snprintf(result, lmax, TRANSVR_IF_SP_1G); + /* 100 Base */ + case TRANSVR_CLASS_OPTICAL_100: + return snprintf(result, lmax, TRANSVR_IF_SP_100); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + detect_val); + goto err_sfp_detect_if_speed_1; + } + /* Check by BR */ + detect_val = _sfp_detect_if_sp_by_br(self); + switch (detect_val) { + case TRANSVR_CLASS_25G: + return snprintf(result, lmax, TRANSVR_IF_SP_25G); + case TRANSVR_CLASS_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + case TRANSVR_CLASS_1G: + return snprintf(result, lmax, TRANSVR_IF_SP_1G); + default: + break; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_sfp_detect_if_speed_1; + +err_sfp_detect_if_speed_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s %s\n :%s", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +sfp_get_if_speed(struct transvr_obj_s *self, + char *buf_p){ + + int lmax = 16; + char tmp_result[16] = DEBUG_TRANSVR_STR_VAL; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return snprintf(buf_p, lmax, "%d\n", self->state); + } + if (_sfp_detect_if_speed(self, tmp_result) < 0) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, lmax, "%s\n", tmp_result); +} + + +int +_qsfp_detect_class_by_extend_comp(struct transvr_obj_s* self) { + /* Reference: SFF-8024 (v3.8) + */ + int detect_val = DEBUG_TRANSVR_INT_VAL; + + detect_val = _qsfp_get_comp_extended(self); + switch(detect_val) { + case 0x00: /* Unspecified */ + return TRANSVR_CLASS_UNSPECIFIED; + + case 0x01: /* 100G AOC (Active Optical Cable) or 25GAUI C2M */ + case 0x18: /* 100G AOC or 25GAUI C2M AOC. */ + return TRANSVR_CLASS_OPTICAL_100G_AOC; + + case 0x06: /* 100G CWDM4 */ + case 0x09: /* Obsolete (assigned before 100G CWDM4 MSA required FEC) */ + case 0x17: /* 100G CLR4 */ + case 0x1A: /* 100GE-DWDM2 */ + return TRANSVR_CLASS_OPTICAL_100G; + + case 0x02: /* 100GBASE-SR4 or 25GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_100G_SR4; + + case 0x03: /* 100GBASE-LR4 or 25GBASE-LR */ + return TRANSVR_CLASS_OPTICAL_100G_LR4; + + case 0x04: /* 100GBASE-ER4 or 25GBASE-ER */ + return TRANSVR_CLASS_OPTICAL_100G_ER4; + + case 0x07: /* 100G PSM4 Parallel SMF */ + return TRANSVR_CLASS_OPTICAL_100G_PSM4; + + case 0x12: /* 40G PSM4 Parallel SMF */ + return TRANSVR_CLASS_OPTICAL_40G; + + case 0x11: /* 4 x 10GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_40G_SR4; + + case 0x10: /* 40GBASE-ER4 */ + return TRANSVR_CLASS_OPTICAL_40G_ER4; + + case 0x08: /* 100G ACC (Active Copper Cable) or 25GAUI C2M ACC. */ + case 0x0b: /* 100GBASE-CR4 or 25GBASE-CR CA-L */ + case 0x19: /* 100G ACC or 25GAUI C2M ACC. */ + return TRANSVR_CLASS_COPPER_L4_100G; + + default: + break; + } + SWPS_INFO("%s: Unexcept value:0x%02x\n :%s", + __func__, detect_val, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_qsfp_detect_class_by_10_40_100_ethernet(struct transvr_obj_s* self) { + /* Reference: SFF-8472 (v12.2) + */ + int detect_val = DEBUG_TRANSVR_INT_VAL; + + detect_val = _qsfp_get_comp_10_40_100_ethernet(self); + /* Case: Unspecified */ + if (detect_val == 0x00) { + return TRANSVR_CLASS_UNSPECIFIED; + } + /* Case: 40G Optical */ + if ((detect_val & 0x01) == 0x01) { /* 00000001 : 40G Active Cable (XLPPI) */ + return TRANSVR_CLASS_OPTICAL_40G_AOC; + } + if ((detect_val & 0x04) == 0x04) { /* 00000100 : 40GBASE-SR4 */ + return TRANSVR_CLASS_OPTICAL_40G_SR4; + } + if ( (detect_val & 0x02) == 0x02) { /* 00000010 : 40GBASE-LR4 */ + return TRANSVR_CLASS_OPTICAL_40G_LR4; + } + if ( (detect_val & 0x08) == 0x08) { /* 00001000 : 40GBASE-CR4 */ + return TRANSVR_CLASS_COPPER_L4_40G; + } + /* Case: 10G Optical */ + if ( (detect_val & 0x10) == 0x10) { /* 00010000 : 10GBASE-SR */ + return TRANSVR_CLASS_OPTICAL_10G_Q_SR; + } + if ( ((detect_val & 0x20) == 0x20) || /* 00100000 : 10GBASE-LR */ + ((detect_val & 0x40) == 0x40) ){ /* 01000000 : 10GBASE-LRM */ + return TRANSVR_CLASS_OPTICAL_10G_Q_LR; + } + /* Case: Extend Compliance */ + if ( ((detect_val & 0x80) == 0x80) ){ /* 10000000 : Use Extend Compliance */ + return TRANSVR_CLASS_EXTEND_COMP; + } + /* Case: ERROR */ + SWPS_INFO("%s: Unexcept value:0x%02x\n :%s", + __func__, detect_val, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_qsfp_detect_if_sp_by_br(struct transvr_obj_s* self) { + + int lower_bound_10g = 0x10; + int upper_bound_10g = 0x25; + int lower_bound_40g = 0x60; + int upper_bound_40g = 0x75; + int lower_bound_100g = 0x60; + int upper_bound_100g = 0x75; + int used_extend_br = 0xff; + int notmal_br = DEBUG_TRANSVR_INT_VAL; + int extend_br = DEBUG_TRANSVR_INT_VAL; + + notmal_br = (int)(self->br); /* updated by update_all() */ + /* Check 40G */ + if ((notmal_br >= lower_bound_40g) && + (notmal_br <= upper_bound_40g) ) { + return TRANSVR_CLASS_40G; + } + /* Check 100G */ + if (notmal_br == used_extend_br) { + extend_br = (int)(self->extbr); /* updated by update_all() */ + if ((extend_br >= lower_bound_100g) && + (extend_br <= upper_bound_100g) ) { + return TRANSVR_CLASS_100G; + } + } + /* Check 10G */ + if ((notmal_br >= lower_bound_10g) && + (notmal_br <= upper_bound_10g) ) { + return TRANSVR_CLASS_10G; + } + return TRANSVR_CLASS_UNSPECIFIED; +} + + +int +_qsfp_detect_class_by_feature(struct transvr_obj_s* self) { + /* Reference: SFF-8024 (v3.8) + */ + int conn_val = DEBUG_TRANSVR_INT_VAL; + int wave_len = DEBUG_TRANSVR_INT_VAL; + int speed_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + speed_val = _qsfp_detect_if_sp_by_br(self); + conn_val = _qsfp_get_connector_type(self); + + switch(conn_val) { + case 0x00: /* Unspecified */ + return TRANSVR_CLASS_UNSPECIFIED; + case 0x07: /* LC (Lucent Connector) */ + case 0x0b: /* Optical Pigtail */ + case 0x0c: /* MPO 1x12 (Multifiber Parallel Optic) */ + case 0x0d: /* MPO 2x16 */ + goto ok_qsfp_detect_class_by_feature_4_optiocal; + case 0x21: /* Copper pigtail */ + goto ok_qsfp_detect_class_by_feature_4_copper; + case 0x23: /* No separable connector */ + if ((_qsfp_get_comp_fc_link_length(self) > 0) || + (_qsfp_get_comp_fc_trans_tech(self) > 0) || + (_qsfp_get_comp_fc_trans_media(self) > 0) || + (_qsfp_get_comp_fc_speed(self) > 0) ) { + goto ok_qsfp_detect_class_by_feature_4_aoc; + } + goto ok_qsfp_detect_class_by_feature_4_copper; + default: + snprintf(err_msg, sizeof(err_msg), + "_qsfp_get_connector_type return Non define value:%d", + conn_val); + goto err_qsfp_detect_class_by_feature_1; + } + return TRANSVR_CLASS_UNSPECIFIED; + +ok_qsfp_detect_class_by_feature_4_optiocal: + wave_len = _common_count_wavelength(self, + self->wavelength[0], + self->wavelength[1]); + switch(speed_val) { + case TRANSVR_CLASS_100G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_100G_SR4; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_100G_LR4; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_100G_ER4; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_100G; + + case TRANSVR_CLASS_40G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_40G_SR4; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_40G_LR4; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_40G_ER4; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_40G; + + case TRANSVR_CLASS_10G: + switch (wave_len) { + case VAL_OPTICAL_WAVELENGTH_SR: + return TRANSVR_CLASS_OPTICAL_10G_Q_SR; + case VAL_OPTICAL_WAVELENGTH_LR: + return TRANSVR_CLASS_OPTICAL_10G_Q_LR; + case VAL_OPTICAL_WAVELENGTH_ER: + return TRANSVR_CLASS_OPTICAL_10G_Q_ER; + default: + break; + } + return TRANSVR_CLASS_OPTICAL_10G; + + default: + return TRANSVR_CLASS_OPTICAL; + } + +ok_qsfp_detect_class_by_feature_4_aoc: + switch(speed_val) { + case TRANSVR_CLASS_100G: + return TRANSVR_CLASS_OPTICAL_100G_AOC; + case TRANSVR_CLASS_40G: + return TRANSVR_CLASS_OPTICAL_40G_AOC; + case TRANSVR_CLASS_10G: + return TRANSVR_CLASS_OPTICAL_10G_Q_AOC; + default: + return TRANSVR_CLASS_OPTICAL; + } + +ok_qsfp_detect_class_by_feature_4_copper: + switch(speed_val) { + case TRANSVR_CLASS_100G: + return TRANSVR_CLASS_COPPER_L4_100G; + case TRANSVR_CLASS_40G: + return TRANSVR_CLASS_COPPER_L4_40G; + case TRANSVR_CLASS_10G: + return TRANSVR_CLASS_COPPER_L4_10G; + default: + return TRANSVR_CLASS_COPPER; + } + +err_qsfp_detect_class_by_feature_1: + SWPS_INFO("%s: %s\n :%s", + __func__, err_msg, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +qsft_detect_transvr_class(struct transvr_obj_s* self) { + + int detect_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Check Extended Compliance */ + detect_val = _qsfp_detect_class_by_extend_comp(self); + switch (detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + case TRANSVR_CLASS_COPPER_L4_100G: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined extend_comp:%d", + detect_val); + goto err_qsft_detect_transvr_class_1; + } + /* Check 10/40G/100G Ethernet Compliance */ + detect_val = _qsfp_detect_class_by_10_40_100_ethernet(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_COPPER_L4_40G: + return detect_val; + case TRANSVR_CLASS_EXTEND_COMP: + /* Format incorrect case (We already checked the Extend + * Compliance is 0 + */ + snprintf(err_msg, sizeof(err_msg), + "Transceiver format incorrect"); + goto err_qsft_detect_transvr_class_1; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined 10/40/100:%d", + detect_val); + goto err_qsft_detect_transvr_class_1; + } + /* Check by Connector type, BR and wavelength */ + detect_val = _qsfp_detect_class_by_feature(self); + switch (detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_10G_Q_ER: + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: + case TRANSVR_CLASS_OPTICAL_10G_Q_AOC: + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL: + case TRANSVR_CLASS_COPPER_L4_100G: + case TRANSVR_CLASS_COPPER_L4_40G: + case TRANSVR_CLASS_COPPER_L4_10G: + case TRANSVR_CLASS_COPPER: + return detect_val; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined connector:%d", + detect_val); + goto err_qsft_detect_transvr_class_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), + "Can not identify!"); + goto err_qsft_detect_transvr_class_1; + +err_qsft_detect_transvr_class_1: + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return TRANSVR_CLASS_ERROR; +} + + +int +_qsfp_set_trident2_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result){ + + int lmax = 8; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + switch (transvr_cls) { + case TRANSVR_CLASS_UNSPECIFIED: + case TRANSVR_CLASS_ERROR: + break; + /* 100G Optical */ + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* 100G Copper */ + case TRANSVR_CLASS_COPPER_L4_100G: + return snprintf(result, lmax, TRANSVR_IF_KR4); + /* 40G Optical */ + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + /* 40G Copper */ + case TRANSVR_CLASS_COPPER_L4_40G: + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + /* 10G Optical */ + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL_10G_Q_AOC: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: /* Need Check: LR4 or LR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_ER: /* Need Check: ER4 or ER */ + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + /* Optical */ + case TRANSVR_CLASS_OPTICAL: + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + /* Copper */ + case TRANSVR_CLASS_COPPER: + return snprintf(result, lmax, TRANSVR_IF_IF_XGMII); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + transvr_cls); + goto err_qsfp_set_trident2_if_type_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_qsfp_set_trident2_if_type_1; + +err_qsfp_set_trident2_if_type_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +_qsfp_set_tomahawk_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result){ + + int lmax = 8; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + switch (transvr_cls) { + case TRANSVR_CLASS_UNSPECIFIED: + case TRANSVR_CLASS_ERROR: + break; + /* 100G Optical */ + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* 100G Copper */ + case TRANSVR_CLASS_COPPER_L4_100G: + return snprintf(result, lmax, TRANSVR_IF_KR4); + /* 40G Optical */ + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* 40G Copper */ + case TRANSVR_CLASS_COPPER_L4_40G: + return snprintf(result, lmax, TRANSVR_IF_KR4); + /* 10G Optical */ + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL_10G_Q_AOC: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_ER: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* Optical */ + case TRANSVR_CLASS_OPTICAL: + return snprintf(result, lmax, TRANSVR_IF_SR4); + /* Copper */ + case TRANSVR_CLASS_COPPER: + return snprintf(result, lmax, TRANSVR_IF_KR4); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined value:%d", + transvr_cls); + goto err_qsfp_set_trident2_if_type_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_qsfp_set_trident2_if_type_1; + +err_qsfp_set_trident2_if_type_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s\n :%s", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +_qsfp_set_bf_tofino_if_type(struct transvr_obj_s* self, + int transvr_cls, + char *result) { + /* (TBD) + * Due to BF looks like doesn't have interface type. + * We bypass it currently. + */ + int lmax = 8; + return snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); +} + + +int +_qsfp_detect_if_type(struct transvr_obj_s* self, + char *result){ + + int lmax = 8; + int detect_cls = DEBUG_TRANSVR_INT_VAL; + + detect_cls = qsft_detect_transvr_class(self); + switch (self->chipset_type) { + case BCM_CHIP_TYPE_TRIDENT_2: + return _qsfp_set_trident2_if_type(self, detect_cls, result); + + case BCM_CHIP_TYPE_TRIDENT_3: + case BCM_CHIP_TYPE_TOMAHAWK: + return _qsfp_set_tomahawk_if_type(self, detect_cls, result); + + case BF_CHIP_TYPE_TOFINO: + return _qsfp_set_bf_tofino_if_type(self, detect_cls, result); + + default: + SWPS_INFO("%s: non-defined chipset_type:%d :%s\n", + __func__, self->chipset_type, self->swp_name); + break; + } + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + return ERR_TRANSVR_ABNORMAL; +} + + +int +qsfp_get_if_type(struct transvr_obj_s *self, + char *buf_p){ + + int lmax = 8; + char tmp_result[8] = DEBUG_TRANSVR_STR_VAL; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return snprintf(buf_p, lmax, "%d\n", self->state); + } + if (_qsfp_detect_if_type(self, tmp_result) < 0) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, lmax, "%s\n", tmp_result); +} + + +int +_qsfp_detect_if_speed(struct transvr_obj_s* self, + char *result){ + int lmax = 16; + int detect_val = DEBUG_TRANSVR_INT_VAL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + detect_val = qsft_detect_transvr_class(self); + switch (detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + case TRANSVR_CLASS_ERROR: + break; + /* 100G Optical */ + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + return snprintf(result, lmax, TRANSVR_IF_SP_100G); + /* 100G Copper */ + case TRANSVR_CLASS_COPPER_L4_100G: + return snprintf(result, lmax, TRANSVR_IF_SP_100G); + /* 40G Optical */ + case TRANSVR_CLASS_OPTICAL_40G: + case TRANSVR_CLASS_OPTICAL_40G_AOC: + case TRANSVR_CLASS_OPTICAL_40G_SR4: + case TRANSVR_CLASS_OPTICAL_40G_LR4: + case TRANSVR_CLASS_OPTICAL_40G_ER4: + return snprintf(result, lmax, TRANSVR_IF_SP_40G); + /* 40G Copper */ + case TRANSVR_CLASS_COPPER_L4_40G: + return snprintf(result, lmax, TRANSVR_IF_SP_40G); + /* 10G Optical */ + case TRANSVR_CLASS_OPTICAL_10G: + case TRANSVR_CLASS_OPTICAL_10G_Q_AOC: + case TRANSVR_CLASS_OPTICAL_10G_Q_SR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_LR: /* Need Check: SR4 or SR */ + case TRANSVR_CLASS_OPTICAL_10G_Q_ER: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + /* 10G Copper */ + case TRANSVR_CLASS_COPPER_L4_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + /* Optical */ + case TRANSVR_CLASS_OPTICAL: + break; + /* Copper */ + case TRANSVR_CLASS_COPPER: + break; + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined class case:%d", + detect_val); + goto err_qsfp_detect_if_speed_1; + } + /* Check br and extbr */ + detect_val = _qsfp_detect_if_sp_by_br(self); + switch(detect_val) { + case TRANSVR_CLASS_UNSPECIFIED: + break; + case TRANSVR_CLASS_10G: + return snprintf(result, lmax, TRANSVR_IF_SP_10G); + case TRANSVR_CLASS_40G: + return snprintf(result, lmax, TRANSVR_IF_SP_40G); + case TRANSVR_CLASS_100G: + return snprintf(result, lmax, TRANSVR_IF_SP_100G); + default: + snprintf(err_msg, sizeof(err_msg), + "Detect undefined BR case:%d", + detect_val); + goto err_qsfp_detect_if_speed_1; + } + /* Exception case: Can't verify */ + snprintf(err_msg, sizeof(err_msg), "Can not identify!"); + goto err_qsfp_detect_if_speed_1; + +err_qsfp_detect_if_speed_1: + snprintf(result, lmax, TRANSVR_UEVENT_UNKNOW); + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + return ERR_TRANSVR_ABNORMAL; +} + + +int +qsfp_get_if_speed(struct transvr_obj_s *self, + char *buf_p){ + + int lmax = 16; + char tmp_result[16] = DEBUG_TRANSVR_STR_VAL; + + if (self->state != STATE_TRANSVR_CONNECTED) { + return snprintf(buf_p, lmax, "%d\n", self->state); + } + if (_qsfp_detect_if_speed(self, tmp_result) < 0) { + return snprintf(buf_p, lmax, "%d\n", ERR_TRANSVR_ABNORMAL); + } + return snprintf(buf_p, lmax, "%s\n", tmp_result); +} + + +int +_common_set_lane_map_str(struct transvr_obj_s* self, + char *result) { + int i = 0; + int tmp_val = 0; + char tmp_str[LEN_TRANSVR_L_STR] = DEBUG_TRANSVR_STR_VAL; + char err_msg[LEN_TRANSVR_L_STR] = DEBUG_TRANSVR_STR_VAL; + + memset(result, 0, LEN_TRANSVR_L_STR); + snprintf(result, LEN_TRANSVR_L_STR, "%s=", TRANSVR_UEVENT_KEY_LANE); + + for (i=0; ilane_id); i++) { + tmp_val = self->lane_id[i]; + if (tmp_val < 1) { + break; + } + if (tmp_val > 256) { + snprintf(err_msg, sizeof(err_msg), + "detect abnormal value:%d", tmp_val); + goto err_common_set_lane_map_str_1; + } + memset(tmp_str, 0, sizeof(tmp_str)); + if (i == 0) { + snprintf(tmp_str, LEN_TRANSVR_L_STR, "%d", tmp_val); + } else { + snprintf(tmp_str, LEN_TRANSVR_L_STR, ",%d", tmp_val); + } + strncat(result, tmp_str, LEN_TRANSVR_L_STR); + } + if (i == 0) { + goto err_common_set_lane_map_str_2; + } + return 0; + +err_common_set_lane_map_str_1: + SWPS_INFO("%s: %s", __func__, err_msg); +err_common_set_lane_map_str_2: + snprintf(result, LEN_TRANSVR_L_STR, "%s=%s", TRANSVR_UEVENT_KEY_LANE, TRANSVR_UEVENT_UNKNOW); + return EVENT_TRANSVR_TASK_FAIL; +} + + +int +_common_send_uevent(struct transvr_obj_s* self, + enum kobject_action u_action, + int (*detect_if_type)(struct transvr_obj_s *self, char *result), + int (*detect_if_speed)(struct transvr_obj_s *self, char *result), + int send_anyway) { + + char *uevent_envp[4]; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + char tmp_str[32] = DEBUG_TRANSVR_STR_VAL; + char tmp_str_1[32] = DEBUG_TRANSVR_STR_VAL; + char tmp_str_2[32] = DEBUG_TRANSVR_STR_VAL; + char tmp_str_3[64] = DEBUG_TRANSVR_STR_VAL; + + if (TRANSVR_UEVENT_ENABLE != 1) { + return ERR_TRANSVR_NOTSUPPORT; + } + if (_common_get_if_lane(self, tmp_str) < 0) { + snprintf(tmp_str_3, sizeof(tmp_str_3), + "%s=%s", TRANSVR_UEVENT_KEY_LANE, TRANSVR_UEVENT_UNKNOW); + } else { + snprintf(tmp_str_3, sizeof(tmp_str_3), + "%s=%s", TRANSVR_UEVENT_KEY_LANE, tmp_str); + } + switch (u_action) { + case KOBJ_ADD: + /* Detect type */ + if (detect_if_type(self, tmp_str) < 0) { + snprintf(err_msg, sizeof(err_msg), "%s", "Detect interface type fail!"); + snprintf(tmp_str_1, sizeof(tmp_str_1), "%s=%s", TRANSVR_UEVENT_KEY_IF, TRANSVR_UEVENT_UNKNOW); + snprintf(tmp_str_2, sizeof(tmp_str_2), "%s=%s", TRANSVR_UEVENT_KEY_SP, TRANSVR_UEVENT_UNKNOW); + uevent_envp[0] = tmp_str_1; + uevent_envp[1] = tmp_str_2; + uevent_envp[2] = tmp_str_3; + uevent_envp[3] = NULL; + goto private_common_send_uevent_4_fail; + } + snprintf(tmp_str_1, sizeof(tmp_str_1), "%s=%s", TRANSVR_UEVENT_KEY_IF, tmp_str); + uevent_envp[0] = tmp_str_1; + /* Detect speed */ + if (detect_if_speed(self, tmp_str) < 0) { + snprintf(err_msg, sizeof(err_msg), "%s", "Detect interface speed fail!"); + snprintf(tmp_str_2, sizeof(tmp_str_2), "%s=%s", TRANSVR_UEVENT_KEY_SP, TRANSVR_UEVENT_UNKNOW); + uevent_envp[1] = tmp_str_2; + uevent_envp[2] = tmp_str_3; + uevent_envp[3] = NULL; + goto private_common_send_uevent_4_fail; + } + snprintf(tmp_str_2, sizeof(tmp_str_2), "%s=%s", TRANSVR_UEVENT_KEY_SP, tmp_str); + uevent_envp[1] = tmp_str_2; + uevent_envp[2] = tmp_str_3; + uevent_envp[3] = NULL; + goto private_common_send_uevent_4_send; + + case KOBJ_REMOVE: + snprintf(tmp_str_1, sizeof(tmp_str_1), "%s=%s", TRANSVR_UEVENT_KEY_IF, TRANSVR_UEVENT_UNKNOW); + snprintf(tmp_str_2, sizeof(tmp_str_2), "%s=%s", TRANSVR_UEVENT_KEY_SP, TRANSVR_UEVENT_UNKNOW); + uevent_envp[0] = tmp_str_1; + uevent_envp[1] = tmp_str_2; + uevent_envp[2] = tmp_str_3; + uevent_envp[3] = NULL; + goto private_common_send_uevent_4_send; + + default: + snprintf(err_msg, sizeof(err_msg), "kobject_action:%d not support", u_action); + goto private_common_send_uevent_4_fail; + } + snprintf(err_msg, sizeof(err_msg), "%s", "Exception case"); + goto private_common_send_uevent_4_fail; + +private_common_send_uevent_4_fail: + SWPS_INFO("%s: %s :%s\n", __func__, err_msg, self->swp_name); + if (send_anyway) { + goto private_common_send_uevent_4_send; + } + return ERR_TRANSVR_UEVENT_FAIL; + +private_common_send_uevent_4_send: + return kobject_uevent_env(&(self->transvr_dev_p->kobj), + u_action, + uevent_envp); +} + +int +sfp_send_uevent(struct transvr_obj_s* self, + enum kobject_action u_action) { + int send_anyway = 1; + return _common_send_uevent(self, + u_action, + &_sfp_detect_if_type, + &_sfp_detect_if_speed, + send_anyway); +} + + +int +qsfp_send_uevent(struct transvr_obj_s* self, + enum kobject_action u_action) { + int send_anyway = 1; + return _common_send_uevent(self, + u_action, + &_qsfp_detect_if_type, + &_qsfp_detect_if_speed, + send_anyway); +} + + +int +fake_send_uevent(struct transvr_obj_s* self, + enum kobject_action u_action) { + return EVENT_TRANSVR_TASK_DONE; +} + + +int +common_fsm_4_direct_mode(struct transvr_obj_s* self, + char *caller_name){ + + int err; + int detect_result[2]; + int current_state = STATE_TRANSVR_UNEXCEPTED; + int current_type = TRANSVR_TYPE_ERROR; + + if (self->state == STATE_TRANSVR_NEW) { + if (_transvr_init_handler(self) < 0){ + return ERR_TRANSVR_INIT_FAIL; + } + } + err = detect_transvr_state(self, detect_result); + if (err < 0) { + return err; + } + /* In Direct mode, driver only detect transceiver when user call driver interface + * which on sysfs. So it only need consider the state of Transceiver. + */ + current_state = detect_result[0]; + current_type = detect_result[1]; + + switch (current_state){ + + case STATE_TRANSVR_DISCONNECTED: /* Transceiver is not plugged */ + self->state = current_state; + self->type = current_type; + return ERR_TRANSVR_UNPLUGGED; + + case STATE_TRANSVR_INIT: /* Transceiver is plugged, system not ready */ + return ERR_TRANSVR_UNINIT; + + case STATE_TRANSVR_ISOLATED: /* Transceiver is plugged, but has some issues */ + return ERR_TRNASVR_BE_ISOLATED; + + case STATE_TRANSVR_CONNECTED: /* Transceiver is plugged, system is ready */ + self->state = current_state; + self->type = current_type; + return 0; + + case STATE_TRANSVR_SWAPPED: /* Transceiver is plugged, system detect user changed */ + self->type = current_type; + if (reload_transvr_obj(self, current_type) < 0){ + self->state = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_UNEXCPT; + } + self->state = current_state; + return 0; + + case STATE_TRANSVR_UNEXCEPTED: /* Transceiver type or state is unexpected case */ + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = TRANSVR_TYPE_ERROR; + return ERR_TRANSVR_UNEXCPT; + + default: + SWPS_INFO("%s: state:%d not in define.\n", __func__, current_state); + break; + } + return ERR_TRANSVR_UNEXCPT; +} + + +static int +_is_except_happened_4_pmode(struct transvr_obj_s* self, + int new_state) { + + int event_chk = 0; + + if (self->temp == 0){ + return 0; + } + switch (new_state) { + case STATE_TRANSVR_INIT: + event_chk = EVENT_TRANSVR_EXCEP_INIT; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_CONNECTED: + event_chk = EVENT_TRANSVR_EXCEP_UP; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_DISCONNECTED: + event_chk = EVENT_TRANSVR_EXCEP_DOWN; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_SWAPPED: + event_chk = EVENT_TRANSVR_EXCEP_SWAP; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_UNEXCEPTED: + event_chk = EVENT_TRANSVR_EXCEP_EXCEP; + goto check_event_happened_4_pmode; + + case STATE_TRANSVR_ISOLATED: + event_chk = EVENT_TRANSVR_EXCEP_ISOLATED; + goto check_event_happened_4_pmode; + + default: + SWPS_INFO("%s: unexcepted case:%d\n", __func__, new_state); + break; + } + return 0; + +check_event_happened_4_pmode: + if (self->temp == event_chk){ + return 1; + } + return 0; +} + + +int +common_fsm_4_polling_mode(struct transvr_obj_s* self, + char *caller_name){ + /* [Return Value]: + * ERR_TRANSVR_UNINIT : (1) Initial not ready + * ERR_TRANSVR_UNPLUGGED : (1) Any -> Down + * ERR_TRANSVR_TASK_BUSY : (1) Wait Initial task + * ERR_TRANSVR_UNEXCPT : (1) Initial fail + * (2) Task fail + * (3) Reload fail + * ERR_TRNASVR_BE_ISOLATED : (1) Already be isolated + * OK Case (return 0) : (1) action_4_connected + * (2) action_4_nothing (initial retry) + */ + int curr_state[2]; + int old_state = self->state; + int old_type = self->type; + int new_state = STATE_TRANSVR_UNEXCEPTED; + int new_type = TRANSVR_TYPE_ERROR; + int return_val = ERR_TRANSVR_UNEXCPT; + + /* Never initial */ + if (self->state == STATE_TRANSVR_NEW) { + goto comfsm_action_4_reinit_obj; + } + /* Detect current state */ + switch (detect_transvr_state(self, curr_state)) { + case 0: + new_state = curr_state[0]; + new_type = curr_state[1]; + break; + + case ERR_TRNASVR_BE_ISOLATED: + new_state = STATE_TRANSVR_ISOLATED; + new_type = old_type; + break; + + case ERR_TRANSVR_I2C_CRASH: + goto comfsm_action_4_report_i2c_crash; + + case ERR_TRANSVR_UNEXCPT: + default: + new_state = STATE_TRANSVR_UNEXCEPTED; + new_type = old_type; + } + /* State handling */ + switch (old_state) { + case STATE_TRANSVR_INIT: /* INIT -> */ + return_val = ERR_TRANSVR_UNINIT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: + switch (new_state) { + case STATE_TRANSVR_INIT: /* Case 1-1: UP -> INIT */ + SWPS_INFO("Detect %s is present. :1-1\n",self->swp_name); + return_val = ERR_TRANSVR_UNINIT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: /* Case 1-2: UP -> UP */ + return_val = 0; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_DISCONNECTED: /* Case 1-3: UP -> DOWN */ + SWPS_INFO("Detect %s is removed. :1-3\n",self->swp_name); + goto comfsm_action_4_disconnected; + + case STATE_TRANSVR_SWAPPED: /* Case 1-4: UP -> SWAP */ + SWPS_INFO("Detect %s is swapped. :1-4\n",self->swp_name); + goto comfsm_action_4_reload_obj; + + case STATE_TRANSVR_UNEXCEPTED: /* Case 1-5: UP -> UNEXPET */ + SWPS_INFO("Detect %s has error. :1-5\n",self->swp_name); + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_ISOLATED: /* Case 1-6: UP -> ISOLATE */ + SWPS_INFO("Detect %s be isolated. :1-6\n",self->swp_name); + goto comfsm_action_4_isolate_obj; + + default: + break; + } + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_DISCONNECTED: + switch (new_state) { + case STATE_TRANSVR_INIT: /* Case 2-1: DOWN -> INIT */ + SWPS_INFO("Detect %s is present. :2-1\n",self->swp_name); + return_val = ERR_TRANSVR_UNINIT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: /* Case 2-2: DOWN -> UP */ + SWPS_INFO("Detect %s is present. :2-2\n",self->swp_name); + goto comfsm_action_4_reinit_obj; + + case STATE_TRANSVR_DISCONNECTED: /* Case 2-3: DOWN -> DOWN */ + return_val = ERR_TRANSVR_UNPLUGGED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_SWAPPED: /* Case 2-4: DOWN -> SWAP */ + SWPS_INFO("Detect %s is swapped. :2-4\n",self->swp_name); + goto comfsm_action_4_reload_obj; + + case STATE_TRANSVR_UNEXCEPTED: /* Case 2-5: DOWN -> UNEXPET */ + SWPS_INFO("Detect %s has error. :2-5\n",self->swp_name); + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_ISOLATED: /* Case 2-6: DOWN -> ISOLATE */ + SWPS_INFO("Detect %s be isolated. :2-6\n",self->swp_name); + goto comfsm_action_4_isolate_obj; + + default: + break; + } + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_UNEXCEPTED: + /* Filter out re-action */ + if (_is_except_happened_4_pmode(self, new_state)) { + goto comfsm_action_4_keep_state; + } + /* First action */ + switch (new_state) { + case STATE_TRANSVR_INIT: /* Case 3-1: UNEXPET -> INIT */ + SWPS_INFO("Detect %s is present. :3-1\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_INIT; + return_val = ERR_TRANSVR_UNINIT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: /* Case 3-2: UNEXPET -> UP */ + SWPS_INFO("Detect %s is present. :3-2\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_UP; + goto comfsm_action_4_reload_obj; + + case STATE_TRANSVR_DISCONNECTED: /* Case 3-3: UNEXPET -> DOWN */ + SWPS_INFO("Detect %s is removed. :3-3\n",self->swp_name); + goto comfsm_action_4_disconnected; + + case STATE_TRANSVR_SWAPPED: /* Case 3-4: UNEXPET -> SWAP */ + SWPS_INFO("Detect %s is swapped. :3-4\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_SWAP; + goto comfsm_action_4_reload_obj; + + case STATE_TRANSVR_UNEXCEPTED: /* Case 3-5: UNEXPET -> UNEXPET */ + self->temp = EVENT_TRANSVR_EXCEP_EXCEP; + return_val = ERR_TRANSVR_UNEXCPT; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_ISOLATED: /* Case 3-6: UNEXPET -> ISOLATE */ + SWPS_INFO("Detect %s be isolated. :3-6\n",self->swp_name); + goto comfsm_action_4_isolate_obj; + + default: + break; + } + goto comfsm_action_4_unexpected; + + case STATE_TRANSVR_ISOLATED: + /* Filter out re-action */ + if (_is_except_happened_4_pmode(self, new_state)) { + goto comfsm_action_4_keep_state; + } + /* First action */ + switch (new_state) { + case STATE_TRANSVR_INIT: /* Case 4-1: ISOLATE -> INIT */ + SWPS_INFO("Detect %s internal error. :4-1\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_INIT; + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_CONNECTED: /* Case 4-2: ISOLATE -> UP */ + SWPS_INFO("Detect %s internal error. :4-2\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_UP; + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_DISCONNECTED: /* Case 4-3: ISOLATE -> DOWN */ + SWPS_INFO("Detect %s is removed. :4-3\n",self->swp_name); + goto comfsm_action_4_disconnected; + + case STATE_TRANSVR_SWAPPED: /* Case 4-4: ISOLATE -> SWAP */ + SWPS_INFO("Detect %s internal error. :4-4\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_SWAP; + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_UNEXCEPTED: /* Case 4-5: ISOLATE -> UNEXPET */ + SWPS_INFO("Detect %s internal error. :4-5\n",self->swp_name); + self->temp = EVENT_TRANSVR_EXCEP_EXCEP; + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + case STATE_TRANSVR_ISOLATED: /* Case 4-6: ISOLATE -> ISOLATE */ + return_val = ERR_TRNASVR_BE_ISOLATED; + goto comfsm_action_4_keep_state; + + default: + break; + } + goto comfsm_action_4_unexpected; + + default: + break; + } + goto comfsm_action_4_unexpected; + + +comfsm_action_4_keep_state: + return return_val; + +comfsm_action_4_reinit_obj: + SWPS_DEBUG("FSM action: %s re-initial.\n", self->swp_name); + return_val = _transvr_init_handler(self); + goto comfsm_action_4_identify_event; + +comfsm_action_4_reload_obj: + SWPS_DEBUG("FSM action: %s reload.\n", self->swp_name); + self->type = new_type; + return_val = reload_transvr_obj(self, new_type); + goto comfsm_action_4_identify_event; + +comfsm_action_4_identify_event: + switch (return_val) { + case EVENT_TRANSVR_INIT_UP: + case EVENT_TRANSVR_TASK_DONE: + goto comfsm_action_4_connected; + + case EVENT_TRANSVR_INIT_DOWN: + goto comfsm_action_4_disconnected; + + case EVENT_TRANSVR_INIT_REINIT: + goto comfsm_action_4_nothing; + + case EVENT_TRANSVR_TASK_WAIT: + self->state = STATE_TRANSVR_INIT; + return ERR_TRANSVR_TASK_BUSY; + + case EVENT_TRANSVR_TASK_FAIL: + SWPS_INFO("%s detect EVENT_TRANSVR_TASK_FAIL.\n", self->swp_name); + goto comfsm_action_4_unexpected; + + case EVENT_TRANSVR_INIT_FAIL: + SWPS_INFO("%s detect EVENT_TRANSVR_INIT_FAIL.\n", self->swp_name); + goto comfsm_action_4_unexpected; + + case EVENT_TRANSVR_RELOAD_FAIL: + SWPS_INFO("%s detect EVENT_TRANSVR_RELOAD_FAIL.\n", self->swp_name); + goto comfsm_action_4_unexpected; + + case EVENT_TRANSVR_I2C_CRASH: + goto comfsm_action_4_report_i2c_crash; + + case EVENT_TRANSVR_EXCEP_ISOLATED: + goto comfsm_action_4_isolate_obj; + + default: + SWPS_INFO("%s detect undefined event:%d.\n", self->swp_name, return_val); + goto comfsm_action_4_unexpected; + } + +comfsm_action_4_nothing: + SWPS_DEBUG("FSM action: %s do nothing.\n", self->swp_name); + return 0; + +comfsm_action_4_connected: + SWPS_DEBUG("FSM action: %s Connected.\n", self->swp_name); + self->state = STATE_TRANSVR_CONNECTED; + self->type = new_type; + self->send_uevent(self, KOBJ_ADD); + _transvr_clean_retry(self); + return 0; + +comfsm_action_4_disconnected: + SWPS_DEBUG("FSM action: %s Disconnected. \n", self->swp_name); + self->state = STATE_TRANSVR_DISCONNECTED; + self->temp = EVENT_TRANSVR_TASK_DONE; + self->send_uevent(self, KOBJ_REMOVE); + _transvr_clean_retry(self); + _transvr_clean_handler(self); + return ERR_TRANSVR_UNPLUGGED; + +comfsm_action_4_report_i2c_crash: + SWPS_DEBUG("FSM action: %s report I2C crash.\n", self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + return ERR_TRANSVR_I2C_CRASH; + +comfsm_action_4_isolate_obj: + SWPS_DEBUG("FSM action: %s isolate.\n", self->swp_name); + self->state = STATE_TRANSVR_ISOLATED; + return ERR_TRNASVR_BE_ISOLATED; + +comfsm_action_4_unexpected: + SWPS_INFO("FSM action: %s unexpected.\n", self->swp_name); + SWPS_INFO("Dump: :%d :0x%02x :%d :0x%02x\n", + old_state, old_type, new_state, new_type); + self->state = STATE_TRANSVR_UNEXCEPTED; + self->send_uevent(self, KOBJ_REMOVE); + _transvr_clean_handler(self); + return ERR_TRANSVR_UNEXCPT; +} + + +int +fake_fsm_4_direct_mode(struct transvr_obj_s* self, + char *caller_name){ + self->state = STATE_TRANSVR_CONNECTED; + self->type = TRANSVR_TYPE_FAKE; + return 0; +} + + +int +fake_fsm_4_polling_mode(struct transvr_obj_s* self, + char *caller_name){ + self->state = STATE_TRANSVR_CONNECTED; + self->type = TRANSVR_TYPE_FAKE; + return 0; +} + + +/* ========== Object functions for Initial procedure ========== + */ +int +transvr_init_common(struct transvr_obj_s *self){ + /* Nothing to update */ + return EVENT_TRANSVR_TASK_DONE; +} + + +int +transvr_init_fake(struct transvr_obj_s *self){ + return EVENT_TRANSVR_TASK_DONE; +} + + +int +transvr_init_sfp(struct transvr_obj_s *self){ + + int tmp_val = DEBUG_TRANSVR_INT_VAL; + int err_code = DEBUG_TRANSVR_INT_VAL; + char *err_msg = "ERR"; + + self->info = sft_detect_transvr_class(self); + /* Disable auto_config */ + if (!self->auto_config) { + return EVENT_TRANSVR_TASK_DONE; + } + /* Handle multi-rate */ + err_code = initfunc_sfp_handle_multi_rate_mode(self); + if (err_code < 0) { + err_msg = "initfunc_sfp_handle_multi_rate_mode fail!"; + goto err_transvr_init_sfp_1; + } + /* Handle 1G- RJ45 */ + tmp_val = err_code; + err_code = initfunc_sfp_handle_1g_rj45(self); + if (err_code < 0) { + err_msg = "initfunc_sfp_handle_1g_rj45 fail!"; + goto err_transvr_init_sfp_1; + } + tmp_val = (tmp_val > err_code ? tmp_val : err_code); + if (tmp_val > EVENT_TRANSVR_TASK_DONE) { + return tmp_val; + } + return EVENT_TRANSVR_TASK_DONE; + +err_transvr_init_sfp_1: + SWPS_INFO("%s: %s :%d :%s\n", + __func__, err_msg, err_code, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +int +transvr_init_qsfp(struct transvr_obj_s *self){ + + int err = EVENT_TRANSVR_EXCEP_EXCEP; + char *emsg = "ERR"; + + self->info = qsft_detect_transvr_class(self); + if (!self->auto_config) { + return EVENT_TRANSVR_TASK_DONE; + } + err = initfunc_qsfp_handle_power_mode(self); + if (err < 0){ + emsg = "initfunc_qsfp_handle_tx_disable fail!"; + goto err_transvr_init_qsfp; + } + return EVENT_TRANSVR_TASK_DONE; + +err_transvr_init_qsfp: + SWPS_INFO("%s: %s :%d :%s\n", + __func__, emsg, err, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +int +transvr_init_qsfp28(struct transvr_obj_s *self){ + + int tmp_val = EVENT_TRANSVR_EXCEP_EXCEP; + int err_val = EVENT_TRANSVR_EXCEP_EXCEP; + char *err_msg = "ERR"; + + /* Handle QSFP common */ + err_val = transvr_init_qsfp(self); + if (err_val < 0){ + err_msg = "transvr_init_qsfp fail!"; + goto err_transvr_init_qsfp28_1; + } + /* Disable auto_config */ + if (!self->auto_config) { + return err_val; + } + /* Handle CDR */ + tmp_val = err_val; + err_val = initfunc_qsfp28_handle_cdr(self); + if (err_val < 0){ + err_msg = "Handle CDR fail!"; + goto err_transvr_init_qsfp28_1; + } + tmp_val = (tmp_val > err_val ? tmp_val : err_val); + if (tmp_val > EVENT_TRANSVR_TASK_DONE) { + return tmp_val; + } + return EVENT_TRANSVR_TASK_DONE; + +err_transvr_init_qsfp28_1: + SWPS_INFO("%s: %s :%d :%s\n", + __func__, err_msg, err_val, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; +} + + +/* ========== Object Initial handler ========== + */ +static int +_is_transvr_valid(struct transvr_obj_s *self, + int type, + int state) { + /* [Return] + * 0 : OK, inserted + * EVENT_TRANSVR_INIT_DOWN : OK, removed + * EVENT_TRANSVR_INIT_FAIL : Outside error, type doesn't supported + * EVENT_TRANSVR_EXCEP_INIT : Internal error, state undefined + */ + switch (type) { + case TRANSVR_TYPE_SFP: + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + case TRANSVR_TYPE_UNPLUGGED: + case TRANSVR_TYPE_FAKE: + break; + default: + SWPS_INFO("detect undefined type:0x%02x on %s\n", + type, self->swp_name); + return EVENT_TRANSVR_INIT_FAIL; + } + switch (state) { + case STATE_TRANSVR_DISCONNECTED: + return EVENT_TRANSVR_INIT_DOWN; + case STATE_TRANSVR_INIT: + case STATE_TRANSVR_CONNECTED: + case STATE_TRANSVR_SWAPPED: + break; + default: + SWPS_INFO("detect undefined state:%d on %s\n", + state, self->swp_name); + return EVENT_TRANSVR_EXCEP_INIT; + } + return 0; +} + + +static int +_is_transvr_hw_ready(struct transvr_obj_s *self, + int type){ + /* [Return] + * EVENT_TRANSVR_TASK_DONE : Ready + * EVENT_TRANSVR_TASK_WAIT : Not ready + * EVENT_TRANSVR_INIT_FAIL : Error + */ + int addr = DEBUG_TRANSVR_INT_VAL; + int page = DEBUG_TRANSVR_INT_VAL; + int offs = DEBUG_TRANSVR_INT_VAL; + int bit = DEBUG_TRANSVR_INT_VAL; + int ready = DEBUG_TRANSVR_INT_VAL; + int err = DEBUG_TRANSVR_INT_VAL; + char *emsg = DEBUG_TRANSVR_STR_VAL; + uint8_t ab_val = DEBUG_TRANSVR_HEX_VAL; + + switch (type) { + case TRANSVR_TYPE_SFP: + addr = VAL_TRANSVR_8472_READY_ADDR; + page = VAL_TRANSVR_8472_READY_PAGE; + offs = VAL_TRANSVR_8472_READY_OFFSET; + bit = VAL_TRANSVR_8472_READY_BIT; + ready = VAL_TRANSVR_8472_READY_VALUE; + ab_val = VAL_TRANSVR_8472_READY_ABNORMAL; + break; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + case TRANSVR_TYPE_QSFP_28: + addr = VAL_TRANSVR_8436_READY_ADDR; + page = VAL_TRANSVR_8436_READY_PAGE; + offs = VAL_TRANSVR_8436_READY_OFFSET; + bit = VAL_TRANSVR_8436_READY_BIT; + ready = VAL_TRANSVR_8436_READY_VALUE; + ab_val = VAL_TRANSVR_8436_READY_ABNORMAL; + break; + + case TRANSVR_TYPE_UNPLUGGED: + case TRANSVR_TYPE_FAKE: + return EVENT_TRANSVR_TASK_DONE; + + default: + emsg = "unexpected case"; + goto err_is_transvr_hw_ready; + } + /* Select target page */ + err = _common_setup_page(self, addr, page, offs, 1, 0); + if (err < 0) { + emsg = "setup page fail"; + goto err_is_transvr_hw_ready; + } + /* Check feature supported + * [Note] + * Some of transceiver/cables doesn't support "Status Indicators" + * (ex:DAC, RJ45 copper SFP ...etc). In these case, we bypass the + * step of checking Status Indicators, then state machine will take + * the following handle procedure. + */ + err = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + if (err < 0) { + emsg = "doesn't support Status Indicators"; + goto bypass_is_transvr_hw_ready; + } + /* Filter abnormal case */ + if (err == ab_val) { + emsg = "detect using unusual definition."; + goto bypass_is_transvr_hw_ready; + } + /* Get Status Indicators */ + err = i2c_smbus_read_byte_data(self->i2c_client_p, offs); + if (err < 0) { + emsg = "detect current value fail"; + goto err_is_transvr_hw_ready; + } + if ((err & (1<:%d\n", __func__, emsg, type); + return EVENT_TRANSVR_TASK_DONE; + +err_is_transvr_hw_ready: + SWPS_DEBUG("%s: %s :%d\n", __func__, emsg, type); + return EVENT_TRANSVR_INIT_FAIL; +} + + +static int +_is_transvr_support_ctle(struct transvr_obj_s *self) { + + switch (self->info) { + case TRANSVR_CLASS_OPTICAL_25G: + case TRANSVR_CLASS_OPTICAL_25G_AOC: + case TRANSVR_CLASS_OPTICAL_25G_SR: + case TRANSVR_CLASS_OPTICAL_25G_LR: + case TRANSVR_CLASS_OPTICAL_25G_ER: + case TRANSVR_CLASS_OPTICAL_100G: + case TRANSVR_CLASS_OPTICAL_100G_AOC: + case TRANSVR_CLASS_OPTICAL_100G_SR4: + case TRANSVR_CLASS_OPTICAL_100G_LR4: + case TRANSVR_CLASS_OPTICAL_100G_ER4: + case TRANSVR_CLASS_OPTICAL_100G_PSM4: + return 1; + default: + break; + } + return 0; +} + + +static int +_transvr_init_handler(struct transvr_obj_s *self){ + + int detect[2]; + int d_state = STATE_TRANSVR_UNEXCEPTED; + int d_type = TRANSVR_TYPE_ERROR; + int result = ERR_TRANSVR_UNINIT; + int retry = 6; /* (6+1) x 0.3 = 2.1s > spec:2.0s */ + int elimit = 63; + char emsg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Clean and check callback */ + self->state = STATE_TRANSVR_INIT; + if (self->init == NULL) { + snprintf(emsg, elimit, "init() is null"); + goto initer_err_case_unexcept_0; + } + if (self->clean == NULL) { + snprintf(emsg, elimit, "clean() is null"); + goto initer_err_case_unexcept_0; + } + self->clean(self); + + /* Detect transceiver information */ + result = detect_transvr_state(self, detect); + if (result < 0) { + snprintf(emsg, elimit, "detect_transvr_state() fail"); + switch (result) { + case ERR_TRANSVR_I2C_CRASH: + goto initer_err_case_i2c_ceash; + case ERR_TRNASVR_BE_ISOLATED: + goto initer_err_case_be_isolated; + + case ERR_TRANSVR_UNEXCPT: + default: + break; + } + goto initer_err_case_retry_1; + } + d_state = detect[0]; + d_type = detect[1]; + + /* Verify transceiver type and state */ + switch (_is_transvr_valid(self, d_type, d_state)) { + case 0: + break; + case EVENT_TRANSVR_INIT_DOWN: + goto initer_ok_case_down;; + case EVENT_TRANSVR_INIT_FAIL: + snprintf(emsg, elimit, "transceiver type doesn't support"); + goto initer_err_case_alarm_to_user; + case EVENT_TRANSVR_EXCEP_INIT: + default: + goto initer_err_case_unexcept_1; + } + + /* Handle reload case */ + if (self->type != d_type){ + /* This is the protect mechanism. Normally, This case will not happen. + * When State machine detect swap event during initial, It will trigger + * reload function to ensure type correct. */ + if (_reload_transvr_obj(self, d_type) < 0){ + snprintf(emsg, elimit, "reload object fail"); + goto initer_err_case_unexcept_1; + } + } + + /* Check transceiver HW initial ready */ + switch (_is_transvr_hw_ready(self, d_type)) { + case EVENT_TRANSVR_TASK_DONE: + break; + case EVENT_TRANSVR_TASK_WAIT: + goto initer_err_case_retry_1; + case EVENT_TRANSVR_INIT_FAIL: + default: + goto initer_err_case_unexcept_1; + } + + /* Try to update all and check */ + if (self->update_all(self, 1) < 0){ + /* For some transceiver, EEPROME has lag issues during initial stage. + * In this case, we set status back to STATE_TRANSVR_NEW, than it will + * be checked in next polling cycle. */ + goto initer_err_case_retry_1; + } + + /* Execute init() call back */ + result = self->init(self); + switch (result) { + case EVENT_TRANSVR_TASK_DONE: + break; + case EVENT_TRANSVR_TASK_WAIT: + goto initer_ok_case_wait; + + default: + snprintf(emsg, elimit, "undefined init() return:%d\n", result); + goto initer_err_case_unexcept_1; + } + goto initer_ok_case_up; + + +initer_ok_case_wait: + self->dump_all(self); + return EVENT_TRANSVR_TASK_WAIT; + +initer_ok_case_up: + self->state = STATE_TRANSVR_CONNECTED; + self->temp = 0; + self->dump_all(self); + return EVENT_TRANSVR_INIT_UP; + +initer_ok_case_down: + self->temp = 0; + self->state = STATE_TRANSVR_DISCONNECTED; + return EVENT_TRANSVR_INIT_DOWN; + +initer_err_case_i2c_ceash: + SWPS_DEBUG("%s: %s :%s :I2C crash\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + return EVENT_TRANSVR_I2C_CRASH; + +initer_err_case_be_isolated: + SWPS_DEBUG("%s: %s :%s :isolated\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_ISOLATED; + return EVENT_TRANSVR_EXCEP_ISOLATED; + +initer_err_case_retry_1: + SWPS_DEBUG("%s: %s :%s :retry\n", + __func__, emsg, self->swp_name); + if (_transvr_handle_retry(self, retry) == 0) { + self->state = STATE_TRANSVR_NEW; + return EVENT_TRANSVR_INIT_REINIT; + } + goto initer_err_case_alarm_to_user; + +initer_err_case_unexcept_1: + self->clean(self); +initer_err_case_unexcept_0: + self->state = STATE_TRANSVR_UNEXCEPTED; + if (_is_except_happened_4_pmode(self, d_state) && + (self->mode == TRANSVR_MODE_POLLING) ){ + SWPS_INFO("%s: %s :%s\n", __func__, emsg, self->swp_name); + SWPS_INFO("Dump: :%d :%d :%d :%d\n", + self->state, self->type, d_state, d_type); + } + return EVENT_TRANSVR_INIT_FAIL; + +initer_err_case_alarm_to_user: + SWPS_DEBUG("%s: %s :%s :alarm_to_user\n", + __func__, emsg, self->swp_name); + self->state = STATE_TRANSVR_UNEXCEPTED; + alarm_msg_2_user(self, "detected transceiver/cables not meet SFF standard"); + return EVENT_TRANSVR_INIT_FAIL; +} + + +/* ========== Object functions for Clean procedure ========== + */ +int +_transvr_clean_handler(struct transvr_obj_s *self){ + + int retval = DEBUG_TRANSVR_INT_VAL; + + if (!self->clean) { + SWPS_ERR("%s: %s clean() is NULL.\n", + __func__, self->swp_name); + return EVENT_TRANSVR_TASK_FAIL; + } + retval = self->clean(self); + if (retval != EVENT_TRANSVR_TASK_DONE){ + SWPS_ERR("%s: %s clean() fail. [ERR]:%d\n", + __func__, self->swp_name, retval); + return retval; + } + return EVENT_TRANSVR_TASK_DONE; +} + + +int +common_transvr_clean(struct transvr_obj_s *self){ + + transvr_task_free_all(self); + transvr_cache_free_all(self); + return EVENT_TRANSVR_TASK_DONE; +} + + +int +qsfp_transvr_clean(struct transvr_obj_s *self){ + + int retval; + int lpower_config = 1; + + retval = _taskfunc_qsfp_setup_power_mod(self, lpower_config); + if (retval < 0){ + SWPS_ERR("%s: Set lpmod fail! :%d\n", + __func__, retval); + return retval; + } + retval = common_transvr_clean(self); + if (retval < 0){ + SWPS_ERR("%s: common_transvr_clean fail! :%d\n", + __func__, retval); + return retval; + } + return EVENT_TRANSVR_TASK_DONE; +} + + +int +fake_transvr_clean(struct transvr_obj_s *self){ + + return EVENT_TRANSVR_TASK_DONE; +} + + +/* ========== Object functions for check and update ========== + */ +int +common_transvr_check(struct transvr_obj_s *self){ + + char fun_str[32] = "common_transvr_check"; + + if (self->mode != TRANSVR_MODE_POLLING) { + SWPS_ERR("%s: mode:%d is not TRANSVR_MODE_POLLING\n", + fun_str, self->mode); + return ERR_TRANSVR_UNEXCPT; + } + /* Trigger delay task */ + transvr_task_run_all(self); + /* Trigger state machine to check and update */ + return self->fsm_4_polling(self, fun_str); +} + + +int +fake_transvr_check(struct transvr_obj_s *self){ + return 0; +} + + +/* ========== Functions for Factory pattern ========== + */ +static int +setup_transvr_public_cb(struct transvr_obj_s *self, + int transvr_type){ + switch (transvr_type){ + case TRANSVR_TYPE_SFP: + self->get_id = common_get_id; + self->get_ext_id = common_get_ext_id; + self->get_connector = common_get_connector; + self->get_vendor_name = common_get_vendor_name; + self->get_vendor_pn = common_get_vendor_pn; + self->get_vendor_rev = common_get_vendor_rev; + self->get_vendor_sn = common_get_vendor_sn; + self->get_power_cls = unsupported_get_func; + self->get_br = common_get_br; + self->get_len_sm = sfp_get_len_sm; + self->get_len_smf = common_get_len_smf; + self->get_len_om1 = common_get_len_om1; + self->get_len_om2 = common_get_len_om2; + self->get_len_om3 = common_get_len_om3; + self->get_len_om4 = common_get_len_om4; + self->get_comp_rev = common_get_comp_rev; + self->get_comp_eth_1 = sfp_get_comp_eth_1; + self->get_comp_eth_10 = sfp_get_comp_eth_10; + self->get_comp_eth_10_40 = unsupported_get_func; + self->get_comp_extend = common_get_comp_extended; + self->get_cdr = unsupported_get_func; + self->get_rate_id = sfp_get_rate_id; + self->get_soft_rs0 = sfp_get_soft_rs0; + self->get_soft_rs1 = sfp_get_soft_rs1; + self->get_info = common_get_info; + self->get_if_type = sfp_get_if_type; + self->get_if_speed = sfp_get_if_speed; + self->get_if_lane = common_get_if_lane; + self->get_curr_temp = sfp_get_transvr_temp; + self->get_curr_vol = sfp_get_transvr_voltage; + self->get_soft_rx_los = unsupported_get_func2; + self->get_soft_tx_disable = unsupported_get_func2; + self->get_soft_tx_fault = unsupported_get_func2; + self->get_auto_tx_disable = unsupported_get_func2; + self->get_tx_bias = sfp_get_transvr_tx_bias; + self->get_tx_power = sfp_get_transvr_tx_power; + self->get_rx_power = sfp_get_transvr_rx_power; + self->get_tx_eq = sfp_get_transvr_tx_eq; + self->get_rx_am = unsupported_get_func2; + self->get_rx_em = sfp_get_transvr_rx_em; + self->get_wavelength = sfp_get_wavelength; + self->get_extphy_offset = sfp_get_1g_rj45_extphy_offset; + self->get_extphy_reg = sfp_get_1g_rj45_extphy_reg; + self->set_cdr = unsupported_set_func; + self->set_soft_rs0 = sfp_set_soft_rs0; + self->set_soft_rs1 = sfp_set_soft_rs1; + self->set_soft_tx_disable = unsupported_set_func; + self->set_auto_tx_disable = unsupported_set_func; + self->set_tx_eq = sfp_set_tx_eq; + self->set_rx_am = unsupported_set_func; + self->set_rx_em = sfp_set_rx_em; + self->set_extphy_offset = sfp_set_1g_rj45_extphy_offset; + self->set_extphy_reg = sfp_set_1g_rj45_extphy_reg; + return 0; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + self->get_id = common_get_id; + self->get_ext_id = common_get_ext_id; + self->get_connector = common_get_connector; + self->get_vendor_name = common_get_vendor_name; + self->get_vendor_pn = common_get_vendor_pn; + self->get_vendor_rev = common_get_vendor_rev; + self->get_vendor_sn = common_get_vendor_sn; + self->get_power_cls = qsfp_get_power_cls; + self->get_br = common_get_br; + self->get_len_sm = unsupported_get_func; + self->get_len_smf = common_get_len_smf; + self->get_len_om1 = common_get_len_om1; + self->get_len_om2 = common_get_len_om2; + self->get_len_om3 = common_get_len_om3; + self->get_len_om4 = common_get_len_om4; + self->get_comp_rev = common_get_comp_rev; + self->get_comp_eth_1 = qsfp_get_comp_eth; + self->get_comp_eth_10 = unsupported_get_func; + self->get_comp_eth_10_40 = qsfp_get_comp_10_40; + self->get_comp_extend = common_get_comp_extended; + self->get_cdr = unsupported_get_func; + self->get_rate_id = unsupported_get_func; + self->get_soft_rs0 = unsupported_get_func; /* TBD */ + self->get_soft_rs1 = unsupported_get_func; /* TBD */ + self->get_info = common_get_info; + self->get_if_type = qsfp_get_if_type; + self->get_if_speed = qsfp_get_if_speed; + self->get_if_lane = common_get_if_lane; + self->get_curr_temp = qsfp_get_transvr_temp; + self->get_curr_vol = qsfp_get_transvr_voltage; + self->get_soft_rx_los = qsfp_get_soft_rx_los; + self->get_soft_tx_disable = qsfp_get_soft_tx_disable; + self->get_soft_tx_fault = qsfp_get_soft_tx_fault; + self->get_auto_tx_disable = qsfp_get_auto_tx_disable; + self->get_tx_bias = qsfp_get_transvr_tx_bias; + self->get_tx_power = qsfp_get_transvr_tx_power; + self->get_rx_power = qsfp_get_transvr_rx_power; + self->get_tx_eq = unsupported_get_func2; + self->get_rx_am = unsupported_get_func2; + self->get_rx_em = unsupported_get_func2; + self->get_wavelength = qsfp_get_wavelength; + self->get_extphy_offset = unsupported_get_func2; + self->get_extphy_reg = unsupported_get_func2; + self->set_cdr = unsupported_set_func; + self->set_soft_rs0 = unsupported_set_func; /* TBD */ + self->set_soft_rs1 = unsupported_set_func; /* TBD */ + self->set_soft_tx_disable = qsfp_set_soft_tx_disable; + self->set_auto_tx_disable = qsfp_set_auto_tx_disable; + self->set_tx_eq = unsupported_set_func; + self->set_rx_am = unsupported_set_func; + self->set_rx_em = unsupported_set_func; + self->set_extphy_offset = unsupported_set_func; + self->set_extphy_reg = unsupported_set_func; + return 0; + + case TRANSVR_TYPE_QSFP_28: + self->get_id = common_get_id; + self->get_ext_id = common_get_ext_id; + self->get_connector = common_get_connector; + self->get_vendor_name = common_get_vendor_name; + self->get_vendor_pn = common_get_vendor_pn; + self->get_vendor_rev = common_get_vendor_rev; + self->get_vendor_sn = common_get_vendor_sn; + self->get_power_cls = qsfp_get_power_cls; + self->get_br = common_get_br; + self->get_len_sm = unsupported_get_func; + self->get_len_smf = common_get_len_smf; + self->get_len_om1 = common_get_len_om1; + self->get_len_om2 = common_get_len_om2; + self->get_len_om3 = common_get_len_om3; + self->get_len_om4 = common_get_len_om4; + self->get_comp_rev = common_get_comp_rev; + self->get_comp_eth_1 = qsfp_get_comp_eth; + self->get_comp_eth_10 = unsupported_get_func; + self->get_comp_eth_10_40 = qsfp_get_comp_10_40; + self->get_comp_extend = common_get_comp_extended; + self->get_cdr = qsfp_get_cdr; + self->get_rate_id = unsupported_get_func; + self->get_soft_rs0 = unsupported_get_func; /* TBD */ + self->get_soft_rs1 = unsupported_get_func; /* TBD */ + self->get_info = common_get_info; + self->get_if_type = qsfp_get_if_type; + self->get_if_speed = qsfp_get_if_speed; + self->get_if_lane = common_get_if_lane; + self->get_curr_temp = qsfp_get_transvr_temp; + self->get_curr_vol = qsfp_get_transvr_voltage; + self->get_soft_rx_los = qsfp_get_soft_rx_los; + self->get_soft_tx_disable = qsfp_get_soft_tx_disable; + self->get_soft_tx_fault = qsfp_get_soft_tx_fault; + self->get_auto_tx_disable = qsfp_get_auto_tx_disable; + self->get_tx_bias = qsfp_get_transvr_tx_bias; + self->get_tx_power = qsfp_get_transvr_tx_power; + self->get_rx_power = qsfp_get_transvr_rx_power; + self->get_tx_eq = qsfp_get_transvr_tx_eq; + self->get_rx_am = qsfp_get_transvr_rx_am; + self->get_rx_em = qsfp_get_transvr_rx_em; + self->get_wavelength = qsfp_get_wavelength; + self->get_extphy_offset = unsupported_get_func2; + self->get_extphy_reg = unsupported_get_func2; + self->set_cdr = qsfp_set_cdr; + self->set_soft_rs0 = unsupported_set_func; /* TBD */ + self->set_soft_rs1 = unsupported_set_func; /* TBD */ + self->set_soft_tx_disable = qsfp_set_soft_tx_disable; + self->set_auto_tx_disable = qsfp_set_auto_tx_disable; + self->set_tx_eq = qsfp_set_tx_eq; + self->set_rx_am = qsfp_set_rx_am; + self->set_rx_em = qsfp_set_rx_em; + self->set_extphy_offset = unsupported_set_func; + self->set_extphy_reg = unsupported_set_func; + return 0; + + case TRANSVR_TYPE_FAKE: + self->get_id = fake_get_hex; + self->get_ext_id = fake_get_hex; + self->get_connector = fake_get_hex; + self->get_vendor_name = fake_get_str; + self->get_vendor_pn = fake_get_str; + self->get_vendor_rev = fake_get_str; + self->get_vendor_sn = fake_get_str; + self->get_power_cls = fake_get_int; + self->get_br = fake_get_hex; + self->get_len_sm = fake_get_int; + self->get_len_smf = fake_get_int; + self->get_len_om1 = fake_get_int; + self->get_len_om2 = fake_get_int; + self->get_len_om3 = fake_get_int; + self->get_len_om4 = fake_get_int; + self->get_comp_rev = fake_get_hex; + self->get_comp_eth_1 = fake_get_hex; + self->get_comp_eth_10 = fake_get_hex; + self->get_comp_eth_10_40 = fake_get_hex; + self->get_comp_extend = fake_get_hex; + self->get_cdr = fake_get_hex; + self->get_rate_id = fake_get_hex; + self->get_soft_rs0 = fake_get_binary; + self->get_soft_rs1 = fake_get_binary; + self->get_info = fake_get_int; + self->get_if_type = fake_get_str; + self->get_if_speed = fake_get_str; + self->get_if_lane = fake_get_str; + self->get_curr_temp = fake_get_str; + self->get_curr_vol = fake_get_str; + self->get_soft_rx_los = fake_get_str; + self->get_soft_tx_disable = fake_get_str; + self->get_soft_tx_fault = fake_get_str; + self->get_auto_tx_disable = fake_get_str; + self->get_tx_bias = fake_get_str; + self->get_tx_power = fake_get_str; + self->get_rx_power = fake_get_str; + self->get_tx_eq = fake_get_str; + self->get_rx_am = fake_get_str; + self->get_rx_em = fake_get_str; + self->get_wavelength = fake_get_str; + self->get_extphy_offset = fake_get_str; + self->get_extphy_reg = fake_get_str; + self->set_cdr = fake_set_hex; + self->set_soft_rs0 = fake_set_int; + self->set_soft_rs1 = fake_set_int; + self->set_soft_tx_disable = fake_set_int; + self->set_auto_tx_disable = fake_set_int; + self->set_tx_eq = fake_set_int; + self->set_rx_am = fake_set_int; + self->set_rx_em = fake_set_int; + self->set_extphy_offset = fake_set_hex; + self->set_extphy_reg = fake_set_hex; + return 0; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return ERR_TRANSVR_UNEXCPT; +} + + +static int +setup_transvr_private_cb(struct transvr_obj_s *self, + int transvr_type){ + switch (transvr_type){ + case TRANSVR_TYPE_SFP: + self->init = transvr_init_sfp; + self->clean = common_transvr_clean; + self->check = common_transvr_check; + self->update_all = _sfp_update_attr_all; + self->fsm_4_direct = common_fsm_4_direct_mode; + self->fsm_4_polling = common_fsm_4_polling_mode; + self->send_uevent = sfp_send_uevent; + self->dump_all = sfp_transvr_dump; + return 0; + + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + self->init = transvr_init_qsfp; + self->clean = qsfp_transvr_clean; + self->check = common_transvr_check; + self->update_all = _qsfp_update_attr_all; + self->fsm_4_direct = common_fsm_4_direct_mode; + self->fsm_4_polling = common_fsm_4_polling_mode; + self->send_uevent = qsfp_send_uevent; + self->dump_all = qsfp_transvr_dump; + return 0; + + case TRANSVR_TYPE_QSFP_28: + self->init = transvr_init_qsfp28; + self->clean = qsfp_transvr_clean; + self->check = common_transvr_check; + self->update_all = _qsfp_update_attr_all; + self->fsm_4_direct = common_fsm_4_direct_mode; + self->fsm_4_polling = common_fsm_4_polling_mode; + self->send_uevent = qsfp_send_uevent; + self->dump_all = qsfp_transvr_dump; + return 0; + + case TRANSVR_TYPE_FAKE: + self->init = transvr_init_fake; + self->clean = fake_transvr_clean; + self->check = fake_transvr_check; + self->update_all = fake_transvr_update; + self->fsm_4_direct = fake_fsm_4_direct_mode; + self->fsm_4_polling = fake_fsm_4_polling_mode; + self->send_uevent = fake_send_uevent; + self->dump_all = fake_transvr_dump; + return 0; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return ERR_TRANSVR_UNEXCPT; +} + + +static struct eeprom_map_s * +get_eeprom_map(int transvr_type){ + + switch (transvr_type){ + case TRANSVR_TYPE_SFP: + return &eeprom_map_sfp; + case TRANSVR_TYPE_QSFP: + case TRANSVR_TYPE_QSFP_PLUS: + return &eeprom_map_qsfp; + case TRANSVR_TYPE_QSFP_28: + return &eeprom_map_qsfp28; + + default: + break; + } + SWPS_WARN("%s: Detect non-defined type:%d\n", __func__, transvr_type); + return NULL; +} + + +static int +setup_transvr_ssize_attr(char *swp_name, + struct transvr_obj_s *self, + struct eeprom_map_s *map_p, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int chan_id, + int run_mode){ + switch (run_mode){ + case TRANSVR_MODE_DIRECT: /* Direct access device mode */ + case TRANSVR_MODE_POLLING: /* Polling mode, read from cache */ + self->mode = run_mode; + break; + default: + SWPS_ERR("%s: non-defined run_mode:%d\n", + __func__, run_mode); + self->mode = DEBUG_TRANSVR_INT_VAL; + return -1; + } + self->eeprom_map_p = map_p; + self->ioexp_obj_p = ioexp_obj_p; + self->ioexp_virt_offset = ioexp_virt_offset; + self->chan_id = chan_id; + self->layout = transvr_type; + self->type = transvr_type; + self->chipset_type = chipset_type; + self->state = STATE_TRANSVR_NEW; + self->info = STATE_TRANSVR_NEW; + self->auto_tx_disable = VAL_TRANSVR_FUNCTION_DISABLE; + strncpy(self->swp_name, swp_name, 32); + mutex_init(&self->lock); + return 0; +} + + +static int +setup_transvr_dsize_attr(struct transvr_obj_s *self){ + + char *emsg = DEBUG_TRANSVR_STR_VAL; + + self->vendor_name = kzalloc((LEN_TRANSVR_M_STR * sizeof(char)), GFP_KERNEL); + if (!self->vendor_name){ + emsg = "vendor_name"; + goto err_setup_d_attr; + } + self->vendor_pn = kzalloc((LEN_TRANSVR_M_STR * sizeof(char)), GFP_KERNEL); + if (!self->vendor_pn){ + emsg = "vendor_pn"; + goto err_setup_d_attr; + } + self->vendor_rev = kzalloc((LEN_TRANSVR_M_STR * sizeof(char)), GFP_KERNEL); + if (!self->vendor_rev){ + emsg = "vendor_rev"; + goto err_setup_d_attr; + } + self->vendor_sn = kzalloc((LEN_TRANSVR_M_STR * sizeof(char)), GFP_KERNEL); + if (!self->vendor_sn){ + emsg = "vendor_sn"; + goto err_setup_d_attr; + } + self->worker_p = NULL; + return 0; + +err_setup_d_attr: + SWPS_ERR("%s: %s kzalloc fail!", __func__, emsg); + return ERR_TRANSVR_UNEXCPT; +} + + +static int +setup_i2c_client(struct transvr_obj_s *self){ + + struct i2c_adapter *adap = NULL; + struct i2c_client *client = NULL; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + adap = i2c_get_adapter(self->chan_id); + if(!adap){ + snprintf(err_msg, sizeof(err_msg), + "can not get adap:%d", self->chan_id); + goto err_setup_i2c_client; + } + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client){ + snprintf(err_msg, sizeof(err_msg), + "can not kzalloc client:%d", self->chan_id); + goto err_setup_i2c_client; + } + client->adapter = adap; + self->i2c_client_p = client; + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + return 0; + +err_setup_i2c_client: + SWPS_ERR("%s: %s\n", __func__, err_msg); + return ERR_TRANSVR_UNEXCPT; +} + + +struct transvr_obj_s * +create_transvr_obj(char *swp_name, + int chan_id, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int run_mode){ + + struct transvr_obj_s *result_p; + struct eeprom_map_s *map_p; + char err_msg[64] = DEBUG_TRANSVR_STR_VAL; + + /* Allocate transceiver object */ + map_p = get_eeprom_map(transvr_type); + if (!map_p){ + snprintf(err_msg, sizeof(err_msg), + "Invalid transvr_type:%d", transvr_type); + goto err_create_transvr_fail; + } + result_p = kzalloc(sizeof(*result_p), GFP_KERNEL); + if (!result_p){ + snprintf(err_msg, sizeof(err_msg), "kzalloc fail"); + goto err_create_transvr_fail; + } + /* Prepare static size attributes */ + if (setup_transvr_ssize_attr(swp_name, + result_p, + map_p, + ioexp_obj_p, + ioexp_virt_offset, + transvr_type, + chipset_type, + chan_id, + run_mode) < 0){ + goto err_create_transvr_sattr_fail; + } + /* Prepare dynamic size attributes */ + if (setup_transvr_dsize_attr(result_p) < 0){ + goto err_create_transvr_dattr_fail; + } + /* Prepare call back functions of object */ + if (setup_transvr_public_cb(result_p, transvr_type) < 0){ + goto err_create_transvr_dattr_fail; + } + /* Prepare call back functions of object */ + if (setup_transvr_private_cb(result_p, transvr_type) < 0){ + goto err_create_transvr_dattr_fail; + } + /* Prepare i2c client object */ + if (setup_i2c_client(result_p) < 0){ + goto err_create_transvr_dattr_fail; + } + return result_p; + +err_create_transvr_dattr_fail: + kfree(result_p->vendor_sn); + kfree(result_p->vendor_rev); + kfree(result_p->vendor_pn); + kfree(result_p->vendor_name); +err_create_transvr_sattr_fail: + kfree(result_p); +err_create_transvr_fail: + SWPS_ERR("%s: %s :%d :%d :%d\n", + __func__, err_msg, chan_id, ioexp_virt_offset, transvr_type); + return NULL; +} + + +static int +_reload_transvr_obj(struct transvr_obj_s *self, + int new_type){ + + struct eeprom_map_s *new_map_p; + struct eeprom_map_s *old_map_p = self->eeprom_map_p; + struct i2c_client *old_i2c_p = self->i2c_client_p; + int old_type = self->type; + + /* Change state to STATE_TRANSVR_INIT */ + self->state = STATE_TRANSVR_INIT; + self->type = new_type; + /* Replace EEPROME map */ + new_map_p = get_eeprom_map(new_type); + if (!new_map_p){ + goto err_private_reload_func_1; + } + self->eeprom_map_p = new_map_p; + /* Reload i2c client */ + if (setup_i2c_client(self) < 0){ + goto err_private_reload_func_2; + } + /* Replace call back functions */ + if (setup_transvr_public_cb(self, new_type) < 0){ + goto err_private_reload_func_3; + } + if (setup_transvr_private_cb(self, new_type) < 0){ + goto err_private_reload_func_3; + } + kfree(old_i2c_p); + return 0; + +err_private_reload_func_3: + SWPS_INFO("%s: init() fail!\n", __func__); + kfree(old_i2c_p); + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = TRANSVR_TYPE_ERROR; + return -2; + +err_private_reload_func_2: + self->eeprom_map_p = old_map_p; + self->i2c_client_p = old_i2c_p; +err_private_reload_func_1: + self->state = STATE_TRANSVR_UNEXCEPTED; + self->type = old_type; + SWPS_INFO("%s fail! :0x%02x\n", __func__, new_type); + return -1; +} + + +static int +reload_transvr_obj(struct transvr_obj_s *self, + int new_type){ + + int result_val = ERR_TRANSVR_UNEXCPT; + + /* Reload phase */ + result_val = _reload_transvr_obj(self, new_type); + if (result_val < 0){ + SWPS_INFO("%s: reload phase fail! :%d\n", + __func__, result_val); + return EVENT_TRANSVR_RELOAD_FAIL; + } + /* Initial phase */ + result_val = _transvr_init_handler(self); + if (result_val < 0){ + SWPS_INFO("%s: initial phase fail! :%d\n", + __func__, result_val); + } + return result_val; +} + + +int +isolate_transvr_obj(struct transvr_obj_s *self) { + + self->state = STATE_TRANSVR_ISOLATED; + SWPS_INFO("%s: %s be isolated\n", __func__, self->swp_name); + return 0; +} + + +int +resync_channel_tier_2(struct transvr_obj_s *self) { + + int val = TRANSVR_TYPE_ERROR; + + if (self->state == STATE_TRANSVR_ISOLATED) { + return 0; + } + self->i2c_client_p->addr = VAL_TRANSVR_COMID_ARREESS; + val = i2c_smbus_read_byte_data(self->i2c_client_p, + VAL_TRANSVR_COMID_OFFSET); + if (val < 0) { + return -1; + } + return 0; +} + + +/* ----------------------------------------- + * ToDo List + * ----------------------------------------- + * 1. _sfp_detect_class_by_feature() + * => Need check ACC use case. + * 2. _sfp_detect_class_by_1g_ethernet() + * => Need check 0.1G use case. + * 3. Loopback transceiver use case. + * => Less much data + * 4. _qsfp_detect_class_by_extend_comp() + * => Verify 100G CWDM4 + * => Verify Obsolete (assigned before 100G CWDM4 MSA required FEC) + * => Verify 100G CLR4 + * => Verify 100GE-DWDM2 + * => Verify 40G PSM4 Parallel SMF + * => Verify 100G ACC (Active Copper Cable) or 25GAUI C2M ACC. + * => Verify 100G ACC or 25GAUI C2M ACC. + * => Verify 25GBASE-LR + * => Verify 40G Active Cable (XLPPI) + */ + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/transceiver.h b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/transceiver.h new file mode 100644 index 000000000000..f17b7fde71b1 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/modules/transceiver.h @@ -0,0 +1,815 @@ +/* + * 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. + */ + +#ifndef TRANSCEIVER_H +#define TRANSCEIVER_H + +#include + +/* advanced features control */ +#define TRANSVR_INFO_DUMP_ENABLE (1) +#define TRANSVR_INFO_CACHE_ENABLE (1) +#define TRANSVR_UEVENT_ENABLE (1) + +/* Transceiver type define */ +#define TRANSVR_TYPE_UNKNOW_1 (0x00) +#define TRANSVR_TYPE_UNKNOW_2 (0xff) +#define TRANSVR_TYPE_SFP (0x03) /* Define for SFP, SFP+, SFP28 */ +#define TRANSVR_TYPE_QSFP (0x0c) +#define TRANSVR_TYPE_QSFP_PLUS (0x0d) +#define TRANSVR_TYPE_QSFP_28 (0x11) +#define TRANSVR_TYPE_UNPLUGGED (0xfa) /* Define for ERROR handle */ +#define TRANSVR_TYPE_FAKE (0xfc) /* Define for ERROR handle */ +#define TRANSVR_TYPE_INCONSISTENT (0xfd) /* Define for ERROR handle */ +#define TRANSVR_TYPE_ERROR (0xfe) /* Define for ERROR handle */ + +/* Transceiver class for base info */ +#define TRANSVR_CLASS_UNSPECIFIED (0) +#define TRANSVR_CLASS_ERROR (-26001) +#define TRANSVR_CLASS_1G (26001) +#define TRANSVR_CLASS_10G (26011) +#define TRANSVR_CLASS_25G (26021) +#define TRANSVR_CLASS_40G (26041) +#define TRANSVR_CLASS_100G (26101) +#define TRANSVR_CLASS_NO_SPERARABLE (26901) +#define TRANSVR_CLASS_EXTEND_COMP (26902) +/* Transceiver class for Optical 1G */ +#define TRANSVR_CLASS_OPTICAL (27000) +#define TRANSVR_CLASS_OPTICAL_100 (27001) +#define TRANSVR_CLASS_OPTICAL_1G (27002) +#define TRANSVR_CLASS_OPTICAL_1G_AOC (27003) +#define TRANSVR_CLASS_OPTICAL_1G_SX (27004) +#define TRANSVR_CLASS_OPTICAL_1G_LX (27005) +#define TRANSVR_CLASS_OPTICAL_1G_EX (27006) +/* Transceiver class for Optical 10G */ +#define TRANSVR_CLASS_OPTICAL_10G (27010) +#define TRANSVR_CLASS_OPTICAL_10G_S_AOC (27011) +#define TRANSVR_CLASS_OPTICAL_10G_S_SR (27012) +#define TRANSVR_CLASS_OPTICAL_10G_S_LR (27013) +#define TRANSVR_CLASS_OPTICAL_10G_S_ER (27014) +#define TRANSVR_CLASS_OPTICAL_10G_Q_AOC (27015) +#define TRANSVR_CLASS_OPTICAL_10G_Q_SR (27016) +#define TRANSVR_CLASS_OPTICAL_10G_Q_LR (27017) +#define TRANSVR_CLASS_OPTICAL_10G_Q_ER (27018) +/* Transceiver class for Optical 25G */ +#define TRANSVR_CLASS_OPTICAL_25G (27020) +#define TRANSVR_CLASS_OPTICAL_25G_AOC (27021) +#define TRANSVR_CLASS_OPTICAL_25G_SR (27022) +#define TRANSVR_CLASS_OPTICAL_25G_LR (27023) +#define TRANSVR_CLASS_OPTICAL_25G_ER (27024) +/* Transceiver class for Optical 40G */ +#define TRANSVR_CLASS_OPTICAL_40G (27040) +#define TRANSVR_CLASS_OPTICAL_40G_AOC (27041) +#define TRANSVR_CLASS_OPTICAL_40G_SR4 (27042) +#define TRANSVR_CLASS_OPTICAL_40G_LR4 (27043) +#define TRANSVR_CLASS_OPTICAL_40G_ER4 (27044) +/* Transceiver class for Optical 100G */ +#define TRANSVR_CLASS_OPTICAL_100G (27100) +#define TRANSVR_CLASS_OPTICAL_100G_AOC (27101) +#define TRANSVR_CLASS_OPTICAL_100G_SR4 (27102) +#define TRANSVR_CLASS_OPTICAL_100G_LR4 (27103) +#define TRANSVR_CLASS_OPTICAL_100G_ER4 (27104) +#define TRANSVR_CLASS_OPTICAL_100G_PSM4 (27105) +/* Transceiver class for Copper */ +#define TRANSVR_CLASS_COPPER (28000) +#define TRANSVR_CLASS_COPPER_L1_1G (28001) +#define TRANSVR_CLASS_COPPER_L1_10G (28011) +#define TRANSVR_CLASS_COPPER_L4_10G (28012) +#define TRANSVR_CLASS_COPPER_L1_25G (28021) +#define TRANSVR_CLASS_COPPER_L4_40G (28041) +#define TRANSVR_CLASS_COPPER_L4_100G (28101) +/* Transceiver class for Base-T */ +#define TRANSVR_CLASS_BASE_T_1000 (29001) +#define TRANSVR_CLASS_BASE_T_1000_up (29002) +/* For uevent message */ +#define TRANSVR_UEVENT_KEY_IF "IF_TYPE" +#define TRANSVR_UEVENT_KEY_SP "IF_SPEED" +#define TRANSVR_UEVENT_KEY_LANE "IF_LANE" +#define TRANSVR_UEVENT_UNKNOW "UNKNOW" +#define TRANSVR_IF_KR "KR" +#define TRANSVR_IF_KR4 "KR4" +#define TRANSVR_IF_SR "SR" +#define TRANSVR_IF_SR4 "SR4" +#define TRANSVR_IF_SFI "SFI" +#define TRANSVR_IF_IF_GMII "GMII" +#define TRANSVR_IF_IF_XGMII "XGMII" +#define TRANSVR_IF_SP_100 "100" +#define TRANSVR_IF_SP_1G "1000" +#define TRANSVR_IF_SP_10G "10000" +#define TRANSVR_IF_SP_25G "25000" +#define TRANSVR_IF_SP_40G "40000" +#define TRANSVR_IF_SP_100G "100000" + +/* Transceiver mode define */ +#define TRANSVR_MODE_DIRECT (21000) +#define TRANSVR_MODE_POLLING (21001) + +/* Transceiver state define + * [Note] + * 1. State is used to represent the state of "Transceiver" and "Object". + * 2. State for different target has different means. The description as following: + */ +#define STATE_TRANSVR_CONNECTED (0) /* [Transvr]:Be plugged in. [Obj]:Link up, and work normally. */ +#define STATE_TRANSVR_NEW (-100) /* [Transvr]:(Not used) [Obj]:Create */ +#define STATE_TRANSVR_INIT (-101) /* [Transvr]:Be plugged in. [Obj]:Link up, and in initial process. */ +#define STATE_TRANSVR_ISOLATED (-102) /* [Transvr]:Be plugged in. [Obj]:Isolate, and not provide service. */ +#define STATE_TRANSVR_SWAPPED (-200) /* [Transvr]:Be plugged in. [Obj]:(Not used) */ +#define STATE_TRANSVR_DISCONNECTED (-300) /* [Transvr]:Un-plugged. [Obj]:Link down, and not provide service. */ +#define STATE_TRANSVR_UNEXCEPTED (-901) /* [Transvr]:Any [Obj]:Any, and not in expect case. */ + +/* Task state define */ +#define STATE_T_TASK_WAIT (110) +#define STATE_T_TASK_DONE (0) +#define STATE_T_TASK_INIT (-110) +#define STATE_T_TASK_FAIL (-410) + + +/* Event for task handling */ +#define EVENT_TRANSVR_TASK_WAIT (2101) +#define EVENT_TRANSVR_TASK_DONE (0) +#define EVENT_TRANSVR_TASK_FAIL (-2101) +/* Event for initial handling */ +#define EVENT_TRANSVR_INIT_UP (2201) +#define EVENT_TRANSVR_INIT_DOWN (1) +#define EVENT_TRANSVR_INIT_REINIT (-2201) +#define EVENT_TRANSVR_INIT_FAIL (-2202) +/* Event for others */ +#define EVENT_TRANSVR_RELOAD_FAIL (-2301) +#define EVENT_TRANSVR_EXCEP_INIT (-2401) +#define EVENT_TRANSVR_EXCEP_UP (-2402) +#define EVENT_TRANSVR_EXCEP_DOWN (-2403) +#define EVENT_TRANSVR_EXCEP_SWAP (-2404) +#define EVENT_TRANSVR_EXCEP_EXCEP (-2405) +#define EVENT_TRANSVR_EXCEP_ISOLATED (-2406) +#define EVENT_TRANSVR_I2C_CRASH (-2501) + +/* Transceiver error code define */ +#define ERR_TRANSVR_UNINIT (-201) +#define ERR_TRANSVR_UNPLUGGED (-202) +#define ERR_TRANSVR_ABNORMAL (-203) +#define ERR_TRANSVR_NOSTATE (-204) +#define ERR_TRANSVR_NOTSUPPORT (-205) +#define ERR_TRANSVR_BADINPUT (-206) +#define ERR_TRANSVR_UPDATE_FAIL (-207) +#define ERR_TRANSVR_RELOAD_FAIL (-208) +#define ERR_TRANSVR_INIT_FAIL (-209) +#define ERR_TRANSVR_UNDEFINED (-210) +#define ERR_TRANSVR_TASK_FAIL (-211) +#define ERR_TRANSVR_TASK_BUSY (-212) +#define ERR_TRANSVR_UEVENT_FAIL (-213) +#define ERR_TRANSVR_FUNC_DISABLE (-214) +#define ERR_TRANSVR_I2C_CRASH (-297) +#define ERR_TRNASVR_BE_ISOLATED (-298) +#define ERR_TRANSVR_UNEXCPT (-299) + +/* For debug */ +#define DEBUG_TRANSVR_INT_VAL (-99) +#define DEBUG_TRANSVR_HEX_VAL (0xfe) +#define DEBUG_TRANSVR_STR_VAL "ERROR" + +/* For system internal */ +#define VAL_TRANSVR_COMID_ARREESS (0x50) +#define VAL_TRANSVR_COMID_OFFSET (0x00) +#define VAL_TRANSVR_EXTPHY_ADDR_56 (0x56) +#define VAL_TRANSVR_8472_READY_ADDR (0x51) +#define VAL_TRANSVR_8472_READY_PAGE (-1) +#define VAL_TRANSVR_8472_READY_OFFSET (110) +#define VAL_TRANSVR_8472_READY_BIT (0) +#define VAL_TRANSVR_8472_READY_VALUE (0) +#define VAL_TRANSVR_8472_READY_ABNORMAL (0xff) +#define VAL_TRANSVR_8436_READY_ADDR (0x50) +#define VAL_TRANSVR_8436_READY_PAGE (-1) +#define VAL_TRANSVR_8436_READY_OFFSET (2) +#define VAL_TRANSVR_8436_READY_BIT (0) +#define VAL_TRANSVR_8436_READY_VALUE (0) +#define VAL_TRANSVR_8436_READY_ABNORMAL (0xff) +#define VAL_TRANSVR_8436_PWD_ADDR (0x50) +#define VAL_TRANSVR_8436_PWD_PAGE (-1) +#define VAL_TRANSVR_8436_PWD_OFFSET (123) +#define VAL_TRANSVR_PAGE_FREE (-99) +#define VAL_TRANSVR_PAGE_SELECT_OFFSET (127) +#define VAL_TRANSVR_PAGE_SELECT_DELAY (5) +#define VAL_TRANSVR_TASK_RETRY_FOREVER (-999) +#define VAL_TRANSVR_FUNCTION_DISABLE (-1) +#define STR_TRANSVR_SFP "SFP" +#define STR_TRANSVR_QSFP "QSFP" +#define STR_TRANSVR_QSFP_PLUS "QSFP+" +#define STR_TRANSVR_QSFP28 "QSFP28" + +/* For transvr buf len */ +#define LEN_TRANSVR_S_STR (16) +#define LEN_TRANSVR_M_STR (32) +#define LEN_TRANSVR_L_STR (64) + +/* Optical wavelength */ +#define VAL_OPTICAL_WAVELENGTH_SR (850) +#define VAL_OPTICAL_WAVELENGTH_LR (1310) +#define VAL_OPTICAL_WAVELENGTH_ER (1550) + +/* BCM chip type define */ +#define BCM_CHIP_TYPE_TRIDENT_2 (31001) /* Magnolia, Hudson32i, Spruce */ +#define BCM_CHIP_TYPE_TOMAHAWK (31002) /* Redwood, Cypress, Sequoia */ +#define BCM_CHIP_TYPE_TRIDENT_3 (31003) /* Maple */ + +#define BF_CHIP_TYPE_TOFINO (31011) /* Lavender */ + +/* Info from transceiver EEPROM */ +struct eeprom_map_s { + int addr_br; int page_br; int offset_br; int length_br; + int addr_cdr; int page_cdr; int offset_cdr; int length_cdr; + int addr_comp_rev; int page_comp_rev; int offset_comp_rev; int length_comp_rev; + int addr_connector; int page_connector; int offset_connector; int length_connector; + int addr_diag_type; int page_diag_type; int offset_diag_type; int length_diag_type; + int addr_extbr; int page_extbr; int offset_extbr; int length_extbr; + int addr_ext_id; int page_ext_id; int offset_ext_id; int length_ext_id; + int addr_id; int page_id; int offset_id; int length_id; + int addr_len_sm; int page_len_sm; int offset_len_sm; int length_len_sm; + int addr_len_smf; int page_len_smf; int offset_len_smf; int length_len_smf; + int addr_len_om1; int page_len_om1; int offset_len_om1; int length_len_om1; + int addr_len_om2; int page_len_om2; int offset_len_om2; int length_len_om2; + int addr_len_om3; int page_len_om3; int offset_len_om3; int length_len_om3; + int addr_len_om4; int page_len_om4; int offset_len_om4; int length_len_om4; + int addr_option; int page_option; int offset_option; int length_option; + int addr_rate_id; int page_rate_id; int offset_rate_id; int length_rate_id; + int addr_rx_am; int page_rx_am; int offset_rx_am; int length_rx_am; + int addr_rx_em; int page_rx_em; int offset_rx_em; int length_rx_em; + int addr_rx_los; int page_rx_los; int offset_rx_los; int length_rx_los; + int addr_rx_power; int page_rx_power; int offset_rx_power; int length_rx_power; + int addr_soft_rs0; int page_soft_rs0; int offset_soft_rs0; int length_soft_rs0; + int addr_soft_rs1; int page_soft_rs1; int offset_soft_rs1; int length_soft_rs1; + int addr_temp; int page_temp; int offset_temp; int length_temp; + int addr_trancomp; int page_trancomp; int offset_trancomp; int length_trancomp; + int addr_trancomp_ext; int page_trancomp_ext; int offset_trancomp_ext; int length_trancomp_ext; + int addr_tx_bias; int page_tx_bias; int offset_tx_bias; int length_tx_bias; + int addr_tx_disable; int page_tx_disable; int offset_tx_disable; int length_tx_disable; + int addr_tx_eq; int page_tx_eq; int offset_tx_eq; int length_tx_eq; + int addr_tx_fault; int page_tx_fault; int offset_tx_fault; int length_tx_fault; + int addr_tx_power; int page_tx_power; int offset_tx_power; int length_tx_power; + int addr_vendor_name; int page_vendor_name; int offset_vendor_name; int length_vendor_name; + int addr_vendor_pn; int page_vendor_pn; int offset_vendor_pn; int length_vendor_pn; + int addr_vendor_rev; int page_vendor_rev; int offset_vendor_rev; int length_vendor_rev; + int addr_vendor_sn; int page_vendor_sn; int offset_vendor_sn; int length_vendor_sn; + int addr_voltage; int page_voltage; int offset_voltage; int length_voltage; + int addr_wavelength; int page_wavelength; int offset_wavelength; int length_wavelength; +}; + + +struct transvr_worker_s; + +/* Class of transceiver object */ +struct transvr_obj_s { + + /* ========== Object private property ========== + * [Prop]: id + * [Desc]: Type of serial transceiver. + * [Note]: SFP:03h / QSFP:0Ch / QSPF+:0Dh /QSFP28:11h + */ + uint8_t id; + + /* [Prop]: connector + * [Desc]: Connector type. + * [Note]: SFP : A0h / 2 + * QSFP: 00h / 130 + */ + uint8_t connector; + + /* [Prop]: transvr_comp + * [Desc]: Transceiver compliance code. + * [Note]: SFP: SFF-8472 + * - Normal : A0h / offset 3-10 + * - Extended: A0h / offset 36 + * QSFP: SFF-8436 & SFF-8636 + * - Normal : 00h / offset 131-138 + * - Extended: 00h / offset 192 + */ + uint8_t transvr_comp[8]; + uint8_t transvr_comp_ext; + + /* [Prop]: vendor_name + * [Desc]: SFP vendor name (ASCII 16 byte char). + * [Note]: ex:FINISAR CORP. + */ + char *vendor_name; + + /* [Prop]: vendor_pn + * [Desc]: Part number provided by SFP vendor (ASCII 16 byte char). + * [Note]: + */ + char *vendor_pn; + + /* [Prop]: vendor_rev + * [Desc]: Revision level for part number provided by vendor (ASCII 4 byte char). + * [Note]: + */ + char *vendor_rev; + + /* [Prop]: vendor_sn + * [Desc]: Serial number provided by vendor (ASCII 16 byte char). + * [Note]: + */ + char *vendor_sn; + + /* [Prop]: Extended identifier + * [Desc]: SFP: + * => None + * + * QSFP: + * => This byte contained two information: + * (1) Power consumption class + * (2) CDR function present + * [Note]: Bit description as below: + * [SFP] + * None + * + * [QSFP] + * (1) Power consumption class: + * Class 1: 1.5W (Bit6-7 = 00:) + * Class 2: 2.0W (Bit6-7 = 01:) + * Class 3: 2.5W (Bit6-7 = 10:) + * Class 4: 3.5W (Bit6-7 = 11:) + * Class 5: 4.0W (Bit0-1 = 01:) + * Class 6: 4.5W (Bit0-1 = 10:) + * Class 7: 5.0W (Bit0-1 = 11:) + * (2) CDR function present: + * Bit2: 0 = No CDR in RX + * 1 = CDR present in RX + * Bit3: 0 = No CDR in TX + * 1 = CDR present in TX + */ + uint8_t ext_id; + + /* [Prop]: br + * [Desc]: Nominal bit rate, units of 100 MBits/sec. + * [Note]: SFP:03h / QSFP:0Ch / QSPF+:0Dh + * has val: 0x67 + * no val : + */ + uint8_t br; + + /* [Prop]: extbr + * [Desc]: Extended br (00h/222) + * [Desc]: Nominal bit rate per channel, units of 250 Mbps. + * Complements. Byte 140. See Table 32A. + */ + uint8_t extbr; + + /* [Prop]: len_sm + * [Desc]: Length (single mode)-(100's)m + * [Note]: This value specifies the link length that is supported by the transceiver + * while operating in compliance with the applicable standards using single mode + * fiber. The value is in units of 100 meters. A value of 255 means that the + * transceiver supports a link length greater than 25.4 km. A value of zero means + * that the transceiver does not support single mode fiber or that the length + * information must be determined from the transceiver technology. + */ + int len_sm; + + /* [Prop]: len_smf + * [Desc]: Length (single mode)-km + * [Note]: Addition to EEPROM data from original GBIC definition. This value specifies + * the link length that is supported by the transceiver while operating in + * compliance with the applicable standards using single mode fiber. The value + * is in units of kilometers. A value of 255 means that the transceiver supports + * a link length greater than 254 km. A value of zero means that the transceiver + * does not support single mode fiber or that the length information must be + * determined from the transceiver technology. + */ + int len_smf; + + /* [Prop]: len_om1 + * [Desc]: Link length supported for 62.5 um OM1 fiber, units of 10 m + * [Note]: The value is in units of 10 meters. A value of 255 means that the + * transceiver supports a link length greater than 2.54 km. A value of + * zero means that the transceiver does not support 50 micron multi-mode + * fiber or that the length information must be determined from the transceiver + * technology. + */ + int len_om1; + + /* [Prop]: len_om2 + * [Desc]: Link length supported for 50 um OM2 fiber, units of 10 m + * [Note]: The value is in units of 10 meters. A value of 255 means that the + * transceiver supports a link length greater than 2.54 km. A value of + * zero means that the transceiver does not support 50 micron multi-mode + * fiber or that the length information must be determined from the transceiver + * technology. + */ + int len_om2; + + /* [Prop]: len_om3 + * [Desc]: Length (50um, OM3) + * [Note]: This value specifies link length that is supported by the transceiver while + * operating in compliance with applicable standards using 50 micron multimode + * OM3 [2000 MHz*km] fiber. The value is in units of 10 meters. A value of 255 + * means that the transceiver supports a link length greater than 2.54 km. A value + * of zero means that the transceiver does not support 50 micron multimode fiber + * or that the length information must be determined from the transceiver technology. + */ + int len_om3; + + /* [Prop]: len_om4 + * [Desc]: Length (50um, OM4) and Length (Active Cable or Copper) + * [Note]: For optical links, this value specifies link length that is supported by the + * transceiver while operating in compliance with applicable standards using 50 micron + * multimode OM4 [4700 MHz*km] fiber. The value is in units of 10 meters. A value of + * 255 means that the transceiver supports a link length greater than 2.54 km. A value + * of zero means that the transceiver does not support 50 micron multimode fiber or that + * the length information must be determined from the transceiver codes specified in Table 5-3. + * + * For copper links, this value specifies minimum link length supported by the transceiver + * while operating in compliance with applicable standards using copper cable. For active + * cable, this value represents actual length. The value is in units of 1 meter. A value of 255 + * means the transceiver supports a link length greater than 254 meters. A value of zero means + * the transceiver does not support copper or active cables or the length information must be + * determined from transceiver technology. Further information about cable design, equalization, + * and connectors is usually required to guarantee meeting a particular length requirement. + */ + int len_om4; + + /* [Prop]: comp_rev + * [Desc]: SFF spec revision compliance + * [Note]: Indicates which revision of SFF SFF-8472 (SFP) / SFF-8636 (QSFP) the transceiver + * complies with. (unsigned integer) + */ + uint8_t comp_rev; + + /* [Prop]: CDR + * [Desc]: For transceivers with CDR capability, setting the CDR to ON engages the internal + * retiming function. Setting the CDR to OFF enables an internal bypassing mode ,which + * directs traffic around the internal CDR. (Reference: SFF-8636) + * [Note]: value=0xff: ON. + * value=0x00: OFF. + */ + uint8_t cdr; + + /* [Prop]: rate_id + * [Desc]: Soft Rate Select 0(RX). + * [Note]: 1. Addr: A0h / Offset: 13 + * 2. Value description: + * 00h Unspecified + * 01h SFF-8079 (4/2/1G Rate_Select & AS0/AS1) + * 02h SFF-8431 (8/4/2G Rx Rate_Select only) + * 03h Unspecified * + * 04h SFF-8431 (8/4/2G Tx Rate_Select only) + * 05h Unspecified * + * 06h SFF-8431 (8/4/2G Independent Rx & Tx Rate_select) + * 07h Unspecified * + * 08h FC-PI-5 (16/8/4G Rx Rate_select only) High=16G only, Low=8G/4G + * 09h Unspecified * + * 0Ah FC-PI-5 (16/8/4G Independent Rx, Tx Rate_select) High=16G only, + * Low=8G/4G + * 0Bh Unspecified * + * 0Ch FC-PI-6 (32/16/8G Independent Rx, Tx Rate_Select) + * High=32G only, Low = 16G/8G + * 0Dh Unspecified * + * 0Eh 10/8G Rx and Tx Rate_Select controlling the operation or locking + * modes of the internal signal conditioner, retimer or CDR, according + * to the logic table defined in Table 10-2, High Bit Rate + * (10G) =9.95-11.3 Gb/s; Low Bit Rate (8G) = 8.5 Gb/s. In this mode, + * the default value of bit 110.3 (Soft Rate Select RS(0), Table 9-11) + * and of bit 118.3 (Soft Rate Select RS(1), Table 10-1) is 1. + * 0Fh Unspecified * + * 10h-FFh Unallocated + */ + int rate_id; + + /* [Prop]: soft_rs0 + * [Desc]: Soft Rate Select 0(RX). + * [Note]: 1. Writing '1' selects full bandwidth operation. + * 2. This bit is "OR'd with the hard Rate_Select, AS(0) or RS(0) pin value. + * 3. Default at power up is logic zero/low + * 4. Addr: A2h / Offset: 110 / Bit: 3 + */ + uint8_t soft_rs0; + + /* [Prop]: soft_rs1 + * [Desc]: Soft Rate Select 1(TX). + * [Note]: 1. Writing '1' selects full bandwidth TX operation. + * 2. This bit is "OR'd with the hard Rate_Select, AS(1) or RS(1) pin value. + * 3. Default at power up is logic zero/low + * 4. Addr: A2h / Offset: 118 / Bit: 3 + */ + uint8_t soft_rs1; + + /* [Prop]: diag_type + * [Desc]: DIAGNOSTIC MONITORING TYPE (A0h/92) + * [Note]: Description in SFF-8472 as below: + * Bit7: Reserved for legacy diagnostic implementations. Must be '0' for compliance + * with this document. + * Bit6: Digital diagnostic monitoring implemented (described in this document). + * Must be '1' for compliance with this document. + * Bit5 Internally calibrated + * Bit4 Externally calibrated + * Bit3 Received power measurement type.0 = OMA, 1 = average power + * Bit2 Address change required see section above, "addressing modes" + * Bit1-0 Unallocated + */ + uint8_t diag_type; + + /* [Prop]: curr_temp + * [Desc]: Transceiver Current Temperature (A2h/96-97) + * [Note]: 1. Dependent on diag_type. + * 2. 96: High byte + * 3. 97: Low byte + * 4. This feature only for SFP + */ + uint8_t curr_temp[2]; + + /* [Prop]: curr_vol + * [Desc]: Transceiver Current Voltage (SFP:A2h/108-109; QSFP:00h/22-23) + * [Note]: 1. Dependent on diag_type. + * 2. 98: High byte + * 3. 99: Low byte + * 4. This feature only for SFP + * 5. Internally measured transceiver supply voltage. Represented + * as a 16 bit unsigned integer with the voltage defined as the + * full 16 bit value (0-65535) with LSB equal to 100 uVolt, + * yielding a total range of 0 to +6.55 Volts + */ + uint8_t curr_voltage[2]; + + /* [Prop]: curr_tx_bias + * [Desc]: Transceiver TX Bias Current (SFP:A2h/100-101; QSFP:00h/26-27) + * [Note]: 1. Dependent on diag_type. + * 2. 100: High byte + * 3. 101: Low byte + * 4. This feature only for SFP + * 5. Measured TX bias current in uA. Represented as a 16 bit unsigned + * integer with the current defined as the full 16 bit value (0-65535) + * with LSB equal to 2 uA, yielding a total range of 0 to 131 mA. + * Accuracy is vendor specific but must be better than 10% of the + * manufacturer's nominal value over specified operating temperature + * and voltage. + */ + uint8_t curr_tx_bias[8]; + + /* [Prop]: curr_tx_power + * [Desc]: Transceiver TX Output Power (A2h/102-103) + * [Note]: 1. Dependent on diag_type. + * 2. 102: High byte + * 3. 103: Low byte + * 4. This feature only for SFP + * 5. Measured TX output power in mW. Represented as a 16 bit unsigned + * integer with the power defined as the full 16 bit value (0-65535) + * with LSB equal to 0.1 uW, yielding a total range of 0 to 6.5535 mW + * (~ -40 to +8.2 dBm). Data is assumed to be based on measurement of + * laser monitor photodiode current. It is factory calibrated to absolute + * units using the most representative fiber output type. Accuracy is + * vendor specific but must be better than 3dB over specified temperature + * and voltage. Data is not valid when the transmitter is disabled. + */ + uint8_t curr_tx_power[8]; + + /* [Prop]: curr_tx_power + * [Desc]: Transceiver TX Output Power (A2h/102-103) + * [Note]: 1. Dependent on diag_type. + * 2. 102: High byte + * 3. 103: Low byte + * 4. This feature only for SFP + * 5. Measured RX received optical power in mW. Value can represent either + * average received power or OMA depending upon how bit 3 of byte 92 (A0h) + * is set. Represented as a 16 bit unsigned integer with the power defined + * as the full 16 bit value (0-65535) with LSB equal to 0.1 uW, yielding a + * total range of 0 to 6.5535 mW (~ -40 to +8.2 dBm). Absolute accuracy is + * dependent upon the exact optical wavelength. For the vendor specified + * wavelength, accuracy shall be better than 3dB over specified temperature + * and voltage. + */ + uint8_t curr_rx_power[8]; + + /* [Prop]: wavelength + * [Desc]: Wavelength or Copper Cable Attenuation + * [Note]: (Following is info from SFF-8636) + * For optical free side devices, this parameter identifies the nominal + * transmitter output wavelength at room temperature. This parameter is a + * 16-bit hex value with Byte 186 as high order byte and Byte 187 as low + * order byte. The laser wavelength is equal to the 16-bit integer value + * divided by 20 in nm (units of 0.05 nm). This resolution should be adequate + * to cover all relevant wavelengths yet provide enough resolution for all + * expected DWDM applications. For accurate representation of controlled + * wavelength applications, this value should represent the center of the + * guaranteed wavelength range. If the free side device is identified as + * copper cable these registers will be used to define the cable attenuation. + * An indication of 0 dB attenuation refers to the case where the attenuation + * is not known or is unavailable. + * Byte 186 (00-FFh) is the copper cable attenuation at 2.5 GHz in units of 1 dB. + * Byte 187 (00-FFh) is the copper cable attenuation at 5.0 GHz in units of 1 dB. + */ + uint8_t wavelength[2]; + + /* [Prop]: Amplitude control + * [Desc]: Amplitude control + * [Note]: QSFP28 => SFF-8636 03H Byte-238/239 + */ + uint8_t rx_am[2]; + + /* [Prop]: Emphasis control + * [Desc]: Emphasis control + * [Note]: SFP+/28 => SFF-8472 A2H Byte-115 + * QSFP28 => SFF-8636 03H Byte-236/237 + */ + uint8_t rx_em[2]; + + /* [Prop]: Soft Rx LOS + * [Desc]: Soft Rx LOS which provide by transceiver + * [Note]: (Following is info from SFF-8636) + * Byte 3: + * - Bit 0: L-Rx1 LOS + * - Bit 1: L-Rx2 LOS + * - Bit 2: L-Rx3 LOS + * - Bit 3: L-Rx4 LOS + */ + uint8_t rx_los; + + /* [Prop]: Soft Tx Disable + * [Desc]: Soft Tx Disable which provide by transceiver + * [Note]: (Following is info from SFF-8636) + * Byte 86: + * - Bit 0: Tx1 Disable + * - Bit 1: Tx2 Disable + * - Bit 2: Tx3 Disable + * - Bit 3: Tx4 Disable + */ + uint8_t tx_disable; + + /* [Prop]: Soft Tx Fault + * [Desc]: Soft Tx Fault which provide by transceiver + * [Note]: (Following is info from SFF-8636) + * Byte 86: + * - Bit 0: Tx1 Fault + * - Bit 1: Tx2 Fault + * - Bit 2: Tx3 Fault + * - Bit 3: Tx4 Fault + */ + uint8_t tx_fault; + + /* [Prop]: Transceiver EQUALIZATION + * [Desc]: Transceiver EQUALIZATION + * [Note]: SFP+/28 => SFF-8472 A2H Byte-114 + * QSFP28 => SFF-8636 03H Byte-234/235 + */ + uint8_t tx_eq[2]; + + /* [Prop]: OPTION VALUES + * [Desc]: The bits in the option field shall specify the options implemented in the transceiver. + * [Note]: SFP+/28 => SFF-8472 A0H Byte-64/65 + * QSFP+/28 => SFF-8636 00H Byte-193/195 + */ + uint8_t option[3]; + + /* [Prop]: External PHY offset + * [Desc]: It needs to be setup first if you want to access transceiver external phy. + * [Note]: This feature dependent on transceiver. + * Currently, only 1G-RJ45 transceiver supported it. + */ + uint8_t extphy_offset; + + /* ========== Object private property ========== + */ + struct device *transvr_dev_p; + struct eeprom_map_s *eeprom_map_p; + struct i2c_client *i2c_client_p; + struct ioexp_obj_s *ioexp_obj_p; + struct transvr_worker_s *worker_p; + struct mutex lock; + char swp_name[32]; + int auto_config; + int auto_tx_disable; + int chan_id; + int chipset_type; + int curr_page; + int info; + int ioexp_virt_offset; + int lane_id[8]; + int layout; + int mode; + int retry; + int state; + int temp; + int type; + + /* ========== Object public functions ========== + */ + int (*get_id)(struct transvr_obj_s *self); + int (*get_ext_id)(struct transvr_obj_s *self); + int (*get_connector)(struct transvr_obj_s *self); + int (*get_vendor_name)(struct transvr_obj_s *self, char *buf_p); + int (*get_vendor_pn)(struct transvr_obj_s *self, char *buf_p); + int (*get_vendor_rev)(struct transvr_obj_s *self, char *buf_p); + int (*get_vendor_sn)(struct transvr_obj_s *self, char *buf_p); + int (*get_power_cls)(struct transvr_obj_s *self); + int (*get_br)(struct transvr_obj_s *self); + int (*get_len_sm)(struct transvr_obj_s *self); + int (*get_len_smf)(struct transvr_obj_s *self); + int (*get_len_om1)(struct transvr_obj_s *self); + int (*get_len_om2)(struct transvr_obj_s *self); + int (*get_len_om3)(struct transvr_obj_s *self); + int (*get_len_om4)(struct transvr_obj_s *self); + int (*get_comp_rev)(struct transvr_obj_s *self); + int (*get_comp_eth_1)(struct transvr_obj_s *self); + int (*get_comp_eth_10)(struct transvr_obj_s *self); + int (*get_comp_eth_10_40)(struct transvr_obj_s *self); + int (*get_comp_extend)(struct transvr_obj_s *self); + int (*get_cdr)(struct transvr_obj_s *self); + int (*get_rate_id)(struct transvr_obj_s *self); + int (*get_soft_rs0)(struct transvr_obj_s *self); + int (*get_soft_rs1)(struct transvr_obj_s *self); + int (*get_info)(struct transvr_obj_s *self); + int (*get_if_type)(struct transvr_obj_s *self, char *buf_p); + int (*get_if_speed)(struct transvr_obj_s *self, char *buf_p); + int (*get_if_lane)(struct transvr_obj_s *self, char *buf_p); + int (*get_curr_temp)(struct transvr_obj_s *self, char *buf_p); + int (*get_curr_vol)(struct transvr_obj_s *self, char *buf_p); + int (*get_soft_rx_los)(struct transvr_obj_s *self, char *buf_p); + int (*get_soft_tx_disable)(struct transvr_obj_s *self, char *buf_p); + int (*get_soft_tx_fault)(struct transvr_obj_s *self, char *buf_p); + int (*get_auto_tx_disable)(struct transvr_obj_s *self, char *buf_p); + int (*get_tx_bias)(struct transvr_obj_s *self, char *buf_p); + int (*get_tx_power)(struct transvr_obj_s *self, char *buf_p); + int (*get_rx_power)(struct transvr_obj_s *self, char *buf_p); + int (*get_tx_eq)(struct transvr_obj_s *self, char *buf_p); + int (*get_rx_am)(struct transvr_obj_s *self, char *buf_p); + int (*get_rx_em)(struct transvr_obj_s *self, char *buf_p); + int (*get_wavelength)(struct transvr_obj_s *self, char *buf_p); + int (*get_extphy_offset)(struct transvr_obj_s *self, char *buf_p); + int (*get_extphy_reg)(struct transvr_obj_s *self, char *buf_p); + int (*set_cdr)(struct transvr_obj_s *self, int input_val); + int (*set_soft_rs0)(struct transvr_obj_s *self, int input_val); + int (*set_soft_rs1)(struct transvr_obj_s *self, int input_val); + int (*set_soft_tx_disable)(struct transvr_obj_s *self, int input_val); + int (*set_auto_tx_disable)(struct transvr_obj_s *self, int input_val); + int (*set_tx_eq)(struct transvr_obj_s *self, int input_val); + int (*set_rx_am)(struct transvr_obj_s *self, int input_val); + int (*set_rx_em)(struct transvr_obj_s *self, int input_val); + int (*set_extphy_offset)(struct transvr_obj_s *self, int input_val); + int (*set_extphy_reg)(struct transvr_obj_s *self, int input_val); + + /* ========== Object private functions ========== + */ + int (*init)(struct transvr_obj_s *self); + int (*clean)(struct transvr_obj_s *self); + int (*check)(struct transvr_obj_s *self); + int (*update_all)(struct transvr_obj_s *self, int show_err); + int (*fsm_4_direct)(struct transvr_obj_s* self, char *caller_name); + int (*fsm_4_polling)(struct transvr_obj_s* self, char *caller_name); + int (*send_uevent)(struct transvr_obj_s* self, enum kobject_action u_action); + int (*dump_all)(struct transvr_obj_s* self); +}; + + +/* For AVL Mapping */ +struct transvr_avl_s { + char vendor_name[32]; + char vendor_pn[32]; + int (*init)(struct transvr_obj_s *self); +}; + + +/* Worker for long term task of transceiver */ +struct transvr_worker_s { + /* Task Parameter */ + struct transvr_obj_s *transvr_p; + struct transvr_worker_s *next_p; + struct transvr_worker_s *pre_p; + unsigned long trigger_time; + char func_name[64]; + int retry; + int state; + + /* Task private data */ + void *p_data; + + /* Call back function */ + int (*main_task)(struct transvr_worker_s *task); + int (*post_task)(struct transvr_worker_s *task); +}; + + +struct transvr_obj_s * +create_transvr_obj(char *swp_name, + int chan_id, + struct ioexp_obj_s *ioexp_obj_p, + int ioexp_virt_offset, + int transvr_type, + int chipset_type, + int run_mode); + +void lock_transvr_obj(struct transvr_obj_s *self); +void unlock_transvr_obj(struct transvr_obj_s *self); +int isolate_transvr_obj(struct transvr_obj_s *self); + +int resync_channel_tier_2(struct transvr_obj_s *self); + +void alarm_msg_2_user(struct transvr_obj_s *self, char *emsg); + +#endif /* TRANSCEIVER_H */ + + + + + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/d6356/utils/inventec_d6356_util.py b/platform/broadcom/sonic-platform-modules-inventec/d6356/utils/inventec_d6356_util.py new file mode 100755 index 000000000000..e3e696c088cd --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/d6356/utils/inventec_d6356_util.py @@ -0,0 +1,251 @@ +#!/usr/bin/env python +# +# Copyright (C) 2017 Inventec, Inc. +# +# 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 . + +""" +Usage: %(scriptName)s [options] command object + +options: + -h | --help : this help message + -d | --debug : run with debug mode + -f | --force : ignore error during installation or clean +command: + install : install drivers and generate related sysfs nodes + clean : uninstall drivers and remove related sysfs nodes +""" + +import os +import commands +import sys, getopt +import logging +import re +import time +from collections import namedtuple + +DEBUG = False +args = [] +FORCE = 0 +i2c_prefix = '/sys/bus/i2c/devices/' + + +if DEBUG == True: + print sys.argv[0] + print 'ARGV: ', sys.argv[1:] + + +def main(): + global DEBUG + global args + global FORCE + + + if len(sys.argv)<2: + show_help() + + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', + 'debug', + 'force', + ]) + if DEBUG == True: + print options + print args + print len(sys.argv) + + for opt, arg in options: + if opt in ('-h', '--help'): + show_help() + elif opt in ('-d', '--debug'): + DEBUG = True + logging.basicConfig(level=logging.INFO) + elif opt in ('-f', '--force'): + FORCE = 1 + else: + logging.info('no option') + for arg in args: + if arg == 'install': + install() + elif arg == 'clean': + uninstall() + else: + show_help() + + + return 0 + +def show_help(): + print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + sys.exit(0) + +def show_log(txt): + if DEBUG == True: + print "[D6356]"+txt + return + +def exec_cmd(cmd, show): + logging.info('Run :'+cmd) + status, output = commands.getstatusoutput(cmd) + show_log (cmd +" with result:" + str(status)) + show_log (" output:"+output) + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + + +instantiate = [ +'echo inv_eeprom 0x55 > /sys/bus/i2c/devices/i2c-0/i2c-2/new_device' +#'echo inv_cpld 0x33 > /sys/bus/i2c/devices/i2c-0/i2c-2/new_device', +#'echo inv_cpld 0x77 > /sys/bus/i2c/devices/i2c-0/i2c-2/new_device' +] + + +drivers =[ +#kernel-dirvers +'lpc_ich', +'i2c-i801', +'i2c-mux', +'i2c-mux-pca954x', +'i2c-mux-pca9541', +'i2c-dev', +'ucd9000', +#inv-modules +'inv_eeprom', +'inv_cpld', +'inv_platform', +'monitor', +'swps'] + + + +def system_install(): + global FORCE + + #remove default drivers to avoid modprobe order conflicts + status, output = exec_cmd("rmmod i2c_ismt ", 1) + status, output = exec_cmd("rmmod i2c-i801 ", 1) + status, output = exec_cmd("rmmod gpio_ich ", 1) + status, output = exec_cmd("rmmod lpc_ich ", 1) + + #insert extra module + status, output = exec_cmd("insmod /lib/modules/3.16.0-5-amd64/extra/gpio-ich.ko gpiobase=0",1) + + #install drivers + for i in range(0,len(drivers)): + status, output = exec_cmd("modprobe "+drivers[i], 1) + if status: + print output + if FORCE == 0: + return status + + #instantiate devices + for i in range(0,len(instantiate)): + #time.sleep(1) + status, output = exec_cmd(instantiate[i], 1) + if status: + print output + if FORCE == 0: + return status + + #swps map to i2c-bus + for i in range(14,22): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-6/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(22,30): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-7/i2c-"+str(i)+"/new_device", 1) + status, output =exec_cmd("echo sff8436 0x51 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-7/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(30,38): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-8/i2c-"+str(i)+"/new_device", 1) + status, output =exec_cmd("echo sff8436 0x51 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-8/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(38,46): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-9/i2c-"+str(i)+"/new_device", 1) + status, output =exec_cmd("echo sff8436 0x51 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-9/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(46,54): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-10/i2c-"+str(i)+"/new_device", 1) + status, output =exec_cmd("echo sff8436 0x51 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-10/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(54,62): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-11/i2c-"+str(i)+"/new_device", 1) + status, output =exec_cmd("echo sff8436 0x51 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-11/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + for i in range(62,70): + status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-12/i2c-"+str(i)+"/new_device", 1) + status, output =exec_cmd("echo sff8436 0x51 > /sys/bus/i2c/devices/i2c-1/i2c-5/i2c-12/i2c-"+str(i)+"/new_device", 1) + if status: + print output + if FORCE == 0: + return status + return + + +def system_ready(): + if not device_found(): + return False + return True + +def install(): + if not device_found(): + print "No device, installing...." + status = system_install() + if status: + if FORCE == 0: + return status + else: + print "D6356 devices detected...." + return + +def uninstall(): + global FORCE + #uninstall drivers + exec_cmd("rmmod gpio_ich",1) + for i in range(len(drivers)-1,-1,-1): + status, output = exec_cmd("rmmod "+drivers[i], 1) + if status: + print output + if FORCE == 0: + return status + return + +def device_found(): + ret1, log = exec_cmd("ls "+i2c_prefix+"*0072", 0) + ret2, log = exec_cmd("ls "+i2c_prefix+"i2c-5", 0) + return not(ret1 or ret2) + +if __name__ == "__main__": + main() + + diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/control b/platform/broadcom/sonic-platform-modules-inventec/debian/control index 45aa6ba10bc6..b3af29108f5f 100644 --- a/platform/broadcom/sonic-platform-modules-inventec/debian/control +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/control @@ -25,6 +25,11 @@ Architecture: amd64 Depends: linux-image-4.9.0-9-2-amd64 Description: kernel modules for platform devices such as fan, led +Package: platform-modules-d6356 +Architecture: amd64 +Depends: linux-image-4.9.0-8-2-amd64 +Description: kernel modules for platform devices such as fan, led + Package: platform-modules-d7264q28b Architecture: amd64 Depends: linux-image-4.9.0-9-2-amd64 diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d6356.init b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d6356.init new file mode 100644 index 000000000000..eaeb97406a1c --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d6356.init @@ -0,0 +1,58 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: setup-board +# Required-Start: +# Required-Stop: +# Should-Start: +# Should-Stop: +# Default-Start: S +# Default-Stop: 0 6 +# Short-Description: Setup Inventec d6356 board. +### END INIT INFO + +PLATFORM_DIR=/usr/share/sonic/device/x86_64-inventec_d6356-r0/plugins + +PLATFORM_DAEMON=$PLATFORM_DIR/platfmgr.py +PLATFORM_DAEMON_NAME=platfmgr + +# The process ID of the script when it runs is stored here: +PLATFORM_PIDFILE=/var/run/$PLATFORM_DAEMON_NAME.pid + +do_monitor_start() { + /sbin/start-stop-daemon --quiet --oknodo --pidfile $PLATFORM_PIDFILE --make-pidfile --startas $PLATFORM_DAEMON --start --background -- $DAEMON_OPTS +} + +do_monitor_stop() { + /sbin/start-stop-daemon --quiet --oknodo --stop --pidfile $PLATFORM_PIDFILE --retry 10 +} + +case "$1" in +start) + echo -n "Setting up board... " + +# depmod -a + /usr/local/bin/inventec_d6356_util.py -f install + do_monitor_${1} + echo "done." + ;; + +stop) + + /usr/local/bin/inventec_d6356_util.py -f clean + do_monitor_${1} + echo "done." + + ;; + +force-reload|restart) + echo "Not supported" + ;; + +*) + echo "Usage: /etc/init.d/platform-modules-d6356.init {start|stop}" + exit 1 + ;; +esac + +exit 0 diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d6356.install b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d6356.install new file mode 100644 index 000000000000..4c668b9816c4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d6356.install @@ -0,0 +1 @@ +d6356/utils/inventec_d6356_util.py /usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-inventec/debian/rules b/platform/broadcom/sonic-platform-modules-inventec/debian/rules index 2e396e167822..8bfe6e6582d9 100755 --- a/platform/broadcom/sonic-platform-modules-inventec/debian/rules +++ b/platform/broadcom/sonic-platform-modules-inventec/debian/rules @@ -14,7 +14,7 @@ export INSTALL_MOD_DIR:=extra KVERSION ?= $(shell uname -r) KERNEL_SRC := /lib/modules/$(KVERSION) MOD_SRC_DIR:= $(shell pwd) -MODULE_DIRS:= d7032q28b d7054q28b d6254qs d6556 d7264q28b +MODULE_DIRS:= d7032q28b d7054q28b d6254qs d6556 d6356 d7264q28b %: dh $@ --with=systemd From af5c544cbc93c6ebfc2fb27361f6d34efd2c4e1a Mon Sep 17 00:00:00 2001 From: Vitaliy Senchyshyn <43479243+vsenchyshyn@users.noreply.github.com> Date: Thu, 15 Aug 2019 01:26:19 -0700 Subject: [PATCH 23/54] [platform]: Added exceptions handling for BFN syseeprom and psuutil (#3342) Added exceptions handling for BFN psuutil.py and eeprom.py which are raised when syseepromd and psud try to connect to the BFN thrift server which is not up yet. Now the exceptions backtrace is not logged to the syslog. Also psud doesn't exit on system bootup due to uncaught exception. Signed-off-by: Vitaliy Senchyshyn --- .../plugins/eeprom.py | 23 +++++++++++++++---- .../plugins/psuutil.py | 20 +++++++++++----- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py index 1faeff9d18bf..c06a1899fc3c 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py @@ -74,6 +74,7 @@ class board(eeprom_tlvinfo.TlvInfoDecoder): + RETRIES = 30 def __init__(self, name, path, cpld_root, ro): @@ -88,7 +89,16 @@ def __init__(self, name, path, cpld_root, ro): self.eeprom_path = EEPROM_SYMLINK super(board, self).__init__(self.eeprom_path, 0, '', True) - self.eeprom_init() + + for attempt in range(self.RETRIES + 1): + if not self.eeprom_init(): + time.sleep(1) + else: + break + + if attempt == self.RETRIES: + raise RuntimeError("Could not initialize syseeprom") + def thrift_setup(self): global thrift_server, transport, pltfm_mgr @@ -109,9 +119,12 @@ def thrift_teardown(self): def eeprom_init(self): global pltfm_mgr - self.thrift_setup() - eeprom = pltfm_mgr.pltfm_mgr_sys_eeprom_get() - self.thrift_teardown() + try: + self.thrift_setup() + eeprom = pltfm_mgr.pltfm_mgr_sys_eeprom_get() + self.thrift_teardown() + except: + return False eeprom_params = "" for attr, val in eeprom.__dict__.iteritems(): @@ -143,3 +156,5 @@ def eeprom_init(self): sys.stdout = orig_stdout eeprom_base.EepromDecoder.write_eeprom(self, new_e) + return True + diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/psuutil.py b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/psuutil.py index 734901c2adfa..2c0e2fdb224e 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/psuutil.py +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/psuutil.py @@ -63,9 +63,13 @@ def get_psu_status(self, index): return False global pltfm_mgr - self.thrift_setup() - psu_info = pltfm_mgr.pltfm_mgr_pwr_supply_info_get(index) - self.thrift_teardown() + + try: + self.thrift_setup() + psu_info = pltfm_mgr.pltfm_mgr_pwr_supply_info_get(index) + self.thrift_teardown() + except: + return False return (psu_info.ffault == False) @@ -80,9 +84,13 @@ def get_psu_presence(self, index): return False global pltfm_mgr - self.thrift_setup() - status = pltfm_mgr.pltfm_mgr_pwr_supply_present_get(index) - self.thrift_teardown() + + try: + self.thrift_setup() + status = pltfm_mgr.pltfm_mgr_pwr_supply_present_get(index) + self.thrift_teardown() + except: + return False return status From 01786b2fdc3d2bed490eb37541491f44fd9dcc14 Mon Sep 17 00:00:00 2001 From: brandonchuang Date: Thu, 15 Aug 2019 16:27:38 +0800 Subject: [PATCH 24/54] [device] Add pmon_daemon_control.json for accton (#3340) Add pmon_daemon_control.json for accton devices which do not need led_control Signed-off-by: brandon_chuang --- .../x86_64-accton_as4630_54pe-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as5712_54x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as5812_54x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as5835_54t-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as5835_54x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as6712_32x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7116_54x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7212_54x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7312_54x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7312_54xs-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7315_27xb-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7326_56x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7512_32x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7712_32x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7716_32x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7716_32xb-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7726_32x-r0/pmon_daemon_control.json | 4 ++++ .../x86_64-accton_as7816_64x-r0/pmon_daemon_control.json | 4 ++++ 18 files changed, 72 insertions(+) create mode 100644 device/accton/x86_64-accton_as4630_54pe-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as5712_54x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as5812_54x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as5835_54t-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as5835_54x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as6712_32x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7116_54x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7212_54x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7312_54xs-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7315_27xb-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7326_56x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7512_32x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7716_32x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7716_32xb-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7726_32x-r0/pmon_daemon_control.json create mode 100644 device/accton/x86_64-accton_as7816_64x-r0/pmon_daemon_control.json diff --git a/device/accton/x86_64-accton_as4630_54pe-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as4630_54pe-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as4630_54pe-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as5712_54x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as5712_54x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as5712_54x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as5812_54x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as5812_54x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as5812_54x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as5835_54t-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as5835_54t-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as5835_54t-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as5835_54x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as5835_54x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as5835_54x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as6712_32x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as6712_32x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as6712_32x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7116_54x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7116_54x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7116_54x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7212_54x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7212_54x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7212_54x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7312_54x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7312_54x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7312_54xs-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7312_54xs-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54xs-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7315_27xb-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7315_27xb-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7315_27xb-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7326_56x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7326_56x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7326_56x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7512_32x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7512_32x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7512_32x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7712_32x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7712_32x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7716_32x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7716_32x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7716_32x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7716_32xb-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7716_32xb-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7716_32xb-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7726_32x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7726_32x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7726_32x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + diff --git a/device/accton/x86_64-accton_as7816_64x-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as7816_64x-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as7816_64x-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + From 448d40a4ccfa1d505347e7baa6cec801d07975de Mon Sep 17 00:00:00 2001 From: Jipan Yang Date: Thu, 15 Aug 2019 02:20:18 -0700 Subject: [PATCH 25/54] [build]: Fix INSTALL_DEBUG_TOOLS build config option (#2564) * Fix INSTALL_DEBUG_TOOLS build config option Signed-off-by: Jipan Yang --- rules/config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/config b/rules/config index 31e5d40ff1f9..afc9a4b9a374 100644 --- a/rules/config +++ b/rules/config @@ -52,9 +52,9 @@ DEFAULT_PASSWORD = YourPaSsWoRd # by default for TOR switch # ENABLE_PFCWD_ON_START = y -# SONIC_INSTALL_DEBUG_TOOLS - installs debugging tools in baseline docker +# INSTALL_DEBUG_TOOLS - installs debugging tools in baseline docker # Uncomment next line to enable: -# SONIC_INSTALL_DEBUG_TOOLS = y +# INSTALL_DEBUG_TOOLS = y # SONIC_ROUTING_STACK - specify the routing-stack being elected to drive SONiC's control-plane. # Supported routing stacks on SONiC are: From 97467e30097d56fd82806ba896723d60aae7be8b Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Thu, 15 Aug 2019 02:22:37 -0700 Subject: [PATCH 26/54] [device/Arista] Update drivers submodules (#3339) - Improve smbus reliability for all platforms - Delay processing of the reboot cause to reduce critical path - Add support of get_change_event for PSUs --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index 530f9707a2c3..8c45a8e11153 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 530f9707a2c3d06bb50a9b60b24a4bf4eb8a9735 +Subproject commit 8c45a8e111534f9d4337d3552eaf08881fb19d30 diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 530f9707a2c3..8c45a8e11153 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 530f9707a2c3d06bb50a9b60b24a4bf4eb8a9735 +Subproject commit 8c45a8e111534f9d4337d3552eaf08881fb19d30 From fbf616503a73470d6997009bc88409b4241ac8ff Mon Sep 17 00:00:00 2001 From: Jonathan Tsai Date: Thu, 15 Aug 2019 17:25:43 +0800 Subject: [PATCH 27/54] [Quanta/platform] Update IX1B to support Stretch (#2358) * [Quanta/platform] Update IX1B to support Stretch What I did Update IX1B's platform folders to support Stretch How I did it Follow https://github.com/Azure/SONiC/wiki/Porting-Guide How to verify it Follow https://github.com/Azure/SONiC/wiki/Command-Reference to verify hardware information can get from CLI correctly Signed-off-by: Jonathan Tsai --- .../x86_64-quanta_ix1b_rglbmc-r0/default_sku | 1 + .../minigraph.xml | 1074 ----------------- .../ix1b-32x/modules/Makefile | 4 +- .../ix1b-32x/modules/pmbus.h | 387 ------ .../ix1b-32x/modules/qci_hwmon_ix1b.c | 425 +++++++ .../ix1b-32x/modules/qci_platform_ix1b.c | 82 +- .../ix1b-32x/modules/qci_pmbus.c | 264 +++- .../ix1b-32x/utils/quanta_ix1b_util.py | 179 +-- 8 files changed, 838 insertions(+), 1578 deletions(-) create mode 100755 device/quanta/x86_64-quanta_ix1b_rglbmc-r0/default_sku delete mode 100755 device/quanta/x86_64-quanta_ix1b_rglbmc-r0/minigraph.xml delete mode 100755 platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/pmbus.h create mode 100644 platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_hwmon_ix1b.c mode change 100755 => 100644 platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_platform_ix1b.c diff --git a/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/default_sku b/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/default_sku new file mode 100755 index 000000000000..68cbc0d6058d --- /dev/null +++ b/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/default_sku @@ -0,0 +1 @@ +Quanta-IX1B-32X t1 diff --git a/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/minigraph.xml b/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/minigraph.xml deleted file mode 100755 index 9d348f0051ba..000000000000 --- a/device/quanta/x86_64-quanta_ix1b_rglbmc-r0/minigraph.xml +++ /dev/null @@ -1,1074 +0,0 @@ - - - - - - ARISTA01T0 - 10.0.0.33 - sonic - 10.0.0.32 - 1 - 180 - 60 - - - sonic - 10.0.0.0 - ARISTA01T2 - 10.0.0.1 - 1 - 180 - 60 - - - ARISTA02T0 - 10.0.0.35 - sonic - 10.0.0.34 - 1 - 180 - 60 - - - sonic - 10.0.0.2 - ARISTA02T2 - 10.0.0.3 - 1 - 180 - 60 - - - ARISTA03T0 - 10.0.0.37 - sonic - 10.0.0.36 - 1 - 180 - 60 - - - sonic - 10.0.0.4 - ARISTA03T2 - 10.0.0.5 - 1 - 180 - 60 - - - ARISTA04T0 - 10.0.0.39 - sonic - 10.0.0.38 - 1 - 180 - 60 - - - sonic - 10.0.0.6 - ARISTA04T2 - 10.0.0.7 - 1 - 180 - 60 - - - ARISTA05T0 - 10.0.0.41 - sonic - 10.0.0.40 - 1 - 180 - 60 - - - sonic - 10.0.0.8 - ARISTA05T2 - 10.0.0.9 - 1 - 180 - 60 - - - ARISTA06T0 - 10.0.0.43 - sonic - 10.0.0.42 - 1 - 180 - 60 - - - sonic - 10.0.0.10 - ARISTA06T2 - 10.0.0.11 - 1 - 180 - 60 - - - ARISTA07T0 - 10.0.0.45 - sonic - 10.0.0.44 - 1 - 180 - 60 - - - sonic - 10.0.0.12 - ARISTA07T2 - 10.0.0.13 - 1 - 180 - 60 - - - ARISTA08T0 - 10.0.0.47 - sonic - 10.0.0.46 - 1 - 180 - 60 - - - sonic - 10.0.0.14 - ARISTA08T2 - 10.0.0.15 - 1 - 180 - 60 - - - ARISTA09T0 - 10.0.0.49 - sonic - 10.0.0.48 - 1 - 180 - 60 - - - sonic - 10.0.0.16 - ARISTA09T2 - 10.0.0.17 - 1 - 180 - 60 - - - ARISTA10T0 - 10.0.0.51 - sonic - 10.0.0.50 - 1 - 180 - 60 - - - sonic - 10.0.0.18 - ARISTA10T2 - 10.0.0.19 - 1 - 180 - 60 - - - ARISTA11T0 - 10.0.0.53 - sonic - 10.0.0.52 - 1 - 180 - 60 - - - sonic - 10.0.0.20 - ARISTA11T2 - 10.0.0.21 - 1 - 180 - 60 - - - ARISTA12T0 - 10.0.0.55 - sonic - 10.0.0.54 - 1 - 180 - 60 - - - sonic - 10.0.0.22 - ARISTA12T2 - 10.0.0.23 - 1 - 180 - 60 - - - ARISTA13T0 - 10.0.0.57 - sonic - 10.0.0.56 - 1 - 180 - 60 - - - sonic - 10.0.0.24 - ARISTA13T2 - 10.0.0.25 - 1 - 180 - 60 - - - ARISTA14T0 - 10.0.0.59 - sonic - 10.0.0.58 - 1 - 180 - 60 - - - sonic - 10.0.0.26 - ARISTA14T2 - 10.0.0.27 - 1 - 180 - 60 - - - ARISTA15T0 - 10.0.0.61 - sonic - 10.0.0.60 - 1 - 180 - 60 - - - sonic - 10.0.0.28 - ARISTA15T2 - 10.0.0.29 - 1 - 180 - 60 - - - ARISTA16T0 - 10.0.0.63 - sonic - 10.0.0.62 - 1 - 180 - 60 - - - sonic - 10.0.0.30 - ARISTA16T2 - 10.0.0.31 - 1 - 180 - 60 - - - - - 65100 - sonic - - -
10.0.0.33
- - -
- -
10.0.0.1
- - -
- -
10.0.0.35
- - -
- -
10.0.0.3
- - -
- -
10.0.0.37
- - -
- -
10.0.0.5
- - -
- -
10.0.0.39
- - -
- -
10.0.0.7
- - -
- -
10.0.0.41
- - -
- -
10.0.0.9
- - -
- -
10.0.0.43
- - -
- -
10.0.0.11
- - -
- -
10.0.0.45
- - -
- -
10.0.0.13
- - -
- -
10.0.0.47
- - -
- -
10.0.0.15
- - -
- -
10.0.0.49
- - -
- -
10.0.0.17
- - -
- -
10.0.0.51
- - -
- -
10.0.0.19
- - -
- -
10.0.0.53
- - -
- -
10.0.0.21
- - -
- -
10.0.0.55
- - -
- -
10.0.0.23
- - -
- -
10.0.0.57
- - -
- -
10.0.0.25
- - -
- -
10.0.0.59
- - -
- -
10.0.0.27
- - -
- -
10.0.0.61
- - -
- -
10.0.0.29
- - -
- -
10.0.0.63
- - -
- -
10.0.0.31
- - -
-
- -
- - 64001 - ARISTA01T0 - - - - 65200 - ARISTA01T2 - - - - 64002 - ARISTA02T0 - - - - 65200 - ARISTA02T2 - - - - 64003 - ARISTA03T0 - - - - 65200 - ARISTA03T2 - - - - 64004 - ARISTA04T0 - - - - 65200 - ARISTA04T2 - - - - 64005 - ARISTA05T0 - - - - 65200 - ARISTA05T2 - - - - 64006 - ARISTA06T0 - - - - 65200 - ARISTA06T2 - - - - 64007 - ARISTA07T0 - - - - 65200 - ARISTA07T2 - - - - 64008 - ARISTA08T0 - - - - 65200 - ARISTA08T2 - - - - 64009 - ARISTA09T0 - - - - 65200 - ARISTA09T2 - - - - 64010 - ARISTA10T0 - - - - 65200 - ARISTA10T2 - - - - 64011 - ARISTA11T0 - - - - 65200 - ARISTA11T2 - - - - 64012 - ARISTA12T0 - - - - 65200 - ARISTA12T2 - - - - 64013 - ARISTA13T0 - - - - 65200 - ARISTA13T2 - - - - 64014 - ARISTA14T0 - - - - 65200 - ARISTA14T2 - - - - 64015 - ARISTA15T0 - - - - 65200 - ARISTA15T2 - - - - 64016 - ARISTA16T0 - - - - 65200 - ARISTA16T2 - - -
-
- - - - - - HostIP - Loopback0 - - 10.1.0.32/32 - - 10.1.0.32/32 - - - - - - - - sonic - - - - - - Ethernet0 - 10.0.0.0/31 - - - - Ethernet4 - 10.0.0.2/31 - - - - Ethernet8 - 10.0.0.4/31 - - - - Ethernet12 - 10.0.0.6/31 - - - - Ethernet16 - 10.0.0.8/31 - - - - Ethernet20 - 10.0.0.10/31 - - - - Ethernet24 - 10.0.0.12/31 - - - - Ethernet28 - 10.0.0.14/31 - - - - Ethernet32 - 10.0.0.16/31 - - - - Ethernet36 - 10.0.0.18/31 - - - - Ethernet40 - 10.0.0.20/31 - - - - Ethernet44 - 10.0.0.22/31 - - - - Ethernet48 - 10.0.0.24/31 - - - - Ethernet52 - 10.0.0.26/31 - - - - Ethernet56 - 10.0.0.28/31 - - - - Ethernet60 - 10.0.0.30/31 - - - - Ethernet64 - 10.0.0.32/31 - - - - Ethernet68 - 10.0.0.34/31 - - - - Ethernet72 - 10.0.0.36/31 - - - - Ethernet76 - 10.0.0.38/31 - - - - Ethernet80 - 10.0.0.40/31 - - - - Ethernet84 - 10.0.0.42/31 - - - - Ethernet88 - 10.0.0.44/31 - - - - Ethernet92 - 10.0.0.46/31 - - - - Ethernet96 - 10.0.0.48/31 - - - - Ethernet100 - 10.0.0.50/31 - - - - Ethernet104 - 10.0.0.52/31 - - - - Ethernet108 - 10.0.0.54/31 - - - - Ethernet112 - 10.0.0.56/31 - - - - Ethernet116 - 10.0.0.58/31 - - - - Ethernet120 - 10.0.0.60/31 - - - - Ethernet124 - 10.0.0.62/31 - - - - - - - - - - - - DeviceInterfaceLink - sonic - Ethernet0 - ARISTA01T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet4 - ARISTA02T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet8 - ARISTA03T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet12 - ARISTA04T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet16 - ARISTA05T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet20 - ARISTA06T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet24 - ARISTA07T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet28 - ARISTA08T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet32 - ARISTA09T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet36 - ARISTA10T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet40 - ARISTA11T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet44 - ARISTA12T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet48 - ARISTA13T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet52 - ARISTA14T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet56 - ARISTA15T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet60 - ARISTA16T2 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet64 - ARISTA01T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet68 - ARISTA02T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet72 - ARISTA03T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet76 - ARISTA04T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet80 - ARISTA05T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet84 - ARISTA06T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet88 - ARISTA07T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet92 - ARISTA08T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet96 - ARISTA09T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet100 - ARISTA10T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet104 - ARISTA11T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet108 - ARISTA12T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet112 - ARISTA13T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet116 - ARISTA14T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet120 - ARISTA15T0 - Ethernet1 - - - DeviceInterfaceLink - sonic - Ethernet124 - ARISTA16T0 - Ethernet1 - - - - - sonic - Quanta-IX1B-32X - - - - - - - sonic - - - DhcpResources - - - - - NtpResources - - 0.debian.pool.ntp.org;1.debian.pool.ntp.org;2.debian.pool.ntp.org;3.debian.pool.ntp.org - - - SyslogResources - - - - - - - - - sonic - Quanta-IX1B-32X -
diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/Makefile b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/Makefile index fd73f274ef53..48683c54a7bc 100755 --- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/Makefile +++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/Makefile @@ -1,3 +1 @@ -obj-m:=qci_pmbus.o qci_cpld_qsfp28.o qci_platform_ix1b.o - - +obj-m:=qci_pmbus.o qci_cpld_qsfp28.o qci_platform_ix1b.o qci_hwmon_ix1b.o diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/pmbus.h b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/pmbus.h deleted file mode 100755 index fa9beb3eb60c..000000000000 --- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/pmbus.h +++ /dev/null @@ -1,387 +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 - -/* - * Registers - */ -#define PMBUS_PAGE 0x00 -#define PMBUS_OPERATION 0x01 -#define PMBUS_ON_OFF_CONFIG 0x02 -#define PMBUS_CLEAR_FAULTS 0x03 -#define PMBUS_PHASE 0x04 - -#define PMBUS_CAPABILITY 0x19 -#define PMBUS_QUERY 0x1A - -#define PMBUS_VOUT_MODE 0x20 -#define PMBUS_VOUT_COMMAND 0x21 -#define PMBUS_VOUT_TRIM 0x22 -#define PMBUS_VOUT_CAL_OFFSET 0x23 -#define PMBUS_VOUT_MAX 0x24 -#define PMBUS_VOUT_MARGIN_HIGH 0x25 -#define PMBUS_VOUT_MARGIN_LOW 0x26 -#define PMBUS_VOUT_TRANSITION_RATE 0x27 -#define PMBUS_VOUT_DROOP 0x28 -#define PMBUS_VOUT_SCALE_LOOP 0x29 -#define PMBUS_VOUT_SCALE_MONITOR 0x2A - -#define PMBUS_COEFFICIENTS 0x30 -#define PMBUS_POUT_MAX 0x31 - -#define PMBUS_FAN_CONFIG_12 0x3A -#define PMBUS_FAN_COMMAND_1 0x3B -#define PMBUS_FAN_COMMAND_2 0x3C -#define PMBUS_FAN_CONFIG_34 0x3D -#define PMBUS_FAN_COMMAND_3 0x3E -#define PMBUS_FAN_COMMAND_4 0x3F - -#define PMBUS_VOUT_OV_FAULT_LIMIT 0x40 -#define PMBUS_VOUT_OV_FAULT_RESPONSE 0x41 -#define PMBUS_VOUT_OV_WARN_LIMIT 0x42 -#define PMBUS_VOUT_UV_WARN_LIMIT 0x43 -#define PMBUS_VOUT_UV_FAULT_LIMIT 0x44 -#define PMBUS_VOUT_UV_FAULT_RESPONSE 0x45 -#define PMBUS_IOUT_OC_FAULT_LIMIT 0x46 -#define PMBUS_IOUT_OC_FAULT_RESPONSE 0x47 -#define PMBUS_IOUT_OC_LV_FAULT_LIMIT 0x48 -#define PMBUS_IOUT_OC_LV_FAULT_RESPONSE 0x49 -#define PMBUS_IOUT_OC_WARN_LIMIT 0x4A -#define PMBUS_IOUT_UC_FAULT_LIMIT 0x4B -#define PMBUS_IOUT_UC_FAULT_RESPONSE 0x4C - -#define PMBUS_OT_FAULT_LIMIT 0x4F -#define PMBUS_OT_FAULT_RESPONSE 0x50 -#define PMBUS_OT_WARN_LIMIT 0x51 -#define PMBUS_UT_WARN_LIMIT 0x52 -#define PMBUS_UT_FAULT_LIMIT 0x53 -#define PMBUS_UT_FAULT_RESPONSE 0x54 -#define PMBUS_VIN_OV_FAULT_LIMIT 0x55 -#define PMBUS_VIN_OV_FAULT_RESPONSE 0x56 -#define PMBUS_VIN_OV_WARN_LIMIT 0x57 -#define PMBUS_VIN_UV_WARN_LIMIT 0x58 -#define PMBUS_VIN_UV_FAULT_LIMIT 0x59 - -#define PMBUS_IIN_OC_FAULT_LIMIT 0x5B -#define PMBUS_IIN_OC_WARN_LIMIT 0x5D - -#define PMBUS_POUT_OP_FAULT_LIMIT 0x68 -#define PMBUS_POUT_OP_WARN_LIMIT 0x6A -#define PMBUS_PIN_OP_WARN_LIMIT 0x6B - -#define PMBUS_STATUS_BYTE 0x78 -#define PMBUS_STATUS_WORD 0x79 -#define PMBUS_STATUS_VOUT 0x7A -#define PMBUS_STATUS_IOUT 0x7B -#define PMBUS_STATUS_INPUT 0x7C -#define PMBUS_STATUS_TEMPERATURE 0x7D -#define PMBUS_STATUS_CML 0x7E -#define PMBUS_STATUS_OTHER 0x7F -#define PMBUS_STATUS_MFR_SPECIFIC 0x80 -#define PMBUS_STATUS_FAN_12 0x81 -#define PMBUS_STATUS_FAN_34 0x82 - -#define PMBUS_READ_VIN 0x88 -#define PMBUS_READ_IIN 0x89 -#define PMBUS_READ_VCAP 0x8A -#define PMBUS_READ_VOUT 0x8B -#define PMBUS_READ_IOUT 0x8C -#define PMBUS_READ_TEMPERATURE_1 0x8D -#define PMBUS_READ_TEMPERATURE_2 0x8E -#define PMBUS_READ_TEMPERATURE_3 0x8F -#define PMBUS_READ_FAN_SPEED_1 0x90 -#define PMBUS_READ_FAN_SPEED_2 0x91 -#define PMBUS_READ_FAN_SPEED_3 0x92 -#define PMBUS_READ_FAN_SPEED_4 0x93 -#define PMBUS_READ_DUTY_CYCLE 0x94 -#define PMBUS_READ_FREQUENCY 0x95 -#define PMBUS_READ_POUT 0x96 -#define PMBUS_READ_PIN 0x97 - -#define PMBUS_REVISION 0x98 -#define PMBUS_MFR_ID 0x99 -#define PMBUS_MFR_MODEL 0x9A -#define PMBUS_MFR_REVISION 0x9B -#define PMBUS_MFR_LOCATION 0x9C -#define PMBUS_MFR_DATE 0x9D -#define PMBUS_MFR_SERIAL 0x9E - -/* - * 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. - */ -#define PMBUS_VIRT_BASE 0x100 -#define PMBUS_VIRT_READ_TEMP_AVG (PMBUS_VIRT_BASE + 0) -#define PMBUS_VIRT_READ_TEMP_MIN (PMBUS_VIRT_BASE + 1) -#define PMBUS_VIRT_READ_TEMP_MAX (PMBUS_VIRT_BASE + 2) -#define PMBUS_VIRT_RESET_TEMP_HISTORY (PMBUS_VIRT_BASE + 3) -#define PMBUS_VIRT_READ_VIN_AVG (PMBUS_VIRT_BASE + 4) -#define PMBUS_VIRT_READ_VIN_MIN (PMBUS_VIRT_BASE + 5) -#define PMBUS_VIRT_READ_VIN_MAX (PMBUS_VIRT_BASE + 6) -#define PMBUS_VIRT_RESET_VIN_HISTORY (PMBUS_VIRT_BASE + 7) -#define PMBUS_VIRT_READ_IIN_AVG (PMBUS_VIRT_BASE + 8) -#define PMBUS_VIRT_READ_IIN_MIN (PMBUS_VIRT_BASE + 9) -#define PMBUS_VIRT_READ_IIN_MAX (PMBUS_VIRT_BASE + 10) -#define PMBUS_VIRT_RESET_IIN_HISTORY (PMBUS_VIRT_BASE + 11) -#define PMBUS_VIRT_READ_PIN_AVG (PMBUS_VIRT_BASE + 12) -#define PMBUS_VIRT_READ_PIN_MAX (PMBUS_VIRT_BASE + 13) -#define PMBUS_VIRT_RESET_PIN_HISTORY (PMBUS_VIRT_BASE + 14) -#define PMBUS_VIRT_READ_POUT_AVG (PMBUS_VIRT_BASE + 15) -#define PMBUS_VIRT_READ_POUT_MAX (PMBUS_VIRT_BASE + 16) -#define PMBUS_VIRT_RESET_POUT_HISTORY (PMBUS_VIRT_BASE + 17) -#define PMBUS_VIRT_READ_VOUT_AVG (PMBUS_VIRT_BASE + 18) -#define PMBUS_VIRT_READ_VOUT_MIN (PMBUS_VIRT_BASE + 19) -#define PMBUS_VIRT_READ_VOUT_MAX (PMBUS_VIRT_BASE + 20) -#define PMBUS_VIRT_RESET_VOUT_HISTORY (PMBUS_VIRT_BASE + 21) -#define PMBUS_VIRT_READ_IOUT_AVG (PMBUS_VIRT_BASE + 22) -#define PMBUS_VIRT_READ_IOUT_MIN (PMBUS_VIRT_BASE + 23) -#define PMBUS_VIRT_READ_IOUT_MAX (PMBUS_VIRT_BASE + 24) -#define PMBUS_VIRT_RESET_IOUT_HISTORY (PMBUS_VIRT_BASE + 25) -#define PMBUS_VIRT_READ_TEMP2_AVG (PMBUS_VIRT_BASE + 26) -#define PMBUS_VIRT_READ_TEMP2_MIN (PMBUS_VIRT_BASE + 27) -#define PMBUS_VIRT_READ_TEMP2_MAX (PMBUS_VIRT_BASE + 28) -#define PMBUS_VIRT_RESET_TEMP2_HISTORY (PMBUS_VIRT_BASE + 29) - -#define PMBUS_VIRT_READ_VMON (PMBUS_VIRT_BASE + 30) -#define PMBUS_VIRT_VMON_UV_WARN_LIMIT (PMBUS_VIRT_BASE + 31) -#define PMBUS_VIRT_VMON_OV_WARN_LIMIT (PMBUS_VIRT_BASE + 32) -#define PMBUS_VIRT_VMON_UV_FAULT_LIMIT (PMBUS_VIRT_BASE + 33) -#define PMBUS_VIRT_VMON_OV_FAULT_LIMIT (PMBUS_VIRT_BASE + 34) -#define PMBUS_VIRT_STATUS_VMON (PMBUS_VIRT_BASE + 35) - -/* - * CAPABILITY - */ -#define PB_CAPABILITY_SMBALERT (1<<4) -#define PB_CAPABILITY_ERROR_CHECK (1<<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 ((1 << 0) | (1 << 1)) -#define PB_FAN_2_RPM (1 << 2) -#define PB_FAN_2_INSTALLED (1 << 3) -#define PB_FAN_1_PULSE_MASK ((1 << 4) | (1 << 5)) -#define PB_FAN_1_RPM (1 << 6) -#define PB_FAN_1_INSTALLED (1 << 7) - -/* - * STATUS_BYTE, STATUS_WORD (lower) - */ -#define PB_STATUS_NONE_ABOVE (1<<0) -#define PB_STATUS_CML (1<<1) -#define PB_STATUS_TEMPERATURE (1<<2) -#define PB_STATUS_VIN_UV (1<<3) -#define PB_STATUS_IOUT_OC (1<<4) -#define PB_STATUS_VOUT_OV (1<<5) -#define PB_STATUS_OFF (1<<6) -#define PB_STATUS_BUSY (1<<7) - -/* - * STATUS_WORD (upper) - */ -#define PB_STATUS_UNKNOWN (1<<8) -#define PB_STATUS_OTHER (1<<9) -#define PB_STATUS_FANS (1<<10) -#define PB_STATUS_POWER_GOOD_N (1<<11) -#define PB_STATUS_WORD_MFR (1<<12) -#define PB_STATUS_INPUT (1<<13) -#define PB_STATUS_IOUT_POUT (1<<14) -#define PB_STATUS_VOUT (1<<15) - -/* - * STATUS_IOUT - */ -#define PB_POUT_OP_WARNING (1<<0) -#define PB_POUT_OP_FAULT (1<<1) -#define PB_POWER_LIMITING (1<<2) -#define PB_CURRENT_SHARE_FAULT (1<<3) -#define PB_IOUT_UC_FAULT (1<<4) -#define PB_IOUT_OC_WARNING (1<<5) -#define PB_IOUT_OC_LV_FAULT (1<<6) -#define PB_IOUT_OC_FAULT (1<<7) - -/* - * STATUS_VOUT, STATUS_INPUT - */ -#define PB_VOLTAGE_UV_FAULT (1<<4) -#define PB_VOLTAGE_UV_WARNING (1<<5) -#define PB_VOLTAGE_OV_WARNING (1<<6) -#define PB_VOLTAGE_OV_FAULT (1<<7) - -/* - * STATUS_INPUT - */ -#define PB_PIN_OP_WARNING (1<<0) -#define PB_IIN_OC_WARNING (1<<1) -#define PB_IIN_OC_FAULT (1<<2) - -/* - * STATUS_TEMPERATURE - */ -#define PB_TEMP_UT_FAULT (1<<4) -#define PB_TEMP_UT_WARNING (1<<5) -#define PB_TEMP_OT_WARNING (1<<6) -#define PB_TEMP_OT_FAULT (1<<7) - -/* - * STATUS_FAN - */ -#define PB_FAN_AIRFLOW_WARNING (1<<0) -#define PB_FAN_AIRFLOW_FAULT (1<<1) -#define PB_FAN_FAN2_SPEED_OVERRIDE (1<<2) -#define PB_FAN_FAN1_SPEED_OVERRIDE (1<<3) -#define PB_FAN_FAN2_WARNING (1<<4) -#define PB_FAN_FAN1_WARNING (1<<5) -#define PB_FAN_FAN2_FAULT (1<<6) -#define PB_FAN_FAN1_FAULT (1<<7) - -/* - * CML_FAULT_STATUS - */ -#define PB_CML_FAULT_OTHER_MEM_LOGIC (1<<0) -#define PB_CML_FAULT_OTHER_COMM (1<<1) -#define PB_CML_FAULT_PROCESSOR (1<<3) -#define PB_CML_FAULT_MEMORY (1<<4) -#define PB_CML_FAULT_PACKET_ERROR (1<<5) -#define PB_CML_FAULT_INVALID_DATA (1<<6) -#define PB_CML_FAULT_INVALID_COMMAND (1<<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_NUM_CLASSES /* Number of power sensor classes */ -}; - -#define PMBUS_PAGES 32 /* Per PMBus specification */ - -/* Functionality bit mask */ -#define PMBUS_HAVE_VIN (1 << 0) -#define PMBUS_HAVE_VCAP (1 << 1) -#define PMBUS_HAVE_VOUT (1 << 2) -#define PMBUS_HAVE_IIN (1 << 3) -#define PMBUS_HAVE_IOUT (1 << 4) -#define PMBUS_HAVE_PIN (1 << 5) -#define PMBUS_HAVE_POUT (1 << 6) -#define PMBUS_HAVE_FAN12 (1 << 7) -#define PMBUS_HAVE_FAN34 (1 << 8) -#define PMBUS_HAVE_TEMP (1 << 9) -#define PMBUS_HAVE_TEMP2 (1 << 10) -#define PMBUS_HAVE_TEMP3 (1 << 11) -#define PMBUS_HAVE_STATUS_VOUT (1 << 12) -#define PMBUS_HAVE_STATUS_IOUT (1 << 13) -#define PMBUS_HAVE_STATUS_INPUT (1 << 14) -#define PMBUS_HAVE_STATUS_TEMP (1 << 15) -#define PMBUS_HAVE_STATUS_FAN12 (1 << 16) -#define PMBUS_HAVE_STATUS_FAN34 (1 << 17) -#define PMBUS_HAVE_VMON (1 << 18) -#define PMBUS_HAVE_STATUS_VMON (1 << 19) - -enum pmbus_data_format { linear = 0, direct, vid }; - -struct pmbus_driver_info { - int pages; /* Total number of pages */ - enum pmbus_data_format format[PSC_NUM_CLASSES]; - /* - * 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); -}; - -/* Function declarations */ - -void pmbus_clear_cache(struct i2c_client *client); -int pmbus_set_page(struct i2c_client *client, u8 page); -int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg); -int pmbus_write_word_data(struct i2c_client *client, u8 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); -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); -int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id, - struct pmbus_driver_info *info); -int pmbus_do_remove(struct i2c_client *client); -const struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client - *client); - -#endif /* PMBUS_H */ diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_hwmon_ix1b.c b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_hwmon_ix1b.c new file mode 100644 index 000000000000..eb730cb28d0e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_hwmon_ix1b.c @@ -0,0 +1,425 @@ +/* + * A hwmon driver for Cypress PSoC fan controller and thermal sensor + * + * This PSoC is a specific customize design only for Quanta Switch + * This driver is also monitoring pca9555 which is related to + * RPSU detection and LED controll in front panel. Instead a standalone + * driver, it should be combined with gpio lib to work correctly. + * + * Copyright (C) 2014 Quanta Inc. + * + * Author: Luffy Cheng + * + * Based on: + * adt7470.c from Darrick J. Wong + * Copyright (C) 2007 IBM + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define QUANTA_IX1_PSU_GPIO_PSU1_PRSNT_N 16 +#define QUANTA_IX1_PSU_GPIO_PSU1_PWRGD 17 +#define QUANTA_IX1_PSU_GPIO_PSU2_PRSNT_N 19 +#define QUANTA_IX1_PSU_GPIO_PSU2_PWRGD 20 + +#define QUANTA_IX1_FAN_GPIO_FAN1_PRSNT_N 36 +#define QUANTA_IX1_FAN_GPIO_FAN2_PRSNT_N 37 +#define QUANTA_IX1_FAN_GPIO_FAN3_PRSNT_N 38 +#define QUANTA_IX1_FAN_GPIO_FAN4_PRSNT_N 39 + +#define AUTO_UPDATE_INTERVAL 10000 + +enum psu_nr { + PSU1 = 0, + PSU2 +}; + +enum fan_nr { + FAN1 = 0, + FAN2, + FAN3, + FAN4, +}; + +enum led_color { + LED_RED = 1, + LED_GREEN, + LED_COLOR_OFF +}; + +int hwmon_enable = 1; + +struct qci_hwmon_data { + struct device *hwmon_dev; + struct task_struct *auto_update; + struct completion auto_update_stop; + unsigned int auto_update_interval; + struct attribute_group attrs; + +}; + +static void simple_atoi(const char *buf, int *output_val) +{ + int negative = 0; + + if (buf[0] == '-') + { + negative = 1; + buf++; + } + + while (*buf >= '0' && *buf <= '9') { + *output_val = *output_val * 10 + *buf - '0'; + buf++; + } + + if (negative) + *output_val = 0 - *output_val; +} + +int read_gpio_file(int gpio) +{ + struct file *fp; + char buffer[512], file_path[255]; + int offset = 0; + int ret; + + /*open the file in read mode*/ + sprintf(file_path, "/sys/class/gpio/gpio%d/value", gpio); + fp = filp_open(file_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + printk("Cannot open the file %ld\n", PTR_ERR(fp)); + return -1; + } + + /*Read the data to the end of the file*/ + while (1) { + ret = kernel_read(fp, offset, buffer, 512); + if (ret > 0) { + offset += ret; + } + else { + break; + } + } + + filp_close(fp, NULL); + + simple_atoi(buffer, &ret); + + return ret; +} + +static ssize_t get_hwmon_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + return sprintf(buf, "%d\n", hwmon_enable); +} + +static ssize_t set_hwmon_status(struct device *dev, + struct device_attribute *devattr, const char *buf, size_t count) +{ + long enable; + + if (kstrtol(buf, 0, &enable)) + return -EINVAL; + + if ((enable != 1) && (enable != 0)) + return -EINVAL; + + hwmon_enable = enable; + + return count; +} + +static u8 read_fan_present(u8 fan_nr) +{ + u8 value = 0; + + if (fan_nr == PSU1) + value = read_gpio_file(QUANTA_IX1_FAN_GPIO_FAN1_PRSNT_N); + else if (fan_nr == FAN2) + value = read_gpio_file(QUANTA_IX1_FAN_GPIO_FAN2_PRSNT_N); + else if (fan_nr == FAN3) + value = read_gpio_file(QUANTA_IX1_FAN_GPIO_FAN3_PRSNT_N); + else if (fan_nr == FAN4) + value = read_gpio_file(QUANTA_IX1_FAN_GPIO_FAN4_PRSNT_N); + else + return -1; + + return value; +} + +static u8 read_psu_present(u8 psu_nr) +{ + u8 value = 0; + + if (psu_nr == PSU1) + value = read_gpio_file(QUANTA_IX1_PSU_GPIO_PSU1_PRSNT_N); + else if (psu_nr == PSU2) + value = read_gpio_file(QUANTA_IX1_PSU_GPIO_PSU2_PRSNT_N); + else + return -1; + + return value; +} + +static u8 read_psu_AC_good(u8 psu_nr) +{ + u8 value = 0; + + if (psu_nr == PSU1) + value = read_gpio_file(QUANTA_IX1_PSU_GPIO_PSU1_PWRGD); + else if (psu_nr == PSU2) + value = read_gpio_file(QUANTA_IX1_PSU_GPIO_PSU2_PWRGD); + else + return -1; + + return value; +} + +static u8 front_led_set(char *name, char *value) +{ + struct file *fp; + char file_path[255]; + int ret; + mm_segment_t oldfs; + + sprintf(file_path, "/sys/class/leds/%s/brightness", name); + fp = filp_open(file_path, O_RDWR | O_CREAT, 0644); + + if (IS_ERR(fp)) { + printk("Cannot open the file %ld\n", PTR_ERR(fp)); + return -1; + } + + oldfs = get_fs(); + set_fs(get_ds()); + + ret = vfs_write(fp, value, sizeof(value), &fp->f_pos); + + set_fs(oldfs); + + filp_close(fp, NULL); + + return 0; +} + +static u8 update_led(u8 *fan_status, u8 *psu_status) +{ + u8 i = 0, fan_color = LED_GREEN; + + // Update FAN front LED + for (i = 0; i < 4; i++) + { + if (fan_status[i] == 1) + { + fan_color = LED_RED; + front_led_set("front_led_fan_red", "1"); + front_led_set("front_led_fan_green", "0"); + break; + } + } + + if (fan_color == LED_GREEN) + { + front_led_set("front_led_fan_red", "0"); + front_led_set("front_led_fan_green", "1"); + } + + // Update PSU1 front LED + if ((psu_status[0] == 0) && (psu_status[2] == 1)) + { + front_led_set("front_led_psu1_green", "1"); + front_led_set("front_led_psu1_red", "0"); + } + else if (psu_status[0] == 1) + { + front_led_set("front_led_psu1_green", "0"); + front_led_set("front_led_psu1_red", "0"); + } + else + { + front_led_set("front_led_psu1_green", "0"); + front_led_set("front_led_psu1_red", "1"); + } + + // Update PSU2 front LED + if ((psu_status[1] == 0) && (psu_status[3] == 1)) + { + front_led_set("front_led_psu2_green", "1"); + front_led_set("front_led_psu2_red", "0"); + } + else if (psu_status[1] == 1) + { + front_led_set("front_led_psu2_green", "0"); + front_led_set("front_led_psu2_red", "0"); + } + else + { + front_led_set("front_led_psu2_green", "0"); + front_led_set("front_led_psu2_red", "1"); + } + + return 0; +} + +static int led_update_thread(void *p) +{ + struct platform_device *pdev = p; + struct qci_hwmon_data *data = platform_get_drvdata(pdev); + + u8 i = 0; + u8 psu_status[4] = {0}; // {PSU1-2 present, PSU1-2 AC good} + u8 fan_status[4] = {0}; // {FAN1-4 present} + + while (!kthread_should_stop()) { + + if (hwmon_enable) + { + for (i = 0; i < 4; i++) + { + fan_status[i] = read_fan_present(i); + } + + for (i = 0; i < 2; i++) + { + psu_status[i] = read_psu_present(i); + psu_status[i+2] = read_psu_AC_good(i); + } + + update_led(fan_status, psu_status); + } + + if (kthread_should_stop()) + break; + msleep_interruptible(data->auto_update_interval); + } + + complete_all(&data->auto_update_stop); + return 0; +} + +static DEVICE_ATTR(hwmon_status, S_IWUSR | S_IRUGO, get_hwmon_status, set_hwmon_status); + +static struct attribute *qci_hwmon_attr[] = { + + &dev_attr_hwmon_status.attr, + + NULL +}; + +static int qci_hwmon_probe(struct platform_device *pdev) +{ + struct qci_hwmon_data *data; + int err; + + data = devm_kzalloc(&pdev->dev, sizeof(struct qci_hwmon_data), + GFP_KERNEL); + if (!data) + { + return -ENOMEM; + } + + data->auto_update_interval = AUTO_UPDATE_INTERVAL; + data->attrs.attrs = qci_hwmon_attr; + + platform_set_drvdata(pdev, data); + + dev_info(&pdev->dev, "%s device found\n", pdev->name); + + data->hwmon_dev = hwmon_device_register(&pdev->dev); + if (IS_ERR(data->hwmon_dev)) { + err = PTR_ERR(data->hwmon_dev); + } + + err = sysfs_create_group(&pdev->dev.kobj, &data->attrs); + if (err) + return err; + + init_completion(&data->auto_update_stop); + data->auto_update = kthread_run(led_update_thread, pdev, + dev_name(data->hwmon_dev)); + if (IS_ERR(data->auto_update)) { + err = PTR_ERR(data->auto_update); + goto exit_unregister; + } + + return 0; + +exit_unregister: + hwmon_device_unregister(data->hwmon_dev); + return err; +} + +static int qci_hwmon_remove(struct platform_device *pdev) +{ + struct qci_hwmon_data *data = platform_get_drvdata(pdev); + + kthread_stop(data->auto_update); + wait_for_completion(&data->auto_update_stop); + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&pdev->dev.kobj, &data->attrs); + return 0; +} + +static struct platform_driver qci_hwmon_driver = { + .probe = qci_hwmon_probe, + .remove = qci_hwmon_remove, + .driver = { + .name = "qci-hwmon", + .owner = THIS_MODULE, + }, +}; + +static int __init qci_hwmon_init(void) +{ + platform_driver_register(&qci_hwmon_driver); + + return 0; +} + +static void __exit qci_hwmon_exit(void) +{ + platform_driver_unregister(&qci_hwmon_driver); +} + +module_init(qci_hwmon_init); +module_exit(qci_hwmon_exit); + +MODULE_AUTHOR("Quanta Computer Inc."); +MODULE_DESCRIPTION("Quanta Switch Hardware Monitor driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_platform_ix1b.c b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_platform_ix1b.c old mode 100755 new mode 100644 index f783c88fb9a1..925b46256cea --- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_platform_ix1b.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_platform_ix1b.c @@ -179,67 +179,67 @@ static struct pca953x_platform_data pca9555ID_data = { static struct i2c_board_info ix1b_i2c_devices[] = { { - I2C_BOARD_INFO("pca9546", 0x77), + I2C_BOARD_INFO("pca9546", 0x77), // 0 .platform_data = &pca9546_1_data, }, { - I2C_BOARD_INFO("pca9546", 0x72), + I2C_BOARD_INFO("pca9546", 0x72), // 1 .platform_data = &pca9546_2_data, }, { - I2C_BOARD_INFO("pca9555", 0x26), + I2C_BOARD_INFO("pca9555", 0x26), // 2 .platform_data = &pca9555psu1_data, }, { - I2C_BOARD_INFO("24c02", 0x54), + I2C_BOARD_INFO("24c02", 0x54), // 3 }, { - I2C_BOARD_INFO("pca9548", 0x73), + I2C_BOARD_INFO("pca9548", 0x73), // 4 .platform_data = &pca9548sfp1_data, }, { - I2C_BOARD_INFO("pca9548", 0x74), + I2C_BOARD_INFO("pca9548", 0x74), // 5 .platform_data = &pca9548sfp2_data, }, { - I2C_BOARD_INFO("pca9548", 0x75), + I2C_BOARD_INFO("pca9548", 0x75), // 6 .platform_data = &pca9548sfp3_data, }, { - I2C_BOARD_INFO("pca9548", 0x76), + I2C_BOARD_INFO("pca9548", 0x76), // 7 .platform_data = &pca9548sfp4_data, }, { - I2C_BOARD_INFO("CPLD-QSFP28", 0x38), + I2C_BOARD_INFO("CPLD-QSFP28", 0x38), // 8 }, { - I2C_BOARD_INFO("CPLD-QSFP28", 0x39), + I2C_BOARD_INFO("CPLD-QSFP28", 0x39), // 9 }, { - I2C_BOARD_INFO("pca9555", 0x23), + I2C_BOARD_INFO("pca9555", 0x23), // 10 .platform_data = &pca9555ID_data, }, { - I2C_BOARD_INFO("pca9555", 0x25), + I2C_BOARD_INFO("pca9555", 0x25), // 11 .platform_data = &pca9555fan_data, }, { - I2C_BOARD_INFO("qci_pmbus_ix1b", 0x5f), + I2C_BOARD_INFO("qci_pmbus_ix1b", 0x5f), // 12 }, { - I2C_BOARD_INFO("qci_pmbus_ix1b", 0x59), + I2C_BOARD_INFO("qci_pmbus_ix1b", 0x59), // 13 }, #if defined(QUANTA_CPU_RGL) { - I2C_BOARD_INFO("pca9546", 0x71), + I2C_BOARD_INFO("pca9546", 0x71), // 14 .platform_data = &pca9546_cpu1_data, }, { - I2C_BOARD_INFO("pca9555", 0x20), + I2C_BOARD_INFO("pca9555", 0x20), // 15 .platform_data = &pca9555_cpuled_data, }, { - I2C_BOARD_INFO("24c02", 0x50), + I2C_BOARD_INFO("optoe1", 0x50), // 16 }, #endif }; @@ -347,6 +347,13 @@ static struct platform_device system_led_dev = { }, }; +static struct platform_device qci_hwmon_device = { + .name = "qci-hwmon", + .id = 0, + .dev = { + }, +}; + static struct platform_device *ix1b_device; struct gpio_led_data { @@ -390,68 +397,68 @@ static int __init ix1b_platform_init(void) goto fail_platform_device; adapter = i2c_get_adapter(0); - client = i2c_new_device(adapter, &ix1b_i2c_devices[0]); // pca9546_1 + client = i2c_new_device(adapter, &ix1b_i2c_devices[0]); // pca9546_1 - Address: 0x77 printk("[CC] NEW device pca9546_1\n"); - client = i2c_new_device(adapter, &ix1b_i2c_devices[1]); // pca9546_2 + client = i2c_new_device(adapter, &ix1b_i2c_devices[1]); // pca9546_2 - Address: 0x72 printk("[CC] NEW device pca9546_2\n"); #if defined(QUANTA_CPU_RGL) - client = i2c_new_device(adapter, &ix1b_i2c_devices[14]); // cpu pca9546_1 + client = i2c_new_device(adapter, &ix1b_i2c_devices[14]); // cpu pca9546_1 - Address: 0x71 printk("[CC] NEW device cpu pca9546_1\n"); #endif i2c_put_adapter(adapter); adapter = i2c_get_adapter(0x14); - client = i2c_new_device(adapter, &ix1b_i2c_devices[12]); // pmbus_psu1 + client = i2c_new_device(adapter, &ix1b_i2c_devices[12]); // pmbus_psu1 - Address: 0x5f printk("[CC] NEW device pmbus_psu1\n"); i2c_put_adapter(adapter); adapter = i2c_get_adapter(0x15); - client = i2c_new_device(adapter, &ix1b_i2c_devices[13]); // pmbus_psu2 + client = i2c_new_device(adapter, &ix1b_i2c_devices[13]); // pmbus_psu2 - Address: 0x59 printk("[CC] NEW device pmbus_psu2\n"); i2c_put_adapter(adapter); adapter = i2c_get_adapter(0x16); - client = i2c_new_device(adapter, &ix1b_i2c_devices[2]); // pca9555-PSU1 + client = i2c_new_device(adapter, &ix1b_i2c_devices[2]); // pca9555-PSU1 - Address: 0x26 printk("[CC] NEW device pca9555-PSU1\n"); - client = i2c_new_device(adapter, &ix1b_i2c_devices[3]); // MB_BOARDINFO_EEPROM + client = i2c_new_device(adapter, &ix1b_i2c_devices[3]); // MB_BOARDINFO_EEPROM - Address: 0x54 printk("[CC] NEW device MB_BOARDINFO_EEPROM\n"); - client = i2c_new_device(adapter, &ix1b_i2c_devices[10]); // pca9555-ID + client = i2c_new_device(adapter, &ix1b_i2c_devices[10]); // pca9555-ID - Address: 0x23 printk("[CC] NEW device pca9555-ID\n"); i2c_put_adapter(adapter); adapter = i2c_get_adapter(0x17); - client = i2c_new_device(adapter, &ix1b_i2c_devices[11]); // pca9555-fan + client = i2c_new_device(adapter, &ix1b_i2c_devices[11]); // pca9555-fan - Address: 0x25 printk("[CC] NEW device pca9555-fan\n"); i2c_put_adapter(adapter); adapter = i2c_get_adapter(0x10); - client = i2c_new_device(adapter, &ix1b_i2c_devices[4]); // pca9548_2 SFP + client = i2c_new_device(adapter, &ix1b_i2c_devices[4]); // pca9548_1 SFP - Address: 0x73 + printk("[CC] NEW device pca9548_1 SFP\n"); + client = i2c_new_device(adapter, &ix1b_i2c_devices[5]); // pca9548_2 SFP - Address: 0x74 printk("[CC] NEW device pca9548_2 SFP\n"); - client = i2c_new_device(adapter, &ix1b_i2c_devices[5]); // pca9548_3 SFP + client = i2c_new_device(adapter, &ix1b_i2c_devices[6]); // pca9548_3 SFP - Address: 0x75 printk("[CC] NEW device pca9548_3 SFP\n"); - client = i2c_new_device(adapter, &ix1b_i2c_devices[6]); // pca9548_4 SFP - printk("[CC] NEW device pca9548_4 SFP\n"); - client = i2c_new_device(adapter, &ix1b_i2c_devices[8]); // CPLD2 + client = i2c_new_device(adapter, &ix1b_i2c_devices[8]); // CPLD2 - Address: 0x38 printk("[CC] NEW device CPLD2\n"); - client = i2c_new_device(adapter, &ix1b_i2c_devices[9]); // CPLD3 + client = i2c_new_device(adapter, &ix1b_i2c_devices[9]); // CPLD3 - Address: 0x39 printk("[CC] NEW device CPLD3\n"); i2c_put_adapter(adapter); adapter = i2c_get_adapter(0x11); - client = i2c_new_device(adapter, &ix1b_i2c_devices[7]); // pca9548_5 SFP - printk("[CC] NEW device pca9548_5 SFP\n"); + client = i2c_new_device(adapter, &ix1b_i2c_devices[7]); // pca9548_4 SFP - Address: 0x76 + printk("[CC] NEW device pca9548_4 SFP\n"); i2c_put_adapter(adapter); #if defined(QUANTA_CPU_RGL) adapter = i2c_get_adapter(0x18); - client = i2c_new_device(adapter, &ix1b_i2c_devices[15]); // cpu pca9555_1 + client = i2c_new_device(adapter, &ix1b_i2c_devices[15]); // cpu pca9555_1 - Address: 0x20 printk("[CC] NEW device cpu pca9555_1\n"); i2c_put_adapter(adapter); for(i = 0x20; i < 0x40; i++) { adapter = i2c_get_adapter(i); - client = i2c_new_device(adapter, &ix1b_i2c_devices[16]); // eeprom for loopback module + client = i2c_new_device(adapter, &ix1b_i2c_devices[16]); // eeprom for loopback module - Address: 0x50 i2c_put_adapter(adapter); } printk("[CC] NEW device eeprom\n"); @@ -466,6 +473,9 @@ static int __init ix1b_platform_init(void) } printk("[CC] NEW device led\n"); + platform_device_register(&qci_hwmon_device); + printk("[CC] NEW device hwmon\n"); + return 0; fail_platform_device: diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_pmbus.c b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_pmbus.c index f54a0f204d67..0fac27b59b6c 100755 --- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_pmbus.c +++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/modules/qci_pmbus.c @@ -27,14 +27,268 @@ #include #include #include -//#include <../drivers/hwmon/pmbus/pmbus.h> -#include "pmbus.h" #include enum projects { ly8, ix1, ix2, ix1b }; #define DELAY_TIME 1000 /* uS */ +/* Pmbus reg defines are copied from drivers/hwmon/pmbus/pmbus.h*/ +/* + * Registers + */ +enum pmbus_regs { + PMBUS_PAGE = 0x00, + PMBUS_OPERATION = 0x01, + PMBUS_ON_OFF_CONFIG = 0x02, + PMBUS_CLEAR_FAULTS = 0x03, + PMBUS_PHASE = 0x04, + + 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, + +/* + * 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, +}; + +enum pmbus_sensor_classes { + PSC_VOLTAGE_IN = 0, + PSC_VOLTAGE_OUT, + PSC_CURRENT_IN, + PSC_CURRENT_OUT, + PSC_POWER, + PSC_TEMPERATURE, + PSC_FAN, + PSC_NUM_CLASSES /* Number of power sensor classes */ +}; + +#define PMBUS_PAGES 32 /* Per PMBus specification */ + +/* 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) + +enum pmbus_data_format { linear = 0, direct, vid }; +enum vrm_version { vr11 = 0, vr12, vr13 }; + +struct pmbus_driver_info { + int pages; /* Total number of pages */ + enum pmbus_data_format format[PSC_NUM_CLASSES]; + enum vrm_version vrm_version; + /* + * 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; +}; + +extern int pmbus_set_page(struct i2c_client *client, u8 page); +extern int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg); +extern bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg); +extern bool pmbus_check_word_register(struct i2c_client *client, int page, int reg); +extern int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id, + struct pmbus_driver_info *info); +extern int pmbus_do_remove(struct i2c_client *client); + /* Needed to access the mutex. Copied from pmbus_core.c */ #define PB_STATUS_BASE 0 #define PB_STATUS_VOUT_BASE (PB_STATUS_BASE + PMBUS_PAGES) @@ -327,6 +581,7 @@ static int qci_pmbus_identify(struct i2c_client *client, break; case 1: info->format[PSC_VOLTAGE_OUT] = vid; + info->vrm_version = vr11; break; case 2: info->format[PSC_VOLTAGE_OUT] = direct; @@ -411,7 +666,7 @@ static int qci_pmbus_probe(struct i2c_client *client, { struct device *dev = &client->dev; struct pmbus_driver_info *info; - int ret, i; + int ret; dev_info(dev, "qci_pmbus_probe\n"); @@ -419,8 +674,7 @@ static int qci_pmbus_probe(struct i2c_client *client, I2C_FUNC_SMBUS_READ_WORD_DATA)) return -ENODEV; - info = devm_kzalloc(&client->dev, sizeof(struct pmbus_driver_info), - GFP_KERNEL); + info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); if (!info) return -ENOMEM; diff --git a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/utils/quanta_ix1b_util.py b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/utils/quanta_ix1b_util.py index f530cf3dbb7b..2135932938eb 100755 --- a/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/utils/quanta_ix1b_util.py +++ b/platform/broadcom/sonic-platform-modules-quanta/ix1b-32x/utils/quanta_ix1b_util.py @@ -40,75 +40,96 @@ FORCE = 0 i2c_prefix = '/sys/bus/i2c/devices/' - if DEBUG == True: print sys.argv[0] - print 'ARGV :', sys.argv[1:] - + print 'ARGV :', sys.argv[1:] def main(): global DEBUG global args global FORCE - - if len(sys.argv)<2: + + if len(sys.argv) < 2: show_help() - + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', 'debug', 'force', ]) - if DEBUG == True: + if DEBUG == True: print options print args print len(sys.argv) - + for opt, arg in options: if opt in ('-h', '--help'): show_help() - elif opt in ('-d', '--debug'): + elif opt in ('-d', '--debug'): DEBUG = True - logging.basicConfig(level=logging.INFO) - elif opt in ('-f', '--force'): + logging.basicConfig(level = logging.INFO) + elif opt in ('-f', '--force'): FORCE = 1 else: - logging.info('no option') - for arg in args: + logging.info('no option') + + for arg in args: if arg == 'install': - install() + install() elif arg == 'clean': - uninstall() + uninstall() else: show_help() - - - return 0 - + + return 0 + def show_help(): print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} sys.exit(0) - + def show_log(txt): if DEBUG == True: - print "[IX1B-32X]"+txt + print "[IX1B-32X]" + txt + return - + def exec_cmd(cmd, show): - logging.info('Run :'+cmd) - status, output = commands.getstatusoutput(cmd) - show_log (cmd +"with result:" + str(status)) - show_log (" output:"+output) + logging.info('Run :' + cmd) + status, output = commands.getstatusoutput(cmd) + show_log (cmd + "with result:" + str(status)) + show_log (" output:" + output) if status: - logging.info('Failed :'+cmd) + logging.info('Failed :' + cmd) if show: - print('Failed :'+cmd) - return status, output - -instantiate =[ + print('Failed :' + cmd) + + return status, output + +instantiate = [ #turn on module power 'echo 53 > /sys/class/gpio/export', 'echo out > /sys/class/gpio/gpio53/direction', -'echo 1 >/sys/class/gpio/gpio53/value', +'echo 1 > /sys/class/gpio/gpio53/value', +#PSU1 present +'echo 16 > /sys/class/gpio/export', +'echo in > /sys/class/gpio/gpio16/direction', +#PSU1 power good signal +'echo 17 > /sys/class/gpio/export', +'echo in > /sys/class/gpio/gpio17/direction', +#PSU2 present +'echo 19 > /sys/class/gpio/export', +'echo in > /sys/class/gpio/gpio19/direction', +#PSU2 power good signal +'echo 20 > /sys/class/gpio/export', +'echo in > /sys/class/gpio/gpio20/direction', +#FAN 1-4 present +'echo 36 > /sys/class/gpio/export', +'echo in > /sys/class/gpio/gpio36/direction', +'echo 37 > /sys/class/gpio/export', +'echo in > /sys/class/gpio/gpio37/direction', +'echo 38 > /sys/class/gpio/export', +'echo in > /sys/class/gpio/gpio38/direction', +'echo 39 > /sys/class/gpio/export', +'echo in > /sys/class/gpio/gpio39/direction', #turn on 100G led by default 'i2cset -y 0x13 0x38 0x00 0xff', 'i2cset -y 0x13 0x38 0x01 0xff', @@ -124,77 +145,89 @@ def exec_cmd(cmd, show): 'gpio-pca953x', 'qci_pmbus', 'leds-gpio', +'optoe', 'qci_cpld_qsfp28', 'qci_platform_ix1b' ] - - def system_install(): global FORCE - + + time.sleep(3) #remove default drivers to avoid modprobe order conflicts status, output = exec_cmd("rmmod i2c_ismt ", 1) status, output = exec_cmd("rmmod i2c-i801 ", 1) #setup driver dependency status, output = exec_cmd("depmod -a ", 1) + #install drivers - for i in range(0,len(drivers)): - status, output = exec_cmd("modprobe "+drivers[i], 1) + for i in range(0, len(drivers)): + status, output = exec_cmd("modprobe " + drivers[i], 1) + if status: - print output - if FORCE == 0: - return status - + print output + if FORCE == 0: + return status + #instantiate devices - for i in range(0,len(instantiate)): - time.sleep(1) - status, output = exec_cmd(instantiate[i], 1) + for i in range(0, len(instantiate)): + status, output = exec_cmd(instantiate[i], 1) + if status: - print output - if FORCE == 0: - return status - - #for i in range(22,30): - # status, output =exec_cmd("echo sff8436 0x50 > /sys/bus/i2c/devices/i2c-0/i2c-4/i2c-"+str(i)+"/new_device", 1) - # if status: - # print output - # if FORCE == 0: - # return status - - return - - + print output + if FORCE == 0: + return status + + #Mount Quanta hardware monitor driver + status, output = exec_cmd("modprobe qci_hwmon_ix1b", 1) + + #QSFP for 1~32 port + for port_number in range(1, 33): + bus_number = port_number + 31 + os.system("echo %d >/sys/bus/i2c/devices/%d-0050/port_name" % (port_number, bus_number)) + + #Set system LED to green + status, output = exec_cmd("echo 1 > /sys/class/leds/sysled_green/brightness", 1) + + return + def system_ready(): - if not device_found(): + if not device_found(): return False + return True - -def install(): + +def install(): if not device_found(): - print "No device, installing...." - status = system_install() + print "No device, installing...." + status = system_install() + if status: - if FORCE == 0: - return status + if FORCE == 0: + return status else: - print " ix1b driver already installed...." + print " ix1b driver already installed...." + return def uninstall(): global FORCE + #uninstall drivers - for i in range(len(drivers)-1,-1,-1): - status, output = exec_cmd("rmmod "+drivers[i], 1) + for i in range(len(drivers) - 1, -1, -1): + status, output = exec_cmd("rmmod " + drivers[i], 1) + if status: - print output - if FORCE == 0: - return status + print output + if FORCE == 0: + return status + return def device_found(): - ret1, log = exec_cmd("ls "+i2c_prefix+"i2c-0", 0) - return ret1 + ret1, log = exec_cmd("ls " + i2c_prefix + "i2c-0", 0) + + return ret1 if __name__ == "__main__": main() From d3ce6523ef5718c0d1c28046e7d5ece0e0b9ad5f Mon Sep 17 00:00:00 2001 From: Tony Titus <49417625+tonytitus@users.noreply.github.com> Date: Thu, 15 Aug 2019 22:06:06 -0700 Subject: [PATCH 28/54] [innovium]: Fix package path + add SYSTEMD_SONIC_GENERATOR (#3351) Fix innovium debian package path Add SYSTEMD_SONIC_GENERATOR Signed-off-by: Tony Titus ttitus@innovium.com --- platform/innovium/invm-sai.mk | 2 +- platform/innovium/one-image.mk | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/innovium/invm-sai.mk b/platform/innovium/invm-sai.mk index 31b7b82bf948..8c236a8b68d2 100755 --- a/platform/innovium/invm-sai.mk +++ b/platform/innovium/invm-sai.mk @@ -1,6 +1,6 @@ # INVM SAI -INVM_SAI_ONLINE = https://github.com/Innovium/SONiC/tree/master/debian/master +INVM_SAI_ONLINE = https://github.com/Innovium/SONiC/raw/master/debian/master INVM_LIBSAI = isai.deb INVM_HSAI = saihdr.deb diff --git a/platform/innovium/one-image.mk b/platform/innovium/one-image.mk index 485f40c77652..c88ec5e65cdf 100755 --- a/platform/innovium/one-image.mk +++ b/platform/innovium/one-image.mk @@ -2,6 +2,7 @@ SONIC_ONE_IMAGE = sonic-innovium.bin $(SONIC_ONE_IMAGE)_MACHINE = innovium +$(SONIC_ONE_IMAGE)_INSTALLS += $(SYSTEMD_SONIC_GENERATOR) $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(CEL_MIDSTONE_200I_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELTA_PLATFORM_MODULE) From 70c75c42d5a966332271aa0199b2807dfd0e94d5 Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Fri, 16 Aug 2019 12:08:46 -0700 Subject: [PATCH 29/54] [radv service] radv service should be a cold only dependent of swss (#3348) radv should be left alone during warm restart of swss. Otherwise it will announce departure and cause hosts to lose default gateway. Signed-off-by: Ying Xie --- files/build_templates/radv.service.j2 | 4 ++-- files/scripts/swss.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/files/build_templates/radv.service.j2 b/files/build_templates/radv.service.j2 index 4f1c67e661b0..3dadc56e46ab 100644 --- a/files/build_templates/radv.service.j2 +++ b/files/build_templates/radv.service.j2 @@ -1,6 +1,6 @@ [Unit] Description=Router advertiser container -Requires=updategraph.service swss.service +Requires=updategraph.service After=updategraph.service swss.service Before=ntp-config.service @@ -11,4 +11,4 @@ ExecStart=/usr/bin/{{ docker_container_name }}.sh wait ExecStop=/usr/bin/{{ docker_container_name }}.sh stop [Install] -WantedBy=multi-user.target swss.service +WantedBy=multi-user.target diff --git a/files/scripts/swss.sh b/files/scripts/swss.sh index 7b6ae6b5dbfe..5b2f582ef4c4 100755 --- a/files/scripts/swss.sh +++ b/files/scripts/swss.sh @@ -2,7 +2,7 @@ SERVICE="swss" PEER="syncd" -DEPENDENT="teamd" +DEPENDENT="teamd radv" DEBUGLOG="/tmp/swss-syncd-debug.log" LOCKFILE="/tmp/swss-syncd-lock" From e53101be769f2bbd6e288a556fbc1c0a2bfbc957 Mon Sep 17 00:00:00 2001 From: shikenghua Date: Sat, 17 Aug 2019 05:29:42 +0800 Subject: [PATCH 30/54] [docker-fpm-frr]: Generate separated staticd.conf for staticd (#3306) * [docker-fpm-frr]: Generate separated staticd.conf for staticd Generate staticd.conf by templates/staticd.conf.j2 with config DB data * [docker-fpm-frr]: Remove default_route block from zebra.conf.j2 default_route block already moved to staticd.conf.j2 * [docker-fpm-frr]: Add test for staticd.conf.j2 template * Add test for staticd.conf.j2 template * Correct the sample output of zebra.conf.j2 template * Fix a typo in test_zebra_frr * [docker-fpm-frr]: Fix test_j2files test errors * Fix test errors in test_j2files.py and test_j2files_t2_chassis_fe.py * Fix typo in test_j2files_t2_chassis_fe.py --- dockers/docker-fpm-frr/start.sh | 3 +- dockers/docker-fpm-frr/staticd.conf.j2 | 29 +++++++++++++++++++ dockers/docker-fpm-frr/zebra.conf.j2 | 9 ------ .../tests/sample_output/staticd_frr.conf | 17 +++++++++++ .../sample_output/t2-chassis-fe-pc-zebra.conf | 2 -- .../t2-chassis-fe-vni-zebra.conf | 2 -- .../sample_output/t2-chassis-fe-zebra.conf | 2 -- .../tests/sample_output/zebra_frr.conf | 4 +-- src/sonic-config-engine/tests/test_j2files.py | 7 ++++- .../tests/test_j2files_t2_chassis_fe.py | 2 +- 10 files changed, 56 insertions(+), 21 deletions(-) create mode 100644 dockers/docker-fpm-frr/staticd.conf.j2 create mode 100644 src/sonic-config-engine/tests/sample_output/staticd_frr.conf diff --git a/dockers/docker-fpm-frr/start.sh b/dockers/docker-fpm-frr/start.sh index 555c1ce24917..fd092919e000 100755 --- a/dockers/docker-fpm-frr/start.sh +++ b/dockers/docker-fpm-frr/start.sh @@ -7,12 +7,13 @@ CONFIG_TYPE=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["docker_routing_co if [ -z "$CONFIG_TYPE" ] || [ "$CONFIG_TYPE" == "separated" ]; then sonic-cfggen -d -y /etc/sonic/deployment_id_asn_map.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/frr/bgpd.conf sonic-cfggen -d -t /usr/share/sonic/templates/zebra.conf.j2 > /etc/frr/zebra.conf + sonic-cfggen -d -t /usr/share/sonic/templates/staticd.conf.j2 > /etc/frr/staticd.conf echo "no service integrated-vtysh-config" > /etc/frr/vtysh.conf rm -f /etc/frr/frr.conf elif [ "$CONFIG_TYPE" == "unified" ]; then sonic-cfggen -d -y /etc/sonic/deployment_id_asn_map.yml -t /usr/share/sonic/templates/frr.conf.j2 >/etc/frr/frr.conf echo "service integrated-vtysh-config" > /etc/frr/vtysh.conf - rm -f /etc/frr/bgpd.conf /etc/frr/zebra.conf + rm -f /etc/frr/bgpd.conf /etc/frr/zebra.conf /etc/frr/staticd.conf fi sonic-cfggen -d -t /usr/share/sonic/templates/isolate.j2 > /usr/sbin/bgp-isolate diff --git a/dockers/docker-fpm-frr/staticd.conf.j2 b/dockers/docker-fpm-frr/staticd.conf.j2 new file mode 100644 index 000000000000..b3de8c424f12 --- /dev/null +++ b/dockers/docker-fpm-frr/staticd.conf.j2 @@ -0,0 +1,29 @@ +! +{% block banner %} +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/frr/staticd.conf.j2 using config DB data +! file: staticd.conf +! +{% endblock banner %} +! +{% block sys_init %} +hostname {{ DEVICE_METADATA['localhost']['hostname'] }} +password zebra +enable password zebra +{% endblock sys_init %} +! +{% block default_route %} +! set static default route to mgmt gateway as a backup to learned default +{% for (name, prefix) in MGMT_INTERFACE|pfx_filter %} +{% if prefix | ipv4 %} +ip route 0.0.0.0/0 {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} 200 +{% endif %} +{% endfor %} +{% endblock default_route %} +! +{% block logging %} +log syslog informational +log facility local4 +{% endblock logging %} +! + diff --git a/dockers/docker-fpm-frr/zebra.conf.j2 b/dockers/docker-fpm-frr/zebra.conf.j2 index 7200d81fda4a..3135a056a656 100644 --- a/dockers/docker-fpm-frr/zebra.conf.j2 +++ b/dockers/docker-fpm-frr/zebra.conf.j2 @@ -36,15 +36,6 @@ link-detect {% endfor %} {% endblock interfaces %} ! -{% block default_route %} -! set static default route to mgmt gateway as a backup to learned default -{% for (name, prefix) in MGMT_INTERFACE|pfx_filter %} -{% if prefix | ipv4 %} -ip route 0.0.0.0/0 {{ MGMT_INTERFACE[(name, prefix)]['gwaddr'] }} 200 -{% endif %} -{% endfor %} -{% endblock default_route %} -! {% block source_loopback %} {% set lo_ipv4_addrs = [] %} {% set lo_ipv6_addrs = [] %} diff --git a/src/sonic-config-engine/tests/sample_output/staticd_frr.conf b/src/sonic-config-engine/tests/sample_output/staticd_frr.conf new file mode 100644 index 000000000000..a1a5fddf322b --- /dev/null +++ b/src/sonic-config-engine/tests/sample_output/staticd_frr.conf @@ -0,0 +1,17 @@ +! +! =========== Managed by sonic-cfggen DO NOT edit manually! ==================== +! generated by templates/frr/staticd.conf.j2 using config DB data +! file: staticd.conf +! +! +hostname switch-t0 +password zebra +enable password zebra +! +! set static default route to mgmt gateway as a backup to learned default +ip route 0.0.0.0/0 10.0.0.1 200 +! +log syslog informational +log facility local4 +! + diff --git a/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-pc-zebra.conf b/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-pc-zebra.conf index 8861e6d3012f..312394bf76c9 100644 --- a/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-pc-zebra.conf +++ b/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-pc-zebra.conf @@ -23,8 +23,6 @@ interface PortChannel8 link-detect ! ! -! set static default route to mgmt gateway as a backup to learned default -! ! Set ip source to loopback for bgp learned routes route-map RM_SET_SRC permit 10 set src 4.0.0.0 diff --git a/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-vni-zebra.conf b/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-vni-zebra.conf index 1f9dce8812bd..30571f2082ae 100644 --- a/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-vni-zebra.conf +++ b/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-vni-zebra.conf @@ -23,8 +23,6 @@ interface Ethernet8 link-detect ! ! -! set static default route to mgmt gateway as a backup to learned default -! ! Set ip source to loopback for bgp learned routes route-map RM_SET_SRC permit 10 set src 4.0.0.0 diff --git a/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-zebra.conf b/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-zebra.conf index b89aeb4a382f..c8157b0519a4 100644 --- a/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-zebra.conf +++ b/src/sonic-config-engine/tests/sample_output/t2-chassis-fe-zebra.conf @@ -23,8 +23,6 @@ interface Ethernet8 link-detect ! ! -! set static default route to mgmt gateway as a backup to learned default -! ! Set ip source to loopback for bgp learned routes route-map RM_SET_SRC permit 10 set src 4.0.0.0 diff --git a/src/sonic-config-engine/tests/sample_output/zebra_frr.conf b/src/sonic-config-engine/tests/sample_output/zebra_frr.conf index aa3486b0163a..2b21ea523f7a 100644 --- a/src/sonic-config-engine/tests/sample_output/zebra_frr.conf +++ b/src/sonic-config-engine/tests/sample_output/zebra_frr.conf @@ -8,6 +8,7 @@ hostname switch-t0 password zebra enable password zebra ! +! ! Enable link-detect (default disabled) interface PortChannel01 link-detect @@ -22,9 +23,6 @@ interface PortChannel04 link-detect ! ! -! set static default route to mgmt gateway as a backup to learned default -ip route 0.0.0.0/0 10.0.0.1 200 -! ! Set ip source to loopback for bgp learned routes route-map RM_SET_SRC permit 10 set src 10.1.0.32 diff --git a/src/sonic-config-engine/tests/test_j2files.py b/src/sonic-config-engine/tests/test_j2files.py index 01bb5d8144dc..ed8ad6cbc5a1 100644 --- a/src/sonic-config-engine/tests/test_j2files.py +++ b/src/sonic-config-engine/tests/test_j2files.py @@ -89,11 +89,16 @@ def test_bgpd_frr(self): self.assertTrue(r, "Diff:\n" + diff_output) def test_zebra_frr(self): - conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-fpm-quagga', 'zebra.conf.j2') + conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-fpm-frr', 'zebra.conf.j2') argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + conf_template + ' > ' + self.output_file self.run_script(argument) self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'zebra_frr.conf'), self.output_file)) + def test_staticd_frr(self): + conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-fpm-frr', 'staticd.conf.j2') + argument = '-m ' + self.t0_minigraph + ' -p ' + self.t0_port_config + ' -t ' + conf_template + ' > ' + self.output_file + self.run_script(argument) + self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 'staticd_frr.conf'), self.output_file)) def test_ipinip(self): ipinip_file = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-orchagent', 'ipinip.json.j2') diff --git a/src/sonic-config-engine/tests/test_j2files_t2_chassis_fe.py b/src/sonic-config-engine/tests/test_j2files_t2_chassis_fe.py index 388f1b2885a6..531a9d477a66 100644 --- a/src/sonic-config-engine/tests/test_j2files_t2_chassis_fe.py +++ b/src/sonic-config-engine/tests/test_j2files_t2_chassis_fe.py @@ -35,7 +35,7 @@ def test_t2_chassis_fe_pc_zebra_frr(self): self.assertTrue(filecmp.cmp(os.path.join(self.test_dir, 'sample_output', 't2-chassis-fe-pc-zebra.conf'), self.output_file)) # Test zebra.conf in FRR docker for a T2 chassis frontend (fe) switch with specified VNI - def test_t2_chassis_fe_pc_zebra_frr(self): + def test_t2_chassis_fe_vni_zebra_frr(self): conf_template = os.path.join(self.test_dir, '..', '..', '..', 'dockers', 'docker-fpm-frr', 'zebra.conf.j2') argument = '-m ' + self.t2_chassis_fe_vni_minigraph + ' -p ' + self.t2_chassis_fe_port_config + ' -t ' + conf_template + ' > ' + self.output_file self.run_script(argument) From 5d376a62614fea60ec7700dde5a2acaa1f5810a8 Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Mon, 19 Aug 2019 14:09:18 +0300 Subject: [PATCH 31/54] [Mellanox] Update SDK (v3.4.1886) and hw-magmt (v2.0.0191) (#3359) This commit also includes sonic-linux-kernel submodule update Commits included: f8b30b4 [Mellanox] Add hw-management driver patches (#97) feb786b Add psample and act_sample drivers (#94) 15f8651 Update optoe driver to add CMIS (QSFP-DD, OSFP, ...) support (#96) --- platform/mellanox/fw.mk | 4 ++-- platform/mellanox/hw-management.mk | 2 +- platform/mellanox/hw-management/hw-mgmt | 2 +- platform/mellanox/sdk.mk | 4 ++-- src/sonic-linux-kernel | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index f6b2a86a7b3e..72a92c1dc57e 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -2,12 +2,12 @@ MLNX_FW_BASE_URL = $(MLNX_SDK_BASE_URL) -MLNX_SPC_FW_VERSION = 13.2000.1634 +MLNX_SPC_FW_VERSION = 13.2000.1886 MLNX_SPC_FW_FILE = fw-SPC-rel-$(subst .,_,$(MLNX_SPC_FW_VERSION))-EVB.mfa $(MLNX_SPC_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC_FW_FILE) SONIC_ONLINE_FILES += $(MLNX_SPC_FW_FILE) -MLNX_SPC2_FW_VERSION = 29.2000.1634 +MLNX_SPC2_FW_VERSION = 29.2000.1886 MLNX_SPC2_FW_FILE = fw-SPC2-rel-$(subst .,_,$(MLNX_SPC2_FW_VERSION))-EVB.mfa $(MLNX_SPC2_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC2_FW_FILE) SONIC_ONLINE_FILES += $(MLNX_SPC2_FW_FILE) diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 91af460c8ded..21a16d29dbb2 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -1,6 +1,6 @@ # Mellanox HW Management -MLNX_HW_MANAGEMENT_VERSION = 2.0.0183 +MLNX_HW_MANAGEMENT_VERSION = 2.0.0191 export MLNX_HW_MANAGEMENT_VERSION diff --git a/platform/mellanox/hw-management/hw-mgmt b/platform/mellanox/hw-management/hw-mgmt index a9ef3e5acf9a..93076e83b083 160000 --- a/platform/mellanox/hw-management/hw-mgmt +++ b/platform/mellanox/hw-management/hw-mgmt @@ -1 +1 @@ -Subproject commit a9ef3e5acf9a2bc4fb4de1f80a53ca2bf3c68a66 +Subproject commit 93076e83b08322207f7b860d34c6c3c2bd655aa0 diff --git a/platform/mellanox/sdk.mk b/platform/mellanox/sdk.mk index 1401b5f6289f..ae49cb619228 100644 --- a/platform/mellanox/sdk.mk +++ b/platform/mellanox/sdk.mk @@ -1,5 +1,5 @@ -MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/f4bc0f92f729cedf4d65a19563f61db23acb7763/sdk -MLNX_SDK_VERSION = 4.3.1634 +MLNX_SDK_BASE_URL = https://github.com/Mellanox/SAI-Implementation/raw/acf8ed31fd43e8280b553357c4ac4248f2c2e3aa/sdk +MLNX_SDK_VERSION = 4.3.1886 MLNX_SDK_ISSU_VERSION = 101 MLNX_SDK_DEB_VERSION = $(subst _,.,$(MLNX_SDK_VERSION)) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 1d9c69fbe1b9..f8b30b40c358 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 1d9c69fbe1b996fd84a659bd28c91f67fe1fe044 +Subproject commit f8b30b40c358238d3055a18305c8b7b659b47739 From 125b39465f75873ac467a81a32ac54f95a3210d5 Mon Sep 17 00:00:00 2001 From: JohnsonYJLu <31528297+JohnsonYJLu@users.noreply.github.com> Date: Tue, 20 Aug 2019 01:23:48 +0800 Subject: [PATCH 32/54] update cpld & swpld module attribute (#3362) Signed-off-by: johnson --- .../ag9064/modules/delta_ag9064_common.h | 108 +++--------------- .../ag9064/modules/delta_ag9064_cpld.c | 4 - .../ag9064/modules/delta_ag9064_swpld.c | 64 +++-------- .../debian/platform-modules-ag9064.postinst | 19 +++ 4 files changed, 53 insertions(+), 142 deletions(-) create mode 100644 platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9064.postinst diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_common.h b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_common.h index da9175088786..40eba7e241a3 100644 --- a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_common.h +++ b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_common.h @@ -148,14 +148,12 @@ enum cpld_attributes { MB_ID, MB_VER, CPU0_PWR_OK, - PSU_OVER_TEMP, PWR_RAIL_OVER_TEMP, CPU_DISOMIC_OVER_TEMP, DDR_OVER_TEMP, CPLD_PWR_ON_RST, CPLD_HARD_RST, CPLD_RST, - MB_PWR, MB_RST, PSU_FAN_INT, OP_MODULE_INT, @@ -167,9 +165,6 @@ enum cpld_attributes { PSU1_INT, PSU2_PWR_OK, PSU2_INT, - SYNCE_INT, - SYNCE_RST, - SYNCE_EEPROM_WP, PSU1_GREEN_LED, PSU1_RED_LED, PSU2_GREEN_LED, @@ -192,18 +187,10 @@ enum cpld_attributes { SB_VER, PLATFORM_TYPE, //SWPLD4 - SWPLD4_MAJOR_VER, - SWPLD4_MINOR_VER, - SWPLD4_SCRTCH_REG, - BMC_RST, - CPLD_LPC_RST, - CPLD_SW_RST, - MB_CPLD_RST, - BCM56970_RST, - CPLD_UPGRADE_RST, - MB_RST_CPLD, - CPU_RST_MB_OOB, - GPIO_PHY_RST, + SW_BOARD_ID1, + SW_BOARD_ID2, + SWBD_VER, + SWPLD4_VER, PSU_FAN_EVENT, CPU_THERMAL_INT, FAN_INT, @@ -334,11 +321,6 @@ static struct cpld_attribute_data attribute_data[] = { .reg = 0x08, .mask = 1 << 3, .note = "“1” =Power rail is good\n“0” = Power rail is failed" }, - [PSU_OVER_TEMP] = { - .bus = BUS0, .addr = CPUPLD_ADDR, - .reg = 0x0b, .mask = 1 << 4, - .note = "“1” = Not over temperature\n“0” = Over temperature" - }, [PWR_RAIL_OVER_TEMP] = { .bus = BUS0, .addr = CPUPLD_ADDR, .reg = 0x0b, .mask = 1 << 3, @@ -369,11 +351,6 @@ static struct cpld_attribute_data attribute_data[] = { .reg = 0x11, .mask = 1 << 0, .note = "“0” = Reset\n“1” = Normal operation" }, - [MB_PWR] = { - .bus = BUS0, .addr = CPUPLD_ADDR, - .reg = 0x12, .mask = 1 << 2, - .note = "“0” = Power rail is failed\n“1” =Power rail is good" - }, [MB_RST] = { .bus = BUS0, .addr = CPUPLD_ADDR, .reg = 0x12, .mask = 1 << 0, @@ -425,21 +402,6 @@ static struct cpld_attribute_data attribute_data[] = { .reg = 0x02, .mask = 1 << 1, .note = "‘0’ = Interrupt doesn’t occur\n‘1’ = Interrupt occurs" }, - [SYNCE_INT] = { - .bus = BUS0, .addr = SWPLD1_ADDR, - .reg = 0x12, .mask = 1 << 7, - .note = "‘0’ = Interrupt occurs\n‘1’ = Interrupt doesn’t occur" - }, - [SYNCE_RST] = { - .bus = BUS0, .addr = SWPLD1_ADDR, - .reg = 0x12, .mask = 1 << 6, - .note = "“0” = Reset\n“1” = Normal operation" - }, - [SYNCE_EEPROM_WP] = { - .bus = BUS0, .addr = SWPLD1_ADDR, - .reg = 0x12, .mask = 1 << 5, - .note = "“1” = enables the lock-down mechanism.\n“0” = overrides the lock-down function enabling blocks to be erased or programmed using software commands." - }, [PSU1_GREEN_LED] = { .bus = BUS0, .addr = SWPLD1_ADDR, .reg = 0x13, .mask = 1 << 7, @@ -538,65 +500,25 @@ static struct cpld_attribute_data attribute_data[] = { .note = "“0x0”: 64X100G_2U\n“0x1”~”0xF” Reserved" }, //SWPLD4 - [SWPLD4_MAJOR_VER] = { - .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x00, .mask = 0xF0, - .note = "CPLD Major Version, controlled by CPLD editor." - }, - [SWPLD4_MINOR_VER] = { + [SW_BOARD_ID1] = { .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x00, .mask = 0x0F, - .note = "CPLD Minor Version, controlled by CPLD editor." + .reg = 0x00, .mask = 0xFF, + .note = "0x00" }, - [SWPLD4_SCRTCH_REG] = { + [SW_BOARD_ID2] = { .bus = BUS0, .addr = SWPLD4_ADDR, .reg = 0x01, .mask = 0xFF, - .note = "CPLD read/write test register, to provide a way to test CPLD access." - }, - [BMC_RST] = { - .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x02, .mask = 1 << 6, - .note = "“0” = Reset\n“1” = Normal operation" + .note = "Configured by PLD Editor\n0x03: AG9064" }, - [CPLD_LPC_RST] = { + [SWBD_VER] = { .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x02, .mask = 1 << 5, - .note = "“0” = Reset\n“1” = Normal operation" - }, - [CPLD_SW_RST] = { - .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x02, .mask = 1 << 3, - .note = "“0” = Reset\n“1” = Normal operation" - }, - [MB_CPLD_RST] = { - .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x02, .mask = 1 << 2, - .note = "“0” = Reset\n“1” = Normal operation" - }, - [BCM56970_RST] = { - .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x02, .mask = 1 << 1, - .note = "“0” = Reset\n“1” = Normal operation" - }, - [CPLD_UPGRADE_RST] = { - .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x03, .mask = 1 << 7, - .note = "“0” = Reset\n“1” = Normal operation" - }, - [MB_RST_CPLD] = { - .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x03, .mask = 1 << 6, - .note = "“0” = Reset\n“1” = Normal operation" - }, - [CPU_RST_MB_OOB] = { - .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x03, .mask = 1 << 5, - .note = "“0” = Reset\n“1” = Normal operation" + .reg = 0x02, .mask = 0xFF, + .note = "Configured by external resistor\n0x01:EVT1\n0x02:EVT2\n0x03:EVT3\n0x04:EVT4\n0x10:DVT\n0x20:PVT" }, - [GPIO_PHY_RST] = { + [SWPLD4_VER] = { .bus = BUS0, .addr = SWPLD4_ADDR, - .reg = 0x03, .mask = 1 << 4, - .note = "“0” = Reset\n“1” = Normal operation" + .reg = 0x03, .mask = 0xFF, + .note = "-" }, [PSU_FAN_EVENT] = { .bus = BUS0, .addr = SWPLD4_ADDR, diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_cpld.c b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_cpld.c index 75bab55d7e2c..a1c275209b05 100644 --- a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_cpld.c +++ b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_cpld.c @@ -772,14 +772,12 @@ static SENSOR_DEVICE_ATTR(cpu_id, S_IRUGO, get_cpld_reg, NU static SENSOR_DEVICE_ATTR(mb_id, S_IRUGO, get_cpld_reg, NULL, MB_ID); static SENSOR_DEVICE_ATTR(mb_ver, S_IRUGO, get_cpld_reg, NULL, MB_VER); static SENSOR_DEVICE_ATTR(cpu0_pwr_ok, S_IRUGO, get_cpld_reg, NULL, CPU0_PWR_OK); -static SENSOR_DEVICE_ATTR(psu_over_temp, S_IRUGO, get_cpld_reg, NULL, PSU_OVER_TEMP); static SENSOR_DEVICE_ATTR(pwr_rail_over_temp, S_IRUGO, get_cpld_reg, NULL, PWR_RAIL_OVER_TEMP); static SENSOR_DEVICE_ATTR(cpu_disomic_over_temp, S_IRUGO, get_cpld_reg, NULL, CPU_DISOMIC_OVER_TEMP); static SENSOR_DEVICE_ATTR(ddr_over_temp, S_IRUGO, get_cpld_reg, NULL, DDR_OVER_TEMP); static SENSOR_DEVICE_ATTR(cpld_pwr_on_rst, S_IRUGO, get_cpld_reg, NULL, CPLD_PWR_ON_RST); static SENSOR_DEVICE_ATTR(cpld_hard_rst, S_IRUGO, get_cpld_reg, NULL, CPLD_HARD_RST); static SENSOR_DEVICE_ATTR(cpld_rst, S_IRUGO | S_IWUSR, get_cpld_reg, set_cpld_reg, CPLD_RST); -static SENSOR_DEVICE_ATTR(mb_pwr, S_IRUGO, get_cpld_reg, NULL, MB_PWR); static SENSOR_DEVICE_ATTR(mb_rst, S_IRUGO | S_IWUSR, get_cpld_reg, set_cpld_reg, MB_RST); static SENSOR_DEVICE_ATTR(psu_fan_int, S_IRUGO, get_cpld_reg, NULL, PSU_FAN_INT); static SENSOR_DEVICE_ATTR(op_module_int, S_IRUGO, get_cpld_reg, NULL, OP_MODULE_INT); @@ -800,14 +798,12 @@ static struct attribute *ag9064_cpld_attrs[] = { &sensor_dev_attr_mb_id.dev_attr.attr, &sensor_dev_attr_mb_ver.dev_attr.attr, &sensor_dev_attr_cpu0_pwr_ok.dev_attr.attr, - &sensor_dev_attr_psu_over_temp.dev_attr.attr, &sensor_dev_attr_pwr_rail_over_temp.dev_attr.attr, &sensor_dev_attr_cpu_disomic_over_temp.dev_attr.attr, &sensor_dev_attr_ddr_over_temp.dev_attr.attr, &sensor_dev_attr_cpld_pwr_on_rst.dev_attr.attr, &sensor_dev_attr_cpld_hard_rst.dev_attr.attr, &sensor_dev_attr_cpld_rst.dev_attr.attr, - &sensor_dev_attr_mb_pwr.dev_attr.attr, &sensor_dev_attr_mb_rst.dev_attr.attr, &sensor_dev_attr_psu_fan_int.dev_attr.attr, &sensor_dev_attr_op_module_int.dev_attr.attr, diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_swpld.c b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_swpld.c index 084f0c74f245..fd17a28378aa 100644 --- a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_swpld.c +++ b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_swpld.c @@ -110,7 +110,7 @@ static ssize_t get_swpld_reg(struct device *dev, struct device_attribute *dev_at case SWPLD3_MAJOR_VER ... PLATFORM_TYPE : cmd_data[1] = SWPLD3_ADDR; break; - case SWPLD4_MAJOR_VER ... FAN_EEPROM_WP : + case SW_BOARD_ID1 ... FAN_EEPROM_WP : cmd_data[1] = SWPLD4_ADDR; break; default: @@ -244,7 +244,7 @@ static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_at case SWPLD3_MAJOR_VER ... PLATFORM_TYPE://SWPLD3 cmd_data[1] = SWPLD3_ADDR; break; - case SWPLD4_MAJOR_VER ... FAN_EEPROM_WP://SWPLD4 + case SW_BOARD_ID1 ... FAN_EEPROM_WP://SWPLD4 cmd_data[1] = SWPLD4_ADDR; break; default: @@ -303,9 +303,6 @@ static SENSOR_DEVICE_ATTR(psu1_pwr_ok, S_IRUGO, get_swpld_reg, N static SENSOR_DEVICE_ATTR(psu1_int, S_IRUGO, get_swpld_reg, NULL, PSU1_INT); static SENSOR_DEVICE_ATTR(psu2_pwr_ok, S_IRUGO, get_swpld_reg, NULL, PSU2_PWR_OK); static SENSOR_DEVICE_ATTR(psu2_int, S_IRUGO, get_swpld_reg, NULL, PSU2_INT); -static SENSOR_DEVICE_ATTR(synce_int, S_IRUGO, get_swpld_reg, NULL, SYNCE_INT); -static SENSOR_DEVICE_ATTR(synce_rst, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, SYNCE_RST); -static SENSOR_DEVICE_ATTR(synce_eeprom_wp, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, SYNCE_EEPROM_WP); static SENSOR_DEVICE_ATTR(psu1_green_led, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, PSU1_GREEN_LED); static SENSOR_DEVICE_ATTR(psu1_red_led, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, PSU1_RED_LED); static SENSOR_DEVICE_ATTR(psu2_green_led, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, PSU2_GREEN_LED); @@ -329,29 +326,19 @@ static SENSOR_DEVICE_ATTR(sb_ver, S_IRUGO, get_swpld_reg, N static SENSOR_DEVICE_ATTR(platform_type, S_IRUGO, get_swpld_reg, NULL, PLATFORM_TYPE); //SWPLD4 -static SENSOR_DEVICE_ATTR(swpld4_major_ver, S_IRUGO, get_swpld_reg, NULL, SWPLD4_MAJOR_VER); -static SENSOR_DEVICE_ATTR(swpld4_minor_ver, S_IRUGO, get_swpld_reg, NULL, SWPLD4_MINOR_VER); -static SENSOR_DEVICE_ATTR(swpld4_scrtch_reg, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, SWPLD4_SCRTCH_REG); -static SENSOR_DEVICE_ATTR(bmc_rst, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, BMC_RST); -static SENSOR_DEVICE_ATTR(cpld_lpc_rst, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, CPLD_LPC_RST); -static SENSOR_DEVICE_ATTR(cpld_sw_rst, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, CPLD_SW_RST); -static SENSOR_DEVICE_ATTR(mb_cpld_rst, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, MB_CPLD_RST); -static SENSOR_DEVICE_ATTR(bcm56970_rst, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, BCM56970_RST); - -static SENSOR_DEVICE_ATTR(cpld_upgrade_rst, S_IRUGO, get_swpld_reg, NULL, CPLD_UPGRADE_RST); -static SENSOR_DEVICE_ATTR(mb_rst_cpld, S_IRUGO, get_swpld_reg, NULL, MB_RST_CPLD); -static SENSOR_DEVICE_ATTR(cpu_rst_mb_oob, S_IRUGO, get_swpld_reg, NULL, CPU_RST_MB_OOB); -static SENSOR_DEVICE_ATTR(gpio_phy_rst, S_IRUGO, get_swpld_reg, NULL, GPIO_PHY_RST); -static SENSOR_DEVICE_ATTR(psu_fan_event, S_IRUGO, get_swpld_reg, NULL, PSU_FAN_EVENT); -static SENSOR_DEVICE_ATTR(cpu_thermal_int, S_IRUGO, get_swpld_reg, NULL, CPU_THERMAL_INT); -static SENSOR_DEVICE_ATTR(fan_int, S_IRUGO, get_swpld_reg, NULL, FAN_INT); - -static SENSOR_DEVICE_ATTR(cpld_spi_wp, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, CPLD_SPI_WP); -static SENSOR_DEVICE_ATTR(rj45_console_sel, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, RJ45_CONSOLE_SEL); -static SENSOR_DEVICE_ATTR(system_int, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, SYSTEM_INT); -static SENSOR_DEVICE_ATTR(cpld_mb_rst_done, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, CPLD_MB_RST_DONE); -static SENSOR_DEVICE_ATTR(mb_pwr_ok, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, MB_PWR_OK); -static SENSOR_DEVICE_ATTR(fan_eeprom_wp, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, FAN_EEPROM_WP); +static SENSOR_DEVICE_ATTR(sw_board_id1, S_IRUGO, get_swpld_reg, NULL, SW_BOARD_ID1); +static SENSOR_DEVICE_ATTR(sw_board_id2, S_IRUGO, get_swpld_reg, NULL, SW_BOARD_ID2); +static SENSOR_DEVICE_ATTR(swbd_ver, S_IRUGO, get_swpld_reg, NULL, SWBD_VER); +static SENSOR_DEVICE_ATTR(swpld4_ver, S_IRUGO, get_swpld_reg, NULL, SWPLD4_VER); +static SENSOR_DEVICE_ATTR(psu_fan_event, S_IRUGO, get_swpld_reg, NULL, PSU_FAN_EVENT); +static SENSOR_DEVICE_ATTR(cpu_thermal_int, S_IRUGO, get_swpld_reg, NULL, CPU_THERMAL_INT); +static SENSOR_DEVICE_ATTR(fan_int, S_IRUGO, get_swpld_reg, NULL, FAN_INT); +static SENSOR_DEVICE_ATTR(cpld_spi_wp, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, CPLD_SPI_WP); +static SENSOR_DEVICE_ATTR(rj45_console_sel, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, RJ45_CONSOLE_SEL); +static SENSOR_DEVICE_ATTR(system_int, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, SYSTEM_INT); +static SENSOR_DEVICE_ATTR(cpld_mb_rst_done, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, CPLD_MB_RST_DONE); +static SENSOR_DEVICE_ATTR(mb_pwr_ok, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, MB_PWR_OK); +static SENSOR_DEVICE_ATTR(fan_eeprom_wp, S_IRUGO | S_IWUSR, get_swpld_reg, set_swpld_reg, FAN_EEPROM_WP); static struct attribute *swpld1_device_attrs[] = { &sensor_dev_attr_swpld1_reg_value.dev_attr.attr, @@ -363,9 +350,6 @@ static struct attribute *swpld1_device_attrs[] = { &sensor_dev_attr_psu1_int.dev_attr.attr, &sensor_dev_attr_psu2_pwr_ok.dev_attr.attr, &sensor_dev_attr_psu2_int.dev_attr.attr, - &sensor_dev_attr_synce_int.dev_attr.attr, - &sensor_dev_attr_synce_rst.dev_attr.attr, - &sensor_dev_attr_synce_eeprom_wp.dev_attr.attr, &sensor_dev_attr_psu1_green_led.dev_attr.attr, &sensor_dev_attr_psu1_red_led.dev_attr.attr, &sensor_dev_attr_psu2_green_led.dev_attr.attr, @@ -401,20 +385,10 @@ static struct attribute *swpld3_device_attrs[] = { }; static struct attribute *swpld4_device_attrs[] = { - &sensor_dev_attr_swpld4_reg_value.dev_attr.attr, - &sensor_dev_attr_swpld4_reg_addr.dev_attr.attr, - &sensor_dev_attr_swpld4_major_ver.dev_attr.attr, - &sensor_dev_attr_swpld4_minor_ver.dev_attr.attr, - &sensor_dev_attr_swpld4_scrtch_reg.dev_attr.attr, - &sensor_dev_attr_bmc_rst.dev_attr.attr, - &sensor_dev_attr_cpld_lpc_rst.dev_attr.attr, - &sensor_dev_attr_cpld_sw_rst.dev_attr.attr, - &sensor_dev_attr_mb_cpld_rst.dev_attr.attr, - &sensor_dev_attr_bcm56970_rst.dev_attr.attr, - &sensor_dev_attr_cpld_upgrade_rst.dev_attr.attr, - &sensor_dev_attr_mb_rst_cpld.dev_attr.attr, - &sensor_dev_attr_cpu_rst_mb_oob.dev_attr.attr, - &sensor_dev_attr_gpio_phy_rst.dev_attr.attr, + &sensor_dev_attr_sw_board_id1.dev_attr.attr, + &sensor_dev_attr_sw_board_id2.dev_attr.attr, + &sensor_dev_attr_swbd_ver.dev_attr.attr, + &sensor_dev_attr_swpld4_ver.dev_attr.attr, &sensor_dev_attr_psu_fan_event.dev_attr.attr, &sensor_dev_attr_cpu_thermal_int.dev_attr.attr, &sensor_dev_attr_fan_int.dev_attr.attr, diff --git a/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9064.postinst b/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9064.postinst new file mode 100644 index 000000000000..6044de232776 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9064.postinst @@ -0,0 +1,19 @@ +# postinst script for ag9064 + +# Insert kernel module +depmod -a +modprobe i2c-dev +modprobe i2c-i801 +modprobe i2c-ismt +modprobe ipmi_devintf +modprobe ipmi_si ports=0xca2 +modprobe i2c-mei +modprobe i2c-mux-pca954x +modprobe at24 +modprobe optoe +modprobe delta_ag9064_platform +modprobe delta_ag9064_cpld +modprobe delta_ag9064_swpld + +#DEBHELPER# + From f7f5d6e1efd02dff6e117aba7081e0d847a00a48 Mon Sep 17 00:00:00 2001 From: Mykola F <37578614+mykolaf@users.noreply.github.com> Date: Mon, 19 Aug 2019 20:25:39 +0300 Subject: [PATCH 33/54] [Mellanox] align platform reboot to use "hardware reboot" (#3321) Signed-off-by: Mykola Faryma --- .../x86_64-mlnx_msn2700-r0/platform_reboot | 8 +++++-- .../platform_reboot | 22 ++++++++++++++++++- .../platform_reboot | 2 +- 3 files changed, 28 insertions(+), 4 deletions(-) mode change 120000 => 100755 device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot index 58ead6402398..d310210497e8 100755 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot @@ -4,6 +4,7 @@ declare -r EXIT_SUCCESS="0" declare -r EXIT_ERROR="1" declare -r FW_UPGRADE_SCRIPT="/usr/bin/mlnx-fw-upgrade.sh" +declare -r SYSFS_PWR_CYCLE="/sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/pwr_cycle" FORCE_REBOOT="no" @@ -20,7 +21,7 @@ function ParseArguments() { ParseArguments "$@" -${FW_UPGRADE_SCRIPT} --upgrade +${FW_UPGRADE_SCRIPT} --upgrade --verbose EXIT_CODE="$?" if [[ "${EXIT_CODE}" != "${EXIT_SUCCESS}" ]]; then echo "Failed to burn MLNX FW: errno=${EXIT_CODE}" @@ -31,4 +32,7 @@ if [[ "${EXIT_CODE}" != "${EXIT_SUCCESS}" ]]; then fi fi -exec /sbin/reboot $@ +# perform "hardware" reboot +echo 1 > $SYSFS_PWR_CYCLE +sleep 3 +echo 0 > $SYSFS_PWR_CYCLE diff --git a/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot deleted file mode 120000 index 43c8ea567493..000000000000 --- a/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn2700-r0/platform_reboot \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot new file mode 100755 index 000000000000..5b9809e10423 --- /dev/null +++ b/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_reboot @@ -0,0 +1,21 @@ +#!/bin/bash + +declare -r EXIT_SUCCESS="0" +declare -r EXIT_ERROR="1" + +FORCE_REBOOT="no" + +function ParseArguments() { + while [ $# -ge 1 ]; do + case "$1" in + -f|--force) + FORCE_REBOOT="yes" + ;; + esac + shift + done +} + +ParseArguments "$@" + +exec /sbin/reboot $@ diff --git a/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_reboot b/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_reboot index d66ab7537bf1..dfaf53417665 120000 --- a/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_reboot +++ b/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_reboot @@ -1 +1 @@ -../x86_64-mlnx_msn3700-r0/platform_reboot \ No newline at end of file +../x86_64-mlnx_msn2700_simx-r0/platform_reboot \ No newline at end of file From 52f31b3e3ab405156eadcb4dd245e127f51eabee Mon Sep 17 00:00:00 2001 From: Andriy Kokhan <43479230+akokhan@users.noreply.github.com> Date: Mon, 19 Aug 2019 20:28:00 +0300 Subject: [PATCH 34/54] [barefoot]: updated SDK to 9.0 pre-release (#3350) Signed-off-by: Andriy Kokhan --- .../Arista-7170-64C/switch-tna-sai.conf | 6 +++--- .../Arista-7170-Q59S20/switch-tna-sai.conf | 6 +++--- .../montara/switch-tna-sai.conf | 6 +++--- .../mavericks/switch-tna-sai.conf | 6 +++--- .../INGRASYS-S9180-32X/switch-tna-sai.conf | 6 +++--- .../INGRASYS-S9280-64X/switch-tna-sai.conf | 6 +++--- .../x86_64-wnc_osw1800-r0/OSW1800-48x6q/switch-tna-sai.conf | 6 +++--- platform/barefoot/bfn-platform.mk | 6 +++--- platform/barefoot/bfn-sai.mk | 6 +++--- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-tna-sai.conf b/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-tna-sai.conf index 2a2270767d87..403b08d6bb5e 100644 --- a/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-tna-sai.conf +++ b/device/arista/x86_64-arista_7170_64c/Arista-7170-64C/switch-tna-sai.conf @@ -22,13 +22,13 @@ "p4_pipelines": [ { "p4_pipeline_name": "pipe", - "config": "share/tofinopd/switch/pipe/tofino.bin", - "context": "share/tofinopd/switch/pipe/context.json" + "config": "share/switch/pipe/tofino.bin", + "context": "share/switch/pipe/context.json" } ], "program-name": "switch", "switchsai": "lib/libswitchsai.so", - "bfrt-config": "share/tofinopd/switch/bf-rt.json", + "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, "non_default_port_ppgs": 5 diff --git a/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-tna-sai.conf b/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-tna-sai.conf index 2a2270767d87..403b08d6bb5e 100644 --- a/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-tna-sai.conf +++ b/device/arista/x86_64-arista_7170_64c/Arista-7170-Q59S20/switch-tna-sai.conf @@ -22,13 +22,13 @@ "p4_pipelines": [ { "p4_pipeline_name": "pipe", - "config": "share/tofinopd/switch/pipe/tofino.bin", - "context": "share/tofinopd/switch/pipe/context.json" + "config": "share/switch/pipe/tofino.bin", + "context": "share/switch/pipe/context.json" } ], "program-name": "switch", "switchsai": "lib/libswitchsai.so", - "bfrt-config": "share/tofinopd/switch/bf-rt.json", + "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, "non_default_port_ppgs": 5 diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-tna-sai.conf b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-tna-sai.conf index 79b10cafa864..a459e925531c 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-tna-sai.conf +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/montara/switch-tna-sai.conf @@ -23,13 +23,13 @@ "p4_pipelines": [ { "p4_pipeline_name": "pipe", - "config": "share/tofinopd/switch/pipe/tofino.bin", - "context": "share/tofinopd/switch/pipe/context.json" + "config": "share/switch/pipe/tofino.bin", + "context": "share/switch/pipe/context.json" } ], "program-name": "switch", "switchsai": "lib/libswitchsai.so", - "bfrt-config": "share/tofinopd/switch/bf-rt.json", + "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, "non_default_port_ppgs": 5 diff --git a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-tna-sai.conf b/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-tna-sai.conf index 647f41838285..5497836266e1 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-tna-sai.conf +++ b/device/barefoot/x86_64-accton_wedge100bf_65x-r0/mavericks/switch-tna-sai.conf @@ -23,13 +23,13 @@ "p4_pipelines": [ { "p4_pipeline_name": "pipe", - "config": "share/tofinopd/switch/pipe/tofino.bin", - "context": "share/tofinopd/switch/pipe/context.json" + "config": "share/switch/pipe/tofino.bin", + "context": "share/switch/pipe/context.json" } ], "program-name": "switch", "switchsai": "lib/libswitchsai.so", - "bfrt-config": "share/tofinopd/switch/bf-rt.json", + "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, "non_default_port_ppgs": 5 diff --git a/device/ingrasys/x86_64-ingrasys_s9180_32x-r0/INGRASYS-S9180-32X/switch-tna-sai.conf b/device/ingrasys/x86_64-ingrasys_s9180_32x-r0/INGRASYS-S9180-32X/switch-tna-sai.conf index 6ad356614a0b..43ed0e4af6ae 100644 --- a/device/ingrasys/x86_64-ingrasys_s9180_32x-r0/INGRASYS-S9180-32X/switch-tna-sai.conf +++ b/device/ingrasys/x86_64-ingrasys_s9180_32x-r0/INGRASYS-S9180-32X/switch-tna-sai.conf @@ -23,13 +23,13 @@ "p4_pipelines": [ { "p4_pipeline_name": "pipe", - "config": "share/tofinopd/switch/pipe/tofino.bin", - "context": "share/tofinopd/switch/pipe/context.json" + "config": "share/switch/pipe/tofino.bin", + "context": "share/switch/pipe/context.json" } ], "program-name": "switch", "switchsai": "lib/libswitchsai.so", - "bfrt-config": "share/tofinopd/switch/bf-rt.json", + "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, "non_default_port_ppgs": 5 diff --git a/device/ingrasys/x86_64-ingrasys_s9280_64x-r0/INGRASYS-S9280-64X/switch-tna-sai.conf b/device/ingrasys/x86_64-ingrasys_s9280_64x-r0/INGRASYS-S9280-64X/switch-tna-sai.conf index 36f2ca83df73..29e8f4bae0b3 100644 --- a/device/ingrasys/x86_64-ingrasys_s9280_64x-r0/INGRASYS-S9280-64X/switch-tna-sai.conf +++ b/device/ingrasys/x86_64-ingrasys_s9280_64x-r0/INGRASYS-S9280-64X/switch-tna-sai.conf @@ -23,13 +23,13 @@ "p4_pipelines": [ { "p4_pipeline_name": "pipe", - "config": "share/tofinopd/switch/pipe/tofino.bin", - "context": "share/tofinopd/switch/pipe/context.json" + "config": "share/switch/pipe/tofino.bin", + "context": "share/switch/pipe/context.json" } ], "program-name": "switch", "switchsai": "lib/libswitchsai.so", - "bfrt-config": "share/tofinopd/switch/bf-rt.json", + "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, "non_default_port_ppgs": 5 diff --git a/device/wnc/x86_64-wnc_osw1800-r0/OSW1800-48x6q/switch-tna-sai.conf b/device/wnc/x86_64-wnc_osw1800-r0/OSW1800-48x6q/switch-tna-sai.conf index 4bff0a177b60..f156534f873d 100644 --- a/device/wnc/x86_64-wnc_osw1800-r0/OSW1800-48x6q/switch-tna-sai.conf +++ b/device/wnc/x86_64-wnc_osw1800-r0/OSW1800-48x6q/switch-tna-sai.conf @@ -23,13 +23,13 @@ "p4_pipelines": [ { "p4_pipeline_name": "pipe", - "config": "share/tofinopd/switch/pipe/tofino.bin", - "context": "share/tofinopd/switch/pipe/context.json" + "config": "share/switch/pipe/tofino.bin", + "context": "share/switch/pipe/context.json" } ], "program-name": "switch", "switchsai": "lib/libswitchsai.so", - "bfrt-config": "share/tofinopd/switch/bf-rt.json", + "bfrt-config": "share/switch/bf-rt.json", "model_json_path" : "share/switch/aug_model.json", "switchapi_port_add": false, "non_default_port_ppgs": 5 diff --git a/platform/barefoot/bfn-platform.mk b/platform/barefoot/bfn-platform.mk index 837f86c335e7..22fc9e6d7c46 100644 --- a/platform/barefoot/bfn-platform.mk +++ b/platform/barefoot/bfn-platform.mk @@ -1,5 +1,5 @@ -BFN_PLATFORM = bfnplatform_8_9_1.x.ab1e16f.deb -$(BFN_PLATFORM)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/rel_8_9_1/bfnplatform_8_9_1.x.ab1e16f.deb" +BFN_PLATFORM = bfnplatform_9.0.0.cc6ccbe_pr_deb9.deb +$(BFN_PLATFORM)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/rel_9_0/bfnplatform_9.0.0.cc6ccbe_pr_deb9.deb" -SONIC_ONLINE_DEBS += $(BFN_PLATFORM) # $(BFN_SAI_DEV) +SONIC_ONLINE_DEBS += $(BFN_PLATFORM) $(BFN_SAI_DEV)_DEPENDS += $(BFN_PLATFORM) diff --git a/platform/barefoot/bfn-sai.mk b/platform/barefoot/bfn-sai.mk index e3253348e720..584c89157527 100644 --- a/platform/barefoot/bfn-sai.mk +++ b/platform/barefoot/bfn-sai.mk @@ -1,5 +1,5 @@ -BFN_SAI = bfnsdk_8_9_1.x.ab1e16f.deb -$(BFN_SAI)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/rel_8_9_1/bfnsdk_8_9_1.x.ab1e16f.deb" +BFN_SAI = bfnsdk_9.0.0.cc6ccbe_pr_deb9.deb +$(BFN_SAI)_URL = "https://github.com/barefootnetworks/sonic-release-pkgs/raw/rel_9_0/bfnsdk_9.0.0.cc6ccbe_pr_deb9.deb" -SONIC_ONLINE_DEBS += $(BFN_SAI) # $(BFN_SAI_DEV) +SONIC_ONLINE_DEBS += $(BFN_SAI) $(BFN_SAI_DEV)_DEPENDS += $(BFN_SAI) From 3ed7cb71310cc4a1bf381327451599faa927fe50 Mon Sep 17 00:00:00 2001 From: pavel-shirshov Date: Mon, 19 Aug 2019 16:05:20 -0700 Subject: [PATCH 35/54] [Fast-Reboot]: FR mode is active only first 3 minutes after start. (#3352) * Fast reboot mode should be enabled only 3 minutes after restart * Advance sonic-quagga submodule --- files/scripts/syncd.sh | 2 +- src/sonic-quagga | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/files/scripts/syncd.sh b/files/scripts/syncd.sh index d4536b4d8b94..0c3be805e7d6 100755 --- a/files/scripts/syncd.sh +++ b/files/scripts/syncd.sh @@ -64,7 +64,7 @@ function getBootType() TYPE='fastfast' ;; *SONIC_BOOT_TYPE=fast*|*fast-reboot*) - TYPE='fast' + TYPE=$(awk '{ if ($1 <= 180) print "fast"; else print "cold" }' /proc/uptime) ;; *) TYPE='cold' diff --git a/src/sonic-quagga b/src/sonic-quagga index b1d01a2dd841..904a35010779 160000 --- a/src/sonic-quagga +++ b/src/sonic-quagga @@ -1 +1 @@ -Subproject commit b1d01a2dd841f76e73067171702f7c6321793c49 +Subproject commit 904a350107793d44be7167500fcec9087ca3243b From ccbc3ecf368cd824d2df9928c6f9d349c6fd9b3c Mon Sep 17 00:00:00 2001 From: Ying Xie Date: Wed, 21 Aug 2019 09:16:55 -0700 Subject: [PATCH 36/54] [kernel] Upgrade kernel to version 4.9.168-1+deb9u5 (#3369) * [kernel] Upgrade kernel to version 4.9.168-1+deb9u5 - Picking up security patches. Signed-off-by: Ying Xie * advance linux-kernel sub module head --- rules/linux-kernel.mk | 2 +- src/sonic-linux-kernel | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/linux-kernel.mk b/rules/linux-kernel.mk index fd8429eb8f3b..bc95255e0dff 100644 --- a/rules/linux-kernel.mk +++ b/rules/linux-kernel.mk @@ -3,7 +3,7 @@ KVERSION_SHORT = 4.9.0-9-2 KVERSION = $(KVERSION_SHORT)-$(CONFIGURED_ARCH) KERNEL_VERSION = 4.9.168 -KERNEL_SUBVERSION = 1+deb9u3 +KERNEL_SUBVERSION = 1+deb9u5 export KVERSION_SHORT KVERSION KERNEL_VERSION KERNEL_SUBVERSION diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index f8b30b40c358..f8bbe29ff896 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit f8b30b40c358238d3055a18305c8b7b659b47739 +Subproject commit f8bbe29ff89611d190658118e2c191943dabe3e0 From ae79f675ee73de191dd459b900284dbff17276bc Mon Sep 17 00:00:00 2001 From: paavaanan Date: Fri, 23 Aug 2019 23:42:26 +0530 Subject: [PATCH 37/54] BIOS upgrade support with API2.0 for DellEMC S6100 (#3116) --- .../bin/S6100-BIOS-3.25.0.2-7.bin | Bin 0 -> 16777216 bytes platform/broadcom/platform-modules-dell.mk | 3 + .../debian/platform-modules-s6100.install | 1 + .../s6100/sonic_platform/chassis.py | 146 + ...-for-Intel-Rangeley-and-Denverton-CP.patch | 8510 +++++++++++++++++ .../tools/flashrom.sh | 10 + 6 files changed, 8670 insertions(+) create mode 100644 device/dell/x86_64-dell_s6100_c2538-r0/bin/S6100-BIOS-3.25.0.2-7.bin create mode 100644 platform/broadcom/sonic-platform-modules-dell/tools/0002-Flashrom-support-for-Intel-Rangeley-and-Denverton-CP.patch create mode 100755 platform/broadcom/sonic-platform-modules-dell/tools/flashrom.sh diff --git a/device/dell/x86_64-dell_s6100_c2538-r0/bin/S6100-BIOS-3.25.0.2-7.bin b/device/dell/x86_64-dell_s6100_c2538-r0/bin/S6100-BIOS-3.25.0.2-7.bin new file mode 100644 index 0000000000000000000000000000000000000000..e6371a2602d6a40f1f88e40a9f61dbdde9f4a2a1 GIT binary patch literal 16777216 zcmeF!u?@m75CFh;f+B?`h>9{uq-P$6foa$y9cwTG8yE)(6uOit&XVQV`(Jur=bZo7 z<^JmG*rX=y+CGjkM8v#eh;v&~pEczpx`=J=ayfo`)-ZJ+(k!vEui;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?uv6DT zURV9Y@Rv|jx;vCcKpG_lq(f4=q`SKtl#q}v0qGK0Vd?I!rD5srUSMy~tA5waeb4j9 zGxsyk%gE}5b$5A>$Ty-^Z%6O`$;*6)gQDi)3Jbn@PCb{TkMAtVecXa zlnB`S{Cyz&-_daYnms${*}+!D`;?qOghcpv+__`4bqkm7ysx9`X1&K(f&(arZ`!~Pl`5b(bJpXtNQ_rn6hhx>4x zWFL+*AYA#D^*c6h)4o-i`mLJ;G-{oxN~OOJ8~5+t%FS9eYSXD>K%BpVP5-(<_(Ek% zR<2aE(qH%Z&-MRbsed?HuD_+KbojASr?zd|wD0&Yu5fYwdz1Hf`Y7CA7b+0`gKvbA ztvfbq`5%Y-OS0i#7k>}%;XA(n`wQal?7ikc*ZfE2@8VyLe{}~0eD*#?e4qY3<)2gk zUH-@Le+U21wMZZRpZou}y%8hE2={(&_;BGq`t0w=@~^AC|IB~Co^Z+E6BUZyFd)ju zAC49-U|@v5%KtcLw)e63^Z$|l`M4rR`sb4W?D|M` z;rEZ}f27PQLi$cf)3ET=J$*Z8EKsdMt+Nw%+$jIN*rIra+7wSYb-~xKWA5HvxLeT$ z>+0PqcRn;n{fk$B-aGba%!N?{E=`Q^_pO!a?pYg-W@K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009F3KM@G{uhjM0@ZtG?O7i`roWtr5+Lq~9KtTS#M$|3#Ly53=kpfBt zJbG3yARzqT(QyBo{omJpy6|B@#(;pAO`g=N_0jK>3k{l{;rr)%+gywDe#VEfH=ZR@r63zXoQ0{EQiw6`BoY8q?#(lfed^k^^ zeX~v`X#Q2XRe2|+n3uinXHyn_6tF)y;N_~|fN+BY!v%z!9UKtwp_1m8LFYryq*^+C zS=%TTVswaCBg5q9qbvMcp;*0kO|oQFghTOI8F)A*Hd2KPC3 zdt1R*Pl^>w_|2s+gH~RfbUJab-WwCvzPd2W{#fI?@9#Ib`HUrf4}2ARXl}2f-}ig4 z>1?4TVV#$q=-zzz)4H1;ZGO4E#<5v>XY8p|H@I7drCqvpnfm7H(dF?;W2mjWNnY;?8fp&C^q->4Sa zE$m3~2^$+VU6VWPP`t*AI(&P&Q^6g-AH9}iTE|f%&U`a@;qo1!318oCR`x=rj)$6* z41PJXcfKK`9$j2Fvd`KlgZi9ao^95?v{h#vyppAO=(L7cdvAJn<8}UI$vciop07@q zvk%u)4NIP?@r>xdE^AWrm$!Q_F36H~da|t37k>5Ra_8i8BP=QsSpRPJ$MJr@eEac+ zXsvT!I#Th}{W-z6)81I|_T9T>my5)>leT`=b6HPa`SZl7H^n;@>GA7tqj!enXcrpo zR^Za6FY~uPI4@|}4>Lw?ToF9r!h^X5mgRm?xn91F>mO7ZGI)A~jYTRYpMJ7U_Y1xA z7P&Daq)YFH`_qoy+%9_cTMyeFF1YGJ$j;+e_fHyp?Zv8Ct#Vacy7*qfsI`l4czo?z zo;;D?&X_X)&l7LQ|5#-E{U({#6x=fOYU$5IhHR|zefQUQj)sLCx;NqF@#@W!Cdr-b zr)5VjhP)WPxnP``??yhjcrmzL;L8(zejhpN4E46Hxzf|q0t@HjIHO-j`2e*W-`+DTXov)@e-%zUfv>Ef(FWFYCVnEo=nPCst zy;%74PH??d)85rQbSC@ZXG!k%sQYEO$9LKnxIS#ifEMAd_a1q&%kv%8zia#^dB$wd z_BMJqIB%86iI?6<_-^mbyw?*idz=5pw3Oe>Z8|-0#^{H2s~zs$rB0JYWqaRUGil>* zBT8-PpXXGS@>;!j(F@m{apy?) z{Kdmh8Pw-w~xZs|UOefwP z`0`DXAG#D+eerpbs=LxJy3n}8+lx{2R8MrV-KO7S4!T&cdfPrD^5(z2e)XLtqehe) zGX3Sv9uL|)Ieek6$y0|c8L(8vDXTABlZuS@rw{N<~h3s=@wYeSf;qd0LWT(-!SsneDUX2@cNOQ8fOBNnNwQ zi2U@sTHCTFTDqf6qk-EJ_UJRI_vFCe`wXqpqxYmf(Gvtb+OU61*~BsCABg<0?tvQn zH;q_0x%U_QI&LlUD)Y$pXCt3)pSn@!)l-)}d~{>|jI5Arfi|&`C2sIaHadl2bztToNL6=PKz3J7*VrQ z`HB^$l+4roi`=C~e3a^sImxF-zE!GJsU!_k#lA43QIeipV`WURKiilwqsOei({D|I z!qxjn`eS0#ttAKKsyKYk^mCM*14QE#`xpB?-(S@r_Nk8;-!u08X81>zf`ze1fJtx!C#oKa~`MzGG z>%XR6yuI1}R4MPRK6`#t(v)AO*!i&Nz@|+XWI25_(uGe(E^LtQhfYwC(pBrye!>+po5sE|VcwsocMh zjukR)K+JoKmX0kytJ-=l#P$?eVey+m4Q9dZcX_|!#UMw zq)E^qUaaAHYBfsnagJ0gvmDO4_1W@sC9~a6UA^SqkAMFBk7WDXRozf$YxRCNvm{G& zzj~?K@%Pt@ziN1w)5jXLOW3X5^9YSjl`Qdble4=^T)Ubk<>C7^l6GjnV@yD|4l%dP zD77csnxOJ0TP@ABw0rTM3tqhoSGVWmQy-u07bo}G){(;kGGDIzykfgK>8j^wJi1Mp zmaS4DsOYnrJ}(V~kkWK90%hc?r;Kh3-LZMhejuD|VG_Pe_4SJv#hw#UvY4;tMH3z_?U zp?l9?-Mp7$Zr(Z7E5V7?BciX5KCo`g{+o)ws_~}h z;6<~~Uz-0%^1AcFg|D)D{Q3$lHZQ6e6nf-`;2s&Kr}(PN?sPeSt`ig~pvHy8?+(Vg zy>Zjr=vk9y8Wmdd!jNm}dhcF3`|-G?iLb9+eSBQ9kMH)n7kVb_#`A@5JJqd!?9}x( zl^2d%og~WbWw#%_s*~r+yA*H2hunIfw;%90EJm*ih3@r<(QU%I{xcq(x)v$#;&UD@ zU**L4;05cJRqayuQr{lul6>~Z)gIXfY*-S~yT_6T`7gZfy}t0K=h3r={TB8p`1Y@T zZWas+-4u4d?z^7TU(~#is``T_`G>{{>)hzUk5ey9pAB9Rtnv@*fq4m1jRj#%;)+W<|pp8}9#T$R&_qyF?FU)p# z+JpQv3)~BRm%RMZz?o}aJWiCp&Z(t;ls}j&Xw$~0hx)vIbf;kOld#a7H(vLwnCnF6 zMzw=lEXvgJ_oWR3S7mBfbZMNxGnYSG*FJc0rta;7OVv0NZ%zM`s{$W~9ADP9#M_ovs zFlEa0Y4(x=W%GxK<18D!s^X?>->vUmxyx^9 zYU~}=ZU2ItZ)074 zy>Ic1Zciq}&(wX)!_dN;>ov%{w_dlf@ShzyQS<)WRa?5{3)~X;RfO?DTZ4a^mVUn#H zxA>QmrFIuc|9aiP8IAh9sC~KB#jnoXUo&b;v$q8omX4cyV2uNr!-cQ$s_W5NJpo;{Mz=x1^)gRG2Sz_C|!GLmO15W+}&5_(uWb%Ke(?5E?48mzFI*oz7AZLsoh75 zkG}uVXD;t8cWqhU8h3uKvpn$j&vm8-9vdGtwf4EX&krm}9Pzi33$~2==JSlPT1Rb` zGHtq+=Tj%jv>;vC$={vJc)i5QRZo{R-nMr}oNqTj?Eh}|)4fG!zA64wfq;ckE0#NW zENA)BdCrWEx8d{nTb@)J+waSG6Ej`7vZP7DP03rHh<9)P=J1^YQ^#C-L|;KT}}f=uI6zj9cz>>-Q=UWzndA7Y3T6?MRR`IzEzsJPwH=u zRkrb&!%Y$$O!rmEB1OKPvo_0#5p(C?nmc!E?bHbeC7(I_VA=AA%O#3cq)6Fu^)^L) zGa%Z<`>R)P9r4SY?@s4>x@y&k(J4|~+?jjsp&yqP`hIrK+09Fag#0|b_b(?$&zq89 zYl*{m_O*A4xvm8F&;dq;lpMG@q@Zl+?OBO0NH2l#6l`2KblCnh0 zJKb}i?eY79Tl2Hu`!?1u=T1a?aklr+_WMH?wm%(rMv2&2n?#*8dEU%fZN8iLeWl*< zt{?0dcUHtiW$OG;?n1@0X^NyRb!KbMS@E-fdu4L*hqc%lSOJB`@)&GvvMblU!v}tZCkRH-Sz#f zmUoYJkJD#!lA#wPrqA8t=;aG{`Ju8MtV@Tl%9a*bKo>|y2Eji1)9y=Tg2(VujP zId0t0{l$(}2p4bG$>cF2_l;5{&+)i5lO28)yJ?LZi4I@;BK?kGX>#1FexQ7XiJK#b ztjKbu+0Y${2Tk5nze$SeL3IG$n1i)`&NrD4g|pIvMorQ6R5_GVp}?Dki;rlt65 z?U<4MTYi0H&9eIU>*g$7=3MsE&E_7DU43D^x!1Og?Yred=!Q$LQpAZ;dHI6a(L7xZQI7^$fRLyxI6Z z%adTyf(18zTsn8kj`!K9?eDVzQ+`@I>B8!`owC=76t`2hunEJ~PAWG&&FzN0rl+~n zVne@VsY^v|b~tj{mfwb6xVRzn(=_vMOc}el)XBFAvgOUw;_|1-R=12Ac}nzHC2Ie0 z;pNNqMVI%;wQ^j8Z$vqD&Z}O!6+`^lCEUgxIf6ZT-zDiVb z`M1s5mMn3r*n|ZA9xcA#>r~@$&5I8DWM*i-bQ#mGnHG96TZ&qxGMt`KKY#c13u}~b zU*W}?RtsyC%F`(Kx{qQs-mxTUxGXWZUFo~HN%B}P+XU1Z+U`-CduyWf9zW-|h~1_n ziCVu_kA7owwJG&+%rDNzywZ06t;BzJZ`bcpT#7Jim&d-0&wS2w?l^6Tumt6M)myXj2XT$5+DXxa91kE%&FO_zflcfCi7m;=yY*4yb;kL($?@N^<{pfvTD%XlNX7?nRjLT zdgtJ**~;%3kb3y!tbdFPSFY*a*pd1_8n<%NqCF8FG_2S8^G7RQCF!?#!SypoNAFuu z=Gm8(+SQ-g?sTF=9g1HnwqWrT;V$AN^k#^L+6}mY8@bP(W1Sjt{l>gv#js-cs32Xb!+zSzQmEN;_e9ELNhA+)rc1X%dF~?Ru(0)|V@VI6I*3h{?0J4JbM*(ab6zB`CP< zyP}mEWLmL)XS^PdH{@wBwf*M@JAC@)O56m~zD-*HWSRQIVm7@xVDs&TSGx`Q`fQO? zNp5718eu}fv1-59U4Fc8sr}tfgoT?|w{zgF&1lG6=k5+A4;hEPyY0&UmqZK!r2E{BgzxkR>58CBCIUw)pjw!zlPWobhhhe*$c8J!g zQq)ob=~A!#=4gx~QD(JRR5V7UkE1m2oHu)vVO=}S+#S55>F2Xz*4dPNPu)@1D`)QC zI?_F!h;3wT$ZSP(#N$CT9gL+RtJL}Q4Hs7YX@HkoZue)xX)Ozvp z-Wkr8Uw*V&&$TSx^CcF))`A{d-*0lyi)#b zyOO6eS8fn@@|*oRDy6NoVL;ljuCF$>JMm_Igy0T`swY2Gc5BGZ%Jo+iPSXBB_hxUq zr7jlf)1;Lj#od)>e7|JBG)>xIP2;d1JG=~EF6jQNKeJAYez1L&CrjI(oLBWsqE6jg z)Y_8dO7lNE?QgQT|D7~v$A$i~vr^yBA{0MTEY`xWx9rQ^>}s8lA19d>aC1quF<&nE zF4yv3Z`B`M^l^{PAvKOvz8&q?;GS)g-yHd(tWY2hwc+D}*=J1BhB+|iOGn>M4+mCai=F5j}KSiw{E6Zg72u~3%8 zS=RLEJ2}B;p~EAsOcH7P&8Rx*}SNZ_*Zh zey8T6lC#%LNR%wYl_Kv#LTbMFc5;M1zef9}RE}d~M$~CvvF)b9drO=e^;?skOY{C2 zHQTkiy>@kd7`8Cz^5*Ye7uvCW;?|m%R)@5X+k8*u)IA^1{xoxyCPV5Z?ep<~iREr) zF5iAxnH14O`(F6EK)SALw_L3p^HH&R)iO1H*nD8+&xf_%RWqpS@6n6pY}#)|Xzh@% zGvsJfyWY!MO-6m0@Li$w@BeGHXm%>F?1P_k-p$seVDP#=;R~HA{n6FCwIcU8e!FO8A z+2gj=dlN0n4^Osk>0jl|k}o!;%bw?c-Z!x}6rLWVd#<=sZ-i{P)N^st95=TIN39*T zVe)-*emH%z)~mt~evG`ZZu#Y7KhN3bz@=?*9$yF@Qegk!e!cgO9J*!GnBUt*s90e| z$hDr)Q$2kb6gl$P2g6!j3Yyw(VeF&l)_0xJWlNlIuctoPaoO!3(!^S}f5WF|>Md`$ zF!rv1BIkAdLK7m zH?Yvk{C%Ue+Z1j1=^{Twt9^2C*W06O#`*JZuJ8v3HJ=}DU+!C{X2!ku)u1Wc+t*s2 z`{UaOOOJanKVa*C*0HC2-J(q1Q7_sSX%lp>VAsmiZ)}KjxqXLY;U?ut9JOuPW2b-K z_#)w#BX+kPd_LdqYpHe}3EDZcEB#$V+5v1z49g)jFSJM~t{ zEkhT5|3mzxX~$3O)Zp~=-}Yzgmi6<{Q;DX9r73su?%jbaXJ0DUVch7*ao)}gU+DI$ z?PYpLUOF{m^TCy>|C;!J0UfvKt^N%oh$0^;i7;cX#x~kCJce9`~njO3$U^w9`eYejmmq9LE+xg)7KJW-zT&E zL?c)(5Oc<~eA2=G@ChPDmHr7D!U8qcoR@C`p+tr(1qz-^zA#mpn0`I~i0^t9fvUGl z$Y-7Ro&+xHf&?<20XbwfFm-BcH~^mvr<}NlJLZaRL0bKx$#IUa_+Soy!TJMo;o8tH zxQ|^#YpzjW>3a$zL0u3f8xzrQ!yXsziI!xu1ln2B80O?iP@F5}@5gTCA~HkRSiE*f znV+ZK530OKdc^S^^&p)ClHR=F1{n$#N5A{WB>`q8FYzZyBqR7OX8=!Y-Ucuc%L03Q zkCb^Ibi$+a8e@D|XRE@&omS-@#RRYCrCx&Nt>BJGJI*bH3NUAfe4den#7}Wy4tiJ9 zs<$n}XRBGlCg6bzg)d;ry?c96$+6WP>81jsoLIx0EB!^Z%786B=@qC!FRvQ2Ih60yy2I6UHfuBSMoe|`?Z#44Yx>h2{`xiNdqRAWP zSlh#(%X7uBd-=5L3jItjyi0c#bD%m9Kplb2xiA>i6f5Y_c>NMhWvsdnicvkJjN zLDhymNJUc!giUdtz~2#u3Sg1z(qRgCb$}4-15SBdK4IEd!5xElVs_E_@=&2Pfr{BH zs|rP)wEVDwB69AAhW;93wH;UL_J$d0ej^_E;x@pYKvu(IYxuAmyHA6JCqpN?Qni(- ztxJHK*kwj6t@v-0*RiUO-$iBDAC2Gz~9k}99gtW z>?;wX&_hg<42*zn*F~|0XxphlD)t)z?NieB4@-2P6Wa!mV6Cz;I>T^U=Q&0i6ot5Y zR)>SBX?*7;^@d!sr${Q)s^ToE(F{9K&>91rZXO+p+Mc+^)S`|36kP=r^y>whf;8cS z4%Yb7AzPdkDAS_R<)0hp9%=?3VDCpRk%i7cr5_3l9CH40?CdLO1Ds(2R3L=t^`|<( z-kE{s!W_HgL>xEXr|MyV(<`oa9lt}P4AD-B4m(S1bD413v*EQVVNP>SXgRYg!dOq} z_gcB(OBo4VCM6AVRGyXcR4ewb1_hof3Ye>saPXq6BxJukdA70W8=gS3`w z^mE~Fu$=G#cY7=FH1@i^9=>&U)gG^4f~7r{9avb=)fSmm1pBbMU_ugcYXplY7Pr)U zHx=JYi&a_PrprdqFGe~AmX1(7Z$kEDO_q#NC@fby)+hr0_ym@>^({xc*tzjW*_J<; ze$DeGwOo~zUO>5BqXOD9C@eN-Ai&~|f74os_%N1F0wGz3z>W5YeE4<1?1UNGF4$qM zpy~ny^tR|Z(T^NcUn(|~BbTGtCE~Or;5+63O#JB5aRz%3Tju>z2@pZ>C?1!!8eT=k zj|Fv0L0TVoeonH0K%i4!`YAQ*u;o2ff3-FTsRWlV+*NAol{NhdkUJ^>7Zt zZVq#P5*x1g3?v9js_J-#DNaLAuyOoVBSSjlXg%Ww-!vS_GA0Y`Y{*N7ke4f)<&R5> z%BPqc%`X)~lfNgd9wAFipcdpB2;zQ0u&}%@B(wm5AXOMExAL&e*bavBc+a#qoN`(* z=%p2!Pk1(f!(*K70i&Nzn2jb&>R`5V73H)1*S& zb045(Rs2!UxccDRx7Z5#)A2S$nEs~F=Im-)gWjUqG1-8Hd zfz}YA&FXtXDkG5FQ%(pE2>{EO!2TLTxFic1k?1HQ@>$MR1R#`0H3ZR%2GK#nDeS>z z-?o4t_ijOuodxkoPcAFLDAnalR`RSG_be7^QbA^D$QU-#b3unxBK+awq;KaXq9-;a zImobVgkEk1WlzFFa|S3-7%>2s7@i1a1Zbnvm;(7-w^^m?NMzH43)Y4jA)4=rXMxNn z75u=I2UD*YBO>n_eVrjh_N40l1Tyw(x(hrHB!Sx{9tQ_x2=4k_Q3rwzSixWtpHGQI zLG1_RKuRH$kbgcs6a(4WNza=(dYS8+DP(zPfI;-^MQc zO=ZRdjw_<_6OD{iV~9==QvBl!y$ZT0B;hh|P;qhA3#i!v0)B?7d!Xtz94zQB62+rRGK8=xmKT!pi*TDR-2V9H7~3w$zi(!u4oOP zepMSjw9N&p)v1Aq&w|tGO{+QuLdH@deJoET=NU!83d9^P<%{=gKSgoraM-TfpqI|a zNoay!7Kg3|1#J|A>yP7+fmQW+KvtS{KOncKvW6lL0HNx9*a7hVYbt!00b>7rpXld{ zU%PdcI#>cF?ilLPjR>E?*OCV>pcru&>lXtK79vHAz-NNnV2zv)CLeS;hHJUzX;`~8|On)`6BOuB(s>%dy;fLkeb6cW3O zp#ps9T3Ejqg2A!Lj7Yr(5z|qbKvG14L$^})fXrCcgLvSdHP#3v$Iwo%$#a3tB$eSn zL>rq6VTmxsb%uwv0ulE8;t+|x^VW&~V33!1nIe*W;S|N#Bu!nXW=Qua#vHroM<|q_ za_UwjQpjXTF8FjfgR45i@|p{{==FzIEVlM;{(GLl^u60jL5?$4EZGYtsqg(&Am}cz z9+P^>Wv3KU*tyy`!AF9eFM_om7X&A5rpE5WL4XuM6Nx{SXn-Sn=Z2>5$5SP~I?DG$ zINE^cG>hz`;l-A~R@72(8xhO3(A)w?SI&cxk>?K21F*dnhX7_F&*{^UgycmBz6j>d zq+mflHF=OvX5TYxxx9%M$x{p{2x1trWJ|V|7#yH8Nu?|~$v{oAR!l&{q0~`#7>nLHG4!;LfQ>g9)2aBQW z0q?Y7&IK{<3A^{}H5*jp?Lr3!P=fD>^@w|-06juUR;gHAITnCP}f)N@`py|Adys(6YF7J9Ld z!A4pBzu$p>+#xr)X8&F?FCi~rr#zMh1smW$)N_kl+h=1+H{seFL3u=mZP+=qK zCtg%kDl3qGDH|YgCn`sBMcZDlVD;SVhi~@7f#o&8@jx?Dp>gV~2a!Kk7?_&8me^I3 zh5qa@A=-U7VUj3DjGPeTT;TLUWSdQBmgSgQ*C^H?A@%XST1*Is)n?<5d&@e54YH7w zVtT%%Q8jH>elQ{2Ja8RQ#`idNCqMQ^`*ehoRrezeo?B^#?dv%qVc?nW~6e>qaWrLc?%L5rZ4C#bStR zcYy(-NGq}!=T1De9mq>!O;J?xp7wK(%(e-<7pACY5BLN}g_Y6O`4GwxHee!YX5s|u zfsVm$j_~QljzuCE;{PtxB%&qrGfR$jlC%TSX%R{CC-j6Ua9C62BtClJWC+De!ncDR z6Sz;F0PgeWE?4=283TW92RgEA5Ks(h>2DBosvXpxKhh#VNxK6NgSJ$|zStdF))A6R z0BH;oWqna@3HbOSCk^U<0UCSL5f{!kPZNF{eTv7>OSh@lHBop^UOp?z0`dtFP+k6t zkvYSAe97R6FzVDwo(|h?JMBc%K`uaPBxEi9^ai@%>%_Og8d)namg+I!smalM^!cQN z{D`oDVRJeN8eiR7R6J3aND}8<+SY{ajvK7DxjZ2_S^Z54_{&}PBm)o!?@2-@QYUrw zKR>qxr+YCq*O@=`gf=;IG`;i2QMb4o$pz7nxy+J}t*+*yeqmUqh~KAGw^+$gDp z=S+r6pf??kIVk87H$o3VxsZW9|B!>GuMk}}Z8T8e%?@482ImWddjo|0eL&$fkf=GE zG*|vOfH$t^yb6wiBn1)H>N46bW(Ev!Y|-kR&4D5h)bLSOf>+0I2qb(9HQR)9=Zs${ zwg!U=PmyZwbS*(ztRdU{j1plH7Q!LFz8)C}wiyQYVRsZ4aZSP)GX>$|y}sBncp&wK z7s#E2A0T|(A3Ho`5HNu~(e|SF@!<6d=?1WVO@3GxpIoEdw}gJ;EDe|IQX+G8Y2dQL zQz0N%su&eFys*yI7~~tY@g#QVtrn4ki+cw4iV=b$FdL(9fv)^rXJ(5 z42Aswo_Gc;jzM!pt*?PhE_5063)rAdQSOky1Ad1sY!Mw!h0X-SQyuUR7xDrttJdP| z5CtNd#1dBu=HdF0h;1_y%ngi!R)aJanneZ9W<(wfB{+_7`&Le#@!s6r+rw@79#0JTTnrdiczGk4^}N5G)6-t`8eX zB}M4rbV!9{aGnSypPYK`tz}OHW1oT-!EB`NK*tE4cUf?ptG_u$=|)H-sBk+pxTm;w zYBFI<@+<DDV5hD}084y9?m5bv%{ZRO81FC`c&L5MenH%d4rig=p5k~Jym35f zj{9J$D16tL?;iGlW6~h5a~}}m)%;m$6&?d)HpF#(uOc~8%AUKnSya4W!zi35yPS;$ z`$S$Cl|R-R>>J(&I3m#l1PPAoZY=XeB?2f;?n=L$fwF&*gn4t~5xUl~-$&n5^A8-fV&5%WO= zY@%KQ2at217!$ybq9BiU5F1nMw8DP5PE~8v5yS<~)&kXhCT};26cv#Vo4h5)%#i zzVuI`D3EWHz}l&jIl_uCZI82Oa>8Aw?-?YV`6NvZ!1IWfpL1wnWup@=y+} zso0Y_e_2!Ml3E$iqc5rdex!c`+`(m?G3v<*Pr%=kSzn(^R|WSNjx-AEpI9Yz&8#V1 zGR&ymYehH*%7IY_O%pI9^{?hwuOO!wf}B^Pi*AK4m)D}3xWdQ}@)SImv%J(VI|I^R z3VWz9man~8qyFVK5I#J?QULzejhPgcy&a^oKYANXHi7t^+0QG~+n;$1RhO*l@5DeI zu?%p4h89%y{ShhhkmHQ}QH}7{$;VdF2ZZezhFAqWle8H zaWa-^OLggX+C%hTG;R@`4@;gU6PG|EHSx$D<`i3Gp|zy}3@K7(2~xRAtIy^*GLUr8 z2s48QRYYsI-Ir&KaHO})!J<;5M0ds?>Jfc$V~5$=LWYjs3lL;`Zr$r-?cTQI+r4dO z&ChSZ2UHn@*ep`orR%VCe`1{fIrG^=g`Vdy5GONhPjgKQ0p{Eyg`=hbpz)bb5DSvw zxV3)H;SX^)SYQNe0~OVSu_z_F9AM*9iTa0<`EKBk^`4_Cm`ud0&cF$2f&pmYA0U(% z39_*>mKrAsV#U;K5H&lAOi?rlPFGviDthtY*gx`)!hE3^fL<~MtS8PVS@Ot2e^b?c z9raiX3`;7ngo{@R*Z$x}6Cj*~18l>TT`|OmCVLwT*p~K(t_n2xGD(BzdLmyu??k2Z z)b}F$W?QNk=W4cK$BIy&4!B-&{wF%haP`9W5-`CcV=2i8vw{!ibPF^bY@1rU+Rn+O zg6IH~XWN|X6(keFLM_|>C7Y~QC^Q0n&K$4&bO>V7rXCU48zBPULdLHv^5fF~A_(FB;0_eDg`h=k*l+pp7$PRnSi-^wR(nA_K))eWm z+Mc=2y5Qq}A?ZQ!llO4qT3MWI1BuLR0Cmo1jS5Utkad5=IHoi)O`vc;@FVL8I>Pn3 z(ms){3kaIv$vXgI6^iHP>dzLb1`mU*4U}FzyRZb)03qO?C=g^fCk*kpJT$L&tP3|V z0KsI3tm?mt%8^w(UPG0g?9xM&I_t7JZUdEfuFb=X zEYRFwp$;?%O#0iNyO7&+X$&d83Cp!TXn1zKRRMH_NW zXi`lHULYy;i8SRPf$C3fW`raqOqC3e1$l2wW6d)DNY;-!MU zzRskBI%Gmi#;{2YpyxPmu#+^woia-^lz?F3b13+eY+0r9o&=hEra40c7}+I){rb_y zHzNUs)>4C7LQ3|Lg$Tl|mq53GB+zgnvQP+a7ry$$l(u1*VS$1;^Cd>bR&tS|(rA)o z#~HH&1?LBuu+40hd+&Y^eeZV;*4Z0vEgxS1dH_S*n}DdE z#VgTUsp%4hY7EE>fmVaUSLbfWLDj z$ArGVKBTFyzu=4;Xq{P26#a8nEto|@A0M#$E(e9W+|YLt0jx_r*SLVZLYbEwO|}A6 z4hq$=_6$20=BbNzFUmD?!u$0A>t%iDuMjsiNOtulJQ4D~;~dQdj049o0pADW{!FdD+9$v<2cp9cf4w3vq@9fHu@rFc#NJ#(>>|`YtsR(tGObj?KaxlgaC5mpL z3qUmDAQyX%NL+oIs+ZeD^A&_+}c1rr6C%Zls>&63QYCitB)P3J4|L)Rgnt#85RA#7@Ko#uiARX!At9l_gpO;cV zBko}-`H>h4y&+om0hoK0eS|q3%3=>s}aj(fs|v@al!5)=g96A)~976P7|Q z!3`a>$4Jqo9;_q?o;hN_bR~XxKn;a{*D)@rW#2W2$xzILWyp)>zu3;umfZGO7+9I!ED-i8pL`X6a!O~U%J zjm#Bsx8v30fvG!F5i@f}hfbrp1b1w@gy~H|B>)%VY)57_=imDY^6JlQ z3U)njLf4OXB^$I}hWbqlTy~-ftfTElxxx737FG4-yodpFn1ky&O~6R=<)oIu=f7EQ%5Gas?_R1rvu^Ae`A9s!%XoYj!lwUGza-5T z5}vubr^T;5_cD*#Hr}#KsmlKF=h5)=#=o`=EI5Y&eg{QbW@0ezYd?baQ{!>NkI1qnHUQ~_0d_rr}+|2_!s1OrS9lG zT|UVbpMp5|XYPJt1@-z8`?J)a2yMLaBh{D!un@`;e9?P~7n~8B_Xw!pryUjbraA{u zZy|SmX-w_DgZUNLaJ_QM)EQVk5;jPCi=2+n_}t`dD?gyRBvUC8>_ri|+#AChX?{Jg zHz@Sx3Ay@63urxKwQZn#goDBftvaGaI11UO)2nx)F+@En4I-@LxB$e+FdtW?hadeg z?4{P7rS?Z{^=&2E9jt-XB^M|P?V?D)S9cSz1WBtnB7u&0zr;5YjOl=`>LjYOm*@)o zF`=e(9oWL)8|uA}uZ1r06b?eB|&sL zw`0gpe_DDuKyW{YT!+658;{Z+05C@e9j{tr%d*mR)st8O|J-cu~J4k z+PKMRSRJwzYu#6XBO5^l?8Y2k8f!*4Pty-U>Fh?h`BvfVobJW!_h&JjF(ftPMDU}y1 zR5>@Ri?uzmQyzAcmT2r}Tpz5ArVqgJ?gEJPn3ZOy$PXdy=So$d8Y=Bsm1JO|p)Cgc z6@Da<5XNCy9QXb~O0zHIGb+t4C`O)Z2dZL_=r`VOy?@6lItSGSGsI+1^ z2n5SdFPkY|7nV|$tvqF-QnSlP-XYChlc`oyTjrZgjR2Q!Z5_xRjPG7FUFg~`s{c?F zF*1b-*-a4kaZ2|WsQglyi`035RyIS(KCkL5hV)qvu&k$ST9Hsbla&0j%Iixjy~0;v z&XhDIqxKLB&}LBCW+e?X<;IjY_ssld4UlYULpSVOGS?<;4r^XQS7v6pfV24H1X7;} zusZpqA@N$BQ{?i=q8Mld0mvWYE@P)OdlMKv&Xy=lK?|V!iAmvxobY_Z1zF~KLNk!@ z7ME=7xCQdi$g`zGDIaOiMZX&EuO%!*em4SGJy*t4t$oO&t|5^hj5D_wEtVL-N2=%1 z^9hmvrEoKTtl7WE828~|O3r0QbiHCk^B4JpZfQ=W zeMAB$0E#i3aDS}Ow6H+{aK8uA_i;)yx7bgpk5IDg<<1BLz!Yyz?uBV|iCTs%3V zpu;4>pBFQ{XuOLa6w?<$&01Bo0^KFj9}eC;9qSI=!dG$f=nyM$Y~)MXV6-e?v9R}x zw~d7UHuLjr@pwbn(t}i?6QlHl|<8ImL~9`w-xWjjE3pI=rLdMBSCD z)LPc26AsNNFRhZ;>!YKZWS?84D2b3o^Liy>#ZRIQADSEoy~PIGR@x>Yc5y}7nH`zf z-JYFWc%3urWaN)q3p6^BB@KoJfqWdVtn+auVD#7Ax*KR7Px$<^R&3OIB*nq zYb-=l46GV}QMRueTttEEWCzBN=_45vZfMG`>ri4Ngb#~(To#050IS=6noP<{XTuWZ z0gc&tWK_;f7UaAhsEwrHR~Vp_=O5QjW7?pm0;hj

yplO0SngoMe5@nF#S5eEAgW9 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 z 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%0D7#>Q9nUIjaIdYp|wVQV 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

64Ker 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�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

vfN| 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

UHavc-2*jBVhgnPIC>Ih%_qyISc3a zV(=MA+AgkMbjp=;MN&4Ru*Oa@nG*P= zGpt1}nycdz=DSVwdA4U9zjRAQA0@s(`Kr!3bShQ&HiF>nx#G{3!j0LetAbl5a$v3Q z?@am6&|zGqG|wbST9LCn{n}WI!wbdI^vS%YaQ>Ty`rO~K!h%5Hl~)0_wJHHJ^gs)p zOp%)jj%@^PtXx5~MEv0IY@oARD@|yGYUQFLQ3t;1Q`y&i!7snYo-P*$o$C4Hp73XG!ENRcNT_^% z4mNjHZP^`3T}oAbV|F;`$R6lAKHpyO{jEVnZv%OyJ})NP1u2%O`*%rkeWAKz{L>R{ zfEkni0vL8k1~hDVbss4*-wQ-tShV`cAVg3mrGCqgI2>9T6E~Gy+mhG=W{-Zja0?bo zP8B`{TXUGTYPNy=(-J>u^PX?)ZQfBgPH!&6|2VC_^a(21{9Syn{ieV=e(YJl;KeTwC4JZV9WglO+eoT)OU`b=9w+a za{kY7O+mB^!2H85_r}a(AT7sBtK|c*dla@(OmgEE+LC_;`T3UK%#Y12_f&f16Rlqm zjU0rTH5sbv*ZeFb3)Wf`5~v&Gc)ma0)|`wwP#l9RmkHGdaXbJJp1wFXb?S1Gw&QPs zU;KP4)%zpjjdax+xUthnXW745+_9jBW^Hya7x=5kuc{VL_e``5?X_$*2MDkN%P{S@ zyIZm2lS`_rX>W7LH~ej(vS*^mY{jBR6hTFeTNt$d&?US)6>LX4M?6!UB{a zgkIRQ52W7TDp%iq)#_hs`!G8?dwUaQTM`4JUAafCffuub{T-tg7}Z{?2y{;}S`n_~ zN2ytaArDgGTDqvkZc@AOOX-9qLJ_BL%^LcSUr?g$zqe+D2KIgso8PDG z0IT~5a3kEz#R{Pv1+m3)x>vaI)GqE?|Qeh1YvKe^*(;pl#kpigk} z)8ns2Vlbyshn856(_cdJRV;EgCHyy~$yZ9_m-M+4wB%Sq55&XNJx>ol*B5<5tLVy{*u z&O&qDEE(-r7O`uizuy(XTQXN^(od8U#v}v!13Y4Zk68*89+ivOGqfa%U@dw*4n-8~ z9;8A9h4=v&Ju_ZGf8m@9T=hQW_0}T2a_Hg5NA&lx#j!S3A0XyIc8U3q@jzS*hOIVp zyYY71CMFzHe^?e$r3z*`y=BWm1ID<390o}Z8n6avfj=SnK1`-+vcGQOe*nrZZFPsp zpGYC82pf#M{+G`6KYTKR{9nEKDh1O7#j}QAxd*UfR`GGA|2G^#5kmq2=fnTQA|yy4 zp#KCA#4ei~964t{hw-BlEL>U~Z5T)Wu4Ro?rHvPnT*@wf(}01k&kC2b3A4>YOEHKx z2$yVfbeVovY6Q8)%h0g27M-M)>=?5s=i$*+^P|dS7!ztFqM{Zeo7Oa$*20(8kp`dJ zU2g0sA`_hIqg_xhojHal_8tPel3csiPpuBrk}u|fS!v9l2MQ>4pQ@iKK~HT;d&;KZ zwj!iIE*10Ca&AH?0M+^RN z1%b6d7mlEgsmNi6?bm=f+iejq5R94tYC11FV zze0h=GUX287K%gU#D&3C`ATDESfQcp%1p&q;F(`^e;*C9vS1U3#p1$^D@#LJ36F)q zn1U0RMSxgUgvAOn^Od5X5ELKL{ez{c;$<=vhruZZ@uk#Mrsx*Ja$u%ts_)Za;LdL; zBm;vJW2Tj;--M+@^PsktQN*Q+pjmlt2b09s6kV_tr}_G`z*oYgzT~m>d%*35+14tcpZ9Q9gYg3Xnq$W#;g zmIgAl6#rhTPzjfajif0-9BtZ)LSyR|MGZkQm^a{f;dF3x|9*($DpslnB|bi#+?zEe za=TiG6PRXRm55YU3_7h24V97^;2A)EmPf!6#d(H12kzV^IvODOuX=F3=%*mJ3Eg*4LYV-<-X)! z=63yIKC1%wsse=Pw`qFnXlEdP^3p$n4>SoLGWa3q_h0XN7-P(24?VIl?K#1p-uSV} z{h_p$(LQ!lRtN28P<`w^xd^y^Zc=S}8}WzoV-&BQWEV0i7EYi})37!I0R|?zNsKNO zn-c7syof*d3%K4!zzE`uxJ1EVAvE=x9k?QF-*NOW7#K+8+y$fxQ+!2k z0tz{0x=aWK%S&R{YWUJB&)Us6AXw#2?#jcgZcY3jo|dOEitvJ)!nfGKT};lzc&8qj zTRL!089x@4iKN)uA`c-*m!$QIAvVf^8#iq7%6f?Fsk5s7(z1S&MRG?0S#2fr+jOmzQ3d;C%u|+-nW9r!yk%b^4=OX>{?57!~1*cSNn}H!V5y|U46CGK1*`LJ_V|0#=&FQ>d`?z(5 zoxOZR$6l^<<;$#w%s)u1#@cK_wYPsEkEIDFT)?{rg|Zt3?_17GBzST%oequAQeMM2X#_INoML}%iA0>tq@rk#B+*mtiC!y43e}L#Yuii5` zb@slG)0cn5n4{zSqoE!e?@W2H2=A|W_=HnaKsYdk=d*tQ?rXGYH2EydXR{x#(ZSCc zECzJTxV)nITarxX>6-7(+BK*afwn%~v!uMQ6OEqEdIPR8*9%?n68$Hd#j>quK z0n?BR0PER#Kvp+{=c^4o_T5aNPO@FNb{Lni#Mw6A>u3bB)T>Tr4Z?IdVK2z$x=?lp ziUdsDeh5HP{ZR$gR}`5xOSnOfZ4FBCRs8O=|Es!^+Y8aSIM?uDy$cI?D`0H4Z^_UL z@jDBX$?P_=32VTZQZEjs_e@6v_AFkB&O3%D!)2b*!$r9!*F% zU#Dt8dgE(JJB;?6JnTvueCjfK%5%Eh)^9MSw-4o)9jtJrKGFQ_al^d!7;hFf-d^LY z>zslvkA3laU@t%ELA_wLC3oKZGCDl$?~~bM-m`Km#g-5CZAfV(3xQY zjeGE+<3AXiAvTW{j)&PF+-0EX9(q5$*QQ#$5}8ir&h9!=P-wX}(fSM)J)B!fSjsgd zn+|%=4eA@kHdnE*!eRab9-f>z&YWa{y=!Gi?bP!SG$tQ{Ry%O7h09VV_f(@9@V#>9 zEO8>lo?9qgYczVTup#1gkuuHXACHV-q^BA+WE(k?O9fIal5~84TMtw!63<#Os>Rxb zAMS$tvj`oP2r~Xh&J0pbZnY>~IED-?&TI|ooGM(=^gS8uB|YU+Zf#3icgwHcs+s&) z)a9?trA`lWotqmG=F;A{aj{st_3*r+Ioq?G**WhU-ufD zJQ4;ka>BO90wtht;_z}bL7HpH@OY^`Hj1D zo853n&QGu{>%oF$(T zKVOjXAE}2?8>j2o!fa>cjF-#7WA(XH0YR?DV9uy_W^_{F{OGIhcU#}+r}gs=n}gcw z$rsS#$HDnM`^OIk3hL+l6aTaT-}!NF8Ip|QvInBz$l6t}t$oP)7je^JOj9@FAm@na zPNQ~Qu4`>|&f3svac_;^r^BAj_XnaMzK=r1*8RI0`%; z=%=G!!+O2X^Brw$fP*VyGb97g3ln}{8x&}K5x3VGgDdG>&~wogLITXK!}ZO;OXN9g zy^%incYD6v{yJ$oxF_YyAxs|jcpeh^-tOj(=r!?_d?L(;$ID&OYXdKZI})wt&z8~3 zOkOH44EnHOn>wMDys4{{M(C-iWIm7LO(t!8fWrdhhDn)x1k9nqX5{G7xk;EpUETGE z;-|a|Yr}wn;?I^0z|>te8xJaEOvBc-V=cve@r#IGcoB@kPv_H#U^9=!ooXXHAQaTm zb$)H=KS=`Ls|NPomhV1gLRZLNi8kkio6o{8rRRfM`@5UFAvd8{9cxVxRzH0aJ5yH! z;9PAlZy+dN&{NzKl*@^AHC$S6tYk?1^c3WiumaiGR*)O z?1PyrU@)09s~>Aj@PV+kONM0_xb z^mg|8AU3T8su{fL5(;z>1S*YY@jILd(Vb+ZI=}%#M8XR?pZ&WRufRf>M5ffifhp!t9cvvB&MJWch~PFT_z1DLTmsSjT8B6QCTXEg0n-N{f?D`z6YX$1_^Sj zpW&2UFyS5Y@Ah)O`|Xa&ahYBJkwllV#Qd?owoxRV@g&}R#_J;}`sZQ!FO^SUn_$eoVwK3%i#Ji7eb zV^EsGS;#eH^+NOV&>HoJWNGZMj{1*|@6JOeRdQz@Fp=u1)@I@tdoZ{YBO9SluAgl# zN~(?-O?kRMhhJFbon+dWk3_hSsC0B4y%nDnX49DgRS8!`=@_P2ZM#|6cFq(N6(5R| zALQ{`-`!Q|OR@xN-`x$FmmU;$0ATLSODG}u*Q=_Cm0w~dd%d{l5C;MX?HusHFm{n6QhwMc^TX`FC%=%M3v(d_e~+tu%vqx6 zP6tof-HK`0Pj4ZBOG~a4-6v+RBS-gHKu}A?N2*}&#;*S?eJU^s`y4}NMGdBYm|Y46JnjU;@*xcNPmLBM84m*Ryk@sJ z!=IgR%4@i>1yKl3CI{a1j1T|(3g}?!b#U#ZHjo6P^g&^(S z_AKxF60eJ>{4^D8J9=GA@8cb$cl*KbuXB0FXSP|)?$c&`cUBm{Y8k*)31%h@VI~db zTr<(Ch|zXvkq)vZ6fS_X<%8Q|eS$pm3lDe^no}#7nXYJ}K#fBhebu}2&@G_YG)cYh zMd%`pSsi>2kT~V8z4ALv&fES#xwQFvi8pxv-Lc%eVq_Oi8kF+;?Q`nm{owr5M5AOH zKvL_!U$a){%0B_+&BfE{F)^m9rr(INIfNeOtMEz)a_J0=Y-7^?hB+SdQ<)WzVUcQLa zNzstEK84p_)Ijkz%N*(`^ZoBHbgiFGY9^|y*j>VFtf~d81JH!dPx4XzGeb|hI+xw% zm)0BP!yjmkzMQf@%d6QvO4SwYehCsS-M5}58e?pb*(DnM{-5_>DdN&_mId6gf+@sb z3c5FdksjqqTVKHyuifaO6oq!Sj}uctn*%J1qR+>hBRIEdJ+JCzoX!#riT~LYmh~*V zV|ZPrr5=8EFLreUyZ55TZ+34J4OQ#&Y2Ev3bL*At_91nz>hS*z%ZlOnv3@hJ9bR6= z>EW(+w!ZkKhyCB(>dG_h6;uq@ISk!t2q7119Adg&`alH-x9GeY0OUT*e_9W|L(Hdj z2-Zu#;mJ81-*xL<_0k z9%7CX`GBCqpTS;r@g2Dr*V*R?S*7zWmxo-8PPAM26M=sr7VzhOL%2eLb;&@aX1%16 zPqvhml~$J8$a(r^*$Mtq5)|6vkLU1D&Jh%pl@{@Ic?smO9dr%}`}&Qo(7FAS>RYXT zI>l8{VZGkL6cRvoP$G)y5N0Ch!!hj=EJ0**tzg~}^&lmi4{`t8of1t$5tmR7Z-W_? z%m>1E%wh=5azkyUP+=o2x5d=__>2yuiQ6I&HNraYlaIQj>~04Nwe+=3;Zo$k1v3qO zOlz9mQ|rQofqnjwE%z9EFZV2Y-6jx;RMSpm#qL!V@l9!qg(#kK2|l&1^L#(iG(ily zbBwu5hO8JCd^~b55LV($vR)xsU?(i$eZ^xK?;xVg^y2P%dw#kJtnMB6it$z(*GpOA zKsetPf3`XLSaZ~|@9cgwW#HHLi#p$yaJD(-YWEM$n`hbWiUibhhqDl8 zZx{gX_}3kDl~fxbw^*Dnp)yx^`H>i2mN$T{XGon~i2(vCK{Jflh z7~m?1Eb>o&*h{~PgRjk<(uWK^9K3FvY;i%ULa6;eZpRZE2&zRyQ>{@Asvp>=c}VBH zvIW6OX88k$i#X)KLR>DSa*U1}2ZE4S;K3&!H_Ao?M3>{eE&BMV=lb4C8Eg+6w+(0-An zJ)SQ#?^4+KJ^A$@C!ZMvFKbSzjZ&8FLSB`x#pAV3OL;=#R8f9us*T7&S_$8c3oE-) z4q;_w1|jI-|2ZuBa}iB;=_wNRzTd5nASa(^#FXh09%C^ z%V6xK=u83YY<#@wh-B8d!?lHJFmZ!{g%LW}r~noMZH9HYF+d){Uzb4#u}Bd6D031VJ+g7 zFtP%I{2ElUYC$T3j?)peK1RpgNrmHU;%!ktI-<7X+(_Vq5ghT`kRc~d5m}~nH({Ou0G1{CSnpr0~+AZ&>ImzlzmoG!h}$d!!eMH zL;e^JA#+w4J@_3ibZI#C>K}a`Y6fgX5kgBz;(1KVKNlOkI|)Nvs16W=44q=$~yUhZIy^2+gk9m}4&^_9!kW zv_kPmcG7c@p@M-kD5lY;jGEvoEsEiDU00>hJkA7SW*OA~1wI9XxBtLqoGvy}@VOT7 zv-#!m1%x~+geprJG)_p%HqH|bs*)haY`oo|7Avm^gRPp`V}FCgMLw)xhK9+XPDp~1 z1v3Na1WdJB&S_kiaS&J=JvAM2KR^Uk6ZjURrc|$)Wd_>>3}qdIP;t&!z=BkHb}772 zCv4@NrxVE{1ce%}>^O$E#PDtQy#>x&HLYRa1zhU`UI+o_Jy9UPR?a()?q2Ps6i$a~@+z*} zc^t=L%5EHl2cJ^O99~~UT&2Mr3jxBA!CUO^zbyW#Nh+oU#}~0F7_XAece+<^s49X* zUoS?1P3G$p?S2gBd%8NLS|yV^N$QRe=0I*Q1q2iJ+ekjxaK(;G%gM52XBqKQ)3Y=6 ztMzN|fgE6WMoHAt;GhZlP6k|QtVa>}HV|63Z9%>=R+1=5#GD*DIa%~Un4g~GPPEvL zX6Ft0_ymUwk%|pJUJE6hT;MFUqX@`TJS{@dB7-VK3%>CR>@fnG?0I;1@9hzvk&62O zuqRbjf{rFXMG-&3bvr9hvvprNo^|(xfMv-WRn5S}^n_PeKQVAHKq}yK@h-ipB8wk{ zkVo#$(FKs~8gR||b3ODyaeEI-()X4H=qCaQ(S9WZJ~FxLK3fc^b1;6xA(*@Rt8k#K zG1%lo`G7{$b7zY8R8@NW5?ocBH^qYxuw4(V?k}wQ=8@BiD$L-a@6QSN%K4hA^>w>* zP`?N$mBACUH=NlR0zwar%0L6pVde_bOaGBEU-REMKY$=ahB#&B9wo`-JD&C~IHFi7 zS!N&#M_kMLIO5~#M1F7TTc)joa zt`gz`93Q!SV&>%6$jhY9w_&qOL(XT1OWOGf_@XP>vA>{C6VkaXISDfN_C*sQ(Afnc zWGRt##l_^r_Nd8(=%U$uGgFn5^CcQFk9QzjOa-T8(tHnmRdX6&_Zchk+*;=itv-DA+QdQYh&BBKmLB7H$A1n9OKK9=&49;a&t~E1`2L_aSC@cT^S#byPoX8wQfJiiGt-Vu<`MVEm8M{Zt1Vt!=bHpDG<`RqWnZzR!* zB1uI5H+$R)L9l*Kj}nKaU!>*aLQ}#{*I%HykUtMy@F$js$U)+=}MXV^sB#TYl%}aP7?#XxD_Oz(Y8{vfas=G8@QW9p*e8 zT3|ys`g9TcRDLd|>_!S)q+L_(El1RqzOG=S6+K}@;I+)O`a7mkO`+6Qwiv{yebI=k z-l?>si%2wyV-dKeqkzhH5y+^=!!OiTvaPE0av3J!IzVSJQb^047%Hu+oiWMZF_WGK z+}3~v(!BR0n-n)aG>I4)`NxQ$+DTl=QKXqys)q}Vq?rL?F%j7YvyHNI@XK}lFUe12 zcx0Mc*`(CTcQHD9sMIgXYjEj>|1=LbK7>!I+Aw@AzZvNToGThA5V8r$__zz9GCG1N zG5v{#qgd@?u&~*Sv!&&S=kEDZ(KtFO2ovzM(h)6+=jq>T5Lu}WMIa-p7_(YLiaZwu z3f4AiHPKR&|doXxz?UQ!Orfh*R#=61^do?F)B zGG(tLu&V5rlU+YL+yUPqaw6#L1DTl2wCzt}k6(HkiVy2WGcoG?*9n!2IyP_)HT`wA zrA`Wm!8bVNZ&k2RsW9nPpl+HimcxV z`!+9+5IqeejSSBe9j2lHP7l!2K(M;rTaM;ic$49^H%Sa_Lxh0}&W zHP1*H;5q|@S1!lv0p>?xLmi!|?;&jbpCC4}6Ey}8;MBRBMK}=A`aQvcs9H!ltme@7 zo$%N2n3mAXU~b~aIL{R3(=A)NPcijMii_Q9p%^r;s%P#{=0U?Nw#kQ}He|pOK8YKe zow~jO&~e76Mm-Lq%BgOty`2-4Cf1#wP-0Z1cCP8{B^iX%XT??WU=0LD@0Gg+?9M8 z74Z6wZmwzK2wxB0d5;C>x5YQhf09j5t=kgdBnq1Li!&}v&n?3Vr9z{83sHY`kj3pm zr`ezSDXj=m|bj z1gb4l2Ho;^I0_W}EaEyEGZc%N9KB0P`DtiYjD=ri&n;)p?Icq;^ApzrZ8(;Yp9M+h ze!OSOSVp1b`8ogk_tsfq^f&bY+te_Lwy|A_rW9xY z`Yck8O1PjX8uolZ?_LoYkQvVBZ-<~5imDQlha$t~L)QDBKMKBE%FFmMRq5DEs)dcdJj?ohd-v>y1FYTG25Ch3?IJ>M+wY02X1 z$ghgizjr&l2uVVUAC1&g@mWKN6qI=hkbry8XGV>#mjquw7zv#DcPz7)FOmI9Z-vwD zq%7M{^`ybGnp+$q1SEZ3u8)&2powMs&6VI(gQ>%S&#^!#u`+)^6N$soa%2CgFj^(9 z0{tHVO+d20R8xdD+ZZe}qqGGC#f2Hw1ESKq*Adgn?t9}9Jf~bl70|669VK1<-|rg$ z|LxwT2D5K)lpKdZK*lpO$qx(|L&AfmDgdb^>btb_2uk?A;&ANtU!)j+Vl2#r9cM+l z6wO03JJb)do8;0Ac)c4R(>Y%IGna)E7n zv;2y3h&B6bg_Lu)6k*>2EJT^u39NuF7TIM{8{94WOIRTg6s4k5*8!EKSiRi*DC(o7 z5<<}{M9CS}`8}~5GlSa^=lpG{Hn*B)Z-Muy8^H=y?3gGA3x*D@+%=an4SKzmh(3pt z>pXbI%Z{lBm%$L72B}ujZ`aLp;bljC?wy?VE~G8e>Zej`(M6d8q?((QlUC{9FRtWwUN#VUxFDSP20 zg4uvNAe|8QVT+F9$as2i5%cTOOS#i!M1pUbB?r8e2`R9wYU*lEaCn##z`C9#>jrSk zgt6blcpai2xD5}RXO1R@+iVSdW-^->V?AEZ^AUOlA4yj5FxFn|9bJ@lU=}D=Bnee+ zLG%^A7x(6iD6BnJLd+L5=J$~!fgfZp2r$)i@PA^xm#eh{W_BCZSEJRIy&$}Tw?)zf zL`Z9t(8pOggplt>K(^|bM_Ah_Ut4EeqP>T@ch_pG0g#O5@NwKLXe!@Uw?)$2 zUf<1oVi&e-0%CktkA&hhE5nf?UBq2PkODue*)mwYPVju>i&6!tYMtYI(q65E7{+0! z>c(=HddsOFmVaI{^Qzm72-S1Yf+E?6;DRh;xv1z7*taz11kta6)~xF7IH- zCNev&*k^C^l!`e+?LY-!cbGbQ6}6*P6_>=Sit)_~l+j*3v@3YXW4$c?7Ev@Ivy{fH zv2P5;E9H+aNo*U7r4~1{!8f{uNto^2%0amO-1X&TqxB(1Y zKf_)mbb*2?Y!(%F_sG@&4l5cPZCWc}$>%7Srsn!j8s8OQKn8QHq%dkoCF{9GL2dM_ z1BBq}D$1M@J;jrJGBKi!nJgTlu-6;_H}i$_tf`|fg~n^t_2difgB;Vz>|d~RC_XzBu0Lb9&Bx(**eHz zcq0jC6e9#i%imQb@@7UDPo4a{HR&pi*@+zX0AwjNK z8$Sr*Moew4=q2k|1iOb(X)KlO!N)uWegJV2UR3Z=py502ZpJYP)*%S@G~dAurq^T~ zg$nj_G9hlp5$@oMUc(f)%&RCu55S^uP;G5&63*iv+&H>bc4{6s!7q^O99}m!|)+c@gQIBI1oVbigaD6yM(;aki3>8Mf zxVsSUf=vTI)nI@HUUhL?&KAkHLNFVk3Mo(#>ig(UjF8~_yE3)Sl2EqW5nPTM6)N`a{YMz1N#(RrTW=aRP@Bde@fI!0%1V?4C{6 ze+cI2M%I0s0g~`-7uNAfm8ggY(f0ciE*Y`+I={d=z0nG-^-#7uiiK^NS`bjIGu?3t z0-@r27^^f^TL9n`+Eo%#f}un$`(j(SS|PhZ&_Ok#vhrrh!?Wa6(RqR5!AsS9 znfJB{=1GpxS$E{%e-1A#7U;PcorC?O&?b3R^I%L~j%?E;KGXZ+;68sqm<-(FcmfJ& zywwhm1CY%WvJ<7raK>(36{xZ|N4;+pF7CZmWIb(|ySY&v-0zS`u`l?5$RSrj2ljG2 z!pu(HT~7*an32$)svFwlXO-;g}Bo+Rr&YhixnQxSvd*A*jDgRt>rKTtsk7k644JT@jy8w73{m;NPWIF z4e%9z920xs_}%LNR2z&U-fgY61rBYUwfPQi=G&)2wMBA<>QLs`*FiT@9J{s9ZQ!}K zVX}}WtN9c-@)1gvWHQ%1l7X0_`sXe{&Jk;!2pABPWqXwi+~w4-bCrX$8QkOSWEDq) z2^;kUgaOK|Ah5(6je!XMFfRTGB0pAen7SZh<_+v5_@{fs?=A>gCOaoC!xXq|lJ`-- z)9XX&=vIScxG)*}_Or^i2oBF0LPI^2NTk$8xUA}oD>{N5K9^i(bvt=3iaJk|LJhm!@-~D}J@dbp zR5iO4nbMB;hWhJ!2sBjlc^$xD9L~XqJNRn64QRgaMqU!a08XKN-DvS#(!JV3D=y%8 zrE7|@ekf$60jY5%oH^7#X{{{i$_TuSpU66`&Fw+C#NNEZaqC$Y+)jF}&%j6iWR)Y0 z2cbB;2b383GjEC!|62A0UF#&RM}=AuJ(O6kUV@kY`@CJa&M8iRA zrPW{H&+|zL{!o~IPToMUkRLiS1DamI!u~PBjB={H(s+kNm_<(ZTa!p%7#IJCSV>?} zjTvEsA*bGD#~|dDB&+rLTi{BDUgd5?6;#7W04 zNdA>!NClT+tKCLh^u@+iWHNg2Xo9_;>PR9j31iOM3`5o6X5JHpKu{j}0OrMo0)WQ^8uOr8}!!4cy%CIFF;zribWlz3hsiOi#@ zv)KJUvm75K0YTtN?b{qRiauC}NGtF+NQ75xl=0i+4Z_1WJWe)X54n5t2iH=E(gY8> zn{fN}_(E$f7~#0Vz$zLp?Ho6@Gl|YC(fFqp1@!e5b(N%N`mIrQU3UDMuf4w=R|jvZ z`9Z4NPX973zy5?bo zDy4~q6r@Vrip41D9yf&yUvK6<;Mgn;U?Ip0@=-JnuT%V9%`_?gKds0fPm zZG&QCS0Hk|Az|26femwMIB`U|=UG2E1d*1ecnxMiI3(EB&@&`(Q^F@z&mvzyew2Yc zD{_#IL#X(cZlQfravH)X?HL44qZhvVSR-{;8{Qd7J@2Xe)fe3K{ovru)oyQnv3=tQ zlF&<450)_lv1VSVBx?OIMw~xe=>hTt9>9V+@4X@;tuLe~>PfAV^w|L?J=|~i6u?gl zn_&z;gw}{N41QJ_*$tu}Zau~Ps3P<|J1--s&DYwKb^3!~^ESrg$xo27Y%jA_#A+X~ zUOvrDak$6da-QSsi^mco-5PocI+O{^d^~5+_uAu2o-llaVIMVh`=7u>{X)mSAUMwu zF#2F!*pd-N(gcVINidE5QGdtH*B>$;tzyOgNOtmf|qM~;5zp`TbrSGcI4gvsS|nvJ|cXFd%Z*ACxz#c zI4}b6j_f&P0hS02gSP>q2tuC#pTLT9$e*-i8~I-mISoO3f^cKcwkfs>()14yhYX5J zL>E*(n6c>N)0drIJdSI~qLi5goRw^v&<>>C^L~N{Sdodr$-B6S#&IXeIZ_vRrzGPg z#lI<4ib^7Y({gsbFX~q5KM?H<2n|Fh&$yZH!-;izEMm%kFgHLAaZb_tE=z<2e**L& zfs5T|@JMv{Db+mk4m!iDBe=nlcleO@M%7jPDkOA?Zw4R#Aa9Qj%vE|%u(9oLALW6Q znO`J$`}ETz&1#dG%)pfH9FOF22Oq_@#xbBJixjGnB<^?Z;twjP35qRJHB7>%7ohha z1R{xS8!m6i9Jcto+kV(MDqZ;r@TZSMWmSji2mnKjX0wzPxapBgqzG+YNjXMGhTp11 zE7(3k$LM14ar4A@-!mB7@&s|Rnoa7x9w;D;<*s0%idBM&E#a9ZX2ma2-jo=<$i9=7 zE2Vdg{Xyw?A4<53zm9Tz-T;*dm#FV@E@FauO7)&OyGDt}Tn&-@{yYAos**ifnPxZ{ zamfO|P#k1ftHX=fRf{>r;3~!(1nR^)=pT0kRql}kZXNP$YXhU=vSJ!&u2*^i!#x1- zzyXE@+@qz?g7NqO2z1LRE3B4_)KROmu5cYL>bD!RLy=RvBbj=Q*t@0Lk~^fZ-YPRmk9Px`y1LX(@$ibI`?0|jjqQa8st2H7f)2E%= zmpe>c>au5X@H4)%p#)+%I)Z_FeMt_-H_&+SofZC?a6T&XH7|Pgo$6jZ4uO(hmJ4Cw zXwbK0>LWF|EYbUt!N0j3y^(hD=R!T*2yOP+Jfo)eT)@X-2M(7^8cV+umOf6?hL>zz z2Q*CwEdxQp5HbAlh}GLDak(@#?Zzfe*G*I)dbF{&4Ds2vqm=#SM^-f9WJfydX7D~%hsP`{`> zLUZ0JoyZ&_$f*6C1L4TjtKuW&RU@b#AD?JqHnR8N$t5El6^&MCyu{$eWP^7mCjd&T z2I-Kb7qa`4Ksk0vB&L&k-T!uww9fAOQ0q7S=I64k2&_UsEU|j>1QZDq;x{CAb}P^& zSM}kz$NZLydW8stTn@WvC9Y`oq4!)Lb>a8W54!;6Ipqa=5c{$ZyDiwzvU%E3ZRZ zOP-vUHQAwij{(hH^q$^XF1mtw`Q-EJN$0C4o$x&Ve3c%L5DeP8oiMO5;*FK zUb4!Hvagqy9F2)GJux%8qItQ^2tVfTb3#W|?7Z7D7|?XO*FJ1MV0fTIk61c`bEuc7 zH#KoSnJ3Fz9`PGhx6(cN($MDespE&=bUypR_umh{m_Gag_u&t}5PfzZc>(w154OSg zk{^CR`}xD~=zB0fhEy0C$*!8h8rOwEf$WZvwQ+h|A=<3UlZhipXl|z+@%|u&Z!)v5 zEZ63L^{%X$>m9@ANB901xeP-$Ajp7iy4-iUpN1U{FgmF$_39nu{|I1g2>k;ljaIGp zeq=N39U=1uty#Dh90uGi{Rb}5g6plFEYEI2d78#>!nRC;cUg?FJKX|)O5>||m0wgN zVd52|+!3#XqlU|Z+lx-Nmi%U)4|GN&dp;0>n5wTldtg4aXfK|LB1CtE-R#;<-j_)v zl!dmQ&`P!9sT8?t3(XR$%VC{8wnF5qRf53~iTp7foy}`e% zGx_Z8$M`0k=D_Vk4}gM)I~a%`@iz4R5}w2I1q{aiR(tE~Q4xV|l?F_>)f%Gqbx3$v z?Fj@yb*(9yI9OS!;*dR9l5A$U1_RSy&^jA7hIlXltE7|TFj!hE5oJvW1s*1x@rmn# z<+t~zW*mz><&K^F_!!@wp7Ok77299q9+6Qeyby@o20n=wS&0-&D?%9 zml}N7@n1yP@&BT1dGKt>k3ZLvALr?_CN=3hkJl+L%Nq$369y@9irMJ$>hrJRR_F`WI$Z0FVDGnnxS zojO9eylZ=xadebaq|XM>GHyN-XWvur@|pLm2>!=Ep6s)?9FZO0#;pk=y}EsRF5TB1 z&Dd=Y^(#+weUkjzF-tqdqHa*of3L+uL4qDAKS1M3(GHOPU7-s?2Qo{-{3xZV&)-?2 zfWZ4A#!a5!S)`0!?mJj0Ffr**jp|2~g!&#ll%fZ6nAT7ZA>%UiO@Iyw9 ztzFj0i}-j}rb(~<=%=aD5$qm(2B7oBTM$GS5q>bE`8isZ+mf~Vy{#34@lPF$1XI>c z$yk~skN;J{yI0Od@$(>4#(N(0>yr>H;J>rGN+JwWo@|ZB2c8Ixrm|w1;w9mI)G4ig zu+-71SBl)4bTv8?w%b;I7k)e}8E!2NPHI zDBBHOwHx;JW}|c3yfqpV;I`w`8`Z#~1ScJo+XPhgMsD}V`BqK7!i6;T&1BpZg@c6Rb#ATUdk0n| zyE)G7DHTkl?XXKvmGKa=Vl+H^LyZsIv^dbV{pA`QyF5tH?lhw}#Y1e~<=aeAUA(=O z@cuU;U>*zSBL(P@g6%xw!E5vwB@)Y9+yGd{ z!ml9^$*dm4wtAMwZ2C1slIeMj47QtKN!92DmZI>wg(k7bye>1L0v)}8=et-)Vqn7U zc!=?>Wa830cdN)GdiRm{$%d%)Ems0b7%d)7J05+rXV60>HtgPUVP7>DWh6i8t3WP4kbk<2Zvh8}=0S z%O-d2u30j_XL870D^Fl*c{r`EF#w*!1bxLMp#uQk@-p(^WOtg$*Z1KK2)tv`w7C5| zLKikz9oT?%@=F%~xFe86IDpBB$ocw(hYSRyfy3kH)VZlqiUo`OdV?J9AROz*A}zA> z>eSA z2|rf}IUj6|p@ZDZc=5@eP&M2Ten;j*;m2u21}11FUh>Q3X9pK$^0I=`Ckhu)hXcXq zhHmqyuE(EOXMjWJ`N)OXF1CEw`FiL2w1Z7!p^_l z45n#Fe20DY%$y7&m$4hw2snlF*x-zv1(^W^z>Sp=gRnGbV7E3qNCw?6VN)7VDj%G{lwr#@4Har?I@sc?_fr$ zbAQYZtvKqyKC9fMq;@HSwC$tf6Ek>*POOe>ooZkWy1Wvv9fq{g%t+JnC^oUmzYRgf z4j+^Af1)dP{X`5gA+uEW9}jDxWrT{s#raaE)?KN;D1tvRRx4{ zwSnroa>L^;RfP9FuLi`(s+)Ocn@B9DF`_>Ki0>Fp=T_CF9c(sp0PB;)ZONA^?XZl9~h7Sgs8cV`Ed zCXU7@P3@CR0o`(enH|KyN;gC}9y#)jm{N&w$dZ`9`P` ziD+bfqIQwQUG}hBWk!+m53T4TdlD*TDfT%9=Xh~hl{}vUQ8c4~uwO9nUhs0hb?c>O zRK3Y(fL3Yx&&s=-x9Z80O{ObkcH&Sx-k>E|u${-93HGlTOpZ#L0&%Lrs9UguVDj-e zP;uEyWh~`E#d0l_-rqvwG!de9OkRy@oLf3n6Y2Q~Bgq|)?4v91Yfk&s8Ss}HiLRf+ zMd&r9FX7ZW*x!|lK6`S1SlaYkq&yK)BvP#cLUmFzGE|Ia%+|<%`xrCZ2u`0VlfY}p zxn0Gue4a0|U|TrDl6@gJ3xSkFn3{Zfh-Iv_CHTvzNWsjI#MGrq#>0)F{4W&Fcb@gGfV4w<0 z(z^W=Giwd*L|mJnVL1Ds9yGd-g|+EySO^mAr;w%Ifk>)s3WxDTe3yU7;hPXqXm(e~ zYtEi^!uqqR;hkSpAyev0WC-V|ixm`+ttPTj*9H$nZIr7xcdYWH*36vL8(U{ht+XcA z-q`XXdry`2-#Yfvh}7{YWUgNU&EkJ$s&1`+8}*-3Uas5hr%n-;(qnvut&vZ2xcEV; zpoV*>ayQ_BWfK^zmrhxGG#mgEl_vNm6_yRyS3@le6Fsn%E5Ib?_sT8t{l2a7kI><) z76ub5;0_gl_m9`BKVJjt_5G~@qP@&Tz2gVlZzg;C0Jktb&!Q0*|2+!zxtC_S}%T#Oo6l)|NENI%wcl}=42Fg z#Do4rh*OMHUca`NH(TwyJ96Y|H!NX!Dmvgn*U8XvNq-SB3duRUy%TqQ8a1w? z!xL)8h)u=orvxP6MupV~OBu~?BK@~?+!#E$ZwzTc_j`OH9P4)r075yGdve4Zmenl9 z5Rs0Y>{qj~)1HdEN4+nxY2%BZnafR_Ma$0knX2E&3C1{DZjoDWlol4Q`lbaUgI>gkP zz9CJ6A@t3Hd;aFZ{fcY_t=yG69Wm2U{%S+gQ9EG=pgEsT57tmxi*4ahDW=jQJFD%PxO_W*68h_gRXrn*cf>~;v>iT_t~3{Z3)ds-MAu%6zOql%)0Em@2;l$$ zL%b_DfSb0EW}njLD%t3N=NfPmyt82&|sfSVKb$5#y*#s zGo|MvrE4>#`+j5TTTJPGq;#(4bi8DAw~JUmV3neE@FQujCUf@#pV>q`xt$qBM5tf| z@>k07ERj^m}2@Dq&49mK?Y zlwv(HF&)mlu^PNgM^#=>5Umj41t z`esqZbdljzrk9s(Z+g{DYK-=^QauVb6lHKWg0dA5l5KnIF>k-Hmx?BtxlaY_1i&o@(ERK>{7_LIgjDAp+mwYXP1T zQ9p4?!k5h@ij|(E;QUBzWmcFfTmKem+OQH}eP@EAw$J9E?8j3 zGTevlM{Qpr9le6ysq?7MayvT)63Z+i$w;#k6h38uA&jkmA+eJm#B62b{t{y=Gh;2< z7|TBZ>HTr|PsiZv&&SXok9mpX^&`i==j9Zi0O{|eXInmvq2)4KiqnXHb`|Ey+;tV= z)yB}zgntP#U;Xg8jzvWJayrSao!Sp=B)6#OOa~UbzWENpUP7=RePYHQQCHu!EmvNo zV~lNjewp4LDx^+Fe8e+)Rbx`Cw^!IbRVy;!V*m&51Eo?&Ih*m%Y%oUH{2n=Nj>>Iv ziU_m*%eF1ewZ8mJme49l%r=h7ifby;7c^vIzgKjb(ULL|T!v-BJZOEJYa`MHpF_5C zHOgx63V6$CVgbavkD=UC187m)ep#aZ!GvB-5lB7LoN!RW3^dBQg4Rkel~l_6!o(=FigB%X}M2<&J_R8 z1=7sHNiyKqOxiKjX%?%hnW&mt%EcCoEGbYMNDu*X3HYuYJ} zxA$2-XLgpwig`PzJlOn%<~nThtbnkQs;KYsURUlI-9jMdyv|>+4+A>;(O$;O{GbZjPvqmC_aLufP5tDlIw}T(a5c52_DFKT0V2bUmpE6N~r3;rvbS(@kjxY9w zl`@&3jPFGj(9+4zc&c-xi526#bTyX;NjkSh=1$lV&YbvkH;U9w?29mTCKtyS0vS=r#uql0&$MYhp`b79Vo>!W zG4@(FjS{o)#|yhgF4EZDDcjptn2+%%_>D^CtB5$ae2b@cQo5Z7xPQ3ds(RCv|70;+ z@2*kR6sVEXjye(f(#^Yzq@tu8Ju?Y8jiDt5y>EB{8Lug|3p;FNRcnN&3N!X9NY$X; zoaxu`VkpcOI#?*TC1KZ{V;?h>i&g+SsPb_n*BQN_x0 zSe%%wPDaS&O4Bn`T?pBU*?q`;ocjbL7Sj4~X0B6c#{HoETeim!x6B<4k&~gBkF{fe zjuOA2#LU{1;hoqpVWzQdkN_i}ouKLzx?$3<%3kHtbZl0vy!plrGinD$jGsq;iXN*K zt1=yO9DOylbcyaJ^A6df=Xlh{mZ4vtG}jDjV&}HrVcRug7!!8@?RRU_SQVPtkpkol zxU0?X5Rk7vemL;!B;>tfzj*W$UhnQ5Y&TzUHx!4;ORaE+N+;d_Gr!MbYzWt-{097e z!0F+>?@iekY(@$4x!L#1=tM3*hJNF5hTC)NQVre^e4l)>^>`w-4zOw;5VZ)7jZ(R< zR|wDDllw-T233}J%kUf)eEn(Wzt>V)CwjvY3pTxp(o6b#v#k|D;_^GN8ucdG`nM9i zO2ee2jBC+k#vNU$JUhBZ9r@1=;PPkRBNl(X@ssCh#xhuKV05Fm@ieo;h9(!QzUpf8>?<$c8Iaikzj^5O*L45Qo_ zSgK2F?ttnB@{Bd7&bV-r!wo9>YRprb(TCWhC+Fy<-UsLC;=H2C$?iQMVsuC}T^UNMrL)MkEld6UYZ?_TXIII;D1lZ3 z$}WwO0%|-~E*A4KNB-%$R)1zuGK0Do>k_M0>g_KNtw1^3lG0ZrNmWRlZ1}qrvWkJ; z0dF>oQ!YM=RmVN%_dFlH^U2?eysL`x-SiE0LXk!R;0{ITVsd@ zt)OrIH|rMK{1R?m7mDCND#25Af|N%^X@!@}#A$1!?5?Lmb=e3uuzIb@CXk98ymiHR zl})**a!_3p@GKjE^A%K^;d31)3FKrCTZ6?lVE{5!F@9xBChCk2DK@@lirW{T+Mua9$4UJN&9*HIg9V%$R|3fY^R>PFWkFoWx|@U1w?ejk>PVGl8@Y}lN7JD z^?QR;^1Mpa7JaksFx9v=_ElhM8-gUd)dZJT;u2g0ANbBxwWOYyq53mK26R7B$-SN@ zeS*-_#P6>`IYo1TdC;9N8p_ve*%`fud}^($$JB_a1F~SW%GN??iX+*~qCT*J7b+wEbMeYI1-9;; z@e#D^B$XvH9f?}Cr0vT#z8X_S+m_zlt+$0@Ww?Jip>RRypN7I0PBu?3_m5=X>W^g6 z9?9^zJ0?$FPyD+$-}cXy&Ns5rq{0xkajti_M7AH2>{?rSt?m((J14*06pf)Zz-G!3 zM+fhiNUupOaI48IZqHB>Sije(bk)i5a0^>pnCzuktzkz$IJ|Qupt}kjL=Ma8K>0fJ zro3f3YW_+Gyd{K?-y36^Ax7r^sww@ulkQ;{>^x7jT9+(Zm#3GhN3fi&RwDs(IJu~cRkKRaPX~?XfSPp3%=Yow@gQ7P; zMyW^5~qgd&n7O|f3;2T5K9%Vtzqg-}cBi9`V z{Og67EZ_=;2fbOt#fLu1%ny+ujMd`|OSgf_e(N0A?=*oe`kz4g->5k?XDRPASe7!- zhr#L8*)Px0vk}fS2T65j7JIY={w(aw&x#)xYZJK(jDYyG<_?sV;X*u{z!TU7mV(!| z6Fb9%<~51~L=YCZ*g__O&7zaM;u-I^icKGF$)xY3%$DA$Cwu+In@#9JRH{x2cXrD? zHviQprXC&u1o{mbIA(EpfA++MHp?Lya0I@HYeIt0zCgfv!A|MbN}vca^=yF_R_Xj0i#w1G0p0r4V*{fFcFm>bQZ;+pO-jgIc{A&&1V&YKWEphD+JH6zm zIwVVP{p*WWW$4OBHKWDndsAegS~VKYEicjjY!LoprN+N!wU(TO6Yjx(=4Jl%YSlX( zw7S(dD2ylF`^K_=AB0OMnB?DGTya^;U7;2+gN=T!=BzjZB51~&6T3AB>#mY{UNKWJzJ&4hK;7|xq@tE~=K&W{H3w3g+3<#*8KeTf8R-55Qt%6wr) z7(91yXdY6rge^dP-a98OVNE7wBMMhZSC0(4+_86*Rg#pc)^dClaSsX$SahtRPA!8c zHwBrAgjgrf;qzzV)6Y3hdKCP6e0!Af@S8`cNy=$q`jY)M{OPfY|NrNI$r9*;zh_4M zUfsQ`10Hu{#maDnYsDyd33+@(wlOG*+jtE4j|k)Frda264d=D8nmS30GhHE6u>>wp zR6Ilg1y@KDYap9&EU&8UYRs(b-|~4C#wb2&J9d2|l@;rVn9G)=_ppXva52SA7`)5Z+Jr=WL7eiX&edw5yQ$Wp~`UuDDj*8Vf*%0ELaN0jw+ocX=kbfoTO{0i+Zhi zH44{*Ob>kMOHwt9b>Lf=ZuXPkQb%|aR|Wip#37$iyo+0U^dl^D_}vA|yT&qni;}dv z)Ji98#LTbk(;e1_Wq$AyN@LG8{RJ>Pe|eqMJ#!`o0~tvgyH>Y)DR-5|7lSW)!&g{5 zsZS|?DR_y;`I7sr*qEvE4FocIA>J%J$T|#7ZRB3oiNSt!tD7Ix3pQM#5C;*+|zmU*1TV6(aW6X|An3z+fsw>1b(^n#ic$V%i|}N z!{Qsolsi&XEC9C^(MwLl<4P$sI}8Vvy8_Zmq~QT>Qiw|tD@?m39dJ^I{Rg8Rqo{$y zq?L|#CG1}Jz; zw7M~M&?@IPRFlbl4!ZS(e8k#n+lFj?KKeC9t_+vUG9X&9?^%W8hNMG=+?hP#Vv77M_Am-}{}6-$1~21+?r+ z>gA$${sK3vR{E`5w~_XV*#u}{_B@Zi0VKW2T&HF4Xj)0E-tJwDePEp54bYpz~u>n2*@qnHWup`N|fb$~>faqSpdpU9- zob`t(N^6kDA3z8*CnrKu;BLI+>q3i9&?P8JgWgFv{6}&4?{Z$X7L-614?C6rg(m)5 zlMgTm!Q_XebJ{{$XA9wX69Nu0t=8i~?Y`4-ie#Plto>ff?eez|q3GN&e3ROT55j79 z5><;q!AzMZu$O(8>h;#dmVIT?%IM=bqQKyU!x*e|7MrNRx}HWFY=1=M?UzqJqz9oqlb+*U z;D5OdbIn_1ZR1&?+in*bEG+)zz?wsmG=klc)6CswXv*n=xj zKtb}auHMIegjG|!Dj}>3LOC0NycYsBBX?nkj5n*lqAI0r4Pnymdgy>}t&g-C;A?6v zFaI^c8c$|r^0Jl`Icv4`kHYy}#o6msR#Zb+tfy-ik*ZdkW7e+-7@pKs-g_XH<&yBi zTVua9hBi?HWm}!N{|7U;DQpWv#GQOHp@>Y$piAyKFgw$sqbT-GO5Yyi&lA`A9n)<= zz<6P(c4aCx4(05%VtXub>N|_w83V1@$?5>hsyf=i-8+x%yK~+4edwc0Enb$#Zgjun z!*g!R#VRo%s&-LG_zKVHk4Ig|xTeo`dJW1M6umt`xP#FXpX-zg36PgT7Tt@;sxUeO+X9t6@qQoII_&2qNDZ z&yEjw?Y6Z!CwTp*s-*t&Bweowpf6}I_X!5?urgMoPgVP(gk(CI`PndUwB zS&2GH+&nJ-KqK!Djwy@ROQtWkvN~ep_p8$v!4;6n<&_;;?z7)Bco~HI;Tl7ckJ|)} z1zDT#2=EWinye!;OruExH9(C+xu~@hUs29d&+>6BUVo~rFg1tzYz2~F3+Kwiy+r-J zRXr?ZydlflVP8KO)Fy4kTd!FtpBdY)vBwPuxPbB3y`klU$ zKM`Q{t}Jb_<6Xk&UQ<-o!WG|V)W7A&9(?%2=#D(}A!F8k%jaIyEO+h{UhU-T_@zoM z;aBP4**az3_5zodaI;UHd|>*8TK}(FQ)A_TKDc%+wbY}iD-~ghZ)Y?+UGG{=9ag}J zJ5okvm0fbz5I$G>sOvtY9%O#I40h{2<_z#YRqtAZ0Rz*S_zIO0La7A|A*dlQgY=52 zj5g~I8tZun>%Vnv2P6P)a5kJ~P!o*8|Cuv?A=@%Tc(_Yq+5Qd?BMxW#}*{OfZFt>POIDaM+yo-G;&8c5@kElMJW3M8g@D-fwl`);efK0kKqX*{Si?Qp{wBQ$K zx&G&SF&L%@$G_>;6fd*eQz{asPLjTC}ti!NnJ_0CeZR zOu2;l>im+WN$9$qA4-n#rn%1>+IlTd$q{K#c$5#I8PA;^13x|}x6jR{u`^FDR+3}6^hFAh~0 zcA{P#!z?<3!!Kv%N+mqemfu1&$fgQ|t}I%^gafwpSepGO5=zZPU(xu+-Sh6uf`mz_ zITd0>JM=D1HeCgr7hu;u{dLc-KA5#EDsfEOs!)`&Q7W?IKAU-+IyLy-M)Ebsouirj zYTEgot#2!|=4TtZoN6z}bio3bOTaaZu=SLm+x&nfjg+4!X z@TSM@YEdN~;vp9i1MK(6N_SAUzD>gTHC-)pgraXwr>ch!9JgMcYqYj3Jo1HHIV_ak z$%@5)M4`=AJh2Zc^M`gkq1>G>V(pY1Tm;$fN*(_g{Da`Vk5QfxFN4oKS8k0B!1(z( z8O*(#9-}|X@_%P5$#*l!t>t+z`Cdwr)@+Z%Ym2Qlik>6aHA#v4t7d9%2(T!Fd$^Z z189@;8u`69M$6hA)nj2bTUhVg3|IJNLf#I-OR1H$8{&^94Z-XQBo9tb)f&v&_2QrN zvs#-t9mulYr!cL|DDO8#*l*;-hu z56UG2rO#4Mz4xLLEdH!#8&xGkkZ_nhnt!T$ z&EejT;URM<1VK#nk|kB-VCSE?gPqIWEq3n1m0Z5Z&_whM=gISahkI?XyQd%7f!c|S ze@7XlBWcrai{(Cdn|CxZ8_wk{g6+=VCaUro&O?WcQuB~@^;Z1z^)ro^3X(6<;x{uZ z$D(6foc#}qI6j1m>pe67CPX~gamSk};w5}ac%QmAam^Ig;di!)`bX_3*_yPhCN0^E zgIOzR&DLT}`!u-)FJFO~suF9=M^Hh4)aR`O%3W42ZCqjg*uwHI9#wG(yNf~-rOoHt z8l2-xL^f#csE3Lz9Q^bVz80Mn&TzDIwX@Nj+w+?w4NcpcCt!<3U`7a1R=`TfNC`-uHkl_h zUJ#L@C{FrA#bv6cu$V zA!9?C&^#{xm(TY>3oz^1@%6^*-n-P>wP(EhM?ZV8IYDAu)4iR!kfY6)g1o?k+x}jh z5iJ?A_FY_j@`1JF5n)t^2rAzHrCyakLkX8PN#AXsUDAUPuQ!Gu)>vLey7yWE>{fE| zg*hp-gvP9|&|7%a+k*KReuh_hQvn;necmOri>&CxM~YcLl87eoh{w62=_~7-B{ZPv zu40z-v9tnHWHD2q_k-yx>)31x&XaN|M zWAJgm5vG$oehIVj$*!i*arQtdC{xVrVTwbEls>NIfEauLkC^Lpdbu^(um3ySdcj{ z)^^29JRr2SeDV15m&o*pbtk^$Pm#(M_Graj zPz6@t8GpKNd8s7KR*c>~K>Dv==+Fe>?pZ$zzR+!(-~c$hrrN&OqK@z{P6BvzFAeEF z0>ku>Ohw8Txy?^kyMxlanVc>;aZ=lqg;2xQVNU zTjrSX2$-WP$q&FJnJzfFUXAneVwnAS#=U~+g9k5T{!=t{?xjOWLpcUGwtXHS-2feE zX=v^@k$7py^Bva-OwdLDz((7?$3}<(f?OtkRnMSbx4*`!Ly6gIcfSV^wTpl)kXdBmAwJU{P zfBc+gxzYyc5VBTLLm-d0zV&zE3|?rS9{-MGEfM@Ob153#jy$(Eu>e<`wdEET^vlE= zug$Pyz*2K~R`_%_Ss1grn5wbwmSmWqPJkCzvyMf9dL+@-nB}isOL0|)Z$Ck|svQRs zaNqUwm_+^(rFS3(5;ne;gSPwQ@XKf8+{g32`fT@ha{Hkv-GMeU zqxL*Q=~a&Q6*1aMG1^!jZNrt(-v1)CPfZ49&|1q6c1$+V@O3$2#?7;7#&Kt(s)-Y8 zSz6yu(@w**i^a4DALDUvuAHXL!wK&WA^X8qm@XC)SN6c{zHnC^7j-x#=2ny^_9c!x zVt-MoFYZr<3y5&7aUw6$olE8xvsT8eTg0q4h*|9{>%Oz2ZYG&~kLI4Tj&P8eI52U! zofo<5l1gHia4=a5#dIqiEYU1>o%fo$Nwev0<5|;nyfIQK>q3_7%A~-F4(K0v3r~#g zKDz`G>@xLSA4Z7LprU`&^K!crYLqY@de_YtjQZxdrv2I zA&T~oU+3s7+N>#W5v{G+u{bn$kyFoK2`@JBQsCclFSm+kyI)J%y4+24z6DMvr%;I^ zy3>E+022Y%6aHkxnGDAA&wx_cQBCI9NycvXx`t;j137m4_Q#SccK9(CBPl|~-dRRs z^!+{$eL@U>OC%NuHAq0fiV)`NAvjQh8UCqe&c6A#esWGqVUH4KpxQ!V4%zYG?I-=D zg{!vTi%_^zY~WW$C7XNB6g8_5i8Km0NmynoF|#Lf-9L6Z7mEAT+Y|SSc-U=RpjSYb zl-5>-%0xp3r2?*P$Gko)0eihfnCXJg%=9{Y|E4=t9POnl-rG#~(a~-?bF`0MtBi`? zZ#C#0%9~lb2 zT65WS9T$9m@^$Wd4fp)yYF>CEi$-;x#ohnQHG45e5lU|yHd7do9$8qV7zKE2j8$Q(%e?8!*zK=`MLe_+y&JV;q&G9T6!~%`ytLmV_4K z*kQ#TDg!N2)(4ujSLY3vMZIQVdTdkO+C1~_l&HXZbwSxsVDQseq6}mXOOtlGXba2w zyb$gF7CfC!S3_Kb{5h4s(o%y`wSlT>uH%ooMBS=TuiSY|u6;)@*PYPU&AElL8hbi2 zWi3T$KLYpsP21(6vUlu|CHJD#ookn?@L8O1g<^?8x4<-2ghWPy22%cjddG`4| z>mLMzmGFFRW>56ROM>S zH`Pth|5K7K35?|f)NsB({XnVrxa(p9FpY8opRnC;Qx~6KL;3rq}bhJ+lZsM5~ksr?I|5&%kJZ)AQ-r|z9 zWMLZL^w9p%H1^bccr`*LX|+nszOE`PL)uImANvv7&+J8m?v;kTJcc$LU-kl6EjmGu z?Gjfwe_XHwQHCq@(jPwyg@lk+BAp5l4h9iSrIuD#!!la|2vuu3(dFau7G3bCL5A7K zeA?Hcaol3i(-v=KNiL(Oh35(*SiNsxB|vZFB#z<#AW|+@sI?M^*_BV7K`YfJLGC}c<5Te@mns~jFQj~Kf!X<5=&@n|Fmr0`ty1& z_-T-*JxAnq`lRdvt~b3X+cP}pJGd$JVDut{FI1B0RJpG2gH-O6UMn+Hs$nTEb&(k$ z&F!=r1~HF4PCKMGSK?v3t@d8s5UkP`YRjxeqdfjtzzEu2DI3D|=h{_#(y;uCm4W`& zPY$E9cw$)kF}+brcb27a6Lik>W#hBJH@s9144C=;*SoR2=A;2|XyC$Bx3OF!0=@UT zXY@~elyKHM;#1}Qlbh&sEbe|jK_!k(|9C7eb0cPZT!Pj{2Ag8T5 z+xJBb{p$4!U&p+r%s{mer(bF(pYN_&oMut>srKRZ6)(^Q4;ekpCHsPynn?WG_c@E0tjP~1Ym-)A!O{}sT&XMI* zbtbfq(})@?4?@658eu$+U5a{IdSNn8$r&N?H=E+9CW2KpjrdpZlw zLgY0*^QmSNz3xF?(-&cN@t61`WF#84`t7L*5ze9WvbXoPP=q z_-Ch~hc3`=E_2}eLA~cD_St!$TD&=Rc62<3J=dP;oje!#+Es!Sw2J*HXzlWKgnmA+ z7SAVCl5BEF?Y-+`3=rpfl^#R>SEt;-r>sp{anN;>x!CTiIZdjs8=CKQi29ppJm|L| zFd6h)CkY)_@F_9bfU_Rr_>9%*W8Zt^s@;nSBu2w> zh|#6$a1lW(Q0j4=YiujI+Po7i6m7!>h0u~_s*D-3%vNYPyQ(KPg#;lyzd%VmVpTeL zLx492JJd*wC{slOYUtXuUhxkqHsbib5DMfvVN*K8^=_3uw{`^3Mtn3kjV>*u-u zlZ;4o&DG_@#-kVZ?`2i`-{l*jq>Nc8#iWZi7m!ql(w0ZHS|^v|FitwWEF$^t{D7<(b}n6 ze_&3a%apJ@pU*b)lUoqyANZMx))nq{{t_Wnp|yJGHpH1J7G4ggMg;K$7eDpN!ms~A z@#%xLtHT7d#h4$NlbNb0^Q!nAFZtdT@lJQX|7g5BlkbqZ6JUH*KMRrvnE%BK2l&z_2RJf!=oU|< z@=2h7#pR6lSEH{C^71Ex9JobAdao5CNS1MIkP5LZ;jg3mAsp z35{r&tWj|k3D-(wzR1WCZQCc)4!@Baba=urDBa3ER+qZ6z>R(&KPWGIXoy@E`fW`m z2MhwUBB~oC4*-lne;`{tx>KM42OF!qVaN#%ypYFn^s>qLGYsMgdxX1r504g8mgm7J zD4g>^9?9^2gpPTHNnFACUZ@{*`G!~16m(pr>vUSym3eH&=5DdlTzshZ;UwWZaCBL* zJjyOhqMk-d#8Kp^H|zazoc-T&%#Yz8%p;p!>dyF^l<*r6K@ocM zXc#0{B?YCElKhARkKlVPe6|LX`GRR84eBov0L;!iwJI%O^Vw=B$vPL9n>pZC9Ww%c z)56noC|X!rxw31kW$RFn6D{(FGjev=CzoDJk=5$AM%sEgvT~tF@0+H#&Pwy=My7lU z`E~5NXBYH&^2oAdmu|01L^$EPA3cVrg%UpbShwP$FNy;rO43Grl1LzkD$wI&I`7$f z!&^k$Xhqty3ySSl-jWmFtl$8y>mUX|9;Tf6XlEQkq9`PSk}l>6bD*u?+2c=&K6oC} zLIBMp`$wFrCDp9sfp1jl zNJq+8N2o;eiHQ;bgk^Y7jGdvI9lTxuhe0w2(&K_55S?)U^*+2A6r5pPFFTI<00WLf zi0eOjc|ai|Y6*+_`au`i@p_7+9i;Sc@!8pfFzlJhRYYv;BL0Agp zyJi3U{{159TjVX;(G!2{m-NYUzJ}#|wbfqVDald90gkm=qdPz0)!PZlZ|RPn#T#!M z&)vGj&tT)B=b|iFNA1nVC>sIHxHs5%W(XFF-Ea*Q+FuC%)YAU$N{VA|PJ0FEZk*g! zljciz;dWcHjc!0lRsK~9a#uca|)BUkMRk52P6Ja6H= zLwaqq+xU(kZTkrKx{l$Bnp{=54EjwVftW6Z#(M=?@Y5{Nt-dQG8zybPQSWMe#@0z% zRr{i?8Q*SxWMxGcAgy9bMwfd6aE=wN=X|E%MDG5it%5YfaY_ngX3-_QVB;_nN8tST z^4ze_)W)ZE{Db8XJ~Ms)oQoVkzQQ+ckdUL4V!?)&ZP7G1Qrp1cd`G$vypYO|Syb>b z13yaija0%f^L*dR>F`)zH7(e0t<`HbtJCZ7vp(h@=2k5f z{-;Z!CB-GTa;@9H69wYP>0;^dY)BpwTFZjZJI1`){+oPcvHk&)=>sXT-guvJA~uW* z2Bt|t?HCJu9i``AAJ0WkSpVTco);K+RI1;=r3WmrcPy@&AmIGh<%$PUH`C= z_xuKvy=_mMG@%q@py7yn0iF9d?L&cz&`jL_ z3X;m<0n!*4NRfj7mFDgIL=!uwYQ8FV_OEpL0N@XJL(WCm)Xo&fRNR2AP9ISU_SA@1 z*@Q>89=6U2Gi4k4NZ`C=7$$)+7{nPjEaJbm$=0Z#s4k73=SI#b$|;c$7LR|Jnpk;? zrZbwtXMV2m*PlH`c!*4h$R~h2#uZ;9$!zj8Ho6eHSuqNwevY;k(}moV56_7aCk~ zZKKoND|n;vasPV8&vH9coYL0ZVoS1A8bF~zTDx6Z+b)Kj8B%HA3(PLD^9ZVYuGj*n z@pSENXd3(TH5Ds6fQZ$lKEu^?thYE{9!nNPIloow5FeU5{6i)uT#d=*JbqPbVo-M> zIP-+p@P0eQQEFXk7R_$Q5}s0ZBjI^&G~zYxcb8)4g~F|?LSb zlgV@PPr9Eay&lXWYt(=P8tW{^zt6D$R zhDld<;zQPkNpOy`(|qk&T{H@x9NBPu+-b`yrNYcmDop>kwSO$JrOEVahJLNI4#B6- zlmb1ilvNiSWV{IaQ9=4qPWZZj$WO*a2^{=xlWPEw1(2)AT~+rN0i+z%m6$#=P>L$- zPf%myPGTwl_N@JBDSaB3t=Tn!P9>aNk@acD3PcE*CW6nWpj44rV^Yo?i%%~m`s1+2 zab*4PUxt%*8fzXz+F~G^SGU(|#%(CZckS;EiY-tS3ZvbIPuyJbD@nJdsGquDNl$Bj zt2Y3@WT9JLeSwlP_grUwlUwCL*cwrcT{LYL*=HJR)f7b);efaHxW_JUxBOxcQ0i%o zKK>!O(&&l2piL`!a@ZgeKBZ6HlPretB6r{PBZ91j!H93M)3E2-1SK@d9bng~onV=Q z+{YD`^%h68YLZ;PQ0sO0T$0;H(Xmuts!uk46T7s^xYORb@;lIk7rLju>&3pXy|~5=U@6AZ7b@+X4hkmRp9rYQtuwxIipF~p?A-W zdlhX`VBm6JB$8b^CCX=`^+Ps}(#8_K+i)&$_VJZyQf3s9V*YoLz{S@rcLRS{giy;UWEwOGf`h6cnDr%4)uX`C$5iG_@J* zi{n(qXt}*uJIUiX=u43s{6ILZo{;MGWY|Va!G4yY?Jwe@KO;gSO-y1v zRQ;Q~KYC$zl@#^2)IH|fGH~0ceM~zLls3l-amTm=DQLVXr%i{)PXW=t}ke zN5tBEIn$X{oz8B~efDJhy39Rhb(`C85Q%cdjh&S87Wb)ijQn1V`_#$~#j$7gi{A8I zXrlbUefGx)lx)mcta*bnB6+cNA43BVJflS<&EkHb!P& zh->CpXP^tRA&ogZR!;(73?MUO3OzZJvPfY$meT&%&H!+3#BO?HB-~rETx9wQ9{g9k zlUCpRNWgBVM$%Hcbghvme{Ur7{Ih+**AMotV~NkY1Z7OafRAxUyJ0SUw~t(5{Xizn z7m7Y5xtsYA0o7ej%}{CG6vs&7sE(-vKC?^Bxp^qvCj*7UlM~G&0=>+owxfpxt^iEP z3PX)E*CQuJ#wSJd93r0?$1PFGVVr>Q`VG8X2Lq+FAWUs(VBB`X;D1C)4Yy@+PbzaU z=UIfjp@4{Z`4HjN&+>fABdC?P=}|bDNT+Qqvzfc^UK>z7I41X?9XoPeNlgHLO6O8S zH0xcwr@8@s*AgW>{y;O{ZC|26x2u!6(yaidFJKtOZQPD>tx$SQ!XYp?p9hi%(ckwT zf{r7cdmq7;cB)qiw#uIENd$Z!g~-OjNC!r*oAsp6R68T#A6EOgHja#MYcVYN@yfRQ z#m26>QE(V-zC>VpY8WcT*cCqj8SDVDkkUTLXaiBM2BKVJmG2cS(JKOx^oOD;QgO2d z*?~m#YZU*l17U(MBkH}A57&MMHxwqMwPy*XwPy-w#x`Xwj=`Q1oy6uDAWR=&`#nAC zc0AwIuIN{gNZ%EYYSe(GI34`ZQ{v!8~L{O%}|KrW$w42j-%1 z`pCwVbQSwBAlS!Fuon({CE&2%a^fPodj@wIL8*C>*zDW1!4$x_rf8VXO$CYH8*O-l ziUU2u1^q!Y({Zb%VQg$>#^pz33|IIgiCGi;Kh|r6Iv|G^nl+??h;F8IYEMG5rzINp zIw(P|Mc{8sMW8<@c_BT=JXzU!iNw^dc&QvptJTJN@1*hPr|KpFN^(;KAj|RXtB1YpRQ(DztZ2tACU`5pf6F#Gr0goBvfgq?hd) zX>D7moeti8BIWj^11D37uxU5+g?b#_-cj-vGv_buo{=GgT{n$Qw7~bH<6X@^1Dsg~b4v1h8g&4nKIh&_l~ z$?tHbM`eFsx<_(>hR3V>2w{ZiyxBLRC6mhunr zL9K=Yyik8w84}-QxziAp3Ofz3^!c&DTSr@5I=#n(9&?5Eq2eb2o3ATM)2m<;<1dHw z{xI;T##F$pA+(x3)gMg$hXktYvhv+}e7p3M3vixAIM2NJHKFdBlPBs9$cyIWZMgq& zo9+0dnFv*|if5*jgj4El;iO{cjD7yW(kk+%b&GboLc8PZA^X%wg)V8{!C0faF{3mH z43T_WtxQ?YlX7i;!Uee^0Ql=f^41`C6K@<+OGXwIDM=(clx?~sMsM%Mucz$b?u-=7 zc4)iv)5ij4GOQv4r>xu)0Xr`Mj~FSy|Z=8vSH5jocoz_^>jeOL27hPeK#Jqt8k8Tw+rF1fDc- z;d9b6kCFiuwf9MtKQyu{#^q}$mp5O1rODSnJnluqeiJ_65#Rgg<$}xg*x?1@kpuHtd8~n09`X3;mB)%yv?120?}`?V7Qsf)PCw( z!v#O55aR+GY0#b)`NvZb$ot|Wun;NOf(mG+SQ=E(P+2tEe^KlSEqw}q^*o0t|5hnB zjViGX+lblor23xG{G6fQYyRz2ZIQNkhf7-*XTegIX5zz}h6f1`i8Ju=U^@QJ(CbeR zkzVyt`cj3nsDKA8rS#%*dQIw=-KKiA$ELy5bUO*YI|3Vv^eqik)EFIOpiA%=`)FnJ zpcOb@{Z8i+tL?hJQX%tIkyK+=jJe{!@#de7KBpJkTIIiq)=E&hx+gmJU~)pm(c!QvkkNB+j zcAKxCv@hm94=AXX>T{?w1LN^w+D%~bv-T3>Ua7!e*7$D0Rk%V2qQ!rt86)J|YN22? z%v+UEMuSnVGkfxPD#mx;jNJa?@u>jY=0Ku1{GnaSzq2bmN{cA>PvGWunmY4u!)DL* zgP&>V25IoVD5chaTG=0y@B$I>Jt8-JfrZb}w(9c~q={i>P_;LN#BGNrJo3?gfA~#8 z0#b2OsGBS|WO8rit`PR^i{tn>ich8bTNP=5)Ra(OzGke+lmDysO!4pvm$=cl;=rsu z55^QQ;+nHaORqv>`-4I~3})S5iW1HJsF$+a+p5*=V@g^v8RtCH)Z)XStG>hn+)k9X zmyD3W9eTSa*h|-C_|ca)cK)txF}?Z>A*~1{1{@UtK98f1>C%H5P|OnGEP3 zGCjd~RfI>^Mk&UiS}!z6O)6zc3(Z%Cz)!kaZar>MGT1HPw@7WBcaQX6hFboJa%0-m z4-AcZv)X~L*2L)C_AsLS2Cd28{1x+6;8hQK(JllMNDI_-43`n1;dI^z9%-;QqldoL zy&l8q{eqzpmMoeNiv>T0S>&0{*F6unLw%9(l5KgCN|o)$s(e9xQwf|ff^v@8468Z(q_r3QF6(_DTJ$Lve)TU7b{OpYMHX?OL#hTwqw)j6${@X*r% zj&zjxFP$jF@btWI#$Ut~=0%{z`_-!sp@!-a1%as&cs~{Hd5DsDOGzALt)8Fr`4|Zi z!oWbmmG3h7b$d@i7>E`KjDDXke^lkHGG;8RY`ETheOPrn{%4CtD{c6rx0F}@=$?m` zcg(j$tjZhq1SAy4d6?rRCXZu(l?Cf%!=l;n;UqWcobYmM{5&eozVgZPoA`v6ECkCd zPMBI^|3c3yt$YxC;HvXKu<8HH>U;S#iGSIE4-n>G2F9~~<%W$-8@)32ZHR6-wbAlw z>aEgOo%>f_Rq$ffs_IR(lQv{(+PG=cxo%nA>P= z%4;fUvO6)8l%@quDd9AhslLHH?(f64YZzVZLc+K&Rtxv*}i$f=JHKLwYr?ex++}?T_b$bcu&^pZdZ*{72p*B z8#VwkotWriA;AWTDTUSFZU4XlGEe~Cxc~r=fq3zRs5DHIYoW{lZBTnxri>TaZ#k5ZE@7f*`@Pm}HFL z?r`V1yStpt+^ng4kE!0a20dQ%A z*(p3bucqjbW#hiuvkcD9AWHo4-eX^2zin)%g(%US9c_^ThOC(`CEDG|zR+2n1+d4K}(IGM3-11Cx65M@qJ zZ9d2G3z$v1f2KmT3zwFTh{|%&BhTwM-okNs(RZBR#&{~7QiyU=%t`u5rBV1l?&%T2S1h;re7-+;EjqA41Qc9dG|I`(4E~#%Zh?3qz zhQ1G?xgJq)+bM+FJ&Qg52BSSy-BM;_Qp3#dUE9cWHgBmB(Is?32$V?9$|=*v0ZU>g z!XLn}r~AvqO^)ZU7yCk%JpJzsze)60Y5)AHmDkpu_>S5KdiG6sY}q_v%X{C`y(qV# z{*FsNcQgB#>{s8uQ_<#c-iuU z%EytE!hFaT+*L!tPbsX~BiVlq)%A;)FH(jJZ=L0vH8NjPLtQh>v8v8LVyUb79o62( z{~<*yeb?vWkoIRTK)%oH=F2_CWGjt1jmA{)T$Tw#J;N`&mt9#mwaHj)gf&6Kc0wgC zgPie{i&!s8IEhv;N>co%qjQOGchee0=Qw6c)2tlxO=ll+8u9M70fA?SBSRzD3GDXMfLRWy@) zolNHTCN^5q5c580=~x@jY`Yw|`_aKbe;iWCMEgspqV(683zT(88B!=uW>87fMoTh?%1)&;r0c3b0;IfR+>0J_?6{Z45j>2E_^;B+46ILVhj?^Cn%u-*_gN ziYz60|9K&Dn%s|8D8--KpUJF$3|@aNdr(et|qbv zaI&`R)bDheifRrAK%o%j#*(mR9NDJb2k81RKTH+Tz6+xeKTP$Hwh@uqW3mz%6eeB# z6BsG1Sul|<*qcV$Rh2c67{|5+?gz=Dx(x^`fH1!Wj9^I_8bmp@03rQYJ)#4NZrnVZ zX1cLcz<=y&>5E}IuE%i*-s$r*G&}-eTpQB9N4=s|;|h7Vc3%>WxC<$C6XT{--%}vp zg;&(J0m*Juc&bu(+BpHP3upcLKuTs*xD!DuMXIm@y&cJ6Ti^K)JBSLn8&k_^pQhZ> z=`e+C8V6Up>@=6ASmmDpt~vvd_-8cW{KVTTAi?-&2o@qiNFgYo1QSLG(vRRJfW+_A zs7#mJN#s{axI$M6W_IcClcLrQL>>Yl*tG&iTE_$$#IGGamqtZh6K2CI3Qo}=nsR`JU|S_&2&96WH&IB`ZE7NNN789VY12>IODCzc&XZKy zL@Ld6UfRui5(V4J<7;=^xss1ubv;D*%zd_E3|~FZwzl~KR&TatH-vXGn)d?&#OL^O zrf9Fvz_xjwKKd+Y^ygBA8}Z@yguJ|@G&)4)URvX_H798V+WdPn#iv4mR3!o zMlg4U0Rh<0lw@s{{`Sj9a%`JbgY%pMrfk3aEqm-fP>7JxBz7=Ey$7rL(u@1DE&v9y zq{mzB@$me#MBYnSyxBl+pk936L?XxNNUk+zV{&m(qQXS0g1|oV3kb?^jft4tY#FXjtyo?5;eu*Y75m`NDJzsf zudKaS7F#|K5hrKtc^)tDBsV|KQ1-@pjHU&cnkJf>7KAJetXJKvvlk2tT9*=ZS4z;; zX9eAWWPs`~iP&a0clgdpR{2J?BiqhTu#MYSofcIb`PH#(WKMRGB3#*h3qTkxI#z5s z!v!DCFJ7{#aDXm2>tXDw@}4fMLCFW~mRY^r-$GEwFyc9jhQLv~G+P9MMY)eD%>SUz0S%_$ za1-v?qM~Uykcp1z1t;eA=5{Asxl(jiLlgl$Vd_a)CQ1LhFtjLAr0@!mq8_DK2yFV6 z)w0|E>8TOce1)|IW%Zq4U8SYk8Zwb5+4K}G_(QHT40HD$lgi)a4_@F80^gVg3P33c z;@Q@BM7bX)c+_}%6*IcS)hCppsg0S?Isc9Kcs3hC*n~L$O88)N~2_-rBkx;3YlLZtH~H4 zQ&F-WglvLBhIZxr4n^KY?#>U>$Tc2R_P!PO?p9oAOIx8(k#^Nb?ExZx)wC6ru6q=d zft$(I)M83Q!G#ld3zLC_eI{*8Wm?@qmybJ4g^Mx9<-a2ab|%E4SBQLsL}!NvlF1F| z@W%$|!gmeg!quvE_^uOP4howB6CMY*mjk*87w9{ls6LIeF>Gsw=$V>q9U}7QW%=in ze8_Y?Ea*vKhr9U8Cil#M{giI`KvF-m!*xpjQm98zTywP8xJnsoxS*YZhN{>>5 z#xzNC)$czse+6dYg40i=0!>E)Z75JB#|#Hr7H`@*1qT^%vr-2RjH3SiNH6hVnk3lu6VlMmzZl1o1HB&duR4!4rTtP_|?IW5>7IC#Gg*|}*9zEB*|QJ$7Z z&K=9>wVp(CCDctZ63Qp>NC54^46IoD1-Pm`6+2exXcSt5?H@P{CvTVJ9ogSS2=I}3 z0^K|J-kaB73LM1G(^n0d#)BlTekcm?13EBw^aB_lB>X-&+Qxh=s0I@KHwYA||dLma+Wca){36(@e^?K-s%OPZzRZBAiw}6?}+uY+b z+E)2vWCIxD%*STWhLSHyp8Ty?9=FhN0Z z-Ye-HJDRH&%|c+eieaPHB)!7J{U5|n5`O7v6c~NlK*1Ql=BPI&zKo=S zu^Lapy8QP32v8Nz^7rEI3j#V&kf#^JTap%RUaw0o*r@3#PE3frY4~V=;3U^DH*oUS zRTk5}=|9Wf{6?%|!%TZr6X3&Y8(+ASUzVHnRR(Xvi+tqG#8x=R^v8faTlyB_Nim#G zH21qkptAyatqyMF0z*ljrCT`mr5MLvOOKvfy0PXSzjlg36Zqfrv{S?7*2RY(O15`@ zVS|VBsqLhwlkW|J1FCv;eg~W{d#8QJ!~20z>KLTNkS0wWAP};e+jn8eR;OJEeFmgP zm7i7Ou>8$L-UFuJani)8ZDLUe)XU%rb>lCf|KbbyiV`Tfb7b)yWO@!L>hNC(WU4gx zrN}gjQdKEc>ODD?eW>=8rLe#GM8USGXtsju3>Z~9ZUjAYz$ccOLR;tw)*#0u`75{< zOY%Wdw3BUKE=L{dVw)OZ5M3UJi{4*7`DFC^V#Xo>*iHuGV4b&hKwqV+xUCK7Sfck(y3fGucit-I?t70r%JTl>k zDP+LIG5Y&047};^{-av|wr|-6xDxo))BNoKTPz5BOjg{FpWhD(5A?J005|ipgMkU$ zxV7Owg=Qna35RBAs=3eujPmI!bbzGZgDWeAECc)cufns>XiK(jP(&9PTD)BC8(Ozg z8yGN#v`76|;tveJ!hs*BDcfrBm*F}cFe}Qv@~ch{DTF(;{YVKGU<4hx4q@j{zwonU zGJfxKBv^p7BSh|s<2U5604Z7cyR zi2B>XqW2pViCN?l7OG%;#3j0@JJsdy#YI&4qf>GVs>}YB*(lk1KX~v&3C7^OLeu0w zChtnHFo6*9E#pEr(cmkJH5|hFq=>m5){aOTR_{y&k7cqymYA$Wz^Jzr;Ae5649cx~ zDFXZQC%}AE(J{8=mDAW2UNr5;V@T*Mla%*qBtsealtM)L(S(Ksdz4t$;>xiRvlM#y z>G0Tm{X{4o6of`L_57!y!AINv)9(E=^Z{f8)h8oz3`UoNbkqD)}Fox-yN#YNvm|n#}60ePEqbjWDHMV8|9A3fqGz? zu?>cLkyeC;JS@LUf*+}U?a7G`NU&W^9(tAJ?HPO$=&=mP22_pDAOXw=pRTH=?Yq3p zUH4s(f+YbIJ;&goEpJETBoe*iMrg+bK3I#7w+czLFz@-e-LFDde;WyYrE9p29uD>$ zcrTv>KNbxQWE4rhPLjJ}d~ff`YVP-kM!~@j9eIT0#Rh)?y&foZDELcY`D`?`rwphE z$v>_z*BAxe1^;{C6snZu!C&^T?@9IbrA^FVe{b#W<>&7&xN9J~PyZPWpYM5TiALrY zMr1}ZKKLpipTfuDCr>b)&ERLF0N~CHy&rOXUOH)BPqpmn^u_c)UGfS7;2rIMy5#?@ zI{v3Qc0m9DDk1-;IsW_a@V^4w*=6@F&&BlM`vj8Fgnq3fNZMCpPi(Y9?{r)}G|?bD}i+qP}nwr$(CIsN^2p6<-lLsqO> z^;D~B@2rT-$g=fN%`uWo4G0aVmr<+2uf79InR_n27r-X;pTkEQuwn$4BJ)Nc*_AG~ zvCK!tgmL($2mTQ9o`qhreGjFa8NnF{C10MwM30!u7z*B%hK0!!f`1eVyWTg*S?9~< zGLH6Q`5IwZPv>+tOAz`ejwac5VcaxlW>}vq^^yF}@4zFWUEcq)j?e+d>;M-EbPHc^ zC^jCTQM|+d@bWjzbkSd-pYbp^{0Z{?q+e&s%@r z1Vi)Y^=^F0Y?fM|&}%KxJV^hzISH)C2SKA_$N|J+qIrKh!G1p`S{CKAJ(B{MJ=%V& zQIBEgZ`2zluC=27Fv%qvx2`OV)X7MzWpoRI6o?`|`1Vx`f|;Q6&RL%V%fw-#eTeskW;+6B*KIPs|C=*9@QZ_2SMv;6~K{po|{)ssw@9^CMF zmh#%Y-MwB=R&;T1=LYU^bs>YVf#ZaP?UhV!Gc(${KCSGIrl*%<(A~Uui1V+_HOA%u zt$u+OtF?D^WLvrYdCoo_FTzoJGbP-zO#XQ3u*2E-yMb-=(b}ru7>?Wa&!vs+1Qj z<3^4=YRb*S_U~-vOlDM1%P8Yh$fctTrh!t@y$62wiQ44kuaf%#4QJE$WxG&OT*kYI z+<_u-QT?fS{e7YI{)iQAx`_SbW%};duZ2%!1259PdxX2PZFcYk_PE{8^E}$T>{YiWAair)l|E107pYbf#T@*Y6rkJ9ZLbr(eM?pP|w4gcIWsE_|!Dze$P-m+o>Rw z(9{;)rFx>Oj#YIiWX8VgMkAYT8=SC;`oXWbaEY&T@I*S=68%BY%z4wgOM~%RpAfMh z59@CNDsv!NOn{mFON>^p?<nEgS>GiY3-3KcBa3ZVTjUcok_&P|u5&tl-J_TNYgf z8j$7`CKGNzvA{yWjSZRTZTd9m-)w_k45OfGZUF|_?RxlQ!6Z99QU~51W z6VItX*r;L$EXFSDDi1KjB#fHf*PmMkOMYjSqCW}&qQtT%TSkWsTk_bnisDEO!}7o% zN+M<2m9$ZIS%sF+5Iq!~Ku;BAO@j>#e&UTWuwn`{Zw%RE>WoGYh z-2PP;P+mt~C|-!J$%Du(Sm(>7cr?HUUst>cH_3&}WI3 zuvs@A!7p63ybL9519Bx~n-Hz(s+v;<=1iZ8jv~%rRgv5>uFL9J z%*k<7k7xlD^Yw^Ma_&y`HE>>%XrLVzbvbuENy!|BioxJ((ZEv#1PceSJj?eq9({7O zb@?_<8-^XV2K?_L`{JEz7)t`GbnaiGsh#S9U)+D`QO}TPq{>FXyUwUVDJ6TeSQKz( z+EAuD=cbJwl8xu;ws-Qi>q9;@7a@!%dm9A9o%QJNNdo|#ugn0!EpjJ_CjC41ytWkJ z=fC6fbVcb&HB-(n)#HP9aaZ^LH{W@M`QJJ$LJ&Z7U51xPj%}EGd$3O1|0&G=|1+Zh z(P0Z=000?(6DGg}7yy9(0Mv=s^+%M zO*SXPL>24rpUqw@l{TwuhaK`A;2o+R{*FhHn__(D7x9g#j?>E6!q_?JAMXzIAJ5r2 zsFKO>4}k~JE!r40EShS5!6RYt;wXe{s$pUsM#>ll2KbCW+4JBOfuM#~q`44f>;Li#KGB1hZ&+55`G*3)RZ? zCs_!BW96W1yJ$_c#YR|b3vB^7Ojg^u0@kW2rb;70h;(!mWzi=4)hom<1%!S!)2Rt# zXzou1n6wuA#retEi0V%Ib)nRZmHk6R$;IR2HnXJ+2lf41APCdFj$}vvD9fnd>r z1|t6q;x)Kf)b#rVKgb*_Gv{*h%=j85g0qp6k3-R?u`-?^L#WvM83Lb8-zC|qYlih> zk6ti?e&*1AiLYkELcwO266YxQW0ocs!Ict}KWS-6!`OoRQI0J0#|986Vhu&V0_t3^ z-g?Nx7%lp76_;7?%eeaWw7ntMjll;rAE4Uxjtj@vvc=xATZ?CuAhsMAapS>DBG(@m zU7ZoDk&SD*Dvx%ooq)z?Z#(XtnYBw~IZ%$DDWCOsj_V5xHx2QD(b>N|s~=k53sa^9 z+h_ic?=$F8U~O47xcHjpT3c5x-b*hF<0noOKWcrXEys;54-Z&X#wlaBpSUHb`RG~O zf2(Gfq@B36d}ew-vvUN#r(F)H?9NO(yzqk>LA>3ucy$*Xe735-0-oOZvOP6TK8GZi zMMN$Z&}+VDojRqzt0RnBHtxK6wIlm0gXla|T{xrYn4l?j(Y;7~=D5oDE&b$pU}aN1 zWp`2%M&{nRIyY!)R`$nU*Sv#I5V#CfAXnp19YyJq6$Qgsk#0AZburw-&V8Wjo4d1? zRGch%IDN>Pwrpb9IAryr)Pt-fIn#^NW8kvm>*iUma8*0XOI@BX(@GWKv`mMatlJw# zbZB(j8yPCIVHsvm-ujb}STctO*!1N#b#P;rU@nf1%IXg%1+h0V?TUno zvCnX7U5TR}a~z8m?DGXeL-G(u*BjAsPL_5{ z^x7A@D{%yzgWl;}AkitUKfEGvLV2EFL_`#vbXCSLogv{83Tda+fr|3$9HU~Bq=Qzo zBtJxx9t?@s`L8h@OY33R9eVU^T1t$>UNcN6{w*_L#3QSL6faH}zCsU6#6ITXFIK^m zC|xN|xoln!$Iemsaj zz~RStEVGn^txVtMFe0=p>>=m^Ueei_&6R5*1o%L}Lr8-DLnr_C1qC=hx^Oh|ea$G4 zc!zWu0vHNdwV}4rd=EZfxK-5N5%w_6HICg8<`8bIHCJR%3gNa6R76|H zLwp-o&J;JM#df5Vr`AMRsT7{JV#?oG4lds#vrqZD70KfO0|fC=AYe5No%zl&fGsM- zSqdcuQ_-JGO414kmy@CqhObknk%Wq@q0X!*QECf10|&kGx@J*!n}Xu2T6{m{Zxb9l zkHB87v9&-|Fq5KgaWchl!S2|u@sp&B5h8j*z8s+_OS);q8uH6ud6;q7f za93l9a%A!vg^`rn0TP_{?bM&0pibthrB8k`RI!`>jm&rM4eS>;B#x4xbx;eZqs~(@ z15qtB)#uIn99qS83_<3IB55ud5}j%|Yyn?|-D2IE^%LF*j+WNPL2`^aA0Ln!4RCMY%T9E!~> z1jV6jAqdt(nhB9qdIXl}9-YPx{8be{5L#lSSFV z(4A1aHPIgkAj@Ir5A7DQ%ksfszs?x}3r{+peg{7X!qS-*kxfeZ>J-{17VZkHBNdE! zFM*H-3u)e0I!o@AIv%O74KA+Xv>}3%C{xGU3RZf_BYY{#QnNLmpP$&9-QRMj20cL> zDr@sahKl&f3J@-%-~T-wuYVft0RrApuBqmreXW|uxNngqk*0FA^wkeEGoxT;kAY#1 z>w9mk+U~$ny~4=NhDX2_O?z;990nT>28&CD1M=;KXEzjwV3h%7OAo}uNr5@6$+1wI z=ypcEPEr*kaGzG-V8M{#XIu0^q{`CaptvFVvX~Ce(ZYGit6UlC?A0-CwBTvgn}huA zO_?vp*K~{^a!5p?IIJOf!Ic()Sk*2_06JV zjNlNPbfBlmCuO0i0$1bz@q^U*m`IkHtY#>D3W%R$9 zitwpg?R})b*0fyr&;svymAk?LW0UFhc_s#fAo|R?_-VA$0zysM8@D%R{a~IR@TC=W zW;BV+T}g*Oxc!$OK_`=*w}phK8x#nKEwlN-&sU7Uu=!L)n@q#7?3Occ3lNtAK(EJidAtK1GqboL`~oL*7S&T{Z^L z9q~J!YRB_QZkrdEd@96>9PH_SKE6EV9uoH7eSB;0(h>?$^|Qb$wp`P}oboQ%o;bG37e>HQoM8-IE}&Q$797JK-YrnlIdqFLo>wjw3@nz&%o%j|V^!r3r5SE&eE zf&^()m=Fx_vq0K0pOi#lsEdZ$5Fan&P(gsasC`Vq7A6HgtAmCVnMqYw06O#u1Vws3 ziVY`V);(V&@w`+~FFL~8DE_ejkO)YWhelXY;LO@?7YHHXq@3Uqvn=Y_ z&YVMlB!@V%C|0OtZVx6@MJU42KyW-r6;+Iw;w7HE^B?Xye2i0KzEZ4z0wntbW1<8q zk>6QL^5-8EX`WyG=$8;C6L2)rp~4D&LlfK-ib*8tJx{6}y@>TCs6}APo~3 z2YZIm6PuRjK*~9eCu^fm+@S#`1)8 z%7v#@#GKe;ho#9^mv}iKHM#OH&v^&sw$lkoyo|suEP!E7PV#brc)&<_empe5o~M}* z5?%haaXS#Lc{P$fO4~wL={}ME8>dI6A3G(v#EdWh=-O5N@AWi^%<1!rmB~O``zHzgvRC!NL zuzr=zp{8az!U8k3w6rv%oo3)9YQ>9BqLLOURE+cO-2w)zk{Dg~x&@dBwXk z7e|dt+C;`T+)(SBIT3DM-q4Eh(^t;QmmLq^j?`@0?hmE(lWv1O%$MNhI~-}(cTmkU zJ~a4B399AKRR342w+)-hG1p^D$F_^m?$m7UH2)VGm=hjVOGFMO-FZ6ONzv+qm%hy_ zRm%Z5q`sp=13XVOUhLP7mJZjU*&WR&jsdNSxI0}W-fY-uhb6wL&;`I~zq+)AMoq!K zGZ8i`CUH3X6>$uh_*=0C@stGqpYFw&X4ur#Lx#S_KU&;?8Ef7Xp_Us}dfk)DPfZ?NKv(>$_Y(sl0SqC9OHx z6!Qs7;C}HLnVT~M4hJFgxmeXyVip&C&YyG#J~p6{kX?IWhS&g~lc;?dY( zpOLpz6FLH>i}uzA7Doo#nq?4s(f*8Fm(AB-r&RC z;F&nOp>b2@hmn*klWQ=Lr{9PS>6q3OZz(Qn8%T-x*1VK(>W>bpPbc}Kachj)t8Z0h z{NXy<1O-^!j>E%~N8R;na70r&MOV^uXELTp!xa?eCY%(0}Q5iDV)pPUCS9G z_tXMx(DpmI)+taz4aD}g2poPp@sV!NGz2@IeS7w-y0Rm8w(`%8;P<$EB)bc&*m-m? ziO#O-tvJ-sJy6L61&bjF^*F^(9>#3LM2a)M4OVp$ZV9@Zl0kdL?P5E+MOL-9_H?LH zEvPQ#o*;6bWl$BsF&b8^vLN}1F@QrF)2LCAfk>+mhCLKQn8o4P9>U;;ZB|e z+P{`g6Mc%lc3mMvCixqt&4#=)hZiFk?8(y2qlF7fkgo~an;QM_8b&k3SSEI36HRIwXBHx9_RUuB>$iuA1chsaZK z+SvRx$ep8NfcCt^OjarE5i ziV+{jL=0of)twBY(s;DaH8{L-nr5=EZ_BY6gU9>!WO6AFRqkcT)v3i2)iUlxD>0Fi!E7r=fX0D%7hkd%4$$5K%%U-L@H@v;?h zgn!|nVNEN^QaGbIZoJkr-6z!CeSAdP6utQT8@WF;crdk3Dju|7Hip`D`0)~o`xD7p49i=JMXQVHrnZj z%GnYwC4toexGC;3ziPikYHvlC2fC^X4Tq*N64FENqMRp(X8V?~efpGHd)?CJ;@?Zo z5S`E*53WLt0$kjQs}bQKB@{!ZE$TWaYJ`(jJ53ZWlp-+@50@u`DWWLr+d_h<-B)}o zl(G`!Y>qY?jR*?H^`GRmmZ(@j*2H$C-Fxw(@2|; z9|^^nnn0gjbJ{HZa$IRL`uLooG?auwPX5umr#0Bhodw{hKFJ^{FqK?YS84bu$&zZs zX01|=b+64sS*fu~T zG?6~|g6_-iQUI>W=l*|sMn}+eSNVsmT)eS77Bxwd-+%QR)yV(v_0t;}0C1V=_dBrq zt=;$!zzul*Y8C&)z8|;Jr{ZOJYNO*tgcq6jdAN|^UL3$BJ9gJ*zC!XZ`UDC7lm{NP zan`|xA%hrgu*l?Wx!PA1gdZuRXC5Bbuml1M89<$?hFc>nxt zuNB6IcRqR4O{`RF*|()sP25(SyrS>xEOZ7H9_oHjuCtel$pyqqLL z5N2MJ*tC0sFwmH&N#rR+2*AU-x7vP`>Uad0*Zk1Egm8I;B>gbM<}9Wx%KkL-eepTM zH#FV^T<4%Ueixv7x0JV?Bp*B!0`J?xuz0`eW#$Hp<(5o4)wC}nEQNUE^Lny>?e0Bd zZvGgpWGSIqmG^jd@?FY&e#;77mPID!)BQU?Yj)4tz9`CwJSJ)I3lH)_#w$+T4kA3tr8Hl#D>e8&eG{1yoJphoYQ)gbhBemnA!oc?9* zhJRB6p&c5^znj*V||$qrG|0+ zZcrPc4>X&|2$}9&81$M9iB7vHZ_f2fQR{Y*N~42Ij}tTxeUeIf60#Y=_HNKV;*b+_ z9V?P~Q=;@3A*bbXEURgC*5LO`JvCw4J?G4^7TZX{bk2s!#}4m zr+=mmK9W7$<;`jC%lb{2dJhLw-{&g2^B3Xahvro%i+=jsm*YpiR2dlK2j_hwXAP3& zi?IUcjN4S8_pRaO2MBWUqBZNFc1Y}--KJN=YmeoIdGF@JCw^Li83E7Y`-@xg=!;5o zCo$RQ#UnS&YiH0oR@sD>5NcCp{1e&H?LKEE6=|UBf1s_!&TG;1HUH4eP+J-=u~Hjl-~%h|d2o~t55>${dWm+o8bvyoP^)f#t~Ct!*wy#EX7B*( zty@kseFe|JBY3`8F@3`36kSZjNcRLYUVc+Pn)|S4C>Y0;-NE)zM#<)~Lt7>fGo0O! zs^}+ezb#VQ^3WtMH*y`?a@fS>RK_u!6K)oW)G-o-1vy+zq13Ye&F@-Xm>5J=d z46W&s_6;^W!z?g)e`83)w^C@lw?cqlgLjii%>0d>O+p%w|@rRGR= z$mcUr#i>K^SRKgWSz+!0PcmdM1TBt)2~s+L8w=( zW)EF_Ifm8|oE_C?$Ph4MdjLw%uZuC!p!!fBG$z>rjY_A)ux=Zjv|KnavdUriq=9Gp zRNr{!1-g=kZV&~{@9mz_*VAqw{LuxV5>UC7r`;)1(4%GG{d86Dt@#tP3ynWP zgZy!;FTibHYtRL9v;^|Jxt4|;50KdnO=Q8*P*3uEcG+BeSapkeb7nO}oia&+oFT!q zM_n*ie3BmBnU!v;o{(J*t@(@pkyVF%IjUO}@wH-khShWBqIEq+PFbX=q%8IF;(T~~ z`Qf#?kpDZZlt9F@Gw4il1-hq$#-n~czDbm%s%?N2x-1svk@a?daIL2^J~wEMUhMwG z2>S#(d!@$DPBvVY$BTyPW9VHs?&|=S29b)GeGtOztU9Rb12cp`V6%Y(4A%^mh*(vW z@Jc8>9E5E&zRrD%$1Zk8G#u>d2@%IGtl9u`lYLN(SPS{R-14j{gz5{CI%k_L3bFUbQQ3xsWM0|3uB2J&sc2gc!Dc9q` zTRqR+h>t()HaKM@yWjHl*P{&D)zqe!31IXR#u#V#0xeAIcyb2u(j|qmBsXS8#+$cZ zoc9u!b#OfXTaUZUU9y5s+H>vuLYk@DQp5o7&;TC~;ljq4^)2z8ZJ1B>?L-FuYGtNd zx9RmP%JvVqM9qlYYd1qF1%VApac)KIk)s+58hZ#KoDVRBJG9lX|Duf94o`?j)#uh&+A zkD2BIq_p!Qrd~rfz8%UIk&^{F6O00gSr+l;T%}8p;!PXMDs+uS)ydKT;w81-qb0SX zN@E5KbR%hGZG!~O@;wrUioDUuGe0?HwJw*mB%Kp_6e(ggTevqyF}$rWP8~9gAti@r zH{~5(?o2n8y-n4UEqr4 zH9rJy145EQv9>-yiZ~ZSyC8$Qn64Po)Lwu}MbC_iv8;YB$9oNH?m>WE6Sxi+3F^TTDH3HdhTTY&%c z_4&&EIl!?m@D;}p6(z5$NO@wF!}o<+ zlr;+)ZzdGW^2`fkdVcNWLw;53_uOSO0mF0%Bd%(2)^cIdw)w=}F5?)C=IT-^>-aA^ z^#4Z1kpLVQ_d;F}yRGx&9+=;lq36$j{UjCj`HOQb!hVdpec#DNM$~`r(q$azSYq@P z32`a+_*D6gjyp)dR~Xc!;NJFQIMge-LM#~#m@quolt2N}hD7&NGv=p&vEvg4ka zNB#_@Ab%1rLNcx_2^VdUSWjb2jYmo*93FCx&~aXYl#_!$rBmHFqM_VqZe7V1akWm& zuoXgraHSEE`>(A%Y`)is4vyH4J~8r&c;2Q4RUuBqjN7`jF#I$Gf|sI&`GkX$y)&MQLbLE^ML5VLl68Sq935qzW^a(xSc!F8rSVpwVYUY2SPqqpL>Jq7Qkwp<&;mkSixf9K zGFW%l3pDePI@NMFS>Rk9ZY~Wl8j3B&>2IzaWBzPI|3Uf8i_xszrzRCJwWQ!xh$Zm2HjCf-LR-w z`HgP4TEfy1lgY*V?4zyry3l+jv4}TD1Y7JADWzNgq2%5uaisPDSf~5r>IFc1-w#i^ z)f>Q3r^hykjT>vJcdqwf)pL$mT4YrPn4O1c?{eUb=rFYe9FB#&$RJ*n-!~jQ17wMA zK+U?h*6TdoSKL_|Ug1$K%D}8hw0W=j)heShoPvTq@RPa&unNo@U1mhOcET7ko0=uG zh8!4kofvQ1`(F_WX|`ou=#9I&=RvcPFv+bB$Pl|UL*5D7 z3IRGzF|WmG4IUV_v85S(ZpI)W*1!&koZKPK!X50EOyi?k+Tl=6FTfZ0%14;RGSX-E zYi%6C-pB2^m_d&A`kz{_3-f@6OjXk>SRPb7yY^80-ur4|N_aR7d55?GAMvy|em~QR z)JP&ESSf@0Kzfud{v%y-NZl|mh2Bn9^HDF5qFb3&h0GLcs_W#@G9^kr^HaKqs8HT; zK27D*h#>*zoRU}@q2iWp1XnMwUUvXuNje@`@P`GZ>@=?wTL)^LzDukazt|h`g?q5n z*xMkpwOjf5Cyb0p94Q!&*C@M6^Lj@y7XaN(x1~Lm(ara8ca%Q%-=u`Gc)- zvvCmIC?BHfiUIEi&zNSZbdkDQHYnfrkjgH zUi?)S7XHSd{Uh?qcYSY)E8@8>Rzv<^rw9yplz$RI&`3&WnE*6x3F^Fd=~eM9Vd5J| zt{06s-|h3WQ1A_vsA$gDy^jgG!aH2m6C!lRj-!sj0u9w%**5{GhFiffha_5%lLB3O z<~I)YYEqeK#$j-u`o0Xee~W0#m%Cti8vUxxwP zeoza3fMjjXDi0L1q!(gFGa;^qh%63|!5+zG$j5oLYLlCbYk(cmKxgkpIK9>rA7?t>S=wHJGN*mf{Zh@J0#YeY#3AAb{KLU*2ofcL5wdJOdM$y=%67P+%e^ z+NgA0%f)#qO$MK$2}j@=mkn)zm((tvLmtojF|bYFB;F~e!auW#p%WQz@&Y>1_A!$- z(Lh!SIx}*@f8;uXW`F&v3eW|h-A?Ue6kU1(TTo6Y|$8*4U^ z4NoHd>DOuaR=fsqZ`z%b8x+5V`7nrek&^An89>lPo=)N^Q_miOvjVb zrEx;9>W00P-8#V;UilrL&N8BLjv8l0Z4%3bV(NjgTjcP*3|N57q~mE74+&(;)BT>i z6yko;aEo(lk7Ai4;>w3mx6QB^hiq|-8%6hru{cb+rk*GwG(vMlM|qPBN&^$ z8Y@z5gdhvizGC0p#U4D5r!*bQsq&E__myTIST#{b(~d=~^Pcha{&VS83s9*=EI4*=f6S&xs||)zh^EXw`%5rW z

8Dc&;E@A8rsb`YY@5KXgnR||_JNYIIfAjd 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

l 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%0AhyK+QsQk*AZ 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 z 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

WYD`y;+OC$?D9V;GV4% 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,pSujQdj2>~&Nqu@t;5lE= zNq^YkqzX%WhL6Qz4s_}mlJ|0kE1)n^LT~TX%@=P(JG_9}1bRN9Dq1c4qN^U_W2Y`; zpi}r$5-h&YMjb(@n08iFk=xSoU-0ovCTn-#LYe zn9fSZ2^PSNdvySvPb4~r8%$E^Zm}qA97@I%>PH~=qb(Pfk#vPG-r%(t!qhz4FD4c| z>E4j=O-l$w-;F9Ez-`qRytItbc1XU@dN?g=hl~MZy;1i0&Rw zMHJiIz!Mk!O&AZCJ=#bLsYB;Qcmn2yv=+Jufv2_5&r&E{dn}92q+KYNF~*KE4_rMX z9mjy>79!FU>|~4>!pOH4@Bq}rmh{yRLw+cUX>%u2%W3FJ19Lw-O~0dFB&X`lQ}Yzn z52Nw!A5E@tD_-WRCED=x6rOY@fG8;dL zfE5dd%{ix|%{t`xqQP)FAXu<@^PwHW72jv?aRFOnxJqor6){UQg4+x`$&A~JRR(mt zQsO;H38_>|8w+?b0LRP5t?mSYrX1{AI4mYqVqC!=3GgZdH^Zvg2koBqTrWGxY1 z5c(Zq9=E_n&eQT;F@B>6F*1k_3QrVh&AdEOtQz{|d=?hmlbDt#Yoa87XUoK!M`Avd z-U;b}t4=yejSTcNse!lz$6f#6#FjnpUTw1){7D^dNb8e1*B38f*9Xp6<(et}2{{_Q z<^zim460A*rHxK|6@Y>a^GsG(@l2lIWiA@>k_$mvUt~WBg}Ki`wbZ^+l>e zGMHO&M=`W4bi_Ft;ief;Z7R?cdWGT!KH z5mDWbbvkOnd_nZ>1vnyPwL6ivviMI%Pxz!)V_}-Dbu(WW)d+{ArAuXjaWf_R3&Qve zOL5FjGjnl&0l8C|-U7-^N$W5YA?BuQ`Vi^Rx*3J@ilRZN-q{GlQgX`!gox^Lc)uJ2u6+K-cjbhVUYN zw<*d>14+Y6-9+G+*6IvuTc{q_4_Gzj4Cj~j0XZI=-5)VYVkkY+C+isWPN`qaT0QOO z3h=snZL1t98AL%I(juu2RcJ*4MWYMPk|sJ%qoGGxk?Vdpvr@9Fz%tby! ztND96xHfrcx!O-d!4%mjFZ*_F-nS>Rc=*_N(RwNAhR8Dm$5rVO3l0O*g(~{gxn3YK}R{p^h{?ifihWTV-Ricsq zU>)`r#AdgSFfHy=fQoz)8nbc`lHQ)4HN^|3Odcpx0uEv^EpsH&7aabeQ)TPDPctjAS)=GKfmDKQ== z?Jb~<8rgRLE|WuJaCy;Uhl{5wptR+65?;Zl0SamVfc zLZd!qz-Oi~&5k7BOtYSuRj?82AXF&=43@GQD# zp}P`uvQ*%!!GN2#rSrBUDWv?0AFJaUqg?tF6`hqAA8cq6nQJD6Kfp;gzi<`K%lI41 zfo1!S#!p?TgB$jxQq`4%QznF)hKy;NktN|9O3PZ**7a=7IQI8OYTC1}cN4E*S!NHR z%@_{GY`&&jUr?t!hYY*p1{nA!6K9&5&&`$ixl>}4N|=Lbcvf9`^|OOLv7oD+ds;;+kdm8etgON=bz9ZYHN zFD&Cw@eRo~Y>&tfn^=kPGZe9Edt=rKRc6fiLy$EUhv?(PkjL7@7}55}*S>nAn^8lx zr^M?%3I6vGPm^j!tAXU@d-ktw2Yt!Aw;`|`G4Uaa>IzWRok`MYKg6cGB&-fvIzpyO z=ZGsHxK=>ng2;F<#1drnF$EtmjZi&PZHBEuzV4-z@rV+epR9Uyrtb%a$e37Fre0aw zsbf~HH3sn4nM?G5!Mu$nS@NQD=z z9$x{hZq&_Ckt7rnVs53xL}E*+q)N~zL*E3eL7}jc{bN|!I@#KL1RK{>v8kFhLD*&B zl8PoQU9*XSH&Q%jY3tql!ZbMpULRdFQF1c-W{ZespyAHAF7Apc(L1{%;ns_T>>|7+ zzXiM6>n{M2eSZcI+_Zx6hA|k`7gDFg5XyZ(7mR%3L!#O52_}{93WGNJ57zxAn|hfp zFw8^9fGs%(;Ih^aSTdC1-;BI*PieFN@=M_v} z7l^jOJo&p=v6E0m=twajfDpgO5(an&n|`>;O7iVQwEaYi{=vIBOwx+e=0J(K-Tg0p8*jWxH`== zl<**{6z#++=j#Tis%lcBnyEFlQXlU6{;bLCbhklEiK0bk%b7LCUS!Fq2ymK?SMTSa zWw+3Zn9Ng$+0hmuriA{W;3ve=Y+_QB4p62263=G)k@s${@XP#n` z|6CzOlY&s+c87r<&obq1hdzjQ~SNupf;s*(dSX9-HT^EcUNCtJn?Tq0|F|&hj9vriK%_%Tv z3eC(Dg<9dOjNxn~$5tbys!f0VwdQ!QITZdhMTKERR&BfLF=eLEC`wH_Ng+AXQ^V$& zt8SKtmh zNx+2y&wGZAtic|eJ_l+OZGJk6p1shXygS za5?-Z8NL-p{IEBrfc&sGpc4bNG#dZReNL9aCHv?x14bQ3@7y8Z|H41YrGgqR#Hw+^S zyQuCBc;`C5T-WgS%5F0~C{|wBDB9D)LY$-$YpI12hl9yIL<(}%`wHs)5vxo##h!p- z)i;!utJj*eK=B#dR`Qrgg**YH5PeQC8f;N-Ka#u7(KT9&U=OMY`L(d!@xoU{f+S4 z^eOPzg6+`yCV#X+HugrZpt$5l%mo{4^(L@$;mUIv6SKY+@4MB>O6?ld%%s0`i%REz zYlU+G7wml;(I=H|%KTH(eBVSp!j?V3K}uX9^vCic6GhS%(ilpn2PAgMQ71Vcc zLt>5fv)_qNw-!`d1~Bw`j8d6K(Gec=ReK{}7+v4A{0IT7aQdBGz1kZI__Z*!MkDY5 z^HY)$^~3A_KS)+%{G(}-5Jdb(O04i9n|vOr(yMr-K3K^x$hRKR^eGmF_9<}T_SI!- z#Z1OnxdPuWzX_KZEyO&57^Zn5!}(DnAc2OJZOpF~txUp8>x3jw%6Nr}c?BO(n5X_A zn>wA5K@f6-3z#=k4hC%Ydf=xY7Hw9nwO4Gy-K*(S7i#QiE-FPEe91D;=;hYW)T^I! zQ;(N6e}Gy49j<<5T>GM%T)nWmMNdX}lFX2iEE$lJ>sPf^2{SocWF*f#Iud)iK!lyS zAKDZM`1+PUKBZ8F0~g=BW^^ICmm~NeGN?j{uI>-grJh|Y z=-UFRq7n@iXxZt`2dxQ}n+^;O;qAfXa(5lpwys6xr5okb*vY?H6 zq@-x~ZuUtK7;UMviKV$AQ71B0$FPG1iXIKhWZS*rZupsHyYD%pI|Oe^ZO)#*0cZR6 zx$V`@lvCI~e#Eo=3tag{bMIg|4QlHZ z7~iOgiMvA7OGf@drI6w^Ztsdxl7PaSxsUv+sBs!|;_a1&kcCxN7T_V-P>SlLBuqAk zUk(f4x-S39Dhr7?FL#txAq+}xjtJ`{C8;SGr^}B!E65S$stDJrN>pVG((ASWpZBs^ z|8n#;%vQH4_wfx3cQ*c7Pjzi2zpJE;Q+RzQ^x93D+Dj~zwvstdVERpIw4UthFq9s!bFAl$iazr1m() z2lb=^mH9I%H+M*?lPlamT@*Aej{MNJId0@)rJVVKUO5D{^h%*@alw9-uq}V)3ttT} ze}Tby5(VcL1+O?SAw;S?$9`z@9StzEX9Qfx5qDG(uT+$d9`;xqCs&Tw|E@bZK%xf; z`JM0y*HD{|`%d{@J5;0B(8D|9|1-WmA06!Rr#r|b>V;FjJm9?Luq}t?3t7l-=Ozhqv;ZXUBClC8I4`<4yDl+h zdi6Z{po(8E1i{3+A~O52!1PQi>y=E*wEeS_GqlG{&5kzJ$(I6%Yw0vPJ4k7ha5q{@ ze@kS^rTCRhk(Q>98b_Jr`C_I+gkk-C@SVf&tnMB*Hre3ON_eNze&cCA1+<>`S4kG9 z>ESINW|sJ6m5i&*s$_XM)35l)dM>8?t+sihh691~fIj8Ib*fThPIS@>Rt)Bgd?*Q% z0aT(s>$4bQfM?3#4RwI~-3_6)VtiROFo!fq>LI)?_OT^3l>itRfEX%*C?YHhD5@~3 z0E?KQyb}c}StV7ibrzPQUJ9(rE)LLTleX6FRae&SwN-6RRGe0J1VjZ@Rh4O_YNqB` zvQnyuE`R>_-+7ss8{fX&Jleebz4Pw(`Mbbd9CA3=>-?fA*0!Pli)=f~{sn;a7d7KFmifRmzyF zvaH$&YHHST4YBb73TwMXmPUU#unQvX+e3>n zwZ7Eq4FonSkA{T?A!_%`)yZ|rcUJUhHN^673jQ8V<`sAr8tU8m_WU7l@5rqEPD4O`vLS=M znv99LgW`)9d69PfZp$XYT+zktz`oNWhl@5@IEMT0#mkpn;ZehX-*{ALOv(IluvbsI zB3kT;yTb1C=kE%Q9lL%L<~MW&iYp;%n|QyF>T6^9_Tyr?+cCdX;f+;*kLFLEP3%$I zjYRplD7@Z>Fq?I`gqFx!^9jM>t-Kvb^m7TrM$JRy54;RD-%m}+m;|G_+oHA1>re0< z6{JShVfYBs0v6uKrt46P9^5}p11wJgVOV43OW|$WwXD&VE(QmCq9A_h;?u_g{+l(o zt2sn{>RdOg#XXAVEL!GoV7x&YPRLsTE{fD$!Cu(n-@v?usJKOD4lT)UQn)KoaLUIm zUMFLDeHziBhEsfvN8F@@;<**~f=yl*DqKZl(n4|P{j(<>Y4~!j-<~hHGFVSrB_7Rc z@iW(xZCpZ|^ceqQPZb-yqdKE)vF~_-yIb)Eb}_pr?Y!gHQ@%#skhOIf^|*rLM+LdK zslZu(@$XmvzC!=noUWGVE1`~59^1#SAeK20wP0NwziEzFB{(QKYO(7ij!UA1k&U-W z7}LH!gA_0^e_iSfL@mB=qVXhX;D1Ds0)j~R7{e4ijPY!&u0ZJ`VPzUWIzaC>%Y_Rp zVP2o@Ay63wyTYi>pS&m)Y-e3tm{gL&b9d%sx{~k~rm1DA@p0C$DKoOhvQQeyR<)D5 z$6COo#Y-%?(pQ9YU%f`2V)4sq<;$Qn@*Dg6FL_*MT0Y*EM9rGezRlEg(rDrVE(?Yf z+8Gdd=bvP_F{HtjMyo*pr_6%C-8k_#zb^3EkBqA+$EXn#Zh;Xd(p#xQwVbG~+6k8` z_BUwSSdrLV*|@;Xk;zKLHjk*BLV@py&6LotR?yuo6f>}(J&Mu`&Prv&4RrgLE?ewm z1d8~E8xGb8NU!x51}liw;`MT=gH(LpJ_~FuQpJVdRGS;?i4&TQ21MGQbWQ zWRf=mIALOqN$&zMD#Dyz5DR>@7QI^>eXiPT&DtCrCDA5C?h;ah6PV!bx zh1|^uR;f%8e_PA6MUnn&*)zxqp(^(f!mA+b5bUnz#5YAX=(>y_v+#@I&Pyw6E`u>Vf(zB*q%*Ubz@P_HGgRHWI7jQXZ^$C&rGWY zjW(b0z^aLrIS5Z{9AnLbv+mHI*$iXU_Pg7swcOj=RqvfWqYcOXf)m>AIR7FYMDyr- z7I>CXk7Bep7+NyJUE7jsGWh>+!-ia*1?gs0<;xFLB?n7n{+xQ1r<%`JF*-y|NYm>? z?`HmqTxQz$5ezDH5H%DxMLeMomH(P8G1$Q24=EcJhNZK8q#LcuDd6gOOFjO`XlC_Y zS$DqTIZrGU?Dd*e%2T@9e{ikp@Qr7ICXm;#si1(Jf8HzLa7%^@&FSNU_AsBT0Y`?& ztMTR<_~fpt?IzH`R3Z2`&5%D(=`hd_^Cs5irav~ccF){#`anNZHtIke2-`f>o0k0# zxZH&}?g)Ne)&G~8T4b&`_y4R9m~=j?G_ij8bzIurUO&~vVtEqc=K^v5ZPgF*niV?% zzFQV9;Zv|QDtHxsEDfW^Nvu7M-i_gUl6R2P|-&vK!kDr*GcVS zmmY48A-f<#^D%2-yr*vOcPWl!xQh;-7V{0lE8QGaI2D?DDT28Zii85Oh{H{CcQ*B3 zQM4{hWb6B*f7wFukxQBHTnxyW|BJR{Q>ltDxB-4~id%zD{TJox@s2;DFMGE``$P|e zR;1(kV1Kgceh~xVRq}C5F&Tcj8HmVrKGmUr%)IWtdpd?7JjsWPp<=`RE`SOl$NV8! zD|UwF^DS0|U@EHi(+0wsVTB^GR?gW#;;kM)J%j%+4^hsg8>yM`3d3Q{af$^B*`q)| zzvYnt{S!64xu;S9sNlccfFK~{D~h{JF^XI=UsZH-NOJ-RPJw{#|5lHmU`Tci!UD&|zg zz5pfE%%GNp2K8o7CU%W~`-E0u1|(h8*&LCQ8H2q+AP)qL*;kvWym`>%rnI(ZhPs{9 zLtXIU%?)=ybv5tVE*2H+=3Q}B7~kCFi80YTNOSjCql9iZ2N3hDzn?gMvhWy(s@rk5 zR@2Chz3iTKoZoDOI}#&R!>osR=yBQd&B7ZRb<4Dcf2_JUCKT)g3}^tWl>85* zl};Bchr_(mc3HFOKaGZavsXX#<;98N^WRaWP$NpRKN2*kg{wb?TV}nOQ|#9~=UQK` z@~u`G;n#PXIo2}_>t}A3{3MB91F$ETX%DVIKAK(*-Kk6|8qFHpe_np)%@PBAi};7 zE1QUP%4N~Nb;vhr-XV36uMZHmMs3<5w84?SBi`x7i(`m;(<u2BHAnWK=CgvSmV1{ zhc{@yW=Q>_*rShK1|8pMq>F66GD_m$kCbNEtF3!Wgm*nVy*Xp4k{SOFg?)rMMk(P& z;rWv84&&e6&P!-H-1)G`CEN~6-C>=Q*M4NTQUc(W;^0h6@P-%hRwbf9Uai?LWBHQy zFDK;G9G7R54F8~)u|Y4h!!5$@;d!`SxGBy@FkFly#pLF8=Uz-c5z_KRgV)@#>1E_R zKzx_F@^lAIr5n^D1N5Z~g1WJTJ{&5@;ooFX(5OcbK>P#fMT_`hZI-iLg>|0gAb;L_ zlyv%>I=(Id@-x9N9fdx71IBy9oX;i&-|)7~_1(@a*LZte2N17fRc$l<@I=cS3Y_i9 zPYD`n>PkFg$K9br9xsFy#K~MUhq!JCF5<0K^X+TdH09n`d_jcjw(FA4*Qw!$URr%H zNmH|sj|D88q1YGLngSm@`Mv7``xjZh=&zwBcgM#^J+!Jftr@=@YVgfKxrtk7ZTItw zHQqW^X9(h(`P@@+naUau11h%HRWo?uA3w8OL$$CbZk`286X~s>JX0c^ebAR&J=hpM?mNAL{lnOLauNj|^%w5GsBsJW~C)m17>BFN+>2 zFiw*K>u$ms*&NlN>TaoU%NaN0fj9JFo-ng11^O_vD0Z(E{ukq9tmrvp zFo;jMBlF*o4}YzQVr$?K!q1w7#^qpEkiYL2HJv)kMDB%V{$*xU&P9kq-ym&(KRki- z>jY?@K?8jQjqibCo9IprPxv7X{?cPzPef7VLcGa)AJ--9QIhv3>Yt2VqN}TvLTjHT z@+U|icPO??w0}lR=sRSVBLemh{#6iv@DEZ7F5Qw?vlwuj7mSk0d+0#Ou?PPE>JR(* z*(K<^WS7jqEvTGSO>?okTe2{DcJg}{jErslTAgZ81X@T^U;gdmh(94CL^ zPduCq%ivb#uIZ0NZSl=sH1;RKV#Hu=nq0n|T47V8FgDEd!W>?J3v+;bcepFhz!+Xo zg}0X)5mBIkD)^FGsrJ-smEYhNgSStPS~7;$03=Ton!Z6?3z>S;XX0m89IR7qyd3=7 zZ1#aFdT9##$);iiH0+-rUmEfJI%x``2BZ7&w(4!IV!fUE&_G7VK9!TOg=o{PCF&pLhK zNLzo(#N57V?H>;b2dahxwh}KoQ}ZX!(x2ZT>6ob7c4DJX96#AVJxhl)e#f$e?jdUW z@&-Ko)5V2*sU?(;vc^2)!?ivf;|mr#O52YNImPb4yZn{2IX82Qt^(o3HnBubNv~?X zzdwF#$K+X~G4&Cc{h0@uk7UgGjs@Ohyj$io>!Y7s`Hlc)Jhj-wCVp)wpq@w&#Gsa&OT948;^Mn7@c z8;KlgNNI_wA?jD7v)&PeRO45Wk3a~pK#iFQWc}A;G1$@jE$%Po$vxoci|4*Aia(PV zjuh744T?LlV%gsee&84%V(E;ZSvX<&wg=qKwf(JY@9h)mwDUcrrhD% z?ra`1p+^Dw!=r#ZDhWp$E%xQwQm>c9EnESC=CNWA{E3Yc;g!x@irMeX#k_)xV0#t_ zShmtO-LCsb7kdK#oQteaaBm#<6WIQ^p2ZlS(K;skp@7;M6mS%LPw?W0AL||>c)eG{ zv+>eGUh}U{68Eb*biGRS=`Ulg*^EAm-n~Pm>@Z8!{<0GEg{uX6Hd$UY;<`a?7}nyA zD@f4vebcTV;4zn{AnFyg8++Y*xK_-4t666IZ)(z`LXtnWonXZ=SXZs_3durj4_v-Wt(N1Wtq-q^HrP8;#B#W1^Hx}b7R=lb&B-F zuS#!BM)^SsgosROoUo?xiB}lXxqs4K3kYS>6WaJ{`xl!>E%d}ETuH=2Q}#+kdVm&&x+DFqbO13yLtd9A9ivfV)W3u22zp z0zVW8mW_6~@Bl~Tfftz9Yo6eODbQO##=Bhp5E0Qpj&x(S&)I<;CA0ivwa@fGj+z8* zV;wGkh6D8wAJUAq(WiPZQS%k6G%Z$xKPQ5sDzlt#;i}0feD87m>r!{%RYHy(@kd%S}TtN*8kk)FGqiEjbpK{T> z3Umu#Ii`)^t*`<^07DDMyePtoKCq(*DEb177^CD0HvvYV?^I!d+oRYcvhWo!J{(c* z#sF_3pK`I$pZd=n0)k$p%vZdrlu@nkI42Ms0*1rhX^Uq9-J_z zHhOKw1eQHN1P8zj31z2Yus1YR+(Rm7bF9-R-865MPK9hW{xqF?4Sm3liZKW6AFGr}+edldXK3$F{iDUMb}dPr4M+JwH5C#F)vbPV8eK)%GWB*W&|Yk7@D6JCRdU7!Cix9%_-q zl)<=zzn9fNngL(Tj#qN}r9uID=G4~3_gddvIG5Bdl|N~FlrLt>+$nnNdDJ_qz437r z-}zaa1IdbY2dB?A|DK<|ZT~$#2vedxJiw=yJv8= zH%L+S&7^wI0Y3X$-}(#*|ISK15v^CDeS;U+@kQ`ayoxI_t?I}A-E1|NM=1EB_E5dOtcBuX=tA(iG*(5sV~>{n zz)`^pKRBa-6nH|808y_LLRUBb;*6N1@EndHGq;W+KDD@W!9MM50hKRj2T69RTLyct zelDu@OpLivPv<>3aZiAHcY#lEdVh&PByOSU{Q{r%Jv#wU(JE?63??^_%_ou*>J#rZ zt;2o^<`%+9G;aKyxlof7BT9rk&3z`NOhCPcuN1?IA-zQ~!iaN?OemryuPG`h{6ddr zZokDGA-ew*WsTSQmh0|xxXT{A68A=4=fexl8?a7#X1zI<*#34V15E^`IIONHn`8Ny zmBm*cD$tW5IX2;-itLdz84f|x0rBcikIYLxGa2*J>Kj5O1wSOIsWb;&)Wnb1H6};s zRVE)y^ZdD@pv2j#c46Z#U+tK4wLVj&PRv6JlQlujxS^^J3)ZMV336(Jq@@3l*7YW~ z?#zefuz5u1b*;k_3ClEY`knowdzx{gj5|v!oh1QZd1V9z#;|gZC}~QEs3>=ZL9n6w zM27K0FjOlA4%b@TB|3P}#bz0!c;xT8+b`rdoS&A7j~LE%5G-a(2{^upf8z0WDivac zK~VH@Xl8T55NCDKANbu}d2W)K2i2Ra`eG5GUxVEW`sI$@T&WFi9=s;MFGYN7_Zk{q zVw1+7b5%-dpW?~xJa0oh3{26EsbU?spv(xLK#crDw)7=HjEV$gVjZ`kcLFj<5r&9% z-h=27K!Fjl4%^UFl+{kr0w3ZXx1qlRJ5&h!*nj4e`Xb$vb)@??2-1Imxz!V} zcsQFcwGcny|4kE=K8g5+X;O*SiTZHn(KPg?(D4m3*~6bh?BR(k^M!HCmBym8-C-eP zd--N6(~%@Rs+jpxkyAeUWJ%r4)3cD061OSl-x<+l7{`#dr6eDKBk61w{Zb*SCa{W{89F9wnc zO$oO4mdjRD^hVp-TP{k^7|$p1 zRnx+fNo^kt@_zZFcm(u68M(pVlP??c=E;F#JX(LqRC6T2+`rbQ2gSw`n*73x`qeORa zR*vh1KJn+_3q(EBEgd8pnv*-SAdcC-m2Uu6*P65OZ(gWoJwZQ4RQwT7yrr{%DtfU` zxuvsQRP}QrWL6df`t9+Z)ux=}T2w3cZtNf&I)*EPzu0 z7b;rDDr?_C>ldY5r|v$sUcRH~J19@^g^4xXB~L;~TcC(ao{lXleLQ-wwaXuC6rZJD@T6$T8r+J`0AQTlppnM-QpSo9seO3vy%>{s*&v zl8*SIAglP?4I86qU2qmpeWV?n!xw)FrEqkP8X`vmM^-5{)kq`}>6T`(WuwtZLuUnxa+ysW;P#bQ2ce ZkKCha>1oFFNdGAGs`6k>i#@`or}joH-4Hglk~FX548bMkB`3L0 z8a_)8m;v(eB>(*b1nyIVQ(}YElAhtuUfKXeDeV{o)3n$-XU=w(2XA!;Y@7(+eLY{+ z{+4#I88SoU-~ApRogOwwGvL(tPI&kb0_vx}a31lr5$XSMQZ3c{ml*yeVX0DnH=qlR zzsC^4%&g#-GUqOEx+r(_rhbY65_`RaqhTFm8zd>%So@^ zQpA#(;8F(xuE4?SA~SXriq0}LOsUI(*{C5fDXQqdklmrs#U)Ng23uz(7Ui4&Dt2bi zNgl$d2$N=H6|WIr6ZjHU%jut!!W#sT{U6swH%}&#f%j*_G!%tApcul1+MY9OlnSB7 zNv`y@7jH!;Tt^D3Dav>W1$}+Zo0<8Z9+C`%;~%K0-`qd~tgTaxi7T5GF~iL}y+` zadtRfv8gGdBe^xv9uIx-9_L)v&a~V_PPFU5YPGHjG&rLe+(dqEtNL)v+U`ncqgwTJ zA|FP-kx3F+agz_@R?V$yEq7#Xg#g2wa(yRGWh=_X<-OCn>B8Y3e=Bv3AV6P1)JGX4!W}`dhlfa;$`RgaoWi z%C676Eft?@x?xjbk(>R>zZVXe_493VP^3)w%4SB-y?zi`V{;7J&GJj18v|MJFTq!L z?sA-%hWb*E`VpR4t0;-Kv#Z&)eJk5Sy_Kp+vePZ6eEe#Iqs`L4i|wFBiDJ?=Wu#?z zNvkPFZD(YewPhX}pDWWXr5HQ9x_nQgt?99wqGY(^8YISjs~KW$HTez3`CzV#65_E< zwMs5+s~FZ>T^iOcD#xSs7LY!co%a!Mh4MUnu^$yJ*JP1l8DhdA6n0!;gmi}^ZjYr` z^Bb9s{$1#Np#qB_Hk%{~Z4=4Obey^U{!x@lt519uY7xG1s@UaC#in?Q4BFKwniMza ze0EIj2$*s~U;-w1-=QuYon!40y6qU7&CZ_;wF^7{!PNbhzRPT)(Q1szHa zTz58Rw`c^eac%&r(%E(syVBV?P9==S`8bMO zC)D8qQkKiCu}wbOiIl&8bUq!J;-}g&8R)rBow-gMCVQ3O4bpB-u2+Ru%UnWteNLpW z3T{rQ2Z$fq)lIeB^**=;FJ!@)rlcD;C_DiMZy9J_VKjz)bx z86j4+2vr_&xrnkEbQWunvqT5y%FVOa3_M*2Ndi%FfUS+8u@`a(Z4N`5Yg{m_4BJ`h zCku-GJ$F{Z&=sm@qk%RwH$E;D$G9V>gRn@)IN#1IV;r(t-fqP1YTY;G&^)b!HnnrJ zJRL2`lVas%wyHq6Ufl)`Iv&e8mCEmnzvbk?TRfz5h!cO0ooztma95ZZFkntW_qTzq{#G_M(D z>i=6a23{_#3yMDAZChR2ngpC}dJH@4d2-`f&|$2`$vl14n^o81#nQD!+5GET3O!_+ zT|mtWY}vK1AbM6)?Pv>JyID!uo)UP8*EMN0+ws}V*l651z6(5pEcawtkSW9c4u)(0?wa0y}@^- zk}JCHQEl2!`{b$Th_5_QXJ?m|Zyoo64RS`SPoZD`Z-358@Qa7Ui*%asr`ql4rseJ_ z!z5filR0HlB9oyy)~bGIZo-?yEt|+TX3Mce(qA&1Nqv}2f=+A1i$t95=Vo^FpJ>nd z^tHWWYO(W8o1JUAoom6JBCO#RS(b_wpcQUZodVNsB*7?T1nm<}tbUKPFSoSt1@``( z@V?;Fk1x2C?&bFsozTAG(}yp*q}Qb8t;emgeXQ*2t)gYJ+G)p7Euwl}Ur0a;!EZ-L zdv$p`QOz7rDB*mq;lkIDSyJYy%3>jgKq8}FGP%1Vj_V3QJ8}T61(DJqCD7-VJj-x; z&39s`$U>)gC;H3JRpB)yuCN!_?fazV6*P=JqZeNBDGImu$$(>p3gaoomyZmcv(WgsC9+QB>~t zVyB#L9k4hZ*kJbYf-lp49vdWIl9#~wMf#E{oW0}86d{V|?SclpMq6t&mnv+kUs~5S zTIgTR| zlZLz%Rd@wCl)BIRnaq;nHL;vwkLD!XD&}>x@N6ar)ayA`bE-{&%yS9-2Dsu^IGRn+ z$I#kR{f=Q$&q3Hp&giXv^;tHC=D}F5s72M^8FHvmG1;|Z#&xZGCo};R_gkZ9FMQvm zehtx;<}6}m4NpZLF*b{IF*7QTNwF|9t9~p@$U~$)CS=1O$(?PJEKJToVtn7GSf9`8 zS-E8~$#se6&x!Ioqdem46Tzbs_q{`6d#?P@|G3t;qcR!;(FR>pkkAqY2bS}UvuJ}j z_no`NO@W@*^{fn%N#aszStOHh0Ja)1EG_hLUK%umD<`B}%AG`fz3{s4&r?J%b3A%N z;mSuoCoY%zlz+}xAswX-nJjD$m`B2nrX8);TOx5r8g9Ij_mIq(32VVE0L@qpZN?W& znxwl7&?4Um8SzE^5j7GatUT)+(3h`AYGo{QclI5_e7(BLpzQ8E#=gUK{9P+GIWX~Bty_3rJ&icXD^L#UK?{P`1c~HXqFP2=I)9K>FyHbk7{v!m~i1~~i z;Fjq@jie886AH8gLMhEqe5W(&>xpP1xLxm9l9zPnGdY}46CPrwFw#*->NZ6*C7|L_ zz`?o2!A4e_Wt(){D`~qh<|?S5xC~*-l+^8Qy=rQ1tgBU2fV74J2&$^AsLZQ1yKr)4 zrd3r;`~CmSz!|r@-tX@>cfNPd_s`!u-#z#~@Ecg%jkllJTR^I#Z$QmE6~wIJcWDad zIj*o8Z#{T|icnhIxK0i{TuMjACAhPBybWjOm3B!0CG|*wE`2GN7X7eZ1L^XCKjd_# zDn-+c>%h>d%xWvxn|@S1rZX|+^g3;Mq=pj-NVCk%kiq@C#zLG(D zc9iGtE66T%CKW7~4BXazD&W5p60X^&!j9!z|OIiX98VoTdNU1sD= zaG7?BZ>wj>v?;Xf#WaX|e2z&gpoiyWJf^x7{D~g*5Ob-jD$k>;Vrrb04(2mV9$gbU zz&T~y#Jk>58VU!tgK{<;1@O+;j=zg$vOfK?GG59deR;KsEbV2oIIj$#sLQ?og54~Z z+}Yb?lws5{INUwHAyYgu>|MCqJiDad?sont0J~B)OklnH-M^QEj9*V}V8y$Cc1-P{ z&qAfEw;R{IcW>qrDxSM%a~;Gps^zC|sId09;T58-v6=v;N^MryXv<^n%gb7CBmdUM zCdzYy<~{6EtcaZhFT=6?y0Vk49a-0BM{cchEtln)3l_fn#+2=KfVbf9_A`I<1_KnP z0$8I9y*EXM`ZU0TTptv;T*%-C+yjNw%_Q0xp1W17`Q~q5I>5^^Y)wJA8T`-6EgvqZ zR+oZgvx^EG#at^=uTMO|?~uMyG`jI*0al!e0j>Nz;gercVQgXP?wr+!O-YZ>TO6$n zvipUdE8#M7{$_L?({HbI|Mrw1i|fcJE^c(E*#2fpw9HLyT2uDii>xlL+zLHL>n+>0 z7`q#*jD<{E6)c=t30g+yu=1m^;y4Gcv)m#eQ7t4%;Vy7|EodvV}*ihI$ zg)DiRvXoM7_#<5twA)H+gB62U%xc0v# zRT**Z9+9cRMD``Q?)tugSl?BrI71-@<~%*`KuP0s&6*ASO}SHrQsid($HQ(z{@|c0 zw$h2X;3R{aGJ7C?n`So~A`iSHd9(Qpo~}MqI#q-i*J!wkB|@;CCVIsaMLy8a(L-r~ zq(c^xlgt*=g)&?2{2@XEFo6Nn`AVaIOx3Ub^RNBCU;9wM_N8#2aerTQj}reRm6DW54Ik01C%51ia~c%9gLfXh&`57dy7ya;$BqKq}KcA;oTzhk%bPJ9wWj|LBv3*k%f zi(2}Isk7$R+(HKq9G0Iukw;KRhf&=0O#^l`sJ^7Vc@pkINqQ;DvqMJz%U%LozL=mT z04|lKUGZwR?!g=;iJ}y<37<4h3hI(xz8E95w`_zODXDzSQ^KT4MIJfZPnkC>@+%^8 zyP*sGxViX@EK^jbCTlffM4(DP+|~5sa$&3ttZcVSl4Zg|mx3&z2+D0WW<~FxR#ZCX zcok;#-PN1d7-9o&^sKi@BIs=9xVH7Q?%oDGqr%yvR!O@$uYC%2TuUTeY@SCV<6!bR z_c-T~h`88>CI@HNj4=?%Uh*+aV`8jBQf^ivUWg}7)NH3|;(!jx=~QfmRS*U;56}pv zfv<~I`3nrLxDG}^zXJ=>n!jOgD)#CC8WC>BY~~PdW5uNHM&fpzsiV_g+27?F0G+&lKzIW}1(ph(r9fBHsV<{?V>{jMt5G8b}R|hZ^QJd>7_OBjt6s5w3Rn z-_A9}E+bI#8Lt|IG4RH2BuLZ)2an=>tMpzpqeQZY8X^?GD(wZ-RTJ7LNvRN8liFIO z`U4`W4GryZS9@ANDI(*GC$fbbbKCUPyw3QBsdz^fFxgG0^m|8KmlzPUt?d2=NYTJH$=zw+n9{f! zN@S9n<=C}&ENry3Y&2%1Rda*5MwgWEg2=5R`?MkVPb@}8KxGIr9qKcaf6Uuus{Vo2EpB;J5oe(F41kr zwQVCc=$FZI9m8Ct*%RWqqfqMgM8}FEmyZEFP)c$TrJWtwF`MR-Af~E{3o&eeyylwH zo2U4)>&)K`;G+$PSfH4^hxap>nf<_!@bHk4Y}W~K$jQnkBhVVLAtFj`>|xfDNquUE zmx45t0HHjmM2~7=_+(JUx>E?VpxF#G#LeSWRAp0BdOh-&YKA0})aI|4`DQP8;-LD* zHo?7598r=werAYwoHd`CIs(xLb6q#&4b`^z$s2A@FfkE8*HMvEVz-hgjf+@18+=*i zE6QR=Ac;J8LV3R>B|CJX8fzJEE8{0`@4^L7IORO+7u*g0;ke=T{5`=%j|WV~uG&tu z3UrYgedC}{W%R)nZ2!{{ga}ga`UH!1OLShDwaDu2ll$5=v4_f?l(wM`sER)6^qX#zdHi_ zygui#LYSiET9_jxru3ck+`M*+&WT1xz}b{3cZNcVprVbiLl9fUINFz5W{B0mEj9x`Uz5g$GzGPGG(hYNr1I zkRCYRvofCvoRNCyI&o)1a&)hK(1LTO`|$mxtG=Q{)P(!|;^7Rt6xEIE1R<-`VNyeh z@0gMGd94X{+DDC939cmZJWIP+bH-V1wLB@8#q-p8+UU+7VTMJf=+^ zC6Dr!K7jpD{(?`1_>5){QbMj96a5FO++wpazbbln6&nBQLKDAe3+3-3dRY^oEpT_ zrSB7U8(fS{D+dxq;vcH%`)+diafZ;XzOQu1gLV?v?ZLUzh0Sk7LCvcGO)kOYTc;b8 z(3{-BIU|LjL;rvhbl-9aey9LUHYrrHK(Sgyg&5CMZ|M6J`J3|P989j{dpr%_2!s{k zF>$_RkPY>1nqp@-FmI#{*scwFh7Be_*PfU$0t%k2V6tAPxIzPQ{d)Es+G7ax`!5v1 z=WaE>RBl;5D6t%3TIC8YtlHTE@vkD}qGy@IUxC~2scV5;thr<#=s4tCv zhcgr%y6R$qu24}Pj_u7;w1)yI1ubRK7K>S;CSG(E;)m%acq6m7FT|ZdEO>t0m8e;f zrKeiDV=0UG3q#{1&0rn=C@LEv+s6G!akyKiiTjY-sk>UcqG!)YI~YW(*e{?e^@Tb8 z=eT8FHQbP}i4ww3nOj%4yZ;s8&*$n)p7+2ttuqk?e@`JPiEp1$P7u+Pp!tTf-5|iU z0-2LT60dt^wVwoIKFq~1{HxhzQd7Dcv#K?kx8tA1jX_uc;9kS!{#(V=l%x{h9-yy0 z>U9K<9h;?Qtzg~KQwtR~IQ14rIOs5#ox zwD5H?H?LB|r{!}laNC)rX}^TLs?COqSy1@{ri2qm>xi#Q?JsGv%(n`g)w!Gqn}eo~ zIny}5x*bK{$(2|OZO5Yb&A8FlFMU^Wrzj||@)>o)&hMR|KM*vrM$j=D>V@^_B z$U)QFPDQI;#1l$GVKg9hqs3P{6aG=;Ev(k*jr~=oVGY2tb^p2swG30VQ5X z!h+;$xsz+LL?0SE(nD-CL%=tN;gJ6u%pvxgy)x=O~rI5Hrd58Q$hYk}RpZ0n@Ixhheg6r{J zDffgS}ygD|=$CktFXCCL+m_&I~m1rZtSVq_oK8*nM#U!fNK~;9WDaR$?fWAKzT&b11QiHFjax&&gE&Qzt~-RA?}{c}HDlKG7gQM}ZLlr^$%;(qcb?ZvBZe^6;gZr6IHJ zyZRncUc>xD>Jh5&NxS~OgP{pV*H37gg4#PyQ?|{`I#r_*!BqBM(X679T1wYG;h`(H ze%phiToxWY4r??uR!}~ca=RSo(p8S7cMscYz#I15f%`n5utKETMM`Rdd{Epl_^Sj= zSoTcCgY*XePXG=c-i+02{f@|0F32ALxt0_wACJAGg|V8wKhBO-_yYC|Hye z7@aYh25bM`5FABRnL^LYnHqVZhnDV_ta2j?nUyqaq8MVPlA-sL4IkPOQEfs;h4sDqqbV4^_S$xhFyCdgkCax5}@a);Akg z60TI)Ey67OdYK<8bdHCMs9zWNuZ#C+m&No=iqkWj7F0D~ zw8YoTfavr@h4JRumRcf5pA-eH`uBk+ONVN>B|x{qglkJXV=!o_qwHaKcmX*fGaujz zV>vWx?Ne4K;=O|=CePS0M|bQni3J%%{eZ|<&0?2^9i|&ZXemw2enypkYf+^2#xH$s zi+;GpoVLZZ^{w$`EwOj^7`;`tF9X=O#bUlH*RAnwMw_2t)FGkfw)(V-+(}WT{IVZk zeg9#FxZQ@58Vc|7;s7SsP_|WHQziP=|F$ZNXX&(t?7i2nN|iKaN=ktiVrZwAW$*_S zh&Ip8X$erKrj$R~^~xRXxOLJnr{u>gyV4NkK2^XkIY)kINZONprqiMW!)s4C&DR{6IE;EPQWsP-*j zzqigkma8|Mr=l(mx|n(?ICKn=c|Mg}2Bj-_uO?m#W%K0&IJ5RDt}T%sh*aYWAHFt? zb-VCNQdJgOQct4_c~7A=EM3mbU}T;&DsI85L)KI|_4RGYR&kCGJQYQSq&2|TbqoON z8~_7XzPUj^SsZN+&A^VzU}}t{P<9cv@H__lG7FtTp^B<@d>iICp7ZZ9<(^H@DVBd zetk||M=J?Gk|TPR%CT3-x(bL@U}a`!6~U>RZ&KXr_qj* zk(#L6ITkQbOi~|!w23@;s}{LX{?rR7+YRdwLrfU{MD5aWAjrRM`h8;B2*;@uij}B) zwcekNuOB|wY;J0M+*0TsYC6z%EgB>_yB}26~8|iUKcc<%Q_<4 z?sF<0zy)>06#BGMqp~38m*NGE0o`eMT@u%xTb!-3O;l}3$C72qQ&=r{y~HQ)^%r=+ zXH5D{(vwK!rP7#6MI}Ql<_nK;~MF7^^LQ}U||Hdg+;zm73gg$K zp)|gN7d~a1(yOt?Alz6DTM#R*kTXD=wVD!5*t1YQ$d$ZW_3g`&ni7~52=O)FB@ZC_ zBXJW=ND<_rMt>VaZr8N^h>gua0xiYQ8cnOG@gScd`Cm}q?J&eZettv@R3C^Ql;`XR zn77{yrBJ{7Ph&z!)abzfpuqYgdEU+E=-eJQ{=758Z*$W#%|5J<+`n~^pNOZY{U*bS zMNU_KrEo{i+tM`8a=Qf7=K%blq*Q8y%=rnOTK+@vEZ6cM%QSEA(7&(gU;510hu)X< z(`XI-nW#7Rp?_bO(kb5$^n8)R76kUag4)t=8Bv*Ojq}LW16EK^X;{2IS&+JIxLDGs z@zD)XUMhrhoajIYDf2&&^F0y5av0~O`&>NMPAt2|zctgKK|DB0`{b56`LG9*Wlk7S z(-r8Jkd}?|N}alFR{bQEO)kKcw`5fE-$09U;S8i=TEpRz9KS-^w|>ew+TZOuiX@pEiHcVH(sb56h_sID~hP)$EA=a54q0Zk4IEcmO8 z`~^8@%^4@ZrekUVWfdn+qX^I@#H~eG)(Ih5S}YsQyHW*QF1VQS0)$Mw{-W2p5QFf_ z2DNG!QW2`P%{*9cSgm09@Z^nfB!ats^H?9Qa)oBXbn4l~bPx#mJDW%;N2Y~jcXsY{ zQe6sab!-^CD8LlwncdytCL>rqx&%J5p0(G!_S%^UQqs>LZ-Y4SHWmieVXCWtY;LO zm84p8F@bAEXzV-X2ivizDwtA2ggLin?&)NlK5Vr43ZWtum(@&CJ(r+GEmiHBH4hoF zH6r7{UxFO4?3mh81Z38-HQ1Kf zk38Gwq2`7nOJ_XziB^SXx!aCC3|qG%&8<$-4d}VK+L5z(L^V;(YN1hr{qo4b$hg_N ze$w&=sIJJ>FyWQjW2}Y|-g&z5fc`qgDho6#ARS_v+u;O+@z5twtk}W4qfo+J=dO`E zl$qQCUE%z{_#V4Xo8Z2Iee){|Z(4-!Kma(CtQQXFwcJ6gVSz?gtT@v$vx% zxO4<*6#Fje+~f89aG*nkU2!=6I&4-}cgmX2|M7gk zB4JC9fG9w=cvBRuxd#xsQ~}&Oyd(S$5#Mw(fB&La{n%~|tuO{YOvpYar3naN20GyJ z2vX;b8@!~-rTu-w=gDZ~P1|_6;{Aqvv#enYf7A+ht`X}2-9 zP-E`jC)j>OTBaHxp+J=G>9-vMRY9YLGc)~fFx~mLLsc4aIe*M29a&UIMg>V*s}=Y` zy3BB-b~_M-W1M-C4an=KIKmdij0xBGyjaB^M1?rv?~a}zXxwn$xdPT%1S(IuE`}I9 zfp=y(+xbpB-hFd_7|hyw>qnug(pIP;k)`OwbbSe2+HpVAsH&d(-M18d%Frm5xD{d~ad zyK-$t!C|aAx^E0FUEaU>^ zC-XJ0*f7_h<`2?~1^mvr*wn~H7nS^j?8IY!Ts4p#zvF;~zJZ|>mW&wAIVfT|E;vEI zx{ zNDsH$iphD-Awl%FFhz|EWaEXK>XxJgvht(lDJf1x8ES(RbA76ur}CMx=LY6)SZP!A9><0&bDh7L%RML^4%|C_+sGbJdlzn4wD8NuMcLfY0p6FK zaK&{v&DxEyq#mToFG@UnDk@Uo2%_F?f9l#>rEk6lQKIdGh;?&$#oL8jUK7rCT%?;NO zcjDh`GEW`@*(foybeKEi2e(5BB>SOqqWhKa7}b;@uegUTUSN(D7MK3)<81%t=f1Gi zfz_0gyNbRFSJHfvduNwM3?7Lv?4fLhS!zGEP1RW@VGY{&F3xBBdTb5au_46tjF25(ONWYF^EDt;|knr)D6RS3DPf5xQMXV<&nJ zs%=)%Gcn%89sAB&FRY;qJ=aDd-J0E^=W^<`uY_FX&eK9dmtr)hY|Ki`=d&OD<{DoJXehov(aBe3C6*sWwyvg)T90gRgz zV1GEIpI4kOak)E@D_V-1S=w$}$i!i5gNAn&k9lZR;^#noY`WfQGOhPTj#Bqmb_P9M zC`BzU&vnH_QqY8r^LV$8ZnKuwi(C+_QE|*eJB=g@R%hbKn_hTANm`1!>EOVsC z(Ri;qX;bUXomw-6yeqBOl?X^!)!Hm|9!^Wex-b*edEgy+IB0MxKvQiMdusyHD0788 zYfvhUJ`BHrNA3X>(4Jh5u-tLp^T>paRzB#%|K(6}2~7~rmac)CXp4I-*AgwWjDXWc zC*NC;G+8-O-_BdWo^i6t^=elQiMm=a`^d{ioL!87>HAJsfLu7+vjG)k{KR2b0)vT!Zim3v9Mak_Ouv7^I< z{Ltr1O$hGX&oUpbr-N+S&O4ZAhRPobxNm$ixH6+9ffbOWa&G44BXLfOwB&k#iJT2umR=l)tefSuw_q|V+ZcQqFqN-v=o9EbAR08hQq@w@GG{j&=^41Ic*KAU>&z#`bG&7!@A(D@>a8ZGTnaci3U z(W*5ORa#?)heb{V8`ixx=G;H~I-I`J1QDH1MXBI6~>M@WB&w z7~nL1&M%b+bdSZCBv?erGCj0;az{j5a?tZ}aEitbhD%CSasDF{<#*$o1Hb75B9+4n znVlKsHcp?&NS34I>BE~XdL&$JN8=gQnfm1_>cj!P9#U*9>!^+jkpkFS|L< z5|c1_+~+HUa$zG>P3jQ*9^?&Gpjz-Kx-%EIFJjSewQ;he+JD6tO##Il;G=c5CO6eD)m+VjLs?rwr~1|yD(6*V{FUGan< ziK@er5$<4dTHu>%2b;^;R3@0o3$ET#ocRD%4ox*#*5I1G`wix%F14)knCj7Jhj{bC zofS@k9*W~Ga7>?(P zaHgAWyblYibj*}x%$5KSyMOUXXh;L=_eAc>=uO&*so%9tOq_aZeOU{L%Hg$d05px- zc}==P%CNW3-4$~QzFZ5N*_YXP)(<~Qh{mMiyDQoicKMD}As;HT*+Jkg8@OWfOrx|_ zpMH{z>_loWV3(vUU5ip>?9npdqolxO1&Q|4LG`n=y8$)c6C7JW`Cb=1uO<86F!e%o zaXU-+!2nK&tzVAFxKCn*PQf6}sTHonX(`=BIa3iD37nF67y23```>=)M?4X1_h4Xq zLvY^O7B7O<(8M99g5nL8-1>q7NFe+ zKY@a{&gn$t-6)7`J8B|^hgXs#y|AWR+$tPSOLsQMQkJwzYI#YibakFfBPy23Y+TO$7+Lc+2Aa1m`Uo2uUFUmSP|Ko7sp*wN zg)3@`GN6h}dUpiIndQ-}L*AUYCQpBYWf3KPiaCg8tpqUd5C?w(4!(55yg(iM2s<+jJHmz>6>*|u9r)+&1B4DOrARu8 z7z5&?|JBR-sXw~q{W@>_T)izP^<2G1n%#2g=|8gN zztdZ;Uxi8imo46#|ErgIr2eay)#;2?`bK%62D;c0(O(;N9!1uuzc!BceVCQcK#3)tBF)3 zRzPS166RT@)>fs=+ogPfYUSVaOkAWLBPgJZz1^2G_u6rOQ3`EQML^RUJlr(g=1T`g zFlrC49&+c*m=Dh?SG?n%xEed)E9;5~K97?t`ieCdW!y1)c1iVfB%eTJg-ao1GhFwI zg-lrU77RPvPZ;93g|vDiIBA$L`)*0Uk&jAZZawU<@oGF;!Q8&*GI|i%r+&CM%(ygA z%!+$;hzx}-=;KxY%>*%0L(QTjQ<|EnuTymciq5x&%?(wP?ji|YHwlUnFsJ0xQ)sja zGLA*2$1G}A-DfC7m${YLEm5Q-fRJ%SQ$b;|!s+4^zPTd{eWDb&CNTUstPQYGrtO&& zD*>TN1YZ&1h3T#rq5B7o5`9|9GlkJ9i5I+-l|~Y7HPlhA-(cqP&ks$#hF|eXS}C?# z+u@;_*9LC@tMkN*jT1V+dUfDk#g0?AO;5+=#GGpF?DC_5KEmihXo~0l-3UpY%1QOC zjTh7ro89tx@Rt3a*FqJhgx1QNYd}R*`NhGy@%M9SGMZiet*cDxaP7$mxp;xHN&dugetD=<9%)i;=#tlna2Umxvp3IKW3J?sj5D<}azn4mR0IxSQY%Y4Zj@{kfIKl2M4@65$L2 z%srx0s}PO0v9w<>J!vvP_4BGkN&$iOQSLb z_PK)T|Cu!>JVPfu0_m5Rb@guUCavD&+r#Cb%dd6$sN|dTMw8?BV@cTiF!(qoht4Uj zDT&7--*)mmzavp`yL;GGVuq-L8&!-ih4hW(eS7O=$!q+qo#S&S&DX|b z+Z)@qv$2hht&Q#MH@0otwr$(C?L4{b`4@g&U1$2$%!{e6Gt<{Op9}x>z?@d$3#fMg zoqS|64$h)kB-?I2*K*jZQ|E`F;TOw)=cSBK?F3QG^+ogUXM5wJ@~^95;a%ENtq$#b z_iB;+uWni~Zj+8vyKN7&R{~vZJj8=G1htsR4);glB>5gVE>=g;zi(z$1G-0O-scM) z{jLZ~pUFp85rszy+IJM;MgjD>T1qu0l=}GiZV)}w_ld|H@1S=*` z8C_EKK24!0-Us9{l#`D1pi`OAQvIy~^3+|+bVYPpr6w?5zpMTYlN(FTN9sn^_RegX zR6R}>HIh&0up7a)O>W}Wd_a8o)-Wcoh>S1C1_UFmSG$?VC4JWe4-RH@4aO^_R;;cdB2rnphh1ZrF zWbSR6A*x9T8)~$F)=M`Jesr|C0H`(hu^Nq}W4Ng~i90H=3Qnl(b0OdW@Sf;HGwc6g za&6+oW_r$|W5Isx(Ha{Jk3wRD*80_-&Lpi{LR$MvXQH86-}$rtTJV zipf^RWlfQ?AC#>RG3O8~B+-BGb|aW#l~tEZvw?!rt7-5@33|JP$UmPJj@9eO5%aLw z&>P2OQ&6_Fjx=3rYaih_%F%nWQrsN}Zn2NHw9aunicNd0G&vNkK<9a&7Af6DwcV14 zK8PM;&9F=4eIQmDlN=2N&F&~iurOiepk5$|(gVWOXqUy1{;qx=$Ay>caOQQj)|}7= z(2Wgl7)DPxb^6$_NJjYnb~<}gl{Orn{OdCKpkFMPY!phWRNH(dE?j#F6Q5|e1GsVo$5d;&o0 zrffWdePvEFK9844$LxtQc89^qqz;XL+tGJ9NaaKPC7hTN#5#J`z}ql7)K8wubzU$! z@Za^vCS(FW`wJ3rHCO@SWfaY%#nh==1A^ZbPbQs{^7Fc zK*x9~%2k|{Ya4Wu{B13YBjJR~u}iKs76?lM&sO_4$i4gvmX2WY=a>(elI16yK4g=~ zMn*ireA9D0(31twzm2VpLu=_weJ|dt5ofO`sIzmoF-LGG(o3^Kdr+8(t}ZZyitFw+ zje|)*_aDYYSN>u(>gholDW;94W!&}{l}L>{o{`O3q6G~A7Fk+9dA%sMTg34QAq7{i_$z+;M8B=q7KUkZ*}@yM^2)I3@E4iXR`qi=HB}IWXbXe zQs{==9E?RoL=4IDIJM+rP!P)aKSYBvx$-;lvby5}gOTZ}fcIz| z`o!Nj)1(wP{PnVG?1z}2W2yA$J$#rWz!|fayxonzrwmwC%C8YVoKR;8Ts%lZ9&F?J zP)4ooiu=>3?Iog)^qt)}`Sj93VIFjJ@ge{8%cB4KUM^3RW`iu}#;^5w-+<=`HL!m&*go!ud}80OMnJB$*G$yK7_Uc+!QV3fY(@jfi9Dc0`N zp?UK6`%qe12hH7&Tl`yui!QNSiU^P_;NDgrH37a40 z_MKFu)Lf2>5>rSK^K`OfL64G0C_oEzD!#exb2SPN1`<%$)ow{7CsxtM0fIx#Q`pg- zh#834yk2UL-1y;SwYcKPYABO$cVs$H!t~;Hnz&X24||X17JLsIwV~&bc+&`6PYJ2P z5yX?7(xLk?&~`sRzyd?S#@@*=QDlBp$f0Xj@+W$|x5z`Za{&o}QseY)r_Z&h&qhGJ zD24#s8T90lCj@)t>jEIGz2xgoyz&Vu@71K+-pGO7`lg?z#6N*Q1an5q)>v6thwfw4 zYX4yZ2fDPNFa$A;z&wEsV=S6jwF}J{DvmV3#r<~)hSj9-ED~Z3N?_hOCD(>mscL7M zlu#nuu^@pOqVQZwnRX}2HR$2KKyH$lr%xpVY(SpD2GQ;|dXJh;;TFS^jArg$;fl9u z;fVbEX}xXZ<*W63or?9l5MV(d$e;;s{aX{Ddkg*M`0^KLdsV`V(t?-y(D`gt!d^=m zf%*8SwRFiM<6Jt8)Ds5BjT8uLK_TJ2uSQA{ z%0F=2XJYF>f}qDN9iUR!JZ1}UG{10;0p1B@87v8qeE z(5iFuG`OMhRKw%T;5)vZtlYlhGKAJlcMQ~=kne7Lkeb~$mu33d42;WGs&NCC5Ihz) zu#q(O?KE|~*^@}nb{W;l7*GIN3ZRei5ncT^b!H(aU{m;4HEcY^k%Ukq%C18E&BKuq z#03m>mG-EYLS^gGc$~2k6AzPZ9SOVmlS4ubDIR#%(i3fAyr8GGCeuZ)3iYVDgD}nw+^&#d8s%;?Wq-IDbCT`c zg9y6v`_uSEk{e!b*B{IxV45pqFIK)>^r_=USp{y>(vZm;+7j}5#IW?i;31fZGEtfZ zq;)QkcFl(gtk{pgg2NPJg^h2awigOFW4M~M9t+jWF#1X;2krw)(fi}8F7fYv@kpL2&jQ1Tgso)+WqZ_*Mh6ww(Vs1oq)9K8H_);M*^Xi}9g8Y^0p zV1#X^1b+|M!AyOf%#*#yHWRzNcRAr&p-O9XJ5e5{x$=q zAX5p*|8kc7+R5k5I7^hPLU!);RZv?j3lnWLKi}dmq>2A2aiT>Is-Vs)Iq#6fEN&(XfIva{`vstL*;)1GuvK~fAMxgHQ7imgMz4V!JAmJ#dXxA^V_EdJSg z6e{F85a+3^C=qh-XplpCGAaB?=tE2-hvmHfa#QKokUuY}>@Q~oZO zg9sl6Hqdzm+)sGi;77-K()1Z;Ew21cVu)B)w8GphkSVwE9_|7Jv5HuJmC7Ih^C|3l z+FKGV(%wbZbnOP+>L&t>mb%1teb9MQ=~R;g5a!MKVdCHx~jau5`zQ0Tb5tRQAvx1%?^ zlHUAJo+pa%vN)xStNHz~QFYxUKA`>1Zg3oIADD(3qgm-v3aZ0CU-{5fv^tH2TFtz> zKBorBAh0k1X# zs8>GUJBPYF?eDeyZ;6%h1duuYI)J9}_rl#lqX1E*oQL*=i=`omZjygeBWJmhW_FO_ zr3FCFo~`uf#ZQj+XeQP@hb#Lgvz6{T0%k4j-tY9g`_dL3e$&0Oh}3&MwDyLQR0~vE zWUIFVPND>jO+xV&>*2-*<(P#?taAA4ygDP1@s1=u7n7gQ2&wF@PmS(?M* z$srM`)nh!(29LT&6?34ibA+L6V}}o?YC}qZdOAOF*}*CI1>0Ly+j|bY<3Z)XXUej5ao2l5OFCq&X^b` zABOF5dWsw3FK&O_4=lQ>d+nA~4=7A3(yto~h*v+AGxZ}C{)u-~MK>=PRSfm;2w}+hyx>Hy=WN@E zPuRHO-^kbKB31%5!c>x$V~6-9W&1Bh*E}_F%%K%ym-^!}8P+%y!I$Ib5$-xhbYGxG z_RC@Un7nH;jSFy`$a`@uv5NhNvvfzO{!6sd{Q;4yt*dO^=^yqzCqNs|^754Ki5rG5 zf%YR}mMhsoX3t+7W@~2SfrxwipZ2~WYJTO+@Q^4~RPpcORohwEc?}?Z4K{SO)>0Xc zxy7;BJj+ODKsc7{6?SWscajYLMpsv(qmLND3N{!!>{{(M$6H!!v`EnAy!uyl;uP$3 zD?yh|9q>hU-dOzAA?*bK7t{OHtFHFIIWjby+nm@di1{IZ0U`@2X??IPQ~=5-EXxw&f)Q+AFW0m3K4zTB>MC8FpQE{uQ7?zmC1AAtL=VV zATA!@CX~K);{lQdr2T_W%>jjc-C-ciZ`S z^pl#yR}mc9a53&7Buit6B$|+A$w?$(uK7(47Sdv%X$(qwU(k2~NLi=C9?8uStw*Wf zQk7!+E#~1b+3cSs*h4HM9RVj~L|-bi7~g0ze6O0VnenN_i7d8iTH;zRRrYa`O3q+O zvse|~v};W>sF{VouerLZu)G`cKD)SD_tXn?66vQnhxgc7>a?&y3IAc+P*)ktC}aPU zB3-A&dbGc~>BsGK7pn2MK$Ird=it;f^x}Rmd}*d8sK{>^*FvYj#bTuL!kHIu)`N-76+IaqdHeK>rLgjZ9f_|HUwlHR(}bR7=rFDp!nFOff-9;Asc-qop1mv( zFHj~vAVPCt6WLoHoQbY06bv{=!z9*;*p+U`oGjSc@9_6hkcxLE*?t1cCeXCA@w(ME zyLgi9t(cubI}H1v9`N8?aW26=TJc;7`oBRq*q)qFWdcfb+_$Ole%aRtDF({tFqU@V z=4{!{)8SXk2bp2zZOR$j)c7ymw&XU&bupGHQ&H&3j)mI_5 zmam#fiY5egNeV_<%1vT{6L!wCh1sSs(d2dG46>FvVC`#obgqlanFj^Hp|nN|1+#~5 zGKq0z12;pjng+l>A-yh7aiv%HncDzYc7jn)8U#2Dg|0~HIweoXlYWZO#pSasCYF3= z4&~x1jZiHm?8DEZu^4@7N$&0?I;n(NeilN@K9<;TT+{Vi8^1t;%z^1T*yWk#%re%*%aUtv9wW9$N7 zh#^Z@P36Wp#q$xsZ>-R)K^9A?S;HJ*jkA`(pcx-{zQk`X+lbsTn#$QBnZj4uC2-9X zkEehxf?}ZWKoTjvHit?M9T@7RJBn8wpu&j;xU<6one2a9vu^E4m#yz~clx)1kuCyO zA^qy@?@T~Kwj3v_FCvhib?$L5%O6bvG}WtMEGiryXJgT%9BRV5nj8R%PgoBJ_yK?4(DUH zk5E z2p<^|N$X(KkzS56He5WRy(>j&qcWg&^Vk zvjZMp5%G*qAo9nFk^W_Rm8g1~Y!&|gs`NAi$r($7hO1zMw6YsPp@y>1)<}=YvLA)j zTIo|P%IFtm-DU54m26w##-^;UacLqV7BFefwN($Q@D&pBc4R%(^JSZ<^7QW1qIlqm zeW26jp4Mp%*Z>@20nd;OVReD(n^Gp*eOvwPE4*vniOaIE9$)@pB%pjo!P1uFbEwX5 z*zu}}ZNxzz-fgt|8T(k+GwTZO7;ANZ@|&rC;xor;#TI3!S;6XpH#*2iWQI zRbR&}D+hDb`m?7iAbt9_2>jyZ2B=%3`2*N)0Q`OVw;tCEus0YGgWy+>#!n%d*Ql?z z3=%!hJMfQ9fX@Nob_e`LYCtgin$W8Ki;GiF*vr$3=|^dQ7p9)o5C5uE7FzS?dHMlW&H{SdDQG&I+d%HKeK3}QFi%bZEtnqIU!LbO zuyda?K&_jIAHe_Oe}muH_;hXsCxO3r8T#l+e)VYfR&SPwex;`X=?wY51KT9lKZFkE zX3Hdw2``64K3N;DTs?SWaC2BKaI?S6F1op@P2=GUZ^f2Z8uE-Q zF{!uhzSGIRM1GfZmVxTOa)YhX75I&s1DM!*4_ogYj~zxlfFQ5wnDw zuEFNEP8=4rht95@2F)7wM_ccp9x&;69Lz!P@O@Pfm9zGkpr9^3Cn$ebsp8mcGb^^F z`I%Y!p{2r&C%P$3C8+Ku!v>Zl`8hzKTL_S=Cggc&F8@g#|I&1>{If0I52oLVCx`L0 z3~TOAoKZLay^H_zP|>-3F_9^rVTc9;;2Br9oj7&wpKza_fVi^1op7!TM*fuDirM!E zI%jruJ}-ojaBSi7HGCtP@{|)u`u=9#4l$L_;8Qy821%<>@~GqhxmI0{R6gq0c#up5 z+9U&9L!&q0*^_yf40s+>>b2-><9&A7zuxN&K{W4NEiCoS!;LAXB+VG}_wn7M>R71s zk3qA(6#FxKR{RUfE0tjUZrp_1X$Y`9{zW0w?oO;W)HHdAVn1FnJXx!8vOJPGo^?RV zSkyKdwsef!Q)x$%qPeWtWZR2w)1y)vnQvo`STR&cix15iT1Y>(LzsDc*_#I1A!)GAHVlXOwGM#bcg=-)~ z-TJI%d>y=4Y-B-~Uu0E>kOsqlPHsnd(z1F7EU+6rDLeKTY&xA zzr5mIaon)kLOxyux!HN+#j?MX4B5uho5h4J`|s}LcewOH`akWiIGMuFIAhW&YRQU< zBxfIDOwhLqLzhYLI_;?TO$7_<06y;uw-NKX?JUQ0sN5jfeMjjJ{-~8H(QNW!W4TfPsk5ZH{ zDJvWU(CXh59t~4l6JIS;6;YcYX14OA;9IujtU1-*k@ap2E(B30Of4JlAoL+7Xfx=R8DIHv5%-qiFh zAy$lK3UjP8yIF!5-smHsNIYMmAZ(4i_0+*rpGxxs<7r!*TX{R26V#=Yvuh~ zis8R|$o<;z{CT7a7Y%`|!*fto(pc6mX}C^aV@rdS5wDIqinlZ*s8gRt&0Hwgh!@w1q5jt1YV;DM3Em#2nG$%JpM5Gp@A}yxat7ux^uRjjxg`9%1aRq z6Fe^FfUlfgU+tN;tXy{;kG0(0xGhEF#KL@EUpsNgkd~{7uh=`zt3elfj=B~CIUG1Y`slCt= z6O@s-A>jOf$;Y?Y;#hW#&5?{=z|sH7;L7Tjw0@xf>poRs&2j)GH12E#OEWhh30J-L zFF0_}Xg;#drwJDa#>X#c96j5jAa-$(TrT`vg)u1mz=2hW6~vy>X1MN<3H+4&J^Kki z|2;O+dWj44`=Q%gQN%WxHj#wUFNHa+VykN8CA@9OzPq^z=$rLbagp%P^}8CdOg7Vx zm!92Wpf1N2wV=F4PWIdLVR$J{v(1sWZTC2u^o1ID{Y|=#s=MenwfQ@b_O`WudVgNj z=8xU~K(Q8QUZ89Kc%1h&gL;l_ujEb2HG3Kdnhb$7->P{cq^HQ$S3QB7Y11ugROG6r znbpdDE}S_V51KjY7#&KDeDrDJp}|abRp6JOu_e;$hPoD3??cNTA)E2t(MWRu6s75r zZa(b`WNW{yw-|0{2+#yzv}YQ5XOaUsyVd@-RcYR|%DO3JXZ>h3b-?agvT-*j&~CPI z4g@S-%hzgS!n@X0;OG&NhjQHp449pqQnhhZ+j}xqf=GfSqR{dkXJOI_1Uj>V533UV z0R$jXkti3f#GeK-_%z#X8uk%BhT`+K5gk>9#_tC1k`ZQKUj?xs#yqgYvRSMA`YdZA zN<89*rvb$K;iR7NF#6$taL{Y>r}qT|c^_p)d}Uj+E8cjnnmj{dqfoA^%~~mamImDaCBIw_xD;TfEQxO|eb7L%whn zsgYo+^&61i^#~Zx%wEY(xF<`MPkqK&)bg?QKDw5e(3Whez}qMA_c}`mDcua<25C2p z(tahZ?}a?}?nme$ns6(eaL!Nh-paxUrfc$=ooz~S!a+gMt0G3=1_>(XSEok_M^bkm zVjcxI9Yd@!k76aen_h6sgF=8B2+`*+=JU`^cz=G9X34**8a4IA5a??)HN%j63_M}7 zgW`@1X!|L6_wFI8HE)SMa0W*wQXJXRlY9aEWq-UID1(`pkJhAWG8r@mAuO~61K6N}7f@v|k(rez11F`CZWB%qx%}(m6==AG!vMG*pKD4fuIM4_O zW2K;>MaU@bqF6y&iyfO6>A-a6Azq}NwRs9yjN;_41kl?{(BZ-E;Kxz40{vCE)(M>g zy>S2e=-tXoLuDk|5SUw!G$$yUw{*_BdB8V+1}hHbB7N0Z(R!CX^kdM-BMtyXwtGES zz%DJwI>~?kQU)pRm!8p>Q`bqP9PAkI&;=(O%?*t#yY>X!8tDsSraA0a`L2J^pr<;m zb$<_Bd1RzEX%;OVBg}jPp5e=SqvA-@d|Z)UsN#djV2F$6&EOA{mPP*e>U{_VvGO)z!Q=1PH#uS74wfQBv`iRg8SL`;f|QX^5fYn#QUhO!i&uVa zo-KDq(yI){JR*p!&uU%O8Z$JuJ;eFmUVGr!@xB8n`jQLwN!ohKh3^Y~Ry6m^woy7_ z2s79g!!`g~Ldvgz<|z zad2a(2zYx~{MBKyCd*_{~M6_1U zWFN?bc^8#*g|y%)DhVMR6_h`zQrLfOz(5<|0QwQI$TO`Dy6jpAB6$d^3*v^_My#S# zh&OJMI7=m9#kwFfdM6*ni1 zGADyQ-P0y*X#MR}zl|I!c9|c0g@f)?jX6M>J#_mZ96DGwb4QCCZ=+@fku;hxR&P0> z6aC7zIX5boqNo=6ip~8xrsrTpKUeLr2T6&Lm~$}t&ETf%W7Vu z?kn*p#)0G8UuYJD99(_caLK%kX zwjZbSR5qUXTTYdYU&8q82NagVwu*1!i-SZ6A(VRZE<*9ozlZSOtWXLgRWmQzBtvxr ze{=63#XR&rVt%+c!c=gO(x1JMn;^7c>IU89(34E~j4sM#78*3fS|MU~SaD)(3Z52= zJr}AZ_$FWYfC4qP^60jYbrFH`bXTLd#xCT1e3A9u@k?%@z-lLkPEk3QnBC^vZNrn) zbvAp)%-L2d>o=j~t8dQmUw8_yg!{kKJ3oZit@ST!{?eh=YaK$Evvb&JJJr|ILp7Yz z%NP}&egj91npw}GQ}5+<(<52YMwFQgW=^SZDXr`3lqEDWck+V4FY8NEHHXTM|3ho~ zqU^quwz-dg%)4r3Q{du~A!Q8le}*f_y3Y=#*#`tuXSd_F@JrM_X^DqiEV4(6F0X`F zw-bp{VPSs{&eA3rwapSDx8{eNJ6X}~wx~>3SK@hFQx+R#--!vp{uu$Sz~`|m!_4*g zUrf*Mt=*Me?^;3YC?&5OqY8yV5`)_s@s!n- zJT?qmQz$X@-1&S1t6ntfN-Xu9zE1oQ`+KO!_kYG+^A(4KyZm4^|WFigrY~g^!xWGf?0w z@aDVS?k^|V(&>`k9qz4#q=mGFoCR2rm62OeP*YMF^HEW?(hA$0UDlUy%nmX5~t-)L4Hy$-!HBD<- zR!VC*R%)rDs$#0*sYI$Ys!XaJs)DQHDUTI5syVAQN~&rv(v^pnhnGi{i&be>nN~Se z`Bg<#9%`+%bGK_YlwDaYEr~3NE{Us=XwYe}XmDu=YKW`f)n1xpnp7I9CbNZG8d@5j z8n@>=2yCFJ~d4>Ej3cFr!7h^Qft8p=nS-nyW(DAI!qnuO!4Hniv6%4 zt1dRz+9fx~8yjL-W1V6bLgu8EWai|Q6qFR_cndrw%_J=)63Hfs*VNP0+tklg{+g7U z{xzdAr!qg)Rq8CPFKjH7N;*okDWg!uEQ?wsDN9bmc%_>_~Nh&*5 zY5s#+9=F?Mj}K00@kb2a1u5ir9cWE}&rJ-T2xJ7j^7kI-;M|Z>9V=u?VHzv+ zLI8ACVKpmkQ(+4$yk40;62F!zQ&}1mwgje5Sv4zs)1o#uWc6YVE3!#>A}eaz;xsl) z`{FV-?3%@8B!sFm11nBMk+C@slPs&bKxvVSxv-wBxw*K#Oj$-uVj!zx}> zX8O2z(oo=88D;=e1eD_{h~*_@Y`A2y$Fte@cB6wHep>wBCBv3l;2fd%PhhSF-+OwQHZ@S zk|~X8B+?@hlI6KIJkk}7Dzi!{;j6RUD6;y`1EQI){%+ie{E0gEBVG;=ZgKh11keLX z4f1#^Nqa=%L|mN`dr_1MS_)L9WaRacNmKHve?l=YGI<0sU5usO8zJJY zF|;YlT&?BrAfjRt+xZEyK0-={6;*ZmE7iP6Nzoq)SzP-R@eqOazOb_;iBQZkvROYt zzN&=e*~;wcs7M9>_0rnS0Dh>^Hw){mNHBo8$ir0Tar)O~KFhYY+0azk4CBIa!c zwod5!NO-;u0XqZ%H4Op20RdbCv1L9P37pPh+Jl+v;}X=v8tGHkDAMB=uP=$4B<64! zaTE`3<{#=z?z{y7zZL{r2?v`B2U!gXvBN3rV;51vehpl!iD}A-y&BWT>h!p9;qPJU zx3&gxT?fCI=B|z5?Pfzo8(y>CDA?o(+~^TgMFnmh3Nt4nw}Pa)D`;v-;pe*y_T2>i z)j_e*^LLeE;b@pov0IBk>FE8z?iKL zcAFK~NEi2yy$0|=0rQ#cKx41l=)hCYSIRPL=^yTj47CmhD$d3jJd>Pi9h_#<&L*2n zU~mfTvI1Qjj)($d%pr5mEw|;)!yg!>i?7#m08O$*^$j_-lbz0b$0|2YcO8TmhF z!l>oIc1@^Lx{ezGcAuyk_~|srr4HoAU87OM6Oi7x?lQLqnu!w9tI7IjL}DSJJoIfP zB!m@q3`VvuH@2%8lqKLw7Qu?fouq1*ZANGvJC#R4`O#wfzJv|cfk2#880H7Uv3c`| z8`7r$akE5f5k5R054ag3(rNTv;8h5R88GNZxb;N1$t)Ne?O#bUqPkY%;q0V!>}2Cu z{!Ygpj2@$5wz6SOK{N$c8br=+eite2SXO!>@D9sXCOPh zlxa4lyFqwD9B8%(BG>|$3MMy|Xw0a0#bRRx=SH=D=0Hjj-Qo*Ot_YUy3y zZ?mmwt!3?^*d%uOBFpKbh6A*ux3B*0a61O@K))T_rTg7=+&h{U2-^geMvuy6k1jyU z>R_s=ZTWl#G`W{e%dchCtr^gxmD1HmPc0`;YfT?+zz)fDD&<1oxYX|$MFhfZM@2d! zvhElqBqVz6DC{t~e#WzB#FY3i_@1b9{TyHvHNroJ%M^5N?{qh?GNO?a2s{Y+J-8>J zl~*U1Set!gW8=z$|CYnyvS47(%`VriK8la?mOW?xylLp1BT@)S8HWuAV3EYKra&zK)`=-fq;P9 zA%KAXTY%GArY|-vzfXyiInL=6x|eBM*TNBENC@IsH$@@UxJYX_r&%1qSqhEYfZMA{ z9yU>;E2}nxkKO86aEZ+1@dHElDA(+Pk>WzAFK>5yuph=*mDDW~QCAcC2V8Fc*+Cw4 zV;C}Ob^+nScF-B-{BycmZ`Iip z2j&8V-%$i!=hV-Y(Yzjy$;`3ms zSOz=Tt_m$}C)$n&P0xdt?@2f4Y!qa^!2OKQy_@&5aR0STyVl>Wj+>iL?y04d+Z}{y zVf12DF(;$geFC?bYaSNx6>g?Jj%~&$ZoOSRh=ig(R>Y_u^DsPokw3AoHM*#^Q7YX& zdrYN(3M)%m8_Nqb>WyDv1V8>`YrkIXZrTxk3w81DOm^mGzYGDVsiWxK`nhLn;TFgt zMUJr=$|Ysw%kDM|a?k`=ft7-&q*S4Vn*nWb0wF9z;frVZO+SR@v9!lbKYzGdO@Eni z7QcTY7fL+8p?R)QI_(9?k!N;FZ1+yTG)R4Z#cZ|LW)_K-w@4wuAX`qSMVu1N;U`B$ z(}RBZ5Xq0{{wxN?A1`$2vJG#o-ZA~UJ`C>|uEj`TVem!IHV*V4XX;1VKiBp~0qtg~ z!7YI6Sg6`!e7mA-TO5m75ZAjkP80=1R{T)zG_o@01H^0wZqDF-Z(d12gaKl}+rNpf zT-0`NHnOi^C`SVMx#TR7!w{_H{i_foZ<^YZ5Ql7sy_b!SkcPl=M>gr1kEi!-3Dckfu4pHf5{G}hcUHMo~WkyhdLq$tb>HC|PHp)2_&Zn*d zf7fQ#n_{_iV7XKo%+zqr2@?|XQc=K23B}bEG*B_X$Oy%gOZZo*7tKBFt+L}d-iZX^ zh!m36NrrPRh00l5k(a1c>elI+$}tC8M~4eyyog9=cFs^*6)LQ=Q#-<{ZA)R)14SLxVUZrMY!KVMAuq>jDUbX7NB zyJjyuZb0O)GS3YrVX-{21pLyG+0FV5cgMGG3*p8$s%cyaqLxdOBDE--Aw5~tm7@(4 zV(N>WEy7Y=5QwDDpU_8IK4xigcJ80R)Z=Fm@o)6^pdU;S+3YCLrq^+c=GrGoCe~P^ z*Fkz3QV$W!{>EIiu6Sz|Y?P!0o;{yu4m9e}0VB#2S)l4*-q#?xm6eqX7zSbaiUa)q z*dxoM)%mn``>zB!=*I>Smkc`0GZ?0a(9+SpOP79iaqQY54Bnk)cre~oEzpY>95O3C zs7gZdEU&`RR>1eXKN`=bq;V2-eu8WqT3|4Q5uWg>< zXDdNN{_~NL#e$IWwcz3g&?f$)0bmp+KD($3h_%N)rZV%)roD{%#@PnY;3<*;D(RuF zm}jjA;p!ox7zwPJ3bTKO1`CP8r7-9y)f;m2=3+z(f&a8r4;B)HD|Dm&W8TI%d(q+m z#-&YK+@dQpTq~k0Q(CJ@TBNd8N?K&HR)@9lE21lJ()wf9)O2fYgt5eAZJ4wa&{QjJ ziPlsbZuwhF9i7SAx^8Vfu<<$EGNq|C+%lo5gRF5(OS`afLQ5B9ZKpKc@-k_8gRZti zOMkElPD{VAiHNR7X&s!d#&8`8V+CAB%gCx}XxBP(Z=Ia3&TyTKt{&PtE@_p@Iv!)y zr)h-RaGl4b$t7GL==*1o$#MJxj=GW$zT<);8G@KB{K<10h(Ip`h(N$Mq(6DC9uWxW zzXd#jXXjI7(aJZzVdOBS`r~ty<&ULsOBaQ&+&92WnuwH2O z_t({4f+Fj|-?70PYhH#MzNcT!I7yP85%|gsEM~7SJ;>csi)x;NCdI9Mtvgtb2dQmK z7Q6crSsvxw9W@BsP8U3RBY4M{9?IVjt`&?_?*i3rB8v&Xj-3+x{J0xq-TuP2Mf*H# zlD3Fz%oPWlwTVRX|Gi)`#DI!Rf)}?+L~Pt7R!=Ja3TxJ$$ffoR);LZEt<)U_w`PK^ zRB;;i$ge=QX)%CRgQDd%YBm$h;R$aTsI1HtYwue{SczAwMP)T|O~>-}4MRT77ELS} zyAmTh9J>-HIs$&ssue{Z(J)sCpnR>Y7bO~J0#k^LUBt+k`PKC6(xU_i**X|l!)3s< zy+kaleT|(x(JWf$OjYnh);l1lOAvr*zy@1#@pH^{UJ{j1d7znT(>}QY2of5YTRi!! z)_VPS@zI7x8A&HH%iH;=?WYltnDT>JDV#p8x+hK&Qo4yt%I^Yj$S96(6fCz-pPaPZ z6v}9Sr*>^*-4|^2-_nnxkKEEvpwGp%|5G`HDfL3nQep6tgPCSjHGDx=q~taO$@43U zt4zApd$VCO&1t;c<0?OM>a=Y?_wLs9QfXTfIw1=lyj2uBjTbs{E0JS6nRfiM_~`zL zA632eC3)#xsi*g6=_CU77h6UKdRkj2LFY#=rq7oe*ys7^ddY`tdb8qIC)&$Kr3ti` z+4Re2ro5Tji&JN&ur~L{nhH}ssgsDSGc@?763?C8mG^t}{`rL`{w!$=G#-wx7ejQ_ z5^H8gf&NdI-#jXb&cahD7Wh{Bv|^Kf>tYM(;kt;q)I?LrO=7w=4EXSETPBM|U{8Bl z+N!_V*+1Bzmajj1D-1F+F?k%C2hy>X$bUw}=d^^dFe4|Olm&QJe(u(j69-eoI03HN zF)lsB%z(YDsU*dqE0?e!6YY+iBQM5Se1rfYN|I5)G(c#y$G|GI=~|Hlw`AFN&{3wcRzrRWYI_{cFAxuzU?V8 ze$_B4#Gm%}eH(>gPl@Rds(>R!&frN0M$)$2$Yx6GhEUgZiPGo1o-=lN@+j&Fs-qto1s^ zr6)>?Yx?hb6`)w)1S6YY$pm&2gB);^eH$$CBz99Onf+X5lJSn`TJD}^HC&4O26^Ih z7q9L*j4|Sfk9$NRA;zV2f|6?3(!yT}BFZ6Q{)d$?s2L-vJY<6H{y-kcn+9!&42GGS zYp`I@`)0 z53VUp(Oz}YK4ecs9Lv=!M_ZLCq=GhlQT6HBckM?S_332$4s8^UY%u#a=yb;1R$@r- zomwiekYjyDb|O+JTfr3rI^q}tfAq(|Tj+SstNGkit_d;Tb5 zZ5(9s=uR^V^$cBy_?o$0Dh<-`cWehj;|Nq}VPd;5w1bbCye}xlC@94&C`IGGjO;M9 zpsUZi|& zq(XWqr8EOMvq2c+oj~;UK&Gc%nb1zN2z9%)rKbw4RI_HqCX>oF!D;Id=qS%0O$xpL zon|Tbx1)oaYU6SR=E(j!o+41y?|m9$0znJ0F5P-PT8>0Vly&EHxzOyY`^Uq&jkuo+YKWX5zUcd}>eEMsWLC0o#@msI?@&P!=spQ=ojFMy=IYT_v zDT15}IYp-UuJMUGAn+IH4x&OV$pm4~pIKQ1mtNB?B;rvidfBU7PDoUa ziTKmIx-V8!4njm8aKODZt)=i2jLkvY{{g{3KEGz}OYTcC@F&DCK?DCik;PsLIQk?I zV~}4)4~a-WwY9bX5SO3r{|4fp|NEv2)x);MhlATFwH)VMa<$UY%0xhp;FYFG>X8s5 z)GgLMFI8j$cPc^2}I1PREU8dySZs*3Ie1HFi*Zp zt!sIy(@_t*U_R)KSB;E}UcMPe-Ja;~K^YR(wJ-ZD6BF-%+LsV@Q#QR-;~~^2I-|(2 zZFQcWDeA9bC6AFkY6NM5gRR(DcRko#fWZNh14If$3SJNoUCy(Gxp zl4*YLN$Ggxnp^TsFC>#n877~4Nt3%I)8LY6rb(ycl40W zqGXz$IVPt3lT*ng)U~YIgQ6nLQc0u1s#*wF23*~)=qQ}({)7_#Ccon>+2ww@H_-YKN1PeSAEX|V zM)*FFj}@Xv?}xsT_5-ky{$TvcALkFwk^X@F2_NbY)RFd-?I>v6RTG^}X$~<`-V3`l z7j}b+TNvL(95^Q+?UyrzCB>qvG7S|aNkrQ(4u!(uc_JW2t(U5jH@?9Ue37R+25fEQ zI~oUl7%YGIkdMnu+<@dJC#)5cKTJI^F{zu>4^boMhdm?vf%g(Squ`ki@Lovu!(Aiz z1K>@5^o!CBKADE?R5jrq5Mdi@1?7&5I184YIdB(?xLf0=_T(k@(@!fn`gSa_g3aXw z5(Ly@LkFLV1}Zn7Ww$I~@j@ClQZeb9JTt(`Q!}9GO;d_wwO3KTZH&mN_(q3Dei?Yu zaq)Ry-X;Oy@x>#;0y; z_`O1h%?%@FOb|k0HBdhOXod0Qs~NdI)8XtFAOQMkI3YhPVKPATs$9Qv3zf%2;q@|K zzbpsC&cwdNvb+@9HX!?zK({WQ+jOjrs6A%EQ=1#Qa2pF@pbP-*wg@mV9a_V((9)ll zf#r%>*J~P3NR$K1NjQzd3J(t^Q1rG46|E#paRqvGv7@1Xbcg|rtfZ4wYPB?yh|fCo z2@xHUD0gQP%esV~?y6B;CB)q!!&YI(SblH4uuU-7BSyh?WM3jxT2R2w9|QRH#Ij)}X!fr> z;}ndJL36`RNp05Cq;^)bNcOtp?LeAF7&EG~T9Ly(TP?C9sU&&P2ze`1q&(yGX%fjJ z*{MkF)*f>Zn#i+`uMMihb5~LQh}dFKkkyUdlrWpr1C6FNU;0lZPP_!L%f|q;P;~z@^b>S1`pB;<<$I)G1%4d@rVy9 zt@7o)wXKNF3K^-Zj~o;%e7KnLzIHz(nEaR+{H^9bWK4MfJ0F%zeq0QE?dCpgOm#kX zKQNg5$QbKwvF27`*CJy|9LMGg_98)x3I<|9Fpv**)(Z*YLqVky1z~(4+faMRAKRj)VEZ53A+66 zLOF7v7b)3zB#7I{a`({YZ=uak0exBw?z4(IKZF1oHP@ra0IdR~IO9*~Ce7 z-Jm_C5=BdOv`s6{I#iK#-EOi}iNZoYK^?19drIhHqFe8VH)O2n2uip(59 zIxEY!(`j7%a_vHgL=d1)a9jAh1>#WQ+t?;-J=l5kqUI^^a?Gc`lV?I_eQtDJ|C=si zch>UoEw3s5U(3uLDKG8*WNuP(p8p9c z_j}Sda$%1dm<|MY+)1f2`IZTbqv!_M^#^<{EBykpC&*Kfl(Vig7 zo~-Azw3;1XC3OR$IBw3?ve;TpSi!6AUSvG{evBC|WkKE&hvs!Kc(^-=W<;W2c|hc| z=JUA)>7e<=QZ$U!|nfA=o` zq%|_!!JYC{&ACT6D*LR=Bj*8@Q3n zsux<+tB#SyQr5b)MiOH!TA~!sGOJdw%=f_C@OuCM{`b9^yCjojo3dMNlaXcXdL#)2 z?xD;o5*KqGE#@M%DwiVBfB?_AxX5S80{}xIh{zrYNW2ID_$oWS2X?lo+h_F+^lE)S zuj&}Ho*%SB_SEAW>j(aEn=U({&-!0MKe*;k>T@XBSy@5<%r<6bV1MEd-jIIu%@k1^ zrPAper_<@1_G8aH>A%i5pc=y#ga6=+c?6D#{(X{yN`wBQi+*xB?x+6@f831H6i25c zzw=}1BhI}rsE-HEN2MdJ1CS^m`l7m>_|e6#(H#q3cZ-VlyUMow8Jc$oLFs&1j%PFj zEQ?k_4a@1Fo-Q`gLL{=47*1L>6Y0JPzhF_d5kU@Kyv{fq zM7oH8mhB{6dKo5G4rfE~=Q>vmwnV`nj<=AaA>lNMH1q1!bbct1@*+e7VFQ?ZfwOU? z9*e9Ks(3CDdBNH`C?Ys=+gor)IGzGNNjPTU|7WBp0(FE5+3!68d+Tg+RFxlu;)8Y=M{z$v*E0|`J041daLOZ@WOJiPx$!%A zj+9(c9>Hkeb8wm5rS{YP~G80t+;!o_6(xId9zp?bDBd2^gVrk^9aJl(AeFjHETcIL2 zHTr;ql1HS(Ob|qsE0Qxbc-_E9a$y9-dTC_(`LH7ME5}qlZmwpqONHMo=sFzR$gU39 zG2huEz>7;`TW5}*!5)0V3`BOILKwpYm9_(@X~1fvHJ-e;G@8ckILipDi*0o?jq(VAFChSYq@A; zpD7%aco6o&h~`9r8$}UN#*2V4a+2rlk>Eu@>q|nZDi!${*yR!JCF-4=oX8)2J|2V! z?j_)X@lhTb6SB6Hqu{-cw}6jzDk)%<9_sbsD5OjvNo0ug{h~fI7Z2CN(DE40zE$!) zG_+EDYa_UXvh0~uEq6s|+Bp&JnXLn(OeA>-$0K^Rl+cSPQ-(6@WBs^98-`Rw?hl@a zV2?X#!(5qS$J^*Q%yH&+J@Py$Krmi~5yjp>4!Wj66pR5PE|bKGMI!%UMSaLDa7(1`9KP^ZCdWOF$b zT4`xhS}{cVs}$dHM5WmYR)d>f+M4to5ma_H7~DG_auWziStUyGMQ6&_dPq~f=iOl( zC?zfL^88Gy1+FRL%|6vvbvi1Bp;n^%inU%`EBftnI z;(0AJA(d|D{DgVe+L1Gk_Tv}j>`3u39gLd!c0Vs_MQ>kzN{whOAVk_^ba*SPi^g}M zPQz2D0-56IQoCrH*_;UQTR^0b%F6J8u@g)CNp+{cM#uafp$NQ*P9wvp4Oi|F=W5jH z*w0IMp?gxq)7Wffee9vz>Un$A-#D3@-4E)->_$f8RF| zT|`S|!swJ=V+(95yM}5jsK&Y`HVn>?#?dYolB4{Q@`l->;#^mox8&IhA*YI*?cuJR z7HpmY%|N%n19<@oS_mray0el_qr;3*6{-g=k(vtXjDbYnK>7tnV($X=c==^eG!>0XFg`AF+thZMZqWO{wVINMmy`3Upl)Lw7DvE@N~;UnWR zE{vYFGNwN^=fFn_3*QMHj|1oRNbMmpbRlh7!piZxhMd`6d3HRk`FpBAwEV1%`=1P` zh@4e}>`wF-w)btt=OgnLS^`24z+NpM;TxtB(oOk#|_?v9H`)g#z81_XX7g%t>b?p~cS(1RR? z|I><>A*0BtQ(sMBcW6ZTvR*k{pFDrn)daYY>YXZcPFQDrnGK}86*peSY=h|prU;G1 z45Ml<(h&QE7jaVgTV-JQNc2jw2M5%_#Lcb}zMtZwU{fW;sJijZoeXmr zA>wSDHh9^8(Pt+P$_lNXL7t9Z3HGy-zazxZBS(38f`g8WtyVsm(tx2`K3Y)kR?uDk zMyuKZXqaeevG^&Q;ChO>6m(X4r~%a@dU`(tt=!+FEs$zt=z z?p5af)~?~n{-6dbz?$$YJLtby0vcWm@(a3+z^vBu zbDMFwti7`*TRGhZ7mjZ6?@S9xP= zj4TD!G=G3nuVL5k1BlE^u?OsEJh@b0W2M4$xK5V|(&0K>Cl?D&ON1I)4+D00`jzO(w8_L5&d=K?9J0nj9UK9XO${^sjc@38R;qvz!&`k$gxs3z9%zyE2)e-Geq1b(6BYiuo$daa_9JQjaW=V z(4F1X*_s+Y20kW7#M~LS)7R)UJO&s5I1vu?5i!6?F}P7N$RZ}AwaW`&3IP`}V|e{0 z%BPp*1Jpq}7bMjgAbH~?ZV1VRX)2&7>kg!lkz89aS;2Y0vts)p#g&?9(?I?}{WCz#Ti^LpddscQo{hwoU&fIWGKzWNgwo%8UnbkWDP%*dOGx?h1ixE{r z`Q^L2?~-HGOs&3>6{#Rr-OiOz#SU4?d{A1ruGz9{O-%vEce}UN*yw943hJ}>wm#tQ-P{&PixjC(ORIK5gyZH;G=&gW^7J9}XYX2HoSp zt5(C*8!OvBX7*QIxj$@%e?sN>UoeV5;`b_LK-(2tv-v~YyJHHjLGyp#(w&az{H;6Q zOaIb9uX!$hl^s9cNIG+p`2jn4&w=ZHqmF{U{XJl&u1IKDDxOPi2T<8jn~D=k$#J0R zmh0MW-PY8tR^-*ij2Nj3`q2q?ez+H+#l^qQaEqM7K5dum0>=W+Vosoo&S1Y21^C!` z`M-#vuhNlE5&@*rFWM0c?=i$Lz{I!)%FS;6CN`XYKAH;5_X3Gm=}V_K&;#<4ZDX0# zEV?uC=5WFJ$~S)72vg3)ja;mqtaUs-c!7Nq!eOeJ$d)4%wuz)HAtfVGl1nxq%T?Wa z9RD~)*Ifvu-h%nX;CAA}5q~D4mN3gS}_t3zUA}9{4b;0uja1~Pq$r;qinQJ zm-v^My7~0AD_v-=kfeSLb&*9ITnq&u-g^pQV592b@szwreZB@`LgCz8!Lml%0{u=k z{ENhR5j=FfZ!|l+^V8vaPas^Sy8j6-2mt^8BCiAU1ZYc1qKcq9=heqTc&Y*b@B;w& z*aH9ohXnut0mlOX0EYzt00Vz(quMmouls*Bqis$dBc>KEvIMM|Sja4zJ9FY=ql9@OgZ0>^ht0LOn8F_H1(!sbWDqZ*`5HZNYr2oZ7wjuxzTwO8@|5d%th z7;k;~gD;B4J_dW-z(rea>^<=v@+arS|9Bl*65GV{EAW+79Z;vGIYY$M7Z zm~QlWHj5P=cuQ1-P@g(k7{tyFdi#GG)^r$mPYh8NeL4y81PJxjej@i$E?T7#d?^qs z07cYDrK@Hl$w;HC-UzgkFF9C3Eo6&|tT7ZJi_zpO5Jhg0Tr1v)l}N3Xv=MSrD@9Zh zdx;T73!7vZu4e`-sM0Lw&l3>{vs2{_+`jP~})dr`Z$C zxlDWxDRvac2u8$EIL%Gp#y2(o$G>x^6}D=DzV+(43+@I!f-ee;=zEO6SXWUHGHl3xP>HQOJ~nLVAr7+MFmeJo8!4S2 zlUcYcSy#?Sz!K}Wzi))57pN^Y^8-U`3Q z2LNZTrO)CDbSVt>S5W};##?jJZtm*y{H>!}TGO(YF@6_pJiiTVIsIE&m7PZi+4W!7 z&1YVXNBlpnPn+#7!!Q8XkDQr(ExWz#zwH$}e`+LV9JcYFHaa@oaFIcFa@y<;er2;( z<7_e;V7)fdT*k0owrp0D%Gk00FaNW41P=p1j9DocaAO`)N0{=qcQa-UYNJTcjX2ti6NE&niCGf3-b=SD;x)xm{8KbR zQ+%TJLUY+)n#$bPR{rJ+eJ=P;%tiDxx+P>vsFHskC{dPO+Ua{I{m=HZJpVjtO*?>l zK+XBYQ5-2D9+NLBe@IN{*p`;Zt&MW(=`LMgBFCf@D3@}%58e#zwrzOG&8f;wx0g2C zQX8>_RACJHm2jEcb6#kas@6L}V+bO%ie9t~Y%%Pa(0^Nu@<895^J-(cX8uF*=dI7# z;*>YNKo$oE&KX1Z9*_Y5aA=Ju|JSnOixgb9uJ=zP8hPZzo_|sEgA?EY|NsC0CM`l? z?1BGBw$GEEuIE3x@2Up?=QaTN761Sf0`~Bu6G|rVKJwt+#S%0xGzb6yw>AI)@^kJgND)Cv z88QS&NiI$7Afs40lCvhvXti$&*4j6U(($&{R)hscNdO=KQGy@?P(&9YfTF4ZDrf)x z@7$6A3s#ojwad@8s^g;1jz2{qPUo-O|Y;ZM|wnF>~A*|G%uv|M$+D zm}M{Eis#w!%I-{Z6%iQyEJpW)|^wlBT%U?U@h8Z)7t)-(%jKd@X{)_JhY_83n6O;SH3#(#DAy_@%uk26WwcD9aW?7bU~y@%>U(%j+1bh4%s|{Yo64SxhS`@#&YtDG`+3-x6ccmQ z4xLU;&$n&R$jpY4uOQ6NIPM$XTq|imIXRi0a(XD;TushT=4V@;+qW~LzBX@_aMiy@ zi;c!wb;SF8%c&PkM79d1+qTT&<~ny0(!Xw%G~pKi(7RCqw?KYLz1Bo}EbQZ#6Tzl7K79YI8BKwW z2`uJa2DnjdHxsS3)*sP>=R>gGt#*G zFxg}0X2WyJP0nSe^Eo7YcSv*YTQ@`xFEcb7^#tpFb;_o*cX4-f^_}#F52Lr;fJIIA z>;?aP7i~b{yz^2NEb>%oCs=b@s#jpPLkx4{={k=ed)Q3=DL0-CuT{O%`WsDOUo%t+ zSNIiDyf}PVc@Gxj0r~r0yG^mD%Cr03wli%TtGK^-bA|`I#&Gi;?|Hm~S2?TRr{_w^ zZLk`jUupAjIUiO_^Ls3G{~N1M6Az#7So^z>P<+y=56{YdUFD{iYm@VNc0M%6xNo85 zc3o~?yYa(M?N!tIO9xoBbW;BU8J?HngQ4AJG!tGHpHI8@IC0X8FZpi9na3j}r{MW; zNBp>^JtaHC4}=`yqwl#d&#A@D>AAh+es>Ma^jKom3GrPM-HC5@$YfILA~Dd#a4>vi zU3KWr?4Iikq#XErix7*#x^S-a759Uqg>_+F>?;--qXM^t%dcHp6)Xz$16XVNLC>*X zyTm5ov2Thh=VGyM;wJvFZ;VVj#lAT0;eYtahg`G#mB*~olDpF1$g0Rz`2%Vd{!zk( zen~RxR{mvs3f(a;*e&vje!*|)CHn=x=1cgszF9Bg*7=0Li(BTB{w;6n9h5mfoN%Tu zUHZq|EAxrR*RK7f=Ihsf;IFG<#dq%-35mq%D!z391kvhVCKGxJ_7-;q7J+~2$| z374!hdu>;bAC}(!M>-Td9S>jEX1n=lzLN@mv+mwmd>*9WXtyK>j3Ep`R2h_$pWXBM*yUjwTvjODLPTI)+& zqSq!``BDnkw=H^d*IHWL7P&Il%Ib@+mc1cstu1bgT)AsFwXiLGex+LXWvC0Y_ zwbqupBG!Rxl`V1wtisp8k0>`SdUDsLEp`R2w6*5TS_Q6DwXrRHd;xUw*QYIdLf4xu zXcoCr*2J~(%Gn0owb>TEIcw4ux+2%ybnBJq`N0rTl!3XW4ouS ztjs)jS5&W!9(t)Ns+nng!TH*EHB_n8J9V7R52CqoV}~(!H^z(Vy^Qr1i zlB_zYDW}JWjA4>SP??9kf|A|i%BP1scSlQ4Q<^$&Dh|vX>T-H~>Po7Vo>f#GMv>A~ zxbvOX)w`q*D%?3Sf#DhcGxdtI0sh(I=feuFYO0!=vD&#T`^u!9{dpU#eH|?;$90u~ zZxda2OZ~O?j?zu#NMI?RRcB6fI@IafI-KFoXx?Uk5YM};N-)lk54zXtIr{}g*AJ*C z5Nh(BDtbyfgPS|gQ_?#**zMxe`o; zs;J~cg*!To=Tvl=zyK4j=^fMOozkn9s;H=^tfv8rAJgwB>T4+J5)WewpQowMQPfk? zoDOz}8!lkK4gA^pPrBaoN;+<-Bd3$AtEzaBFoS|kUnst&to$t~m`?7*mh+DO4uZh&I(jhIYmkgCAZ05L#oJYIR zDh478d#n1oH-HtciNB$5+4Sx4ojZAMoxU%pZ`pKh=6=3i65N>Vb=EtfZ;k2O_I*2i zXHMQ*r*Dht+xAzM?(?-zGzU$(o|+)}{=whw!`)kw%9A$i4}7RN#8cGbA|VdzZRlgb z?cKbrclP9Y+ZWfD|JFPcB$)B^j;5ndp)c=;A~(SbNxS;NKSK{sS65K)5!rp9&;4=g ziNinR57~dd9#{W6{IC4)^1s)A80{f;mT&p*AJY!0UYY(c<-gkh7yj4%m)(Dzr>xG= zrAeDJ?I-$2j`ObSQi!A;m}dlHrc5_XvHsit=E6w{S|)||FjLRIE%+GyJvM`#tC1;m z)O7U)>GL6!qokxBO`RA$bJbMIXXxHL9oCwkHFcVC5oB(aZlG1(@j8&No@T}oJQ(w* z^c8OL@>DF&o_0J9Edf0m)B$g+Y@c^Yb?G@)?d2G$^ciBI1_dL7{z_Jd4lJ^@s?ODe z4s_zJw#1V{uhBSqG<7+o=<`nQxB8G(?J?6-^$OWeyR3Hb7jAT%w5}VU?~9njUE|!l zrKcvgECIK?>J!fC6CQqcR-US&j_GQ_ztRU83l8p~+1XG;F>XP7$yHJStuBZ$X?fa! z#m?t@pWUj#iS+_Ev;s2;?je3BnFY8mUh#6m9rLtxbzsq@*SK}6x~iJRd%5b3HqPp4 z$)Jv(HB_BVEzx6#a0Ix3J}v#&10S-rRRB_FO#=*E?{>9M9w$}^` znS8JU$707JS149>uDgivdC~1L3H??$#hfYZ?HxoymLW@)?syooGJ>YE@s-=L{_2h8 z9&{K1d342iW-kK%T8-sMwz3WIfT+797?%Ine~EstPnrWTP2;=EcFyV@^R6OW&{XFt zYP0nxWU4e3VuLy4$RZ4t?6Gp#&d(c;mzX|fs7DFNREsy2i98IaXc%>U^GVav_JrT$ zrDf}J5>mL!sxft=|8?Qg|B21j(Z!rtnm#U<6k0KqryM?5@u6Lggm7`ijBha;Uxf(z$Ut7mYJVLfOGx|> zRN?zxIuJ1pcrfAm<_7qT1^yNkcMoY#;u_QxU&q4;=qJPRYRSRZ{B4H`Bf%XC1dq|~ z!-j};NifUggDxAvGeg=Ahol^w9Jw_0_DbeFM&#K%)p3N)mm^UVA{fOL#%2}9d0%ES z>s~?xetEFf9r#0q!SL{;vd$}IqZ=;xmP_b|qk4k;q7T~+j=!%a$iLUT=IFnXXgRCC z8K!AmZvc=A)~9{4S`kBk&LxP5)`%%k$pI7YfJ@4NmjMnM@8;W zu||v<9U=lufN}U>&(HiM%sco;3m@i%N9vsk**(~+q`~q4ACCYb45S1yLKGmMDbV+_ z03d|%|gj(VQO6U#5Kt2teFaEZm)4JqQdD* z@R&3M*jL;oB!k&=6J7|5g?mO|!(Va*aM0}#duJ-yp2}q#Kn5k_&ujwIxuI$4gQ?a5h`rJ1IQ2sz-q=I%8NXSPSpxCkk~aicEKkC z>>7S4HVd98>>mF=VE$N0g7E=8VxEc?MU3lR3x%}WZ5mGzH$V^XmtkraFgK5d0uf4B zCdwHtaD)mL4a3!n6A`I(u`x_opjucgY0a&q>_J@1%c(!wC7Qb15(1U$X7 zNQf}Uv>ut1VyXRM+7!3;XTWtTsd39$!qlLqwFmSd0CQjiYR-Ox46sf~pb5Z&LG2qU z%$B%vrOFT8TZW4?9G$wHcF;S#8Vv1Cebom=ZDSwng4o+*?i0Qr=&WsFALoa(D8uWy ziw%AAi4O557@GUqAt8Efw1r3ft3D!kq3uwjhp-_r)EfKB3>>_Bz|W^78+L!S0oj8f z><+gdo9#z4Zi<`;bEhbaD!FTfW+@mN^~o~K`#~cU$+LIBHRmyiKgvm<&*Vxp-AvNd z7g{P`bHF;SP_%-%4CS0!3xI*98p)gZ23~82zfKI-zCj8HiIE{dz*L}ky`rT9DuU~X zg#L*1P~dF$sZ=2`Js^?l>x;w(h-_VO;Z2-GC$$Ti;ONM*m4k_wCaL~ip#>Cx3k%IG zYHniPHBxBlLZjB|NVa|j4am3+qy`(}e&B9{kO{;Y^=Yt5q zp^!p&?rYow074yM>zT=$U)lkq0Q%PC0QU{lT99_OwXk35WC%+Uh*=s^s}$)paHd{e z!kNIXu?Gr!$L3G&kM2**0=;&dMM?}63!4Ims{)6uIE4mOdsH&3a;Li8NGfks_`?ai zgOd7y;uK#Y@B)EBD!Ck1>Kr&&2FhD0?MrN7?c6B(91!17hp-g|d;ptx84(a#?XZn7KJmE6^-$|)VNW=0Y0!k{{Cv7XI1v>w*5F)&A!n-v&Bxl?c(gQfyv?uWS0 zih!t)Q$ou&1da$y0AK*P7$brhJAZhC}66!^Z_GDfPx;l~8L7GuuhQ@rP_F;cGK+hkhYZGg` zYtS*;t`s<6a=P{R?078!!j@n{|39-18-{l2bh{OlwbMg2QhBpotbkFqc>zC`$QD>70f=2 zkajtXGG;a;zEV0wH=d5-DxBzUJAQWJH`d)VTNLbrJbhHau4PM>>Tne1UN5^%bA$v~ zw62D^IJs*(oB(=fxy%MGSgLSqL3t@h8>z|y6xTpWW(E@dWU8qy^`;7v;AZYB@g=9f zW<+YXe?=5e2l=)GU09iXXUc6-|5M%r%Zd*YF2YykH^6Cp77TDiNyuwm*lSQHun0Z0 zz<|wFE3l-C!9a&s3aTG)48j$oe?q0UhFV0jv44 z@W58A3HCzpz-%rQ*&h!6I@F+Vyq|eiyv_iVZ3prkM$NTk>yzw`aHCd&4?!Bh1w(TU zf6OMoCFWy93ImV8jPzMBo-0pN5->5Mw?92nM6JgV7U;301-b4m zBG=@{S~VS*Dy{r;m2!NIzybAgEbY7d+7IM#;c*Di$91^nK(j#%0Ph?!H$UUZ0}do- z`JJ*Rx3dt~&|2FgzYrJso6u+O2W-M26mD^%-$5QtybApRN7bq*`_0ARqulje@kim~ ze$hq%R$WfmA0Tm%ma{%xU_2uZ&StwH3OM9s;5J~ed;bKQ=k3O->inDV4;r%p*4R8u z5gL+vt(PL$-tkaurpdCFmE5(d15fLsH2*YumWJwX545?E4CJ}?kYp_&u{Tj}O&A35 z9bzD5gU!Qm!onuukPX27P@uvNiYCy2p}kj=>IKC_fyF^yK#kV&+$Sn-)aEI?Jl#*s z<({rJn&7<1sqS>VC|cDVa~%zf?PPb@t~ zxC7biQ(oR&;~NX0?($WUo~LKjm@!yKri0kUGcdUc-nZU5CNDt5#66=t34tf zk$`|85qw}-5FIKyeo)q-XhTNsFEnp!saHmn)rdjI?^Ej3wvrT+3lZ8x<7uA5i%obm zc?wC$FwMFT3_zQH_U}UcMbNk5U<~+2`N1Gs4#*i8glKU9R@aa=3&EOIT$kq}q*zZY zFM$MX8w{_wHTRku)VyJ@zc{E<)a4QLIQ<34E5-%!f%Vf7iRFcK_(ve*&IJg29beQK zE-swpxd0iDQ*rRP1x5p#d?FC5l`TaIf9r^I0QHjF7)ya)$B?yrfB4uXtnId%zE$wU zEShqRuK2ZoNcjvE|BA(bz7WK$_zR;K`)c@KJS|ty8Zw^8!vnVF%UOj#SD$?NY**_d zVf`}U;==?Q#oH_Tttb@vxUgE`$VS@QL16cRgU(sfsmen+4;KcaQB%O!Hf1g(cL{nB z+YC08LX8(L2oG1BXfslZqIB7v+7gz?GuUUg+~y>}+t{K6bs&fv3DeXWT(TN2EV&dL za7DcdfU}O$gqa@$Zx^#08%ZRwRRCZSeW)AuYw(^P)c$ zV`l0%wmUd9y@?HuJR8ae)B!C5uDhNHYCmEU)ymq0Pl$H!c}r^?ga8a?%vVLD*Kh!U z;a<-MRyxpMdj%E)3I851eEWQtUipAg~hQ5Mtfj{W~1+^gBzynE>+|} zWRl`!jR=hra_ysVd``fEAfc>^<;x+8AXTs zu;G9dj~#o<0!;FwgpIagY$w8QvS=W?`E0ji4uSrSmfS0};4ngx+#SxnAscSv3LO(h z%FI$A`be3-Rh58~(>@`uZ;`^UFD;dEB{oZ3G{wV53F9)iBJO@v1CCh-mM?vx;j{=N zPyJR}Q1%N^Ue$+^sbL2#Bpvs>utT>tES@pOzNaKHZd{UA^dNa8-@~qPqb_hP2Z6q2 zTp7Jt0XpxE7yg?n)rINb*PjNNh&RIZiPArLIRL`nHTGzWwt{i5i2_aR7{t27B`s1k zU~Sj;M7`Rug{2Bs!tq2f#=OT53%$7qC@;%sl(lXSSks`Mu;A{ zoCW|3k(KFWaor4$ra*0T*9!(ucCl9^VD2}GbABazH=GoK}sNY z&v|tQ*ZG9C+OfIzz|mFapz1c%;1suk%2nrPIjsL-lz|oEh)IDye&6~8V8&K%B4(V* zd}``<@&J@#c1o^jxkK^~xjGhQUGt3_b3h&;m6qg0>(K?EYZRvVT}Y*w@r$AmMY6np zIVw=5c-PxiaWp2r+$uv9X1>-dXGm>+^XgPB-@%1rIpJ}LSjF@L>*ibnFH6ZKcRpv- zF#=x`pMU`=i7Uqc{v^1-hkXJ^G7P+2_>0LSF58Aq!xJ}i-mfWCtE>hGvJ7wi_3$t$ zfY2d+)E?aCjeIKD4;$I9wq)+ND@}YZ$ssASHSrrMl-U7UJ>|s&Q?cK5|4B)?%8WV$ z+~q@gz(L6(M8J{TgUgpX$f7~WaTEaB{M_9^>x0zw;o{+FDQ%!5DqIy`DlG%af+Pi@ zKxjTY{P;r9evOn7LZk;>d>pOqP{cL}sHqwvqNuF7p^7Qyl*8mYMjwOcix79-_ymdb z#s?+1_ljAu0?GQJKq0;j{53glMa*na^%82VI$EzkyF}xFfIS4N7Esmuzz5(@vKj42 zVM0QD$Uqje&*Oo=D~)KWhsoRN*pVrZd293M1-GcJwY_ku2p1?#MV{>1^w$-kB|!h^ z_l3h3U3@@C2O0>*x%Y&}UhwyVbmDVj1me(Ba`%G8JQ}?glcCXZE-4AoVMzbmvNYst zqJ{2tdXeDfP*|-uQNA}(%02@~(_8X_!GmZGJ)peZ^b%YB8=KN#7SJx}OhXSc+h3=_U2;ROBM7FTekzb7; zK{fRVs^#^`weyP!gW=xIdf2{vePfI#LD%ot_UzcU%^iEkwr$(qv5g(uwr$(C=YQvU zazEU>Z*r5)NmX^a` z=p$k(7D8Fy9l~;1m>Cmu*Sb2~f`ipt$~gY)KHrOYBRu|yRy0nDm{a*goDOVs-1|)# z{7otPrNfSBj01`b5BjZ*gaHs{R4~f6=Z1p8qBXYEC>&nYJj0T|vT zr4(BtTu%wLg>g-c-Ky!u(Bm`LD}6Zsq;RB;51l%?-PTPFvmfta_%4h#snikM)*DxV zaVRwY;nQoB^oI||w9U7zj%bp_#*VU|IkdN)8AH}Gr+O&BBsnU088)5WWI`@2IF1H) z{%~VXiA8IMun83WYQ1La&#jx!F;-AiwZ~n#OGp(^cHpvIOynm#>2^@D7K|vQU#~Vn zC+s&s<hho(&{*4O>GKXInrnwqn0&CRrb~j{ilA#Vn_>{_7>xqZpcWBTcn* zG^9o*Jb*)e$tZbqG>FWx!rT$&k1elckz5M1j{dSiT&*JS^VGb(&cEK=*p&83GA^1GS$9t$Rz5||^0>siB?Uq#ja+hiMN|D3 zr3P0z7~7SrTmhR^?t!WuUb(YkelVa(Dl?DDDzkt;00jC>J=jCFObK)j#ihT&s!p-; z6R_xXb@nA~{a3x5r5a0CLknB?iki0(q=8qNA$>sdX8C(uN&67Uh@%IIkDxFz5x**a zS7An07bm{xOf}D;^R+PChrtP%AzE-AgHdvEAg=cXz4|g4u*Sc$T|DGnc=m>e3_<^> z;ob)Oc(q?dk&5ef^V$VrldC6Nj*Giul;ty!MEzQaJM<>{0eVLNmWBv+TQH3m-qVXG z&&S)j0CyE1cm|=B!+}!A4G(^jxNd=x$Ty=w`IaFeuI-0e@)xf;%#yLD{ zT>|#DT6u@maafH5{Og(F42S(Ks2jPcoIe#v=G4dO1JeTI5?)qkKT{z?5X~195s?C| zFO19*)|`N#vBA5yEzbn`lBNZk9k8OHUsLqjhxQa6*%pHv3=P^xWufn>{q?nbr0tDO(qxW4 zt-hfv9!6Nkpf=}VqWncYr8S0Y}10NxT#X)WkR>%O|bl`Gp&vPRT}s20~){g4D<|fr?#3 zZ!enA^A|}!=m`K9Gg}yudDYI(i!0pZ*uN;Z705{nQ-Fy%t}q$`WGtO5VCx7hjsQp?vbfLJEOJw zRz7<-9*W@^tE9D%4Kce^;Iu3m(hf3Bb-0FGf%gYAm@As&{W>~UDg6E4NH?K`0xd94 zHCoj8LHUs6kc@^iD^-K=v0dh5)24Xqrc3SEmf>KQjkfh!1hR>Oh zz|7z-oeZHv`o9gL!8pM<6;+x=kg_l7XC4hgo}32@+=?C8X_!&kF|eWIKxhzYVE@%^ ztk}CfZ4PW3TeW2m`|6|s5Mv=Mf->D+U2BOeG6f^kZQ`C2yK@WBw^n$caMVBIn}D`m zUz_P-#=PP?2MLB-ARXQVn8pu=u5WjbB4>dTYG{#zN#zMhSw%9(G&hpPAIrc%Pltb}`5qf&sWo$kL zyUwX)oN)Svwx74Wtne(buJK4C@upTZ;nG^|-+omT;nkM|k09rFCZ34`p5Hhj!7w`n zt@|zSj45n&1+ynbR##I2+7IDi2=_wX?TBxyZ_XvY+QNd5>65mH=}?a%`O7Ex52>2{ zT+-XMXM7WXM-Q_kXK$x~9@@ARCX_XqrX_;hpCYmwnCZexzYq*dyK?EN6dzD%dgvD65-Cth)->A^%m? z1sNBM+iRzxk$H+mRQI|ldYBVN4x(jjyL)UBt1qIR(Fa)?Lal1bEs@N#_DHDR%-ii( zG_J0&fc!n7UubSj0pGn_@_wEiN@<;cGlAwr5r54_ji$yCM2*c~B{}MQ!oBib^$v)?knccgB=!d_I%)#?Xc zIWzc7mQFamsnRUxP_XkJ8u*me1qHkpSQB;|zYnSeNp*kOv-lO(r-@(3dG>0-@W`y4I$wUJmyslZ&WuE0IAYQHjNbXf)j&BoaRx=teS& zgdIE^@g_7HFD(~G0xPVKSV3YwBJ4{}H|6Os#RRHNMcV`(Tw;+>RSUV@+t0Y(qtOZq z!-7)_>CBCYf32R`+}=i_-4+c@#O@G12U&Q4?FOIp>oXYLq(xTACzRenA5Ap%N<{q0 zHHao6U}^LiLT{%jaW!&19>g7APl_XZZ`>2^qgFuHM+pQV`Gnl2H?3bF-B|Pkc}EFk ztpoJVFdn*;e*fhk02#xU4@AGyL!|vVXD#q2<)0t;8@YPinZ#J5!(S|b? z6FqLz>%CQ9Nh@TU5Yah6(2hote~)4|U|aFp27*7AbiYCc_&C&b^^5f!(?ZocAW_>E zw<3C|=!ZJ&8m}xMkPK*(0JNLavkTPDjdq5Z?O!yT2Kkz1+%Z{4Cb^h6=k*c&yiH(( zWJ*U-n>W(3G|nBCT0ALfVhK3IX^ksi^Mw-8i-e@zA!~zDj>-e)8vZ273>mtI2WtOP ze-%m1kX>c3+dbuL(6lWMVc{$Hy_!BU-wahC>3?(J?Ssou&vA};BHbmzE4V1y{EqcR zV9Wgy8gXiVpLI~8K z2_=Rcb4nZBij*SERN^&WEG0-)D)mh%#@_9AE%Z9TQBC=PnV(_wTxQS*HS!Ki*nbFJ zw$UHUpuR$f=0Pd@F28)qA0)VjPDJr{^3| z$*T7xGIm;>vxKn6FP_jP+GMtt_c!-RNeY3M6d$j)J!UzZW+rsgF}9&dVXe!D|6@-b)grj{h)p@9qjq&sS--!$E?3+#|H`P4#AA6G#DaPl zY~OeflKbY)2$h%(WrlKT9ezBXJ4hOM(w@wIdoo}f@EVONPUwr=5sWZw3vJ{2OkGPj z;%9CW`{;JV{#^YP9?`>$*8{=hCBaM@Bn1V8@%S5peSQV#W{|H>pNj@mPIcnJeV{+k zTiLnz6@(HxR8^ye9J?0Mo9`OJ>cOgCmAsO2z@13ks09~N7oRz~PmI7F&5$WTjN%0x zt0oHvRf5Oct7a3jF7_Zy9?lWu7lQ;}e>&8jt`z7fLJ*-^de@zZ6fj7vAdVlV1M~A7 z=k~a_C;p?mn&O%Jtja-7tO99F7}{JM+PBCM%}Cg8fkPHw_?>L{-S5I7R_2XUZVWJ2 z(5LS?5rj=b$T?2G-3b`Irf&o~^KP^vS6nDh*qz9m^x}Zdqpm%o;_Hz#!{p;%9c2a! z2-#q_r^p+`e7Zq`_m`NcV?dhHdHO|N8Y)$@VdfQ_s>9+vE>~FFf5{7h3qiO=VcDRn zsBOYOig+8lTtgBiEKIq8nQS7Jffr|og$Gu_fC`QRH<=3Yon9a66(d;8TQ&h$UP#1{ z8;4)G8n|oDWM{$^XBh0Wt%dM-1D|cvdQAvsKg~XdBCcfgRE|?CcS733c z^$@(JJjI`e(A`7=9RVfi-)3w_j{vIzJPd8oR>zK2a%DCPW(L7{ru=U%*vS%X!}=bp z3SWrIF2UJ92?ZOavKoWN;vl{Oc z%dH_nVc$+zII^V@KHcKz-_< zJq4W$OS`ygxCTx(Ujdo1f~Xpfchw|ifde`K!UPoln$*bg->#M zjwFOSTyoj6vH*0M7@61vr>nCu8`|R{EixgaN~sx&aPq+Gi~q4=5^6DG%?$2e12N)- zNoimGP)Oe;W8A%|Q`51z@o~KUb&D&JuUXij%v5dB0M0&Nx1lYn)jKBOciEzS63|U= z7lVJwUe`uqvpK@=5`g2wSNolCII-s=b;il7oAcweq~bY0y>I|4a%-HQ}W)kf6FK zP@`dAyYg+wAUJU*tn{2;^M>tb?6SWw>k{N&?erXp+mmyVwVpD`9JwwxqvJcVye$mR zHirPd7OsU?pik6Tb;v6p%!+dI_YqCiMtvm7RuibqIQCF(GmshECE}2XDmIk6GC)uwYiE6mtQU@15^}vl!6F3(1YFYl1=iN^ zxq+=TXI1@EJ6Np`vtCs3nA8@N7Ezdm}@lrX$7)UL$2tJq$#0L}AdY#Wly@dTp< zLE`FMu3YhpAd0i33^wO`Fy3#G6oVgs3+``)A)9TZBf+XUo@6nXW}*p6d@)<~PDPAT z-ofu);H?$PY^o;4{E@6mLpd5>!S9e6<(CnnWuYld?E`jX$cUAHs$G&gyE0e_!|U^~ z0YugFG;Mkjsev4z!4Odu8I2dt7GEPJwWsH68#Vk4wHGJh*cnwJ%sm^|&FLEO-g{py zN*rNf>Az021BP?o^#H*?WDr^Ep70(+;MKy*GHL2Jp{qP)=4 z@b|x_eR%bg1d#~fzIsdVw9EFnRT`(piCJ^mtG3PG@xv8V%j9xce~b-I0$k?d%4pCB z2b+C)81`YKy6tSNR=T0NrbE@~%lMPMnN7^XKuV*v{|tXux56xOJ9%enEnj$hZ0otH zBm=HOhChdBotq}3NaQQZGRZUpT#m3Sq}gQuC@=l5pa#%5xDMsH40}UzWMwutQ5;_w zUmVv!K)S+^@C+OE4TlO0BBmxGzCxZOLYec8W|bAAMu>JcDP%(Zn-%?NP8>*CDElj1 zgC6CIUD7jk%r^}>Fp-?vi2MiHNyNP1o5eaMM=h7-d{oNBl9-kCcuF23NlVX8Cf7xIFVYS}i0x`{Z5Q4DQl(-H%s+pvY zD8gE=E_862Nu3Al(xmQip{0WMe#?T!E9kPgCgn+W4-^1yb3Z?FJ^@XisgklqcUt)= z`9pOZe}>wSU|f~SBp~cw;Ga1GDTe`KCIx!s1_HwUUpzOEmY&JS-RCdy>_w!1cM5%f zL7Zvq`{DeVgu=w)np(3CD?vejxNzGfK)?x#KU}ye5+I=e3~)DMUVJZp$xQ>?SjbUH zgL(V|`-D8ne~0*UA}c|_x2>@dZ7;NulExD$)kdd7(?BO2yOlu(Y2%J*P-s|ab`&=? zr*7L6OOoQ)V4>eRO5_89LzVY3{8OrG!<80718!si0B(E_{RMwDcK5X1=xrW9_*|Xv zbshuAAAEs1cH?}p>u_{ z`>gn`1qTRf`unoZ7&vJUf!OfzVZFwZm3RF zaAwv~tDPyeHQ&LpLuE}a&Z!bh7-!V&A9@k#d}Mf5T;iyfSqC>bn;vh!n7bIfIQ~8R z_EbfEa1F3!_e{3Cy!zgBZ3^79JoNm1zd_^?=es#4d+QOt(CU2a2}(CRJO(IsyXC%f z_yQ0Ur)GS5G;(_41YDjHQ>!}$dnO4EZa~F@5pu?QJMvwKZBWybRzhhzFZFQ6V*OTRs?oT+K*u-1mbYWY1?nd~zcClPc3%<9kc*|}#O0bTWIrjAjv0;&_(j3m@QAu7XL>6E+?rEZP@IzmWCQnv2ey%c zixUHPuWXw&KQ*JEpg1!;=5$R#IWFNerl}^UP3)1)ten!=U{1i3)6ai^^^myeRL$*y zdfXeC56bO=pCc+&_I9?8DS&kQ_V#Gzv_+_bLZ1~dYNn8kd<2gSK#AicChO$s*Oqlo zzJ__obP>2`G(kJUd~8KW<>TN@6}vO#&&+Y*_d#Ki;%@^}@PXC3;;;diC>fDZI zmH_*9HXm4WO8y>5tj(2ePh$lySvf}!Qno@*<;2xpH8`Lbjm{Y<=U3=j1Zx}p`H+Ph zp4Nyu{Wl-TDCjiqoP=uDA>SlJ;}!v33w{VR8yqL&7a{TJr9?YYrHQU@@S_s1!g9sF%E)x0JOldAl0{29Br?*eTq@L&G}Ny7s*$*CRIvJ#GW_WzIX5I9Y;v|4 z%mK{Fzn2v*g!mq45Zaqo35E~-Ml|!b{7e$z*;1K|xY$e&h07mdeK?mREAAVbfQ>01 z53_E%9fRJLw~ek+8`g*Ap?8ATkq_^y*lJomS9-V6?%}VQ^!1AtbWe;OaiPt3M=j|~ zy~P|xzU}6yqTBA!Z#?Jc1^<%1%9_%cvx}PKMRys1UNsKvG+k|vyuM#o+GWQ!U>wMA zQk{U#>Gh_=R4)W^tbh4LX1?)&UbmksE&^?4?8)G~E9<+&X?W%02B6kLLEnL0@TNj} z?==3!FK+5b(rUJ__D$(cc|sLCWY&F>o1VSm)E&wrpLFcYf-Sa_z!jQgF($ zaNq(-zs)b6N4`P3=OW&>%`ZWQ`{-LCsvqzjJW#6xP^r6UDyl*1xuk0z2h_{Hq}F_h z24i~yXwzLTzSkJm7*g|8$lQfq^NXeDZR+_CBTRVNz^Z3B>4eVnex;Jm z<)}tVbN1&o+WA(DO#`&TIP)uxnomR3gH1~qZTHKIO<9_2!x8#TcXc7KDIEzbRX>kZ zdp9-FIfm54MA3UUZKiZtSk=%uhg7v$S!y1^YBP^X4xX<#&A-(BELJNt?PPv2eSga% z+P>v%6jKpMZ$s<-*r%?gTKVc3H+eI!c>bp#bas09|Bon)?80%h|*&IsU<9qdWFtDN_Vj7B1*URr$(3G)qVs^0ofNTadMv5 z83olXGS1h*q=ekQo}uCAZpmd`9_lX4W>Sl02yS}X*IB$3_eH~y!EqmEJ9I$eFEg0@ zSSk(j)RuZYT4et`?>Ky9ViEW=3i2;nW&*bvUADyEA-6kZ#hdc|%RC?CoXVja{!vwU zgJ%EXTToff7QMQ6BzF$~MEWul719V4Uq*`0^is{%;bSwH#(QORzMgg^z6-`%oSV*) z#kWU7qw1#UT$O#;#Z8bN$I1&Nc@ z!U`bQks2SU$Wd7?!O}c8n+aefzdcW;vHx*0kbAG`|4~K_b9?f%i~VAhW`m?n8SAxu zkS&3Q=VSBH&6edJ_jq|~;V#0eV$`1pKRxxhH)wNY#xqctohhEnu6Fd}^%L1CnRt~2 zYd~tt%+wk@53~52vOEzgmGkecv(ZqzXR$JrgvJ}^{oE`sxmKeGVW<6kX1@VH6b>K2&NSl2ifBK^w1MWGK=iO4EPuct(Su4PhVmkSEcx>JzVf+RZ`qhMBUpv zzo@9dJ8B^K#RAaw9Jil&88{XI3^V~|ziK`a*8z&J_s${fE_#y=UyK)QXSr8?OkXz- z0^0zld%d&s9gDNX(sGsqvv;@Z$LotfG4+TlETL)TsPIeHezAbJ-UKn#Xpq-Ds?!~e zPh8*X(m%7XiOTI6mhJuN4?;;LrKKpDa=Zx64Ag%X|M0nzXl8V=BUoT<{GFMrln-OQbF zVL5cYi9$|gna)J;>Y*jS`{#%S@0d;CJ#9x766btfP#I9?Z!^Ptn(ro;mwIAuxvly~ z|9TVj-JV={pr_K+HJCMrZq)8FbKG9N7zB}+L6DF)W((2j<0(&)zgDfeNR5bZh-dhL zcn1FB?PCQdZec-94NNkPf7eEhx5~Tj+H<06pnbg_NR)u{PHH_GV+XXCEdtD2>ys2h zz+6`qR3)1eiO-quc$?3&*xr(Yx48K+giaENl%4a5I1=??Bfv;pC7?il}jLakA0srhb#}@M}A^rMJrCUlk9ZMp-o;%BeDOI8(I|3)AL{ z&bFl)yZ7R%ri{I zLzpWg0gK`$M(lCkLD&Q*D=kS8E^fL9+o}23jI(jYnT4jH!%BenlRw)2;_wWj&$C(vBZ{7DO>JLw!K}Si zQDZ1M-VgZi5}Cw~Lq@7bI|Uh7kbi7MVHm!_lJkXo4J~sJ+Qf>cCJDl-KGSf#m&C}( z|H8PGw2M7_J_zZG;vc02=-Cp!z~lIHv=g#3Vp;Dhv!)YL8#5!A68+9i5>j|ti$l5O zP=dg?AB%u?F`!F9+BGCULkggI@p2?^Ki@+G?&TaMeaI^pJ14;om((!!0MMD(xDjwJ> zvxn6SVseA24!OC@Gp!j>+~aQ`HBF=Do?1)ELI<&5Qyz%N+}*2bbd$pR z%>)=wSp2`C@D2!Zu=hp+fH6sb59%+0I$;pRti>b4g&?4!5gD{9Nx~*PSNC+P;n}4! zj)e;*I_xrj3Z0&56**Zaj{FXehLXwDDH{lSLd{(;zJ(hKkO zz+~!{W)Mp&QzXn^+{&~B=Q;VGo z2!-hTvPI$*6 zdQg8kSZJ_TFH+e@0J3TEZ`OBWG6$n=6VPQm1$=sPugP$a(hYy^e0^uRPAuqnO);=} z0}!9u0iz6vZK2RHE+C}=WV)jSFa^gojB0yFUWl8wip5k_`RBtQp|{(>e394Z?KG}x z+pdJ@_yFjP$^w0wOQ1o$4T%M*z@`}Lcop{K-fn$QI{9LOZh@2BB0T&)p~;H86sbAf z%R!Q3H40*c8&&}K=n$6x``iFoUlFXXLNi+W6{Oq=JXz(x47^7CNGNZ)L5)ukCqft` zO$7AKR@E~Alc#$Uy*hdbu^fKYT({5Ni#kd`RyzMVZt)_!>1B-sM7?C88n9@CKSCBL zqFI7a=%egaS`!?fjDawS27p~2L)wYyid*$dFGT0<`0e|nWILkPyib~|5m&Z^2h$%$ zYC!<^Oiv1L)-jP73l`XPMQUoCz@o?;QkO?Ek-%$13Vo!4BZjY~pb(RVf{J+kPPAP6 z_+E0_dOwVZPuiB}@^t$Ev4L?%V4=)lG@~wdsHp#*eDenp-%6)s(1xR#g8wMb0}Zi@ zDAd;NyY4tt$O}6FUG*E6m)KUt&_-?#N3u;&a3gk6TNoL2UNszK+UNyjH2l;CAuJc3 zZ{N}%{{C&(ZYf$Fo}m#fC~KE0PWAQ|;b_g)XafPpJsC>5Cd*<0dcgE(=lo0%4SoP5YRtbFv|>)3e3ienM*+m|T#(>*O+ zLhGe>l$UV!jaUBMANP6Sp|v7dc11$_#DC_G+@x&2m!mg)2Hr*9gS5bwDf6aazBv@Q zZdEA|9D(y~_UBe@cxggCdp3}2$!UK&Kuz`Wu)t)Gg@J=NS|;zbjy)JQB>qix;!`K+ zI%hH6kOV>Vs$?blO}68<@hKc1cP5*t@t<`}Dc=_vkvw>Aa=6Y)Rg-lxJb(6b2 z?CwbP!S^|+lQvm{@QB4^T!v`}LgO~sNB7|+q{Hr(+hf>H{5i>R0=d>f51w<5^#mNm zeAtF;*s6MOWG{Pb&*_i+nmc7(wGMN)zukLO<9!Az)7;_9Nc8%hGRR%BFM+>~;u9|z zIHt0Ulyq?H&gf3MY_Zy( zgGi^NgK=tANGAm$=q&0md8cT@Y4=EwCguvfexu&Gf%|Wp&R} zoW|!qn>RYhcB03^D4F+zFW?&tC=4LJV^Ck8GbUS`SuKPx@+&h;GLvIg{KeqPPS>Cf zB9{T<5WchH%Q`4Y-NHmr)Da6P7xN%$nVr1(LG7}ZR%N_}};l|oXdF}8NQ$Zz| zCjoE=`WMh4VZ^zH!CmX7LAaR)J18&i7G2*yByI?m zWQ&nMc255WVSOycWVkSls8d7}LrXD@K4dX2dktKRz$6=-U`T^R^NP?gjYZpusrqC6 z;~2geF)%0Ep;U$HRL@P6%cII?N4T?=C93sNNi$4aIC+69^PEUx zg5H9?n!kUWo=DXX{DjO|VT2%0A?Er{edgx6{?iUpqW~Pk&CGf}f6tsjUPWD;G7fm= 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�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

(Ww-8a?)#iq*bLss>GUcqW^S20%f`vGR zmI#_9NKexZ%@2D4U5BW^pw_LrkJ6}3E>A6co_&Qdin&w-RH}&5r+y=MZ)-G398m7$u)fL~sDMs44UY%d7%>U9qLp z9xB}7O%M2opqzzlK~&Wmr#3-wU5B?Z)q5<o9N+b$;uWC!b%P%Sf zKP{n?td`@P)^P<}t`v5G<_a(5JvxDB9k0YFz_XL4o2edB71&0G-Q6hN&!Xr6Zv1xY zA(RXJ-e>12MjPxSm~t4f-HUM&EN%1327F5Xn? zcMbV@nGz>Uk8T_CN0m81-_@qM+0>iH`_V~P&=m)!dJU;iH)HjFgN&D8jk7j`mp!-skBajfTK`Y6TRRDtYMR&VLo#Ee~$cct?$tz&!lE$QA11S zvcR6@Qk25Fd(<@ymr_M@SJ=sD+ZT5x2x)G~HUBZ}tLbFfWV?=#^16tnN@5YIEHl&7 zEsSa&hWiYfJ9tf0 zYxWc>e(wCtC-DAeY_%OjA%eJqX9j2GI4~km3ZEtO--IYx@U?l>25;u%P#z*8Z{SzS z_Xh4ExE|%zWW`Hksc{n@Q+`O4=hYulDe4A0No}xIeaewDt`v!(n^GlNoX4LcA$aBu zUw))YZAkyMeHH7qBIW)1JLMPK65I9cdAsRZ$jd1ya=n&pedI$nNqW*MOxjQsch}lJ zuoDgjg~r5)NA&kJwm+GjK-87j(56yp8pAg=OOckU-wS;_!?|{2?>UAOW%c%wZFfBT zT6q@*9INTU^kaL9`Ho=FGMwR6WU#5yPwe~Dc2mJJ!yGA_Od??Pv^b>K5^g`+VT zGL#pqabouKoL#A%fU5S*FoK!|1ZB9mt5A?Mg9u5FpZ1Q?i7ZSEM1-PUzf{58+yR-C zJA&jfmJUrju_w^OWYt_hWk_Y7&k^n!*|60a(A5ytpODWR{(T0dJq5^(8$q%!jjJm; ze(aZAgfT9CR?q#ig_-cn)3F)H_WZ$tQE9fLsP~k2$yn`&BPY7h?<5WVPvnn`&$2!{ zF5G-(y&>_N^2f(#tsfnyRz5pi^pP{`?H26~whRYQPmo~g)6hl^#pfXVoV=4~jj+5Q`X=KQ^G_X#MA~Cl8X*56m!f z9D(k3+xl+sk8S-^H>ZC`eF1l&yVqq0_i$5$`?3!^#?=ch5Q!&Rw6J~lwmy!IL|*7m zMTpT0#b1J&KNK#gVBO)cYhsg*Hu1RQy_hm!fV*(Oo^&Y!`%xBN>29=I`vcm;cSWgE z0k%!2<uWuc&&uzcv9(R9nL2_UrsMhcPoLbQMmg0?_L@e1qaL{c)WrkKJ0!wWi2 z4yaKZi6uxy@Ufw>U8r@JjLlfEy3qiR(zBpWE{Ua^E~K2DmXK3z1+C(G)^lA+HmDx! zYyobwo9an*z3~GOjaIFWk8mevoIQpuD`+t=!p;s2bthbp{gkOEHI4;HU13P$Z?`Sk-fh?vpyX!|iP{?$^Va5}kU}MDQf82(j%R#3TMC|=k z1xY(x+v3!bBP|yjf*MHuUV#R0@~Gk=6@1*yZHSOn3*j`chDZCHi{Zy z@z)1W0O2LT&=$SE-`I$00+M!`~FcV0`$C=TyWX9*F=GA*9T*pn#xg78} zfG=A7M>f0AE6D?-##CNSFAkx(duH(@JCGGqGgnin%#{sS>m{3Y>u(BDPa>SKC|we( z(un$8))gZCkWTBAq<%u;RIKwR&URt^zS|s}NrQCpg_}~`!{$b(VJY)ccs%+_5lKh5 zW6J3c$TP7#$xiR?D!c;0#Yn>Nh}-E#216O8W5FV=96(=ysmi;XV-@F!dz}kQ>kM?U zZ~2Q+#D2#x#YK5RFz#>scE$u7(%lG$aU~G${Nw2GMY=<;$dRpDFv3?qyhA7=2-N2% zjho=Ik|cD;&{E^ey)Gx(?nXzbu4c>lbj)NnWUr3AP4S`_^v#EMN5g?tIyhpHec?7K z&-#3&Vn|Om-9hA%_V3KW;{^ibdP+Lea!ZeI#wx znF=Sx9?zm^gph8d{6(kfXqTl4<27jdyT``D$t1qT^UA6k%xa66oH@Y#s+uTHOY5&% zS@m{{8w&=J4LxY#9JLKx)P1B(v0=a9SZm6vC{$^$mMl$InApp8Lw6ew#47WySY80u z(VQboLsh|#f{993j`Us^?dQW?%b%s0H)@b)D01_*7XJcChV-JtM|6diJoxC|yLKfR zE{*j103Bu^CkjaCXW?fOUoJK^H4x3NR&ta~?D&;|z`V!F3<_L3Eq!|G*bxNUk?5Ek z73WitdDCKG@1^oLBY>+M2HY>Pkn6^JL5gBM zL1cePSDbo=pXf;k{1mbr1S`2@$;5aNoRpjeFoPd2fJ|h-4paR4BP1V_m69B%ws7S+ zRT4?ElQdZ8+=xT}t8!$R7Y>XsQc-E=!o*Ye1A%T-JhArip)uO|&Jp?ZVazB>gY-yt>PA_RR zm7L*k?S|ORtp$tr06A!UcQCM=T&^{=DU)H+!uubu8wVY_Ef2Ji>*~oL59rT_hz(tM z8(_TM0WUL92CR0WhJ#eK-5aSpaRhLV74;@MgmJ7aScb)o=Vob-I^w(ZrFYl%q`J-Q zHwDDRk`#B;cS2t!USqVSb;A(S2hWaD=(4W^VP2z~&fb^6{q;!8=Y5j6$ z^-hr`>GC7l!1gooqBnj#m$gx@%7QSk3FjSb$q7Lm(Hrze#vI~`#FJs;>=O~%#?(`q zVb<)=oLZAs;022T(8O=06qX66V48`=-f}PR$cS^9 z)JQY~#F&&GAps0c*h0%m>zOk&E)$D2TLvXFMB{H-v9a`uWS8bqTa{PE@3!VCAD9NT z-vIP#+EwJxvbZafk#l!!tZ7~3T0-hFEn#%R%dASyeAuMbXe*Sy?pW?V5!Go()ia_{5?Yf@AL?E)rnBxZ6Ba-KUBHt2x}ROpQy*puaeP)mwy#zXjyAb55%qW zI5=K&-(l9#p-RFctr#c32sAfaK6uzi{r+bc(`f}CK(U&w=!jL1f0kQX8DpaFyUWF# z{V7vOPiOov$D4(B1 zsKJm_6{f*HjDd3z@szAX5C70mU)Y#qvuiON1KLN|j?k~|2!;D zXP}RE$XE6fefpyJmO{U(9^&0TJzODQI!E0k*MS8eShuBKD*n_#B5hrejS0v}DTzB~ zIuIUsTPd}i4OQ)0$pf5*IT1YQUf@LfJ1PK&M!4Ht>d6XvY|^=;Q{=B=eyQZA7a9^Z z_tQ2&xAg#8zoZDMh}8s^kO&dPdtV6vv$zIM?iGoM|6hd7&tq(Ej{hq&826*%O|n{Q z&6&A3@!FdfAT0!(#JsNl=@!I_^)BGVr<>-(d**!grbUh{1^EL`aFDX!nHYofLhjb8 z^V^=C=HtbG27Kd{30wbRoC{hN#*lg@OGUIh8%O^X>>KTp_gR?^3dVZ%XZ?ew0cV z&S70MgD|h+z9tp5`p5q)%q-J@4CLtQ4rkoRXdlxmCPn{DdbjV#t#C2pE*ytm_B`Ag zg?#}=Lb>J8km^P}?0o@XZy3gRW$Bl2$5Y+PEvF7VUm=zHWBdwHOe zm@K_Od=(w_jB4HQ3V90(YJyoeb_w_f`yFfS9ViX6`U2Mn^5q4eWAJ%LoN!s*8CJsM z4P^KxO%)u11nPbZ&mqA9(XNo|)a)eNLk;9Q)RqCu(Vq~Xkn7DV&;^};9it-xxa|us zgag0JLLZ`eyQ_UkJp!WjvRSb;b19*3(VD!4;lT|CNgsl${y%;zVfyF1Z3S-%uNfxP z8V__`voH}6yWEAk(+9fjqwaa!RVMufo*yje^oeJt1j#T1=`An7b&tlFt1qlDa0j<@QGui_@HzTa3Y&?XX|(7z!0*_ z_lm{KO+`zXlg4#elq{*BwTwKf`VqKkv+tf#&DBj09`z=+gU+x{sdU6_+2P#78$Npbr1R9J5Q8G!ICm4{u6U?xkwcS8;Dp@6ktbYIeyU!Tr3gV zroFf!hNe>L^U$}c`2DkBLRI(v#?%!hESUBU)WMS@nhq|7&t3!{_7~zj#l^i zyHW|=Hf%;dsNY7OaKf#V+1cXvK@A?*{4yO>(aBRm>Sp>#b&@p`pU;gnYaiW>G>4wR zRTU&_(?;z?A8bMGW9r#Nb}Av2*r<)Nh*E~|IqwSR5x#(ZG2!^);=Zyz2|G5Dbio5{ zT4~2Kv`2Y`T4eK1XmLi0PISdPM9t4lnh+y^$3#Hr?^j{sT_PG!oX>jkUB%HeNq)gL zxb5%2(U6f%3h2V7AC}@=;#Ut5NBhmmIZT2YL#kI}KAJZuSAKIMzn73sFLDamZPOUk zhA%7$j(I@^8?4>op(x{)lQ{yW~vTbJYnp8|J!5fg^eZoiVSumd1Ke*O1&B+ zA=8v$Lo^hBCD@ZX@iwk+q|IzVg4$h~cN(|}0)=r7z{lb9$^;iW zdO7za*%l zP=*J$<8yqsI|*BjcKcIPAJ19#)7<^E|6p$XfDHAt+BArHzTYsGp}ob~c6CUaq0?@p zMa%F2D-N!9uP5P5kl1#UkohvzK!1m{OY4r+^w(?-etIO6oVi|>kO84!L0MA0B$Zy5 zJU*w0>-*wE>GU+40#JCp@oQe@__GZ2U{bCl3$q}UkpQH5h?5%-udkHKMAzUX@}`Ef z83AM66PtH%t z`#6p3uLwLpUlwLiUTg?6zZUScU;_JIluBv#J$_NRPuexbzqT6Il#ObT^^Kn+K8Kr= zD2kVLy6Op)6!b-rD!)l;qs<7BN_1$m3>?1c^7m;xPKL4iaeRTTx)ok|4%Pz@(&C_` z@|zTeah=HX!Ryv+g_mw5gYaF#a`_vzoN;M!tluE|>O^4W(X>;cs@0QjjV6%wLcEzG zj_C^J%7g`ze!04?YW|M;L#jMrSab4BB>1$`j^Sab?FSWMR+&P{zxZp!QZXs8qio-6 z&ak7Ff>Phebk7({@>~wb?c|$)^uon|>x3f{Aw=;AxH7-r|A?VVB4h@AYAILvwY1I{~%TL>7gzPcO04~QK89BIgWd1|f^nntdJc$3W)4QFo` zx|bwpO?+!q(fZ+Iz+%rbj^Sd%VQJ{^vdhhHWIEB}$%$Q!I*E5J_vjOt>bu$I!Edf>K4K1Y=dUkE-@r*xK8FQlQ^1 z=dijU*Ker!rYY}!r@4cY{TKE3NLPO2F7_@3(Ih5Ipt>T4<0`*=IsWnj?X`k4T6|N? z%Y~)~N;^&CI9Nj51q+mCZ_&N0@Z;}C8WFPa^mLP~mU0N~q!Vkm24qLfr=WAGxoF84 z6g6+tjlORJD{X*#!oPqXwKh1zEs7z@-+l?S-cp5lBnSg^i*G|8cD!fNFwf}s0aSH} zStUgUAQXvmeCa(k*-lM9T(TgJwlPNh*dNLVvzkl%P_o;Y_lK}i*DWtcX@7cPak5kw zB{uKawJ_*B!1G-?5#BKz;m4SoWxE>al4l`q$kwf3oR8eVoQ}bnK>=+MzT)7x=N&XG zaMhkn0aYC}@_=!P<_h5|9ee)Noc9&*Fz6IG^$RU~3K+!@d{zWn2<=d=>qVV*|J!g` zmgQ_{hj>BZSKG*q5zmAv1Rs#V=xnGX7NlQfoNtY~ZEpls%zn#Y!9EcwAjxXy$1aWP zv%7}$Lhehj3+F>gcswH0iI_7E%J&~y`F8kWU`ZQK7<1&{?|6;+3xZ;Gq&rWYeUlEe zMXAezIM(Ojj5jxeA4KYY0ZSjr90uUmR{Gm=;T)wC^}*-UOei%u6C$KW&k6$bR+Bp0 zU!i1~86)Y6B%&(K!}N8KiNwBjxrcg?ZMeH^5|JNFO_5&Wop;zL2@iSHq*^|R-#BbK z+wC}zgOofhAM~PUKf4`~HQdb~qYYx-rjHsErNk62aYChR5S9v)S_=&EyirLTdfAV2 z@sbB{h+1;J5$c>{!BN)?4SoyCO3aWQeZV-YK0u$umP|#d3kWSM0LnWT40z>$ie=l# z42LI_Tg{_CRjwL0*BMaB;yL~L(2qJ9bR=)Su!z?v zz{DH#GL6?B;2CjUnUkw+rq8TFP`X6*a~KlB{l|%~a7!ngGh%bnMyKsgG~OcPSYX8A zPXGkoWTOvS&WN4OMkf3`A%gmge^69ae96P=f5dnZEk1DjV+T%0BK1CLsLUBWkjTIA z_wz6diW%w%QOE@zgx!q{gA^S?Jy`cM27&sdGu8q-v@5s4NngC9Lc4Th-Q3HSlTXVq zH)*cGpE%qy=O$*BnFt_;JD28y^xg$XSSTCDzL)#%dUc zA_DtFG?B&`OaTbZF?IP4O;qm{>t<_VN6UqP0}bW{;te!L*`(KMPG!AeRCZNb`~Tp` z*uAJ`3?*U6=vK<}v42AY7xjOpFXP<*)-NAD4nu{zSPR>#@{Y4G9Fdo7nlm+T#Ngjd zESh(>>BGNg3lgMU)U}%-2{an^kg!7!?#mB|&;TybtSfwC^-S12QL?RV6>GIs7PVi% zaYmxx@u6GIk{pPJO&V9?<{nokvQjvbEq!Uyg8+K_X#Bv2?{i(Dl4KH2Cp~(`dx~*2 ztlINiAhjG`(bzzy(Sikdn?c-wJZ&vtNI1Qq6TQ#XXes+s(~H^~TXhq^!j3_iR@II#BbDZT9GlEf6jV?j>g`={<pA)E9M)GIYP1b^H_tHV`!ugqnzMb*jsq%fS|C0?^g7_O>|twZVC_?G#yHlmtsneEM1ph1RqKsugytMI}R@Yb!E0rTk|7nt=Xl(S( z=PfS?nw4RzkUC=79$__t26|n<^!Jf%QQ9raO>E7GQ;njzq`32xtqH|Vda}@fi(a)$ zKbTAP$yXer*=EXC>(#`m21R|Ql$0N%CwA8DRg?va{2swLgiK>`cvwBOJK<)GMZ#oR zx?!>p7TT}y0(xr*kx>vN{3*&bpg4|yAeFpyfl5OQDSvt!>!ElKHM0gOWh#mhHvt9& zl22gYSLn2n#iz(;ml_}1SR_Bw7!vrPlKabYl-0%xY_%{HmQ0}mMa@MJ-g=?D{ndK% z-e7yVz3ea*hSYSTb>!81fu{qWTHn2b2Oe^a^pOMK5`u;u`1D5DXtnR!SmR)gZIx7j zzI3f`3;`|KHQDoHcLaWdJ|4lNmP<4>6Rj;=y)cop=uKe$2L8sdfQMaeur{2TpPi<}iq3h^%MAlp@1T=bz3~tIS zD2kIzYUSwOt)7>q8=2Bwlvm@Hsg)r1;)Q5k6dO3?8MQvP{o>qJw}m2~UKI)lDna>5 z<(}4)6S1edX`phtGo;XSsS8GDd-8bFU@{^t>i|)KT0mWr6`nCgY`yTcEmE|iiClCJ zN(#uY95s#2$uXOclMA9%hvy++2j0l};iMW2`RRq~GG-coj7>9Jh^3zasUGyx4(Y_uhyu^%D6tR{ znWp0tH2;uNo(<>R=?gky&M_ky|rXLPCLnm)V;c*CasdNfNqZaQ>}@?`K^@LU{)0?yLFyvexT~L6wnX zWd9&*> zwSp#XT7pb1nvu4QjrCMUdeqhA_@CMx_`;Y7m73~3qFh^)mg2n%-iRXPf{YVG%hG}0 zxiLphqY*rzS;0SBwi)sEDFc+r{uM|abaVM!q%25t|F*u@MoAYSTwc%u+Sy1R18C>{ z8j!mN!>wyR!W@=B(x3JiJ>Of_aNeWdwyDTGfp*FNGGl^7+w=;_4yi*F8UMXnd}c}zRBY>7gS zrV4BySRPV~5)X4@h;^8Y(i=MgB`)w?AK-(}tjDb0)qLO7FF_;(_pN;!0#4nC3)D&0 zqdSH4g&e5S*~`Jj?@x9X{`~F!@nS6o*X%=oBD&}3QE2khx5W|3pB0X55gn}}PR-k{ z*F?m&qQiwQgbpacg>AoBea_E@(45MlDBs$A58QkIIC`{BW%; z>KU+4o#%PX>kGWZ4rmfc&@a|qpLZ1BW7r|qQ;{3EfP*{$$r312VD%dy5Dks;DpOh{ zi)x$g>RVbZuSsmpaPFq``of0Gp(*v?eDeS;5ICv4DeIQ`u~rg*phaKy7{fcWfbtxR z&0K71eII(RNj0b?60_j6OH1*xO1uWsYcbAGxv&lQ!s{Qi6N^HV@Nf|#dW_e=(2?k1 z==sCpM*1RZVmqa0z?ps+^9ASZ(^}o?JF1zn63haw6JtVYWbzc1qJSq`;zris1%gXi zJV#qk@s7;ds@3w?C~^ux$jl3p`)(q&mSO&b7vs!6lW!B(iyR94t~tal!}P;W z`a)^lbkse`o^z3eclUe(>MI% z(z&|B^?w_LWQ{vEI{YgBQQAHXkQ6@Jc7>ALr!G0Dg=(;b+)}y*YvO%Hrg~)Nmvt4JZPCgdQ(CL02tDn;7jk6C`|L&KQLc%@pB^0yM z>H6cnHO1#GAYwMBFNWzzB@H)q9ulh+ZY?3|E_8v<-=;i^tcd4G z4Elv0QZ2uhV9$GyoTyePSLZ$a!WErp@mnQ>7+sp}eAY_gP_WI(C900UfF%iG{l)IM z16H1XqT5BXxH~(Ryn8l5Z+Wv=?GUYi5UY=p!MZ}Xz$j94p|rP3GZW`$xna!zA{B(Y z!*yom6+n$qUS~dLhc6AN{qHgE>v%|3Y8fzVa{4U%Y|vJ2((rDKp~}EqM0D&YxIoN( zk{&07Q2AX5Y&0j~&>>k&egL74-254#S)D%%;uV>r@RLHZ>mns9-a@i;=w(o>$DfBt zg=Q?-Z~P_vV|yD;SV3T#Gte%i6>9?PqkfTvUnkpoW2TwePpqA&go02r&PvR6S5@i8 zdopLgn&d?U`#tRP&wcjUNH2G7q07L!Y#|{Sr(i*ytk(tUup8D=6s8!RC4$t1{ypyx z99C(eW_BQ+XRjJRWbzcD7JjG*TT0LOraypBB$Bn8Z zae`4T$mmaKneLh)9(*ePVb9gx2MnyjT@z)dh^@VANU4}> zgFanf0HF74q|~s*tNxif3BsI@U*O{#CA$yi87+Q}D06Yb=*fNz$%$0=8eExHPiY-O4~L41^uXH4nG-W!+=TH z{N_XWKRIu^AJp8H>xFIyPvY?>w{L@+Uf9vkM@L%;|36WCWo&#sdHZGcMeUHW>mDDs zU+53a#Sr|=Sbk1nN96DEABp&5@!w28 zGFM~sCqVEQrrbI*4qSHVEZZNhL&&p8Qb@1y?}ZjWT&#vN%ID=ds2cblkq=L zg&=zn0VAOBbXo3<5YDS~nfri)Ay-fG1XcKrYPSy&+$(}49%6*hf7$vCAEXV>nH@*- zDC_tJbY=u=6uqX!mcZr6AzP+4rsagqUWB^jrc<=V2+W-q^C)a@V@cwZ{-&bCdJ&74 z>X5j5>YkWJ{P2xUYxW8h>nhna1x06>G`j&RDDr1=|Ky)ra8{n8a0#oMU-i|Hn!4q0 z%P7$*&6sed_uPV`N%ni0^mf$Xr_KrK~+}}Ngk@EgquydD*O^aX}suI;d5vlVb zO;w9N1X2o3gyTLYlzTpckcfao1PPH50|VF~Sx3BQxgOIG_`_7tdZjpaX8|7e6J3`Q z?jUPClQYKG!wHEaa!6JU%J*>&po#Bt;O2F}3+h%R3c}f&=#s{=T;%Z}6(E%Dn2$iX z=JNv6M!wjm|C$FO^ zoqv;fw$gnYN{+aLpA@suq^yMJHw_)uV&AoQSmj&r-A@ai(c4sXkk=M^KTx-PkU}ZO zLv>s}gC(7K&)|5D_Mgrz*t;60=jJU_Cppm=Z>!}x!qjz)RSl?POmF4(9bu$DN9UNFb%dB(b0ePCEBuLXgFCJ zACS^shZw?3(-KSZZxUXQ8G4fIc$A~mB&j72b&NEjlq8|1G@+*d%24^5i`1e0TqY8P z!IY+7z|k<2JXSi>8}hJ=)Wz0bRyfjzmr;6@H|CML;`JzNzmo|=7Xtb?5pXD}LVa_8 z{EQ24sEU*}%q0!?oRl-`duEgv+{mJxpH2=s~?!41O^$%1@_rWM9+3VvW{S;I`VKMG(L(?6j z^8*w_{vC-xnuJs`NCcyYhI~WA4S06XGB?6dVHBj&Hl3S4}{cT zu*D7IUu>s?YEGj2UFK6&sN3##O~i3K5CtE~Ahc-Sfhuft+B4>#5FwKew#($quMNr( z4uh>XYYxI;-bC$3q#a!P*Kb3IC5;_8X7B=bPa99;dc^FX)=tUYld^M!?4LB9l1{{T zeJ5mf8c3(O;D|*DE3@-ERe1Ir&mKXqd&xDRRAK8 zft!yw*#+tBdB%6!IC{2_BsSR~txS}pxC-UaG!X+9Po+3-tcbt=GV~%Qy|nQOuxcl8s98P-nV|#IHa2<^@~3syA5aC{wI)i%lO}J3C^|GOJ-5(&iFtuug@v2s zb2%&GvM-Wnv3!y{Du0~6Q1G!QTfPOwZbOd5%decLmA)!~v+qTR->2YQk&$nM7$u_r zo^U_di679HGBP0dL8w`8VH4IcJXJd@*ocNM9HmZKZ!;1Mj0-fk}eqC%6zAV(zZ(mANqjbn;{3%H8;;~m;&X@+vuFNQB42G-;6 zXBNsVdi|3l25&`@DE42>SGBYmhyzn!(@EZ*%D?Ym+Z`I`YBBDvKagLjz^%GKoOg5K#i%vNaAV z_z)=pdT^(dUPG%cBc7mM@2WovRsOa-DVO=jgSyX=j=prh`>J5@l?Xf93A-Z>=yElu z;41&pdM|3ORCU)I{Y=;SWUOTd_+dfdXz{Vi;?UIOn?$lETeH`%=x2#e0Ti>e1~B3p zoT-?BeX%K9P_VLn#`EA(QAaQ;QE-DA0f7wu;C$W9{DVNGx6Yg&;Kbac{FOD@-%)vf zgFkhILb^khb%uVW>j?!KF7odgQ_aHx{-1d$YhXX?DA<4+CBF_V0 zr$M{93xXrxHaX4Hj{80YgjjQwt<2r>IQRPgcEqJ6wSEpkKmo@5cQaqd<;RJ{X{cfT zk!^KfxeTCqjjFu~iC*S*Sy>1Z&Y~w@!%c5->zYahQA1Os#3tf<4^xXxZaQ`I*pxLh z(=S$?piV}66t?Mor<5H7shz{5&yJHjw0N}p)Ykgg3SC9CY9@xJlMy$yLc{5Em~m5& zP8NxgAt7n`9f=7qu2rT%oA8D*50hs`_%@4>NM?nFvNNtJ_S1V*;bj>nw=u?Ig;`OQ zVg`SQXK+p&Nu8QE6>Q+YPv-6{_?lPw6{#(;mT>2L}H$*Va`1#UlFX+jP zm=63QaLduepm4?%A?R$AK1pcb3Z5YXBkLLl&Fx{~he!XP?h!1X7AIV#4a{}fSbmsy z$hsdN!B?$|w##cn1OZ=?ui7!18e1`F83|up-s&5ikul)U*LJxT_a=O)zh>iSLg8Qt@5P+6Vla) zMyNu;A*%SPv)~s1CXFQ(KE^Kq&GE(@=Aw?LDj4f5m$mp|{eA8qe&=EA*LKh5i-%Fu z?1{x3+)J35sV=av=WvvWl02%Ok!y5=I$0$%WRp8oZ0Z6Pa^0=(fiZ&|CK0<rnG9I0HV{*5}DaKo}(F@Cs$~%pumTSVqDJAt0r8J)e?T9yZ^>o0IVPqpwUEb zDkT#~;8h23vnVoJ<~CfC+TBqx3TIr6ojX*~yMKLP8Aoefgv~!Fmk9vgCJ6xs_3GIq z&uI#B?Hh`g%WzVe;y~du7^hasHY5<${G1$BU-}7~V7JhZ>mO67C~G}we=a$X|2Y5H zh6cx2b&AXNPol-^V_g=95K;5uY=1fXCIoeJQ9y-dkvEt#aV5C!(Y8awC?pfF^bH>J zaHY_j*SMacS2~hBck(fz=7*dv#C(*^v2b4%ih|1F&LhmJnMohAqw%JW{ai6LkXoh+ z3`|Qqg||t1ee#r=_58maN%<3H4-i!o5agZX_;2Ne(t8GE)K)HH)K?O>R10+8yt6pn zc^Rz8cv;eq=yF+2KN9TQ2G3fSsD|8lj=k+6L><@)g%D3*@f$aYCu9gSQ4E;%vUr5$ zl8|Kjvaf>HXnz~GRQsT-|6{Gm|E{L^M=Wnq(fmU=DB3L&v1n>fvkYl;23z`<%Llv& zu^-Hn^8@JjOg=$=i}XjFQs9J4&(zUNJDFwvp*#?9OaI3DC8OXw4Ns$ty)N2>p94ll z_mOvQlA^Q_gm3@8n~M1NNvxBBF_X_~@P%T4i`_&z-@{8FWe?J^x)CQl+JV)SB2Ya-lTB!qE7vHyW zPw zST%gNKEG{yUL0DMKG|Q$JEnj2MH%6&_wBqCvN$<)eKol@ve{es1Tv+vy#X4k-{rbs z3MH|m*z~r96(-4S!f)Q!d*EX)+4I3zLyPd*2%buaOWpS zPYxS`rt4UyP0oUgLBxmD6&I8!p~{zz7`$)6-?9FqBKQ7>Gst{>p?8HDcZDf;g)w)9 zQTKsHeMM=`iW~*Q&pRAS$Dwdh0YQ_<{*p!4iX{ss$?D%2P-lyA1GCh#;4^t=@iSA| zy+JL&7^1FTf!%-Bztb*pi-4=j7zojtT=I**8S@4D4C;`xOrJT$V}5|1Rhv_n?XOZj z1o|%)CW4LcRX9Tp1Hs3zv&L3;EY>bq%2O9_4Fwzf!J4AeITg~v3$NgwlWXn;b z^`YXtG^s)2+jB;1_*cQ3A>!iBFbQEjLIH*I3BvB#0)dJbA!T(8LC)9zA7$8G74SNY_sE+kWGk0a{-jCU&Xk)XKwkP(et^TaJsln#($_C z8SSCuSvs!I(4k?te2#s^Mnv8A^=#sZYHXR=Co^P)hPC3-R)W`;d^aAwCVK>txbQH7 zoIroL7`DO;?HlBC4k`BQPKQ-%hq8-LQj2A{`@|G4R^TZ~w0URpN2zD=$Iq>5z9*+M z?3Em`(Tr+xjCTTlZQNg8)ctv5vZ+o+-v6coPyn#Jx)PMacA6da@<2n`N9@^VG6HQf zNeU843NlFwQ<3&FN1~qQNgsbCkCil!B#VKeaU8eh9Dm9}ve1Bs)a)xZs8(M~p*cZM zI>4R~J-CSPpR-%DqEZ%ui5w~um{@X*_rVO-+b`ENC@YYyzY9V*SL>-sXVSD-mMKNI5~HL4w$;|j_UQR z5)UlJ+F)I!#oOOY4TG1%VQx?~+3o1aUag$^-#i>D|IL{kj#yjOxMw>~&3@1s(Dfc0 z{1iDuw69#u=E;#7uK3SYgoGGMb?5PqCK01dIy2IL&BeP1M$Zl=bCirK_^6lN)icB z8VMQ)7EjIN9T@AlZ0~rsZOa^6fro!%i+dRJ;@jZNu%b7z;+18KhiTd)e5t^g@tHLy z_N*H;QTD;_T}|0s=)+#Q)BVlFdX2gjm8MhkhEMzg2|vh>AkOGpL7|v@=S7THE`^6* zj3^u(EwK#nbh~W%Fv{KdT}HB=K{UZhrLEqq(|90Eo`-i4%aCTkfI`kv2P7G=@nt9g zIxdLm#s6yo?0ev@i)U0JxQ%_$}-ejIe>tC6sIo1jIX8)&6~Kq^e7G@=N@?f`t*Q&m02zJCJO0#GvlZ zxvyE{#>EE57`hdoz9{3I&>jX$An=`e^uN%ImgmY3d2ExF8&r2M7OIs}7E)P5=Lx>p z(Uwtcz#zJMReZL7C=Y|A)UAlF0X3&@>t-aDo&x;r*Pz@Gj#@cbz=Un^hpB&m=NgwK z&eXr3^T);KBLbE;JO9i!^2P~6oV$$!Ol6cesw|R(_*pJ12*oxtK-JG8)jWU9tjnDn zik_WCxPnMimyFUfVd~717O0lx2Y{PapW=g1=_>nJx)-`2O4TGOs|rS7*V-_Z@}?Qg zU`>XMng}kp1T>v)GIjiAp}FjEbt%1t+K7eaCCVg*ZR>;*ksHVTLJG8PD*9CM{Acoo z3MS2b5Kw%5qPNI82T5vKM7D{p3=L?KJ>CwU$&av~;XmD*JAIk>}fFefUY9PyV+g4E(3;@b z8}Z=I6o}tV#V)=NO}w!dA% zT4Z5~EM3T#bU{dgdnKYblk73Whhc3e3I z_=cw0@F846cAU+l>5*mliv_PvUlf&oWPun$BYnYMA|^^bu6qiIiOdn?5+=CPS%fH-@?gI*vd%P&O*DmC}`#zGxRDD4E2kh2tIE>_G?fO|uj zcSY^Vx`_}uhWirSf!>Be1>Ufx^h~Xn;3{76XOv|P@8np#A7+{2UYwMX3p{>dhv;nRg^V2K+u(^ zsLi8pVmGt-#H|rV$)Ts<2#+Y&NM;3WdluP28rg~BUfUj!-p^xzk_^Es>eh1RoIU)Js<9KJMJeW5tTac*H# zi-_MX!zllAlmP2IqS9DZvhvIA@x;Kj$-@L9i`swM6Q}$_U;hrHis7Q&7QY!vwZ}2l zuG4cgAdnc&#|c9yF?$cLo%;y0BD(+$uG;(cx! zWQcgu<)O(pF&py2HY3P?Dx03!(zpW4XA4)BEOz*o&mwDy7Peo1E(f_##UztD!xAqM zADs7hM;I9b9AfM0<24*L;5cn1xJkM09@Nebf=hlGX13sWBbkLzNuK6?ow4*6*?gxM z7FcFmk*zGk2mIwXD37yZQSvk4qu#xz_E50PO)t>xhzdP&t;`41D}R|9-kcuswa@P> zQDwdD4Ne|>OP01+F`sfH&ytAU^~_vDM8+Ud^`qX<)BDGRKk4rPyNVL0vs)Mo>3~)& z4osT3N6Ul10pHM(@Nq0ca9fOf!wRP0x7ZrwCFXdyDkE zbLCg^DKq#H&bX(!h7t3;4T{1$t}UHBHgxIi<#2y)yYhXQhsyv8+ND|zS&V}^QNqcK zx?rJ!iI3U5@jGD*E2sI7Yh_`zwklal$+2;X0bx zc!i-dz;Rj$h5DapjnFiz64qw}yEEz&yCXpH8PIQ5Z?yOWU_?T@#jO%^fGHrJK-QlH zaa^SKryTh-b}IE^1(Idb%`P0!xGDPG1psXN28SBi>=dPlc|?@bxQ~9+BSMknq|LeR zXIZ~*@Dq=@Q+7}>@yton7bXkeY2uEoK6p`V9l~0yqXKKC3ol~6U_|W$M&dbKJPjMD ziuCJG8F6A$n}oErUCeU52qSq%Q|mgGE-sge5+~kjT&OVWD>%PThE2;b?Ojbif^G-M zTs|b3lwWVZE8Ls$W3EfFx!m*7YU1%0yCts?YXCLE|HMT%kYt5tj>0VW`{58SxFWwg zT;?|G2&zb_(y)q_++gYv+noTKP$HiM6p(18^w!>@l7xy~AxxH`B73FX>k3MvME6|e zPxdQsCDrvSd9x2S{uR8`8@~GtaRInw4CiSYV>{Ra%XKdkCI0XQ^rrw`x8yfpRR{lH zLHZpL!@qaI|cE94mSt}i*JJjjF9<~W0ynO)~Ga5su5Qo6Dj~?8jPzh_zJXM2E)^seUhaJB+V%RNk(6k zCHX*KiWmn4_~5@Lf&oqKO6OJzzaNszvt%M?ozXJ3ozb#U&a9IO{F3kAkR;GQLF*kk zm6)f4YFkhKgtK&Ue=Hx`U;v@w?9TfIagB;sZnFQp<%N^!caEhVz;l4@`ceE-1SRG#m5mX z-y_!3fw9~BA1M^WJDvcg{fZ-JQX9{~z7A#27N30wt$hOCJ@g$L<=q~t%u^<6d9h!} z<&ze+E6d%N{=4rXbck3uqJOap>;|%Ml5Z1*-jvdP#afGX@~R`cRk&s+`FH{4u(EE7 zH`XJ1P@;Ncej#C!8cGME#0OzM_K&7)$A2FP!jkddK(Yf^@4^VqzF(A)GiC*ha{3oi?u&R#HMYC;z0m)d*A3sZhBTny>g(dN2AxeB}>Z;?yoBpz+ov%;& z%VZ#hmcxnEF2SHK!J#F;=E$A0dbhur&1U(<3rq;Q4C5i# zq;I`52N64ipOG(WrVbw-*eA(Bot0qW@$G;w&Y9dTBSNPD3TS=?B8;tq)Vf6aIB-|% zF3?W9&oh!N8s9^blUm%PRD267cQa`27i}INN}4ukervWxYxQi5|J@@|3a;}=9uZr& zJLZ^}!uS<5`5iGaPNH-(gK)1>g@Lfp5-OC>xHx|PIJxj*v7PYGTMqzMVrjsoP7j`R z(>B2$Jq9%q-$jqzsqaJZUps|C5K`-BAtuY1k~-f5rVeVe5jduemw$mic4Hcu_ad^o zA6V@jZj%5+%P`EsOs00w`apOc&?YFol4oi?Zo>JUf(#Eh^_1{(H1BGieDx}FGu^<+ z3IkeTO^BwWg!Pr#9l_(&5+ct&jcO`#uPc(2p6OtvL|3Y!xAvmmnOh?CG8PamSlwC2 z(>#&tS=vyiuF&+X|4$+&N)y=O&`fZ288=1FM^QNox{i-Z6R7nmIWw@6mAiwA>P2Fd zmkJ}wsLZ6d(4seV=nyq=V?9TcPT0LGuXg1eZMb_igY0bS%V-v#o_sl$?c+POKS5tT zBrH8vIAHW@My5&w@;pzFjRJ*<)RBB*wA|P!>sy2}u_u`&sX^U;0rQ#Kx9P=SFuEYX zu&r{DS6r35q0X3b(Am6OnHJ7Xl%~?v%u6zV`4g|C?h@3|FIWyN?On+Hs!ZG$D!Z@Q6G&lZabQO~aneioUGS0H*)9sXuVP!u zinsE7-U^3(|JKvxQGMG?@B}M%Cfjqt1r8=*3dr5KMl#IYJ*3~3wdudc+1u3L%+}qS z|Fg%55cafOJvR!>OKKz)XJ0!?5SO@4M&p~h($*YdjBeq$!l0h+E!U-{i4x_G6rIl| z;MlsWG^TAz@DrauMiR;{7BCmEv%>EQ?_DInyoo|>WL-T}MuPTgLhJ#Y7S9pf)bxr( z*jUE~a6E-o9&aJoKI3`f3|3lQ9*Q|!Mym!){7MULF08W%=khwKb|_?k1^V&1UM=mf z@^`F7uT;F_Q|y?#AW>5<)wLw~G~9U4jtCx@y-q(4Uzk;yj?|e`3GMxyDZr);^&a^( zV`!x(D3#%6zG(MR1pU{D*$?Y=5%*L>C+?I7Xii(H1-_K4;I;5a@qy7Xcx--mvd&r( zRNu(m4|gBVN`Jevb2H!j?A@o07qeLFsp?yvy6*6|bs*+t@BHU9u@RKqPH}|aN^rCh z;sc=Xo*+fKcFDr+*%XfmCb;+RTNi?meF=Tr2>IH8Mx>e-B~D2khav^gm|I6x*&k0p z87^bt?-gJUNu}q0vU6VT+|Kz5!eR5dpM46>8z{aSh~62a@D@4J1r`O@{|wObiaWdr2pdVC3NeVV!90}UMD zm;Zp#@j-z4am`->`2Ik@n=6t~7;h~3828}y8p(Dhw{?CNM8%R|_H0mauBr$GG4D9G zXMovDJDFwu@g)PSeY^Y%=z-dvvl>w(c=Z_@kiig&0EJz!g-c7NtM=uD{S(*s@+8_a zv%|kWgX;OLMNnVSGYy|D7Xn20S{0zaF~BJC0{kC}$8b$Y(8M_p93y)zhcDNczR1*Oxz_ivQm=G zM0T1?;JWSNV8!cIS zE1z+Q`T4lC@m4|BM(S=#5FDNpreO~4%P+4_VJwzD)mah{QK$?N|4KCfF7oWeU5G#+ z-eK%w_MkMXp#()2|X?Ey?)97mmq z--EdV(&&#Lf1Dh*=$_V@+ngbuLF(unn4SF#*v^MOP)fZ!gWNab+&uvY&0Em~O*VzT zXSDmTxF~kxyCUOTE1W6GTEhj7OI2Vo&xs@Am}H7+{(I zp5N^x{+=M+a*Psx=WXJWe$9YzIpm{%f>G3gp_YyWrUr5=B%;qHh`OHla4@J8lEA(` zqeWB`aEUU+)XSMBLlVd#99GFAFI!ua$c)>J(97gmvoa%*jI||AEfxECAM{~_T>=_>vO;oud>SXEZ!dh1A z-?oE}LHvAh4qLvMTQe}wY8Q<5>-w?hgl0w%Tzjr)jMYBBR7t$O#M>zCQ-g>ab<+O0 z^-u|JWebNF6*$o~oC0<42yuP9>x<(6(2pe~4X1dlhNQKapXL;o79)R0-C&}ua*&!- zge$<6Y$;1J={5(s)0KpJ&#dk^s7L{j)Dx#8>2=biK3d;eh}1Zz^9JB^pHio`o8yeD zmFp2cUnEkd23n@kjI_xf0qtB10+wW>5Z?9o-mRqVtXVlFu%)Le7L7y_0RgL2YE?@K zMVu^!5NSc z?1}82+s6pZG_SqsbMG_!##+B6|CACm!x;&y9ScliEC?yB?s%w{M(m z)aS%RGys?wI*I&Rn1S=!sX9J$ieU;RGf*Z=>j?n|z(rMT|M;8EcR)O{_(1RnPsMc= z%K{MI)80YlrwD4D>d$^+UEBY%8dWL7r=m>{T{u0+s^(%vKS4)l9+c03{LLH1A&004 zVdZy{C$rccHe<_}$RQ0HsWox6(sKs4E*&(~JsVI9D@gv~QO-r3B^IJ} zY7to)P^oahB!-Dd{HF{W-aOAP zu#Un=HNZCm15R*e2#CgmFrQn@?SUYMuQJCCq|Jp$$0!JExAfxY_AT`QET_&uDdjl zt52->qDZZ8a0pqTsyPce706ItO&>=fy+v&BIx)@BC9mw43ECs-Xg}FT335KRN?nCjgi{B?ig4;?W`Tv5!?xSER9FiLl<#$x8xvQQRwIw!2;pm z7(i_}y#Ry*7U4UsAvtMY3t1?76OYQjPnR$c(qnAq|DNoGj9~E%z`7j=$a>{t2f|sg zV1ay_(cZHoIO+*;`QqVv{$%kG$uwRi%k zk74{i#;wgJ$f{X@?KNVVR}4M6+~3>ix6W1Q@r(FteDuF(dJU^b@bi^+T?wj;c41sy z)vf7vB~KUgCOOy48gq5$9<|zN*ym>!!*mP?3tH-?AC9>;69LH_obJ_cU04C(GpttC zKNK20ZA!q;1O-nq1}{ZeU`pCBy@i53jaaeY*LxM)@}n4$Rsc4SXCKcehd?VJM$!C3)RUi96pKG^hyjx2F;S&_LlK-^}a+-e7k=)t+#ib6Ly zs+#ORs-xBQ7WaS>Y5F{(rGo;lhtq?}nbJ^fCRZ1WuJ4!s#|wnys(g z_Wwxs>)#zLS9=vqUZbi*6LyR(G{M18b}xn&9gDfP={VWynvhu1E`XqceeKdPBq0>K zbPS%facimftcVeE5%d!Qazh%IVBn2IdR{JIg?QAu$q;^EKyRSpT2(Et?1)N@ck3+s z(L}AJi>3aKvEIT)FN`UaVQE>feKx6*{1~JSz@~JEK#SItN!F$6Ogb8H;WiRzmUtgJ z7hNt$&f#wM{J^TeAcms#b2sD%WrE={(^YPxIPwM&ki{|)OrAqM#k)R2dM+6B?Muw`m!5J+zyRH${VD^8I|881$ibD zF~#Cl*C;LA_5dg3kmC>=?jV*oqWx>A2pwVZYr_b4R+SFb#m94&|K2Z;>M=7F%fb>k zf~fQQ`4S$SSqIARg+R~Ux1?Vb^#A7+k@Vu6IasCA+7XAwt3cp%+#D&8;N4OL(*_d3 z7*5bT@P#*U?HeC_C}&EnJb(l@JUeOZup~lhxep*;l{-=b0J^{`%I_|@R!;#|Kqn)+ zpCDRF#NLrW>g^xoVQx?YDg0zsY_?5!R_zCOh#|i9TUVBgGJ4}_r0A0&zV{1ibtNBS zj6E)0YtEbcox;DSj=B%sQxuwdb?&n%$PW45Ip1r2lOzQofb2zAY=QHkI)UN~jU8 zplJNXW)Az85(lCn{`|80zb3vjz;*p`oZlU zT1UXW{`;&k4eXs1V$A=(e^6QbsF#GsLqg7S^e%wf7J7eae<-?TYmZb1xOk3O5d}TG*_e8*==ysXz-&{J6dH;ObN~W<8gghcz_={) z%aS^=t!G!uICkEoiS9j_05!xTVRe%8V~i$w0$}qhGgNm*_TV7VSdiZBVxWWqJCtrLk3t zW_3$osQ$ObDiw-M@@fGFyU`R3%hZdN;oINHg0nDa3g3%NNz!XBoeknPGY{diZVV?6 z<+Optc;kqsXsDKZ6`f$E$>{db-IMNbdL{=mptqP*z8F-gMS6fk7cX=6ly@$yG%ctJ zBQ;y_b*Cn#sc!x~`H6V}BqeNP_W{QTT2CAgTwg@airC9C>Qc zOHQ;k)56Jm!n}gCuBehEs^`PJhu5@u4?#Hc9*o!Pxqk<^Xa}A(s*?l!$`J8$QS1iO36$;aiC`{0;zo+AFZWj12(*|5!WmH z4Y369x`!-om-`ZBIFs3kX@ zD~>9cz2?L6mN&<>MMiJnr2UBuc`D?(*~8p@2C9Bof+>oe_`DCzks^Dg^h_KUoA7dg zC33gX*AX>(!=5rMiEAU3WN@xIITO=M`xwbSJD8j46Wuwr5&8>dO|CccdB_+&$Dm#H z8)>3j7RDxBs_gBb1%Eh{8blyWr4h?Z25-C@`4-!MxFj^y#d8_vBD*=h2cS@UXXt>` zc2W&}I0#e0(hUYi+0nSa9wi}%L zfam7U7JkI(RN!(?WcEb!9KzuLNs2$(1~QFE3Ots^{J=utfE5~LtG)RkHEBKj_1{L5 z`;C^loJNdK8(=)%B5pQ>5T1mSO4XDshi6e`leYN#_ zURkn5BiOofx&*@CUKpMF(NMR}w|xjlq9*)_q2@uCNZ>+3H!?VOwAF$F`Lx}Y#3qEO zIAKhBI_Z?CZq%PIiKsWzP%yy4-lq#5Xug=oW?xK>2g*(@6a=KAHxQ5B>1{t`&#m5rz26o(-E9fW8+^+Q9yg9Bt8s+n%RSoKt0=f1{yZvkJin zeK4%kwiWCZWM{d?o}ktm{SVw~ALzG-k_bEis(VwaD*g#nk>aq7kw&NZ5rv2&9-L?& z=_TOmG%Qp>+)sd{LL|-dq^{tsWP)B}i%nJ$8y%zi8fW0QV=!Bb^N9tfTc-C!q0zD9 z4N2~!205-B_6Ee~QHAT2EaxA=>L%2jE{OD?+p!$;FgRl)=V-;V^AFqkrHJVHLRN;g&na9}Bxtx)B_gYg*= zU}*LU_VSE{+x>$%`V3D3hwb!DAW%ey-We%nE)j)ZXJcVtsdS)s0r?L5BQnzZCS5K2 zhLAJHlOw3K=byj5o0C6!k4&jOoKp$}1IoA2=wMPmVX-Z5A0S-3_%#-|>iNaOlTYYx z0p$koOi61JiT^odTUY)Dp5+C17f+@}$AB0qAl^N2r`qvs&$WLdE@6OH#ZZoheQ__Q zKFHM1qhq!xx?wDunian>0S)~%r;8Mzuq(MNbh7ppHKK6o*)d<+T_?|oWtN2%cnbhQ zA}%+IVbRxhR0!*t{NrH1q1?ZN!(#p&NYfQ5hH<+u2%$&vZH29%YY3`|totvck4_y- zst^mPm{05GKK-t<4SEFt=f+ zi|-)B|9De#sg#2oP^UxP-xDsWI4yx-A7|VKQO5WOfn}*QFJbngub-4dnli?;4~-jy zz^VJquvX|`dLjSSkN%Ox*k&~_>1)V!02lL7h4)bNyNw8 z8La@#d&@HPp^!Nl^7Q%>4;xKBJ6StB^DlO>xq;MF-9MN^DmTq7%G!D1{_+fD6zHJe zGc0r!=uYJu9wK2US^3^+^_>y5g%oDPwlpI$jO!tbYYP_r$F?F|Hwm_GlzNfBA+4&< zvmE`OnoQ?5|N=<%n%*bQ)L?Q^P4 zl=YL7J!In2=97beAx^p?4ZEsd>IA)Zp@fAwp@^Yr!e}mT94u48i=BN)+JB&|WcaS{Ui@BzL8) zT`SkJbq}*_tu*1i*mU#)y^Igl!oi&7(TnVLRCw&Hkf!Ln01 zC((Mzpk-w0-<|PjanV;c*bOMvZ6F1H6`F#|ie`mzOy4fzUCD_1vGWXCSJ!I5-G{Yr z?5`Zf`erb{;=F$c`F%Cx$o^mYuN~1>kN7{4>&MBFjtg0EOkyFYgZxj%YZ1I7@%N?2 z-*9Bt*As*GSJx&o;=QhEeJO%HFA(z@Zc)nk0MDEmw387+5;<5bV6~n&*{Ie09Y0Af zrV=EzE+s~ksHn=7qyT%J(%FY(C+7X*fJY&PuCb@(0=bM3Oh(7L63g2dFA&}fc^J>? zDGAHL-)S-FtG*_H=eto&o<#9wtERmJ^;2=nFD|a0y@M$L0 z!ar|BrU(y^5-hXoes8(yYqJS#< z?HEL+?VTJ&?B052n6=F{Syw>y3&iMm)&xXK8+E%<)`G@faNYN#L(ZPDA>>8PFdj@ysUKS{Y=_<`%1y;a_RFi1+Z)$N1P2+QNv-}L)vpmOZDHJKpNko9ueWKUj zId*m@L;ncP5!LWbXH19f@@T@mDw=SHu&g31nIbFmSZDAI7bgB5O&c8@SUc1*U25B| zbNaU2T)p|5csPg<)|F9h$n%qn(v->I+5E&It9r6%Ill~;Sqn7iZ7BDBOj)W#Y-PZR zJsNO!tU>P3IHuO`4CF%7&7l9LezS3}!#%o(lNL>J-9^$dQwn`YCe6^PZ{8pUV)zm7 z3UveCBYPbGz_!WA$MJk|2%oMWb)^Rk)Zh4r-Xr+^F#G)eKi3bj4`X6+I0X+ZIYZ0h z*5Am5!IMwE(|Wx=@?kfDWBXGG%kjvb+G|Pacjc4ilY`w*OBRSiRaty`d`kh**vjbQ z1Gnqm6xFjWQnGSo&AvRRgb>#U5lK-s8lFZ!PBJ~Xt`exMCeI3;3b_MVWH`lC$XHa? zI}%xB>cKA9)k*)f-N=6Rv2$PIZu~zV>YKjTd4V^4hw%Q>cfd$wkG!uRmXEc2&QdT{kRm(DllVx(vA*DdBT51|y0=a4UX;BrEpHg2iwWgcZ_5wYD*@Szx2=!Fx6IIAX zGq(xX?$k{i9;S(GC+CqO6`ThO<>wqzwb4HGHx`2Kbu#GduuyNN`=+X7%BMV(7|c}YO3)et_{SH= zIR^QZer610RGotx2BIa?HKi=z-%LPe0CcEi{aaiNO(pR@Y_R5k{ll1+9k&$`Fr(e1 zLr+hSk!+$+Z)adpBd)2NjxMnuEutkh*$5KjrGx_RupBlchHjON25OE5Lf#A_V+{Wo zUJ%$?JiIL#SX|_sFA8ig4x0O(Xk9pr4fu@riT;B$cuU2kZy(H~(bW}#Uzcr-N*EhuJ8P_+*K>Q-MzsB{5 zsJ7`Q^O{e*nz>xb~ra3VljWJ$` z$UxqTQ0h)L$`V_0Be20YA26crzAZu`y=$G(P$&Hhqs|vcaJ7lLKQf59M_qPQr*7s7 z36lll&Ksv`?4Y*D-AQutD+>(In@sfupVpU%{u@W`Jxw22D)T1;RS{}^e}Gh3vZxYW zsVp{OHD%L>JGpp<_4N+c2Le3<(ONxefD;Gu-MJJxwSJU7X>N#^c4a+|07uvrnrcX+ zi)kPZu2I~Z>*wCXOb~-m68ddE!E{yYs2$Pn-zp`;u7umYG~cd>)Wu^YugK`HGzk>_ zmumY!LS7rVoRoxwO6`|%e)A4JGYaJ}ZqWA9CKyQ%m|w>RHVIDEDjl+!csJOzYsx+@ z+iu=nNQnTBd1G{L#=DO1Aus`^9Z>7b#5tQg)CH^loC+!!n6#mQvXm zS4B^|w+le+-YbF(GC!tRjbtLv3zX`$HA1mul> zV}4XSLO6{ooPN=v=sv+6PQ_t}>jS~owI(a&u}fE~_LKmMHGW5QavkKjlzbSu#s+!d zL%$s^JEp;bW{~06@Kj`n0A69i5W1RdOc3sd=ts)?7Xkf$6I9BFhC7@}{s`eWjIFmL ze~7sOm}748mrkNa0<~>kf%cobg~Wljcul(m708Nkt@1-e4@+P?ebJ4y=vBAIx=+u%B$x$9V#1 z=411z+sl+;t>zjQ6+Stbo0!p*!6y$7Z!mFTrCCZBJz-DB0QW)<+`}HeR^i|j%dxI+ zGXp!vNFk&Wzq77y&p?+-y3Rt5hhRr#gVbGIjZl~&#l_Z(dXz>9O7m%C`JBl}5Vm{N zE(e24g@M3+?OK*XL82%hVZ(f-W(M)&*?3(-rPA4Evm}0Ysey9z?;_K8qOkYM z`zBcYH<0PPr_l6$`{;U$A@^r)>9r)iJl!7D1^40)gu7w!me&u8Z^S+wc*Eh|@O)+I zhs8a6_i*%m>fSRFh@i2(;4fty2v4E!Oy^3s9(U zeA>%sXh*)S0Z{h2CG~rlnO}9tntg^>*B@FSXUjXsOl70fjto69O=me;NDwjY#EOc8 z;aZ-YcYEHP;GtC)da$$FNgeNhEhP}@aRnu6!w0%v3S?hUz{auPx#Rm7i#k2s9nLkK zV9jh9=ZDJPmquRSu8y-5LUuO?ARJajbCrc73M)<+njPX;-SX8fFcd!)S$&hDrF#~7 zgjlT@kE8zyxaivPZ_j8ID7YNuM>=nlfplK0#di_r4z8~x`V+aJwQcpJwRaz9YpEpX zoe##h`35?Vm=YNo$J3aaQ`d`Qe%!;-cnkf5YB2kE?%U*zhtr!6Tlvb|dYQsWIoFWg z%SUFq(Bq!GcB^_9AWeXZ=%m-Nc2fhu@Sx?AEIx%?naqqpaO7;sAp%;ug|eK^QiM zQOw~BAKslG3)x5jelaHDDYxXP=8xFfuh?hT8qWpY57ReQcPCBq7M!;#a9hPylQZ9X zGM@P&(eY=d{Bya7;q*@C0*WQOLvhb>|A8$FwYs6q`CZ^PCHhU^ODQ&WC9@p4A_$SR zu(l93`GiAq`CY(?vfr1LzPF|xbREp~TCmop-reTVZ*6%-1#G?fA)Wa?T_R-pePDdN z#9ou8Oh|NH`>J47iqS`;ERu+0?~2@;gM{be+RC@%DxH%#G^Mz`M!&N&=jurHH?64_ z^KHv&&2oFYo_vAH~@h-=t2T{)33|bT0w1ybHylY>p>ABHkXi)J zmOHR%mg#LmWU54nV4G@AQF%)kg&hIxt`^mX|H0VHJLTK!SA8iPX_Rj=i;_8DQv%aeRZyX-_#JidQgCBou{^erZiPAMW$mYm7K{i(jPFv z_W$Zi2YvTo!SY7r%}qU5XtnLEk)&#himJ>D1i-4Bf40{%CUYFnC5$M$;SfFrP#Uq8 z-ZU|oLA}wiyfQIonWey%JrU)PC&4l!6GHJhCre^gPmDXGQrkLVrp(30oIN7k!JQbr zoj+sCc)k1whi4isn)SXd)f*7voE*tiDaUeV_BKf?AKV=p`QJkL=Lb!QP7hHmdwRWc zQUWnP6_+raRVA^e9FF+5$)28wU1{{vW%>-)tmgbuiiX_t@h2K;w>T{M zD*#p79&3_uqUpt*!9A1Lc)wgbn6!2Hx{_%9Yc>4rCSoflg`*gTc3Y^nHJL+0qX|O^ zU%n_3S8L>v)>M55EX)h;gx^Fm8 z0NoN=VXrC(Em5x^L=xDQglRaAj<50=@cg$ll_E#M-=8=yve( zV9jX1krkF?Na0Cxq5eOc|7d7h!JpxLo zwbL)6|^9%o{s83&j==P8jP78xK&e?Br%vY{Sv8{1LB3$8V+Q*KrgjbV%9*$~*fldSZ>E9w_tR=R zgM5meKs;qkpc7?ImJRk1N+5oklps(QG7xW&QyB*Np&ogMQ<;N(%&CQgeLkez8}4aF zkZ+~bLnUWz1>}lDVVeJwcnntzMCy8?<3x51_Z~{$722bL@98i%AJ55f^VT4 z6;>`7BLst|bgSO&lhiI=ht&*)#yts_Ju4Y%J|e9l>l<7Sh$?aNaZ_Y!4Ato5(wTCa z98oXjvtKCE!iI=l`t;rkDB0@zRwf7(1*K@pM$q2VkK$}QMdyM!>-Z?wpLO0Xk@U@g zDX2{g)Z2y2r0vE7JJAw&@0)o;(sdS@$*R0us)FJs53O1ujIQsSSr|naO^$n|#4}t{ z|$4~tgm#6=!MqK(^+vL)i!%?;h`%Swn*b^NGN$tX?@TW2Fl@B~(U z3-HSeO%{51&IkLvD)p9ZS&-SYwbYnZFm=?EuqI!tS_B{;ER6~mrn!p;eev)_)}qJe^OaXB>M zz@kW)Bo@YWeGjpqr|9SXud$Cxu&6zKoNBDZx8H`2P4I zWNd3C-o?l1#}j;v3{bWsuQj2ozzQtZ-D;nV?|IFX<94&~er6gkP7id_Tuhs~Xw6Pz zC1)KH_0_gYBdxsbc0N-MP_@Nq9GgGF%A7T65>OIq_Vfq2YXH~~_~^pt$`>f>u#WOp zX%UmSREWvxbcFceOuC7en~unQ%_UvJqDs25wYK`AaNui+|lZ{VgX@& zhU9B3x8wXWZB5f?Vmo7DPR1j&EGf`N#oV*_a}oO8d2NN7eOVHnkz?IP20h__e0qTR z^ha{m6zrlqVPQ_p*(|x7scQXjlok|jozFZYph3^bsGl`4x*0`H=YHh}Kg++IlsmE^ zn}A9xRJ0yA`B8pXVG)S z|K5^OHxeo+qjZcur3Y5GzaCN`s(9mQj49Q@&;~&5*0dKZS85o|X-JvIG3LmIylS@; zvq>XQxUhW2yHJKK-Lwze#}3{s{jj1?enL9xPNH>RW>Kw{ltYk4NB`Ew5tqPK~Uez0g6>qb)j(Sfsge?I(dAF zR<-UcawrL~0aI_)`5vJ+vw7_NwFQ^CJ+JTIP zu=b-KWa-BHM$$j}I){dQudDT)JVHJN6Ko)0=Qs5lZJjl+Zv#}wdMFxl^JOKf7VS7v zBnboYQj1QAEt}76;S(*mrkzuoTh#UmJ8g%1gtiNkTx&-0%)H??Dw+!m0A_0sLkQ}5 zQpYpJU9onk3*j?jhN@Vk^z?FhM)th(daHQ@KYHB#K~zY?3x#ic%)d8U%2!z4ZQ*r> zQQc)n2S3`V1lnC(}%1#vbP9fG3e2; z%;}{1SmfgO$4_eAkqp7dHNN2~pFU1k+@SGMV27T*T_Oa<9h_`i10eBT$I6f6y0^iMDdZ<5*riB)pP|stYDr}Kjm<4mJd~iDd%AddDtO5p0ZIJX`Dkt2m_EE7@dt-60H5SCohZ?iN`~v)JTC~`kMVa`_6rM)MH#Cul zekw-;5?A%4Ay345zN|c=25jm@ZAX+skZlA6GrXgh%~u$q?Cz2*eW)nTQTvu&qQzP) zW7FqbnkEhsPc=TaRo|I$(ub{4cpDK%_b{)syDvP!SQFj2UE`U`RYf7T(BB;9_RTpjwqUqB1^QG}r?jC+{d$d!T zY~MaRRGvuqZ>Jv_OQG=KuzFSl<168hj-SgP9Y;GOy`*4Cvu2Hd;y{*wo>6kb?GP%r z{&aP71}9`x{&`3KoN4Xr5pJ5kHtmu%CeKrYM#pFYBvT9q+fGHgZZ$2c5reiK#C?%t zHALk021zz$H%o%n)CKU=j2S*gE5M`1l)UDzizhH9U{j7LuN{1x8vMZar-*F4oLk0h z90(>l!P`=nBS4ZP;OnoP0#{^PM4CYWU_hV0ET-NE6!%p6n8qe`^A6ChvE9Mdhwj9e zLOVgidb!BAB7;wQXOHif>JgXWXbB?k)~51EGCx%vXTEOH{G%hC>9sEz9bqGpF}wjh zoi}O&htI+?15Pe0_4g+pb3td3O$%v0J*xgX0LcfqEF#SP#o+)kzc|Q)SbVUFIk^NV zV+cN*Mg5#$D$RU^XK#iy^#EX1nDN^3#1S?_x_W5J#b@3ALUAsy3xp?rt@zIfLQ$)A z<~hpVHf-0i63~Uw7}_7)Z3vBiF^AH_`c|i5`qQxd^v7j@Mle@4Yu*!Dw`I2%GPvUu zNzH_7H}c>2McN%t{!w=K+Q3EC^56bN$imf=WkT^xtNm1Uf2ntkqLCO|1o#K94WH;8M5KOY^?!4XI8A;4H~>Bk3|d~ACaCmsnU!RO(k{iaEN0rsDH&`6NEp`Yds>;SGt z`9ohCTIL*7XNd``a};t7EpbsZ$a;;*<$6-v3|P?8ybDN_B0a+QwTUTrN^>(a6hy~@ zrYSH`$k0kru@qs&Y~o-%#o;9@O)V|65mQkHVKlCy;4_DgZ)WXX-QBj`w%+Y-?QLw@ zg4IBZg9xg!r7F!WTpU?dQB_kvzx?x<13P!$-Tm{wJ@0;peuuwHzWcy!WRf=5YC1Sp z$Dj=fmK{SlPN8&8S)C_PrcR;76R2@y>KtJ@hqjOxX%PCn$p0pwh$#vQLSliA&MQ3Jz1^TOv3uM^2De1Y4@d#!b0HA@#(_bpWri z(OJ@rX6d%JkZzl6XuhcO&)AV#d5-`6!=nXNYGn>Lh*Z9E|JQhT!@W+u^w8)$!E>Y; zkthUY9ISfKUC6yo%n^kJy!fexIhY7>+(@kHpwLiMkzg`wpz9*#=S6iuf%#FRWbcCa zUDR{JgPj#TiUMXoG?4;h)a$aOh#vVO2Vit%Bt^9(MIgcPRHTTwB1B!;A}$^t1hMhM zxoH#2+`WMuy;r(^y0}?CTd5#qwoCj%N_T-RK%&hAMHb4%fd*zQFCR}(NVwsU4&k!Xm4>Rum`kq|DG4W5~b z+3cNn)B{00G3D*u2G+=)8Gzc~WN8WxpzW>ysA$Pg$zF%p!iaa~_B+SL5bwZI4*LZV z={Kh#^^`-s=|np6=tRwUx6x@h^>KsKEBr_2dF~I+^uzNl?T^gAfImCp&3p2(W-dlY zD2DnJG3aK`(sfs#3a-Tpdn$?ouJh0lZB&ax%l?K=$9(_cZsQe+RKzF@U&KSH{Pf=u z5RQ3w3kP40MxVk(rA>An$+PxYjf#)(<=~DiCghDg++) zbr(>VEY`r7asgko$ijHa^uHjEu!2fjYhdRvO$f$0B??~%|x^7 z<@u!wGoSB+Xo*uudqNa1Y(UzOP0B>>WeMROL1{dy_J6#idgwllMxxY@Vq_iEC};;h zKJFAT0k;efPy?fSZR5x^fF3GIN194V#hpxc!!>^{5S!z2S@V9!26hkcyPKGkTUefZ zv#3q61>skcJfstIV#7x9J|pJh(wAa{DBr=rYA z>lGz_>=Q;LQMy)flG?s*zJvyq1M^3-e?~0T_#zf17@0u(uMX=PFk3U<{mS#d`^wy- zD`+R!LWVR-ujncK81;QO|CuHV?<5%J@hvZ*78Mt%?b52MykG%majX85l|WF2nZN16 z2yYE*KI&Sdzcqq}&D4NrrYE|RHA5)L_3|ZxiN;fXkkq44KXOI~g&}exv3V}-K}4}|IMoH%Nta4rh5U>*bUdV z=bw)oe1w?~^Px4X2F5nzlTS%-Tk*%3C?R)j&IB#8^!Eq=zLigPq9%{9kSu!82|`H2 zrQ;ELGk{7b^8&LIfhx=K=PZfm$D&pI8YuzCEK|k`aiLqKSEoNQIB#{K8lysTLzs10 z=%9vMFT&-1IvRJSp|jpXG!QrXP3(d>UmXKF5<><Zc;Us&RZ5?Ip3^2h|zBe}ExX_2<{6eWWM9X9@4oW0xYA#fF5|&keOBU)5RDj?`>N z*Yn7hzJo4^QPl?`*F`6d><3Jh)WsHMRGwH73wT-d`-v)u$Q$c28J)mX@1|AAovK6nS4(KJ)%iR>L@9`;G^bhM&2yWsEv3O?;$572zyfu5o z?CLs@(La1B%5kJFEqFZ{wEA`w++IbGy3FvIn^^@^9mF7XGo4`J*cq7-B|c}}9ue$- zw@{o@3QJ zYvF!aku^yi<(l>c@S{&9ApUfs0aoq-SfbWX>`Rhz(!igErFCSEcS* z!;D|R*O7!)a8XTHuS%=!A#8c1^OaZS?SH{ed*ZA>qNfpF%p2^2faP*gceZmtWD2Gc z|8S8e0EGEgs}xu}c%|;S#NduGT5+`b$A-z)1OIlfyoD|?w2dG5Z%wsdVY@;*P6EsN zqne98Y;I-jEPQ-c7U+^98*-%?XlA)ax&-lswM4M9E2ZjO#6eH({X!}ID%^yM|0rw~ zReSd9@rQ&>a%k)-c@`$Hx0^1!uD(S}=BOg}lI`7Rf~F|_Zp`OH9ufbB@YdlD9R-bf z3qH;bBzwp>oidGgA*`@m_wnaMA+6~pAks!Ja!raSD)SQ3_+{SQr(V(7(3X!X%>(Wh zi#Fh2SMRSaldRBi;o=E(<4Yw~B1nMo)^k^xEt*Pt$4LKuGcXC2p8wIX?S=t`VFcM(ZdS)cjDt{ zC4bO-bOLdONa1bRP@Rt6vD9t@yi_T~LzF+IHa#QYmK zrmENTHH}AUH`BN%6KbHWF=#FQvcm+r z!vZ8ID?5wo0Pzz|xZA6F6Hz+ISN==t8A+8axJhW|-4;T7XP!b9j$xd!x}SeGM@&AI zkvbAhaNdA%NY36muBInrgyPj?JOjDOizw3c_|7gkhCqRTSe3sXR4%4B0=fKZ`;g+r z=YO&Q*|7SWucNgs)hCgTAP43xk|+vygNR9}>Zj35N5@3I+tS(cgdC1+0()&3jv$r` zq;MDggWendga1fxRf8d5NVP1#JJTY|`N7($-f>j?_!HKR8Aaw2$X7% z88jJ%ik;NN!D|c({rv$odB;~8N8~T>m#LfauZg(-7~+-+Q!wT94>pMdu$d@Le*oT^t}F zkoY3N(mBgKG^6Pgg;ZP*dsfMjJ*nQ3WAciTVABrgeJ2eiT~bCq2V1KczhR?0sl1Xy zf=zJws zBf~4AlJ3D3Hptm9Cbb&bw?ZPL(kzq*9m@%>!% z-0}VFkG|;pUZJ79oRhbV9ZMoS3xeOIufZ2Px9E{fDeaP~{_RMF{3Gk-3U(<~dk6LP z4sb$MQRgGVV@x@zO3O*}auhawmXMhwpFJ%e{G?2UKG^NXc%LmO9*H*^W$Rv2RZvcn z{)zB}GXR7F_$^9jP1DruU;b3JRCJNl*<${2O_MCrxcR1)i_LQe??Z7$n@9KahzA2! z(JIzrZu=Mf6svEER9el!>mo)fz6| zAspdo`waBlg!q*4q~}M~ZHBp6-qGL!d0FqC3ovU1(l6WDoVeE-5_Cky+Axy~kY_^x zy_xs&5}EOyr^rgH_lqg^Ymq-vHg@4wEK(~#Ttg|^r<-_F6w5wxFzv$q`7Ly1EX#a#w zpc5Xs_36V8uS6_?P(3!?er}THA<=4|q@KG|l_YtbM?fM197j)yJyM?q*U@0I=OL!Lq&q@jSkI=XMH zY$`eQ?H>bZqhZE^L~P-EIBn#t@75F-&96qvNalE$kG7iUUOt>44z#8-cg7@la zEZ3dZmp2|hyvVT*iumrjDz59IyEcWyHo<1c! zk6>ajP;DR|FPg2Bzht8f3Ds9#^(pWNeG4VtYYBX{r_vl#oIrK~mg@e^&=T-`r{NPd z9nj+2s6>Io1-Y?fj?sT8o+XijX4|wzK0P-jg;m%2oqg5;`i20sBa(6k3(HD9H;frQ zza?j}D4VzE9Ua$iA5pMV;SQ83+FIPDsK+&d%xL+}FX2c3t)+rgt#^u}e{pz(BWZ`vU`-&G-<58-bs!+W`^O>mlGv)V!nN#t0uD zHG2}y;~LJSyerbwV_BY1?VSAX+4FHTQTc*22_Rrji z$aINFto2sW5iSbMdwCjHgqSxTkuZxVA9Bg2&E86$(&-vw9Wfwr{F6# zt|!X-ldwMRtN;6U;~AfJ^+?xqMg0Z8sdc?4Zf^IdIidHbU2=WtIF0FQdPhB%OL|GS zE{4;JlQ`D2J)8QKnW+h~xg!vMah&?CBHY4IOSUUKpQb41;P;J`Gc^tvBFWd&^-p1U z5r%R3S{E5tsMgV(Xs;w=6|~=I;xfwD#?~K;@x|xbBhSGvKD_55H?ltBbtFn9|tT=vU1b|qulVa+t>z@d5vSQ)a3?R|vZY#3?3NBt^E?>;*)-MS87eywCO1@?H}wb7s}}m+rE)`t)%HF&;E~N zgyV6}X32ax?9OrFA7-ue2nZJ|Ou2yA%HB5BvO2`;$NK^&hLfMm^S}1kfV;q&QmB$8s#^R|RKl>5bexEe24eLwR3yWj_P2bUm{Q-Rppi@f-GkC+``#Y1{ zePm!>ZOKv26|mNDX7D7^x*!F^D=vNcO7`gueb3L_E4@IHCu8VQ(#l`pgTxq`xjAIuQZwly= z$SxXg`W|&ZeTx*TT3K7^)D!yij*#xaJdKz2z5-~lep7!qQ+_d$@#9Z%&kCgt%2p+r z6_IE%X6jr0+$bAxCbObuJWoN0?JQN%4=@jrqg*M!b=rLZv6nrh%#N zN&$`jsJY^(^O}u?!sef0B~<9-kT;biO^jE@*Q6)G>R0~yqqGOr7Ev5DF3-7Dt-#a# zVlMxheLu!Zs^q(UH!wv7J_w8M1wA$vkXi(FfWey)`Szn}aXKf{H6^i70Q`agY>LL& zIkW4$U#fdUZbb>XOF@{K=rO41PBD!qQV-NiMfnct++GBFmKn#wcYZfFw_+)Hd3o*otv%MT6K+WdqULx6+G*49u0v$-9<+dJrp1L%of;m5_eb zXfg3MWup`Y+f!`@QOiFpYf@4svFLcC#QNm4e{ku=pv~~P#H@TZL6Nsg`N$7QZl6Hu zP$medB@HsoN)Gk>{K_CN=phjxShh}Pm`sa{YKL2JIsgCNr~BjGwcP*4?XV{_8OM*y zF3PokEM$W+JTlefs$IQt(VN&tD1}_cipYJcrkhiiTzz|4uDGP!iueB~M0S(D=d)pB zFapdt$(wul@Sz67_sSc1@zlLWP}V3$Q!Swat6MAl8r-BIUUp9$n4XTFL!fjV9TK>(6 zGsL=bRi|6;3M$`uyz*P(e=k|dE)g78wz_^F6O_!Sqlg$5v>$}wlq{bxKxP-bl==*{ zzX0%cOgJqfX+P`AE{Nznb>RZFeB;XlhwnvJLKkPCS{IKP7z(Gz%<8!FkshFx$yT<}ufxYrmC6?eu zA@K4J$&1)z#A>i-gZ!Lr1~?d8n>u_m!#vQ2UpLs?7R1g{kxPbeq&>`Qm#|f(P}_3L zrE;fJ8&PP2+Ft5tmiE^F#9~YIJHqsvz7=_c;)@k?5{=?{q@&-> zfnk!73j+DNuCGt}(XYX^vI#|Fg;+{kRq6Eyfkp5zmBs{L1XnVO=werrpg@`#ls|Q5 z0D>BM$~5OyL zNgdG6O}9$5Tkx;)TT#Ktv?q~4&dVg=)N^Rmf1Ll$Kg@qc(`++&b7ikPI`y7E z7$mDXzPPSXQKXLzeOcfTahMeA?{lET#5-uxd_F1M-Q5j`KG%}+3K)v29E0Pp+P8Cu!R$NEAbgK*1HI~j5x@&gIHYg3Dz7Zr1&8zAczZY zP-*DA(}YBhWl;lO!Et{sD`41;9}K!s3z0twPH^R!j{GeJ7FSb%E{To-Ft3RF$L6n! zKQH`4jnKam5HFpc&piza?8Y z`$?Ok`IU!*AiSuT!Zas~5pJZFVBVo=4!-#=qjk|TIMBapfMf<>?gN_}u=ft~KP!ZH zk-piem2V9~H%vr4pWjc7dTvUlzRhh&YW$oru?XrywDn?`aAfBQnIX4U40g==8jVK3 zdj4OSNgZPt_YrXZ!7ANqf(dWXGE;r!7<9)7GP(K2oyxAUT8=b=2BNY!4-9bu4K{F! zz(n+eiD_jOf~;rYH27oW-`-H$Zl}_%w^k*n{^E_x&J4yIFP`-{X=wLnxZOJ zY?HAfnHJHYz3QSHr&| zkVQ~!!^+DP2uibEivkj?*4rTpLk#kE#s9ic@9@ex@F0|e#C`=FOC+mofwKu{y93E5 zmm!xkWyqjq>NYtR>}D1KS2_ABz|BgkI6Ip)uU}*BlQx{^c#O_lI-q;8-32SL(F%y^ z>7bg{H$;OpA79eID z@-amGvKCStaTj)~whOhRgL_~pM{FFP9ZC>EX;{zkI~?NuRveyHwFOYDW#YEMEiY1d z7n{{_N*f+K$Sga>)OuPrNDlu)#V8~_sZ>n|!BE+GVHWMO&af#}0FfC`i?ghhl3G7_ zon`OJ=?;aS45Eg`N{B+cE-B?s?&oSBJT`(c>9(`!x~GhuHcwJ8ZK8qi-%g;7pVhy~ zDr}6h?!9=C0#e&Ato`Tk*}J&cNfc6^|F+l$p)^1RuE=@N6b+jF*TTr-x;rP4*JdZY#~)Pq+TL^8J@gLp=#dcF$1a(SHaLRWRZYArg%Y8eSFktrVb>ru zPonqXie4JBd0Yy&z~EO#8_ z*uswOgB*rW63UI%Cp!P&6f?`!dM=l3`tyK&7P14w-3k zF-&Ka1mK%|m1r#*-74NXuB7w}KkJO`} ztlwU!&Bdb$s&MrKz@+hF>rG*Ip(xN&?Gf~3Rrgrix3F@;C*K-Tj&OEE>xL&0^nB;I zT(pbB6SaFAaM8#!(dU11rsG||nk)Ve{^P%h@83KAKjr+6r2k^!!&O>BU#h*U_cSo4 zq*uTFgv#Dw^Z7qQ3D?x9MJsdGN166E3 zz=PX$%}#NDebHtqPC7v|I4tT9Wd|s?xsEUix@PY^ZSZQ@r{QsLC;$i|IREz z3+roP=bihGRQRWW=nB5MkHM|;QE8X@8x$hnFyP{V(~E+LcCXSaSGs-&u&^e2QW3xO zmrzV+KI^z9GJj`I36Do9c?88g#6z47(>Mg_XLf{gFJROD2LG1ua(%bP)RGJXgQ&)Y z?DZsr1cl#%4i#5vc7#9sLB*Y7>VDEe&uIW1!{C>3#CYk_S~4(r*?ma>LFmIM3#O8* zt~+3Oj~!=2V1I?vUb`^Ysk+g7xS;BpzNQFg=KZ7wwUglWM;+JNSf>(&J(Wjx^a^6> z(1_sOz=#Q}eff@DDwY;3UcmVJIX%r+74Q@5wXLjlIO=I_h91XS_M#G<7m zn2HZf586NoVwYMDFztHQp|4A!uR~~I29#FGsV&e2x*&Z|F)bHbdbg6f!Z`YPMBv9_ z7g&>2vwN$1aYeyCq_Lpg3xb$lxp)P{MZ@v#FBV z;6=LdKo84J#D))Uj(Sn5QP4rpGbyJb@C#$-naGbnq#+Pt$EZcdgRvBfjdsuA1lTJB!2s_2tV9vbtQL`%-Uu zA8$3foRiB8QTJRzC-2Z%w^A`L(ibez>-u;Ck0wtfDs+;4mi+A->sLjZcsA?n`o->a zBL8r8`>}O|sO=Vok0UkJ(Bh*BHNu2Jk|2t{^2C}3&%FY(5t=_lIMsd&qup-`+qy9= zGG(E@a^Jwmru;9p2qH*f%wx?}@vM*yZAA&-3}0|Mv407K_@7_Jh{9Ufu zj}=$vX8J{_#XWB?_7l8UzIx}AyPQb}{tOZAS{%U=Q}Mn(N7~JU1a3Z-cV+b05|W(0 znL|0@77A-ge48>9%lPmJ8*`2F@i`i6b2#~h3jgW*&zR*=n7;hxbN$bOx9#{5avw+O zC1G=i`)(cfR$Ho%IOT$yIHFJsHlU zetmWRoA|l6&%Hjn>;B8Vb@htH{cl<+KmK0*j0a6}bsCAlBWbdNl+JuKVbn)!Az{^r z!?u7CNVsgtVYwt|%+y>eg5>-ODt!#+TXo494ejSucANXos^MJo>HAaE#4>*e?^1@@UbNls!2n=2ESDf*I2;0mx%E zdq_v&d)x#ASW-JakXhGa5=Oczom=3>H8pVS%MSFu9umI}QRFYo%|l5_f+m(}`gNbN#A4Umk; z!dn@Q1gQ!-_2w|KA|+dsmCgxH($r)l)oa96J9=;8L2wqJK-sqw(oWxa<%X2W6s(u> zJu+C_nKeeyD%ID&Ux!=d2z)*%OV>(my$Q9;?BxKgMn*YCqI;M9d%!8U>)S2b8TU$a zAl?9QO|n=$XK6F}8%?>BF0IL>u#*#0zEvc5!KCX9}!DI_K8v22ba(HLz`1t9C;@-N}Z)53T*p z<1}LY(zJ<0TkCg46C;05cyR9i?$k}6wTb7uW`z+meE#tfF<;o7t7Q_1i}5tW9Pgaa42g zbFt#qBs|=uRqBxd=I&*W>83A7Nr>x*g-q&6Rp*BLK(blW@AF#CI>WE5bC&~v6xlGmb?n2w8TYh?NbUXbTbR;_z z3h-$jwWS%ODAUmCSK~;+0FFl;Q2GOKGy;j=OF(McJ%M601ZngEe~N%M zIh4}f#Fr|y6J$sVJvW*r3U>!%w;=btO4SFY`W2XVPfEIxs zW=LoHwFr1ut!+dYiB)C})zu`H83vEJK0xER`c8CkHNK94JoIF6H?T#j8h-R1Yr(g~ zv4seYGq?+W+-2CS`dTUmhdE^;?erp66dfec?VbJB*L$pLA;`D?_}zW)s&d_IiNiqy zsRBGc@JO5Q!*QisMB#8tSqZ|5YB}+3of<}ZMNLC9Svt?MsKgg68Z}m~Cq9#dVx)WL z0vLE2w#m=3ru!kr#YvSg1XDUSt{E*B8JTRZ=L!RZ=UpbZCsor;WUkX%-yYATncj!$ zyG-Rh*_IPJH*f#s&h^44*zY2yccm3GsYeSw&Hf3U&F5Vva@{1(?XHtKK7Znw+UvB= zuVFKhpapgHD%MHZ9W*h!&XQ<2B+#c}G%eed6EnQG`5_y}d%Ql`c`6UMTBIV)o9s~N zpM@P>I|HyBnBp&BE}6|GW37}NNR_>5KwI&&x``KDP4THid|mzx@rp4R7=DmF=88Oq zBVndUZ6pj^(WAu3JjH%UxQpQEj6R$<+J>)yTz=of9&=X@4J|)c!+n-k6(eJJ!TmC6 z3(*HKnYSLuBfP*7=_~K*h`Z|E%sReS;?zQ4`U!s14CX`Bd@H^y29r zCp%Dt%=|{}%rG}-7AKp!CBiH^PZ?^#mVB>*NvTS!rjPG~mn>Z= zntg#%C4jNhZdIjH-A~PM1Qp6wvjQGY4n&GBT~w^0D3+@;C4Wi>^gMM|$!a6J7#8yH zyto$apJJd}vweht&6s~mmZ5INoDZu&4L6sm#ZGsx`}JD$Pe_Ni8*Ej9kF9n~?}7M` z@t^ToVk;_h(ys51q>`=4V3MuKM;^$(i$+B57iBej6Jc2Mv1e6Z<_|4mT8i*GVy$_C zttz~*N+l~dgK5yG$$v2e7nJ##vSy`b?JB=uAjA*7pdP~InpJK&7`sehY9)6Mtoh+(lN6 zvv)sPtXN(OV^Dsqth_kVAd*q#W64>0`Q2mbl`3(OudhS*s(#;2&VI9?Jg?))vOJ^5 zlX2xgJJ3q2$tGM@a#TxEf;Y-L4Jxnn8$t!W@hYe%@V!3J7j08Ow~T#B0^Pgk@GbAJ zv4D<;)T<``S@v3|oi6$N(`+ZJ9$$~q00?AsLd|T}2`MQ(Q;NS!zZClSsq8cxn0V?G z_)nwW#I>N(X0bV14JYu#pOI43cI?z0{ST~nsA^w@tRdkY>Kntjcc^C$JZf47cbK}D z6abWNrAv!!C40WJTp3Y~(mcfXYF1vcx=O51`4C4e@-r(N%bEN+S!g+?IO%z6K9?|D z)PM7sItf+mN>S7)1UybQux3MLsXM!UCs8L;&uLL3Q_pJpI;Wo4zZ<{4LvEnyc9oXH zd%xKzpC$C13|*el2^jwVNf8AK*%gKWp>nv5!>j`oCW+cUEI2rbk zG!B$BKRGDC>_-L!IOEKcsLO)5=s%z7GJ(YSQzYN`+A)>*R@ ze=|dMB9@Gj?O+vAv(1Cexr(~#-+0R#kn1reQQ)l$$s8j5H@0uY+!qM`X$%o?j>UaY zdR8g9_(zGdKM3Ydysj_qI$R@STq7qwDxc4r9D-u?q)c5mvM(+MCXORcSqCp8iI^bi z2H9tUco#-|jw+!4ZYsYQ3Fv*}wWM)Zk}+LU%yCzX?;nb+c6WSLw!7l5LMeaugiE7{ zxuj*!78XEtKLvgsnGAp+Uq}kB#Zz9@f+kqUV1yyzt+?pn{~W9z5D8u7OE3F5s0JBY z%Vp~F*D)^p*0b=F8Y#GJIv{l5-TmaW)xeVS7j6nR;F{%AedX9o_>puSQXkl!xhk)G z@S--A8Z7WBpGKd=`aT`$R;#Mlc$T7gm=#i7EL;q`{$vfL>7!qO+|MFh1l)lSlV;+US;eL2F;as?&Fgi_@pQ5)!820 zp%vhlr*07&a7glPpd}a(t!DJx&?(ZltaFK=DE$|%KRb^Qes?50HcQDLnLlKHWj5pU zx}G1M-B_Evrho!=X+5+Fo7CF$=Jp2QB5z2xdb8Ql61`-cZpjnX9BSEO6D8Zq&4_}m zI{wdG--EFXzt=a%3{je}T-0n?oXZey_=#5!Mm?EaZiX|2uh%yv(2sl9-+H!_x2h6J zC9=}X%2Lsw+O-Ic8lh6rWU_-fZy|XLDp6EKKnDXb;Z)S;DO3=lB^xgYF3Yx6Go7~Y zv$k`WbV>n`w5_zZpa5h59ICGC$a4xPpioOc-~aAOM9TMV_rE*epL_3n-#zbs2fq*B zpzm-SStF6Ph!#c|hPx3-WY_oZiWqJ!ejQwj%aP+mWCHCb%FTK4%f7cEp7Wq*nSe9Q z;2Gw84D+0~UsC5kxGo?F^XLQ@Z`8hh606caCvAl^$vij8bIc=Xgr7nSYva|!(D~>N zjJbTL&OH3(Yi`JQH>_U7?!=q?B)-xxdCZc_Y*+|-P>G;oJ(;B8^S@;*Gv|NFDWEZ8 zMuGk7>(Y+^c(ocLO8_$ z_U(r^>SlmQ)SEMliBQX3MkI7DF`y<1^@EvXp=d{|nS-HciUl$`W88#5nhw4i?g7>* z{~$Z!C)QEjlf3HRJAYXC@7%J@mFr;?daB3D8zkDn%;`~^HH5kxF{;JN6_vLg%F;1L%0&f56toI{d25*mPM!aGzaU%t?0Lb4_M%c z5Ib7XwvbUgClq~bD&#?FztxkTvS!~o8xOB1QhtQYgyc_8=tZD`D{eB5x z){X<^H%IH_)!BRZ@ri~e!@nu|_Ny~LUnFf1;1HkpW-ug3c5NIS9oNc0Q-l`!L4Ye8 z_!i3f4hXRNJ5mjIE+Co}HcfNIs^gfG>iMDgw0q&Rz=s{sxFHj>VkWlVfC~-7p&sA~ zvEMlDWZ3t!V@x=Wf*vtDL#cM>LSS4`o|+hO);}=G>8Dbmrfio~7n(xXb7rbumc4xv z%l5V5`!Wz_E!mr6$x2mm;y&mx_|k-Q9g1$iZk5`8$nM45lTA@qMxnT#IF$^!LhjfY zGGJuKcdej0!6htdrK4KFblE?cX+PTB1{kxoGr4zC1@Vu^9+0eI8u%45V>bR2|HC4SgTv0w5IBbQ^3JNH|LD{wUhqSmTz2PX9J%sX%5 z+%70=*ci-4$o)&DI04nu>=pGT3rBM$2t$;?I_~|mFu6Q6GuLRn8)n;-1xShquA@d9BoD5k9;;q zww9|?bZ%kpRf0DVg95o|?@K#cAJaGd$(+hH>Ail0J=MNH_=lq9t|sM)pcIi0e0XQg z45$SAOK@0C^XN727$+=_(n>p4mc^KB;QIlz-xfapG5Z;!f{*cXm+E1^GlbADlk>@b%6Lf3f^-x0D_B zTIUsn8=OrDn4i-#RlS6hJ>Rf(k0^j>K4>2k;Ic+1-Dpm73AclXiP}~e1`(*?p#}jo zaw>xA5wT-Ej?2(CEUa5%jm&BS(&ue$Uo+=`PuY-DwsLf~>Hk5E_j7}|@qBW55oHhJ zJ_PUHl)-ce#A~$1lOS3L*jq9WLYBzD5!HM$GMVt!49Q)lN9T1kj7+N{p57TuCNKab z4}*m=QYZ4PS2Pg2IWr-&w&_pw5c@eYL`e@Rg(w!3ex>ToABU5O>3uQH(Wh%V!yT)? zFo$ z?-SFxUtbP|=NZ&}yup&l0k8mFE0_-15P7!Dh-wG`TX4NBb)=!zjGgWiJ^Q^Ti0D#m zOHLiEbS`@01#U?Lr17Ihr3e&K#ocE#N#P0VPENGSSHN_P;n1zvF4p<;B|CF^x4F6! zogW(DmDg-egZd2;IMEog#32^X?dT=6cZx5*E~;~>?NL*1TG>9f%m1n5B2N;>5^$0- z6HP~oNuq8^FgnLK8azn?6kwVkH5Vi(b}VEbyB3^#KZm5zEhdYh%!IS*FTqiVa>||^ zPJ$kjKW6oXGlb}rkcYNrk#V-z%rf!qi}<+j9>7Q{{2>9m6X92P9fyX&#C<`2Dhc&Ns9b{LLh0!B z<_}c*Qx_J5v>4Qr>BFgd^N#s0Im&PKG)%mLvWxA$0u?8!=&k7NWj&33_BZYl9sh zn;*$x2U$(-pzhsF!Y-#1`L(6EM|_uc5~+xTEh?lacc(&nOnaf;rPY__4F`MF^kcFi$kx$c z5m4=nGJG(OvV9GVQnzecN25`Z;)@(mfif$h_Do{9D*;Di6`3J$c+y8gEq&P+4b7PE z*YHYwRx>tal(4?eA7zG%{)P(5(S%*heveiaPbuRY1EF3UxwVX6sl$Ws37&VHs&O=5 zfniISKWI@gC!afEPQ22az_?6|dYvqhWi(~^JXu7MVaq%ERa$aYmc{fHI&xJO9YLpL zB;A~VUb41y@)iz;M`20>et$#5e(#E$Rk5S0>!9UvE6UTj7^C$BEbVz4Rw4-txbU^E zcW2lFpG3-3RLFh{asoCm(Jyc`3ydEs`P^jOY>S^T+un-Rd@V}`7fpQOJ&|uM1ve6Jq7;iYxD69^W z{zNtO^>L;T6JDJQ^BK+AX^OIv*63nVlc6 z_+V@?fiu9^VQiv-5704EDA0yTvw;n!84@ZW_jd{WYwV9t)fV_%X|XCbNN$8)k}(+V z-`Arv{CB(3LL>>O}G2 zW>OOQ-?5`H-;|7>Iz!lCiO61}&wfSD`~&ehc=d45J~a!)XkakQy4i9PXbyr+b(@$kzk5*H9Mu-et^%xp@22h%^EaCZIu4>~SP&v*Kk zrvKq;I>)DsXw=1dpdc%&y~)sdxAEzVNOvLUT(U4Fo$B7}^*3RN{1=|3f!hgk*6ZmS z-MNvi$T2pzB{K3Cej<_kCyEI|OH#oErTjSN*8(KX zsG~?3fIPH$L7%sP?&<;OA#(zq(inD0<3aIVt{sw2DaNwl6t=VqJW_e!9?G1Lv0;JOalIpSshsOAKs;%Ierh^f(Ao)q_NmGUeKg9I{Zm z7CyT59cgp1{;NznVp=gGk#(01u_l|v$R zgE|(#v@~LnZGv&Pt>X>=^5XhzKmED-OHci7e`jg_H$Ixv>D>Hi^o!w;7qJj{Gvz5N z7HBgbK+@@zVfaP6lX9hTQ{gZkD~xD9cj9@heG~ltjzUtNW_|4 z#eLGd-Fa?=->tATi<`I#Zs0qmIuEE_*f)2Mw6=ap1v{+GJdxHmYs95(0qZ;15a)72 z_hc_{Db&oNJ_-O}j$0bm3HTRxDzI+~|T z1px7g1E0UqZje=>XYt42nnk6vZVMxN%pD-^+PBXvUk0Y^Xkzz6wOL``XUcI_YaKIW z{hz)MGLnAp+&ffE2f!W^6;MEE5E%}Bvb{g>P#qS~o`?u)_mrT1q*K)Pk9YAMtNZ45 z9*Lrv84w5qm@*hmqVmFgI#P2z%6-vEFbVY0;)8=bLv~+p0oZ%f;1qEMBp;O6X|Cxw zr&c=_F`a-0(Nav$IXMT3T z=r`Dtyk9MuN%7t@Cdiz3i~dZD+wihpY(Kg}jTeNZj}5yR{vJG!3`v{3$mmlgLMHLe zjbZGYNFqJ$pMC+3xmRJzjT#$V?!dO{6OF-bC?e_?USY&Qs+)y#`Z&?HSR-t1;OiOV z0b!NpA!U|gWq?bNWf;VS@~T7J8$M@vU@OkpRIvcq(jT-d@MWVuU?WD6@nGO*c+hcI zLFqoin{_WYykqeE8IX8_!mfG=xq#PP~MrR8_1{P zFD$T8{YgKw=8_i|4}MW#WiT<)MKr@5B!Vy6jUU4JHr@W88ZTFQT!4+EeWLKahgH}4Kq%=6a+O~|cV_myr@dfgdT)PH=- z%;fYlBrNp};k9%zSiLC7VBccSg?4C5yOgnzZ@$siKS$75`&lnca!Mioh~Ut8Ykv@P z8F-Wq+2bZ6`(>Fq&NNPD&ZUcuLE8<)3LC)zw6le#EHw=!la<)vSD4|WgLN)ct*3aO zoWapLsbrl_(Rr{PPPnd|55)%T5axGk+hhtVb=ci!lm#^Q?Ql6S@_ccl4b2WoXyH8I z#8&MfLDVvzPr8pdbEcgPH+W2^(c}rnOS5)98`0-SozcW4&xrA}nwE*RgDwPXdrQnp zP&c@gb!>Hzz7 zETgLhJ5WX+LAGqVB;G;EW_?i&34L4Z2eFJaD)!J=f$CnMGM3hcp)LSBkmggGv} zN;)PCEgl;b%_);hYR`N<7^le-Q71Hw4+uJP1UY7FyLblM@uDHO^W%Y}3^`(A*UFR9 zFlnr8$jP-Ak#NU!bV0-V-#%wfzEhBBG6XazlSBNEL@){^crbg29{U@{&@Vj4hv>(c zu-49nKX>S{UJ#B5QWvEFnPz}B{OUuzS@QldQnCLnjqJ6&qFDSscwYP9P9Ka$mHmHdANs?C@2@-1wt z7{!<|k5{VX=$F6U9jxb&c5d1N(g%abI#w%h$xw2xE1_fIm5)r}$g=LE&J#YYl@SaI zD|U<4&x+qkaR4UMoOtI<Jyq`HgLB5KxSwlz#va=me|4f?BfDBxj8 z@BPKFtJ?5Igi5dHi7KGJT(gue)MrW@?EyobqAretu-~cdzK7h*Rl}&9`iX_~mp5HV zwO}xk0gR0eG5<<)0}HAHcN*^hYZehRT_A^WPZhrXrk7=0cYeWsiEr1rng(o#>?YjD z>7^I!U#X5)vtU!sN2kmEbnGM3*Ys)Msrn2vYB3UVUJInJ1YUnGRY3tnjBA6o4B+!R z^SoL@hs&9d@bvI`n1i8b*%zpDVkYpRIv46EI`cZip?oC@ov!u|F|Lro7iHC#>qdZY zguNPW+%Z=#OwzffG@5lw@YCe$3~?*FZ8a$v&zF#=D`D6YHSQu~>kEbgL=|rgnwhQGaT6T>N zwALFBGs|C?HrGqmzdEMXTz4M+HJpW{?PmmbqRL(^kgosYaagbRPCCwlabjp+yGED@ zq(j?CKx89kMTrih;@K7@>MS-S6v3=Sm~NqT8W@Fd96d)Q#@fOl4v~$yi`8H;V{_Hu zXtc>@TMCH#)?3qH>~b2!#J|SqaCb3%9{6r_@D;~n&BWiT^;YlUPJw#?T=7EYFx03& z*C0=h46FZIPrUt4;9_g2?#TqP@5&sfaZZKZ^Vd*wMH9y{$ZVm!GACWvrDH--2N~X0NsWX#zN^m`P+DPj#U}Q0>gM{QWEk&QB)VLqCh>Hpn(KII z%O(!-c;(ADTmuWUE2!>Hh2)y0l243L*q>S1kr515w^m(qk~gNGse^qcmKfcEDUb9b zswI0;MWXe?A=?zpOL8D7%vo)*Sr+&p#la=^&ko4Tm*eq~onuI5G%wacD2Orv{R48r z75l#l4jL94JdloNn+A5PiS*jQgmecLc8Vw@`G(qbvK?02r6Rj)%1`?s*9fCS7;KFm z0++@{b;O`_rcAXRsz||$gGtmFvSI-m5fe!mSa~Uh;S#)5c>SS)1@XC1GH( zGMCXvzD=~*WwNDXDLZ1YBV^}S(?7We`=(1O069vEA^yxBV=X0FNtD3K5N+SKQ)Y}k z=rAtNihN3}C}AVWtqkd5PqR4P*y6xbn-eD{WbC%1Y{J2P`d@?bZizb(H0~AQ z0(ua$%((6kF?|Qb%81+eX?Ew>bEQFxbi7LG!R3Rl>BsIFEHM4)lEM$%(o}_*9;Z06 z1&|ujT*limuqlr%p|9=B;Xvtb;Bxn{F(%a&u;eHC3cG5!3P`gL==2TF(T15z3jwwe zmKCU=-*-n?>#5xFl!Wz6Egg|egnxrV>WG>wbOSl?X>-7$g~g)Es5DN zH-c|!)Zf1ix2!-r119xLbO8f|mMubqkwTp64qM^B$b_WeAP`)e^N^dHFLK=^80!se ze(7}(=v3f%^xh1)w2YoMsEN$f5&`x=U7+wh!uk%ks``fQX^`h6F~v~|J^^fY!Q^v6fSFk5&hJz7UeepA z`iFbWmm>!HTT#}fl~Z~~@?_xgnI!b^Y%9Y2c6+_<%(-Sljbxei(sJ);U&9d~eJMk#ZZ*lUO0CqH8|&#$@e} zCw}e3L@;j@+(TY)1%GyU+`lonaF;RYIOY`i;DCZ{0`6I%6p2wb{1|E@nU#o-%~qx8 z+XNQ?%&6cgxQ|9$?Ikq}IlKSLCLq|xIFsoxU)V??)PeGc31CC1mVl!Bv^?d=XlpLs zVgdM@QSCG#tLcX=f)tZbEb`4v;Gt867s~bAFab`+3`9~+7A2w{6C?jS4yJUy(H`^T zh;AQ_4reg~)xziQ4_r`qGhTn?E{o+T5rW#4?^4Sp9a=4e$w1G>RXhMx&fOkbT7_f zTe$!bl7`y6=uH=(Iv0FS#Q1=%r7VK(zvLuDZt}d+k&SqK&b0nW#L7Gvo&o3F81>#t z^4>e>Rz=1#UC+zjK*nv0)Ygc3M}_ST{VT_`yYr!7nG{`oleKJ$=bkQ0M9lW|=*0Vg z674gQY-`{7rNBl;96u5U02ZQXk<8mimyO3zUQ|07DE6 z41_!6VI2-5lE2vw?SJZrTY07~)xV1?>xh1IdaTvq+FzCtA$F}{(`Y|GhSq% zAt4VJ%tx93WEB=`yvSO#s(NmjDBzl&y0&3zbcXyP1L%+J3_!;(3PCCidZsDsxd&(ugb28P z&v^Zw^=+u`OK&Kl^tuoVK2q{WahvvIFhNUqwl=Axq~GxjZ&AOzU%uZgat=+N{htNi z_O}#-O-l)aQTL=if63I}#?-a67Gk6@;0xp1*tR{}B&OQyi&{OioNFsBn*%TIc zO?IQ)$8vYsg3?e$i(ch?^(|6@zf?U6VB_KGpo7&~R%+0(XH(mf=d>(I8GY8ES>V6*21um_M+{(X_=3e5h=B>B z5Zbje&u+fK|6O}VA9~_oxj9HGa%~v|H8&QZ7?=p+w#d#Zqv**%b?HN8!dWNb~kCEvS1t| z4ZLCQuM;jze{01xU8+`V>$tsLiW{cCoPK~G*eJ#xn^Idh`^5xi3wJ||yKgMpF$>FI zW&_3F4Vdd*ud@pO96=R4TPvqu96A;(+as&;*V!7O|AC9<4U5Ov{W+G~=44>Z@KPm!`)Cy?*0|^Sb96`001?B&4e#tQ|e)^tNj(*Ac zarLL#@{6DQRq>7r`scUu4X$_^;l%Qdt{i06?hg*)!cqSZ(J=3u9YDmDJyLfo83i27uf&zl^SDbT)CXrY=nk$bYk8V)x!;F6*Cb}RABJ_k|`XQZui?Cn^;@l@)Q31U5d{} z^F+zAFI=|A;ta?W5z!Z_8yGc4^`tLck}5HNrx_9M1H+FYp?moTgj}iXz;tzz+k9`z z2w%(VN9S=QKQkY+es?{P{LI!5%+|<$X7fYyIlmV7l4xou$D%*Hem?yp^CniRqPjo4 zAC+`N^RluZnN7?Al2adL+Dt$s0MgZoHyD{Da{W$eZ9wwQqZ|VS9HPx5pL(q1bSA7e zHA%o_+ePL-MjG(c^6keJm>sM5ggL#GN=Hw}0yF{exfn6AM|iX(NUUcEM8S^*H)ag` zQdDte62d`>(Ju^x?UaLj)ax1MW|~)}-*e+9HDx!1ALv;%hFg&jAFUtHEca^cCP*ft z;M90_Uz1E%Oz8K)AX419&K%dwIu2?)OeWS<7fZ-aBHKv0L1qDBm)!C+S2@aQ(=Oxmu~EgYL9s|yeiI0%Hf5CnR+hscF+ zrBc-Um)|ICn)RFBd}S@)Da;B)UZ}x$uX-i7af4vFE-#{X zOqG)204lieDQ*+5D8{`b26t<-Ggfu+4Eb)y#wQ%Tn0*s0%0-QSeqBN|EwX0Nt;klq zh8N*lXvB{W1ZvA|Oax`Ze*nR`9zzxqFUmPr@$+Lw0pht?pzb4*WI3znkMb92X^;9u zUgMwj<#uJk`huc57pemmhd}}zc{2mV7ZXNIDw1fUWtk~@Qk}<-)euSA`u9w)*>rv`n`e>b1LWmbi-SO9 zn+nvadmzlwG&WpI3g3!YTfNBwg@Xw`{scP7$xOIm=HX5Xxo@AKlDX-}`w5*kbSnx4}ogd(a7yYYAZ8WQi!U*J?U zyu{`oDSrGA2uzQQs$Z&lb}yn=G%kl%!T5CusqrHQHWcksK!}ePmEDRedrzo+q(EXp za^ywl#$Tgq{;twTL{3Hxyvi_cCQ*0o*6pyWwj5hj#)I;3iQ<6H;rIONw6%~2b zj|li_Qa7LPmf>3#;TIaOAE}>lqA_v4F^C+H(5k72(0yi4l=ao=w?>sp0giUbHYt@6 zh7bE|x%&2 zjJepffCzW$To-DM$4V|-XxIR1e$J4jK3sRgV5`*`kjfN;2|rWr6LjAY$Q|p73c4Gm z=ZyJ-dX$^Z_@;-?;UB@e3f}TaoC)p__CHgloxhD9728gCJ~Frdu`mktT#2&G`;6>d za5aWMQ_G-cQhM?z;FMWSEYw_dWztI_K&}>8h9}n>(8Suy7@DafCaF29J@u5^@vIR% zCL(#ui_Uyyn$hovsIHef$M|yw66$Wc7}p7)i1)+6U49fYf)7)jhEa^cx@i~ii!1L| zL}ANSB4E3X=T04F7Mi_jb&Bz9LL?USHu()|?m8|qE1xVqM)$70vZ z5S3(>Dg&)Ft3<&H6#^H;B}!(N0@_s4Rnw3VVw9|s(vmBrg?GE+FI>{OxvPrhxfEww zF+rWeFn01t2>La`m#~OZbKE+`*LG*@iOwgf+R6)aG+E8^b%i&>B>Kn>yeX83#XZY?&`W;1r5Y{ZZNnEee@efFBzOz z)hRSt&w0uc_RT!ldB0I zsRTv?Gz(3#<)(TF@@2^CiAzWQbnbB&b@S`#(*0C#^I5TB9i+TxPOG!=G>p{D%ZZaj zvyA7x8#UJ&iatB736}iuTj?AP<*N&ZKNvR^UOmw+4zg2;%8GZSxa6lJ4es@tJJ7DT z>qZY6=sGQy`l#61HACa%A7?3!Lju3Rx8ZOngOt-fT6Js&?8dURARa97gq5 z1HEgR^dk&9(}Glf&cvFs-&3nI9nzT~PXplUFs{#_O{K~Cc0d0EuN)mJD9ujs7Y$$J ziB#~W5``iUF^W<{^|Es>;#5uu9)xe- zMx-RgAtH@#>_`k3ED{GoSGHi3@uW|OP+C>{O0FJUS%|C|1AIWsCTD~9Y;VxRdDrIu{_6#ms(pbmo-#`qwKhl6P9r~8Qx(5_b zo!y-a?;CSw@pdH--t~EgAG(!GOp284gi8tZ=)0$wB4ZC5w@whbzI-Cub9**gT^Ct3 z>!;(_dqux4pHHQP4=)b`cr60hq}{-%t8|S5SVzhuKq>{qT~wR&3lNPeQXtVQggBo; z>rj9G3)s;A1`#};j`>a+B|gu(`(rO3YfZP0upfyQ%$5rtDorZX?HmJIEvBSxl zctPZt&_409ZI#zZy6%y&tM6xIv~t{u&;B`Abw+VM0mZgO)WBn_J=pW2 zMcaEJS6Z>PPREY$?T0AjIb@GAP5a1PqoHdJjSg@OH>4~H)WUK|y02`O4HDo;+h6EZ z%5K&M6kVH9w`%iw=817lQASnV%q^cRNwRrSi6xMD=OL680f@>?_e7Zu+}lXV@rbE{ zMbl*D%dPB^!AHpw!mSi{0b{85#n6kE_kF$Zd)@vRd$@M8NgHZ6<~!1+<9<@_P$WJ~BoZB4?aq#8zY_S+ zrJ%LF7_m#zP*h;<3rXVXeyg@_QvLtTm1D{4_-r+}j1&heIwLrl`3Id>VjLOoJ}?Nr z`M#!X$I{-pB%NJ;n*=U$(6?EZ$&RPm9pk!WzP|Tw<evekzZ(6W8&$+V_7wz?L#^IA2IpZ{pLw=rPhyzUVSe`1_#E zOQ7LQFsqAwO1eYxL}iU`#YrkW7>@^vk_nA1MX{tOqEXYXACOAhIayV_Kh@HVA@^cO zsGex@UbkxK=N+r@T#p91A7i~O&AAd+m}EZ?Vu%Gbe#+RZM;M!BOw?-T+D&`HNYmC8Fl;%g1U`**Z`dUyZ}3)lAj^;cLvd>t&l z$BbA$19J8VfAxDOqC*dSaa}JcaahH1(xKSkzPtOvF8UrtiEk{~M~o+r&6FYQZCDh? zU`46E|H5K!e#xa25AN47;eEX@ykRzSjMsxkpqV97Noq>(CNKEo=#D3-0Gt85-YXI0 z9T%KG{Wog!U90dN?Am~r02B0;Sq)vGZmmS~am2sPekH@m;#rZzuEBiVZtx((H)2bO zF1_j0qgf>XpvtS&D7FLg_oc*+sQXav;lXJ}upW)n`ioUgkO=D83JMtYwky_yRbjlk zG+VF5oTf0(Dh;|7vd>`5O$jYo6syX81vNMa-qzr`U>$wDM$M%3s@UCVLu5ov%wpaW zkUlB16KO)8h~0e$$~doE2~L!0G@CQhYr2%4vFSX4NKtH#W!nUcZtYzK5J~3AumYw<{bsm?}zsz+WaKydk&r0+(x=S_t}Xk`_Y|p`r(S5j9$C{iy}zL z?<7*m#${Ci$S4&Autj&qO3YCZGL&lZ>4#J5c;kR>;WH{gIph zGi!kZxd5uGK{k@!oxGlYjDAm@XVmJbhGHsbY&7cHn{#vm8omU3ZkE)LJ$mfjy8SAl+9Zs^jA7f*Z++w(2k6rggqEQCxkRN)XVeVj=jU#{(Zs zRPKSlV~gkst5yrOYXms)|IWqaJMBW7%6A_5KA!#Kal_=V3*a7l_ya-9V_OP6*||@d zLiOBh=*BmrL#Arl@cBfMi-TCeQVgpQgrm?Jg0X zx`oMGi_Mano#*%H9CV(6`&f%Y*z_Pa4k}uUw}Iggq{)NyMQUhja0+hX9%*=wWh^<@meAo zjGiIe`zBc!a~;qm=d3GYoFd0TI7|hu%}-c7NS)x#E(No*JGTOls>UxGy8R}$FzOx6#K`nGR#zILthuX zM`muRbmQS(8m;2p-dCv&Qg~!5a?E;`8Z4>C%@z>@?)fJlQkY=D+oe(1J0Jmd<<}{5 z&o1VmPb5-hW^9nH2KaEI%{_3*Nuw&MK@_VOpfQN3R)IWO2yCl-1}rEo63%fC4Y;B6 zd;^JSUY1dOz25EM>gmUz@o*>0$>!Niu2`TZsRgat=|FFrfLW3%=3g`*V^S#YncuYf zVh6}ZRO%3yF`E5`5cHp-jv^Yb+Gh34|IcFWIa7AE*(f;n zF#)v94L(TLNZu2=!_Q2Xyu2Y-rY!-KzKr3#l3qwUFdTNPFh<@wRd%r}e*Z-awQ>`x zu?ES6_)1|*>59C1<2`ux3#(IZn~Y)< z4#aL+b$2PyKBB=VH2R9AIqqwgFOvl-?}DLFZ;;oyV*ih+c+Sz>HiNqNDtlRnD}m=-*yF`j=FxcM{L67WG@N*FI;FZ3B^fW9Q*Ft`k!3!SO(!DIzF)9c?pHR z^F}Spi{O-dy57n(WGhx9-BzT-oM?a$oWfg41@ao5 zFHwhkM=A}c0Q@WNE!kETOn!+HDIy>xWoE)uMq{+Q$Y3ZU8*5T><*r>XAh{qVD-fgI zf@C9cmJ*;Xs6d`TDjD-iXj}wCt(nc(CP2jT9xI5aarA*7_7WD4-!2@--(9O<1#dYv zRK%hmq^a+LJNKb#2W00a6qHv$*f(rNAVk>(?5g&~sZYj=v{cIR5piyYtH>$GVbnA# ze6p;8RhZ<+R_5wlF(45~UGzag+X&)QXS5hxmnstz?*o-RqZ zc&<`>lkt~ha-WqQRQxh~`+k`~1!*K8@wnubpt%lnMalDo%_hcwV&!KB$!|kso&d?c zmRBM)ci?%H#;#zVZQ{5XqQnK2Pq}ofdLC^s6;mFRJo80+!Y1D$EX6#fD`C-40zG?4 z&8~9HY&niu46X|WP;#1)am~@pMcR>sbR{voscU+Y*7>u_0CJRx-j5acso>JiJA;&( zcLyML+xVX~u*PV3q~=(N!KLzt|Cm4Z!~bSK>&O1oZC2lmn}AatK`5bMwUrbWY=HU5 zw?+u%yKDU}qarM7g zo!#}l?K`XMez`lN>wfJDyKoVnz zwZ9;`rLc|_;7fqjV4wgsr)zw%Pl%2if#0zVF~s$x`k{Q!BMzqYQ@QcuhF6|5Pg>@C z^Pa)1IbJ=&*ksm+uo3?(9B1i!=yM-CmVA`JwtUoQ_T>o@@7~tb4940!=bGaPac1F9Aq_f zS5gd4(QMVt+oCOKYw@NpnshdaCVV)V(iJs+I9v8y+c(14_~3Yqn-4O551v~|b7S-- zO`-F`!8Bf7wAz=l(V6uxYVGR=kBOiHC)X4V@p)&c<~gF-&k;x}EfdB(s7)TZEC{W)w}1eKPyBZ-^^YBvz*OjD{2^_TVVCabB&Zu2dJ~$J#mp~Rr5r* z8$r-eJUmaMq)s2{=W(g%!I38e!(FA!aE*a zl34a-)2=r0AAQ+QCg%&Qm^vSlCk!GnuNsM1DDm-6g5ye0@b6?f?jA#w$$zwA` zuDFduYa3YQiLz5+baD_s=ZPmFz)VS)!e9D_8i5aVL|Rm1*LfUdASo_gTuoE+^XyI< zMWT&kR82)^8lrHnB=HN+h))pTJqgK&7Or#CMk7NSCbS3?{@#5E9D^n2W`qk9cwtcS z_BTTC#G&Kw*cXT3L&)>4j3g}D-L1~H(96h1DMUPN?6h=ZyWH5)mpU;E2l5sISRz;V z@jFByWCR~aK-6dflK4UF{v#wHU74>#&SbxbwI9Q0AH!WA!Sf>Skfz9kHtOrd3<49c z%)C!o@NBO;=}1Q(hl%F&Zd9j4w4FufjV}oBR#G(5HX)8#NZEMnn?|BpbX11C3}&$J zIiGSX+T96iFE9BxWFUE05zom+gMgk$zB_XG!WYL{zPS(%N_0(>A?1?0Tl5d<x<{Xa>1SC^r8z!}lH-N7$1yf~hJL3O|joZh<*IIzeY6U-}Vk|Xf^ zvUd;cx*Z}1R>lwcOPo01-DMN}x&($e#5{u8NI?DuLh2+nYMG`TvK~LWWK!+Zr+;qc z2p++ykwULQD;+#8Kct+W5WY^$4;#>Iyz}W%jV_0c`&$x#693i{WNT^fAufMNRToHW z^30X)YXMzb=TNrd7#`n1QX68E$B0`A`VKeRPTZkvM`T;U)+=tHk=|OF4Sjf!@4N5K zC)P@0nFm%vG??(W@Wq`r&jhZ=eD=2eeH%Yk4*Wyew-YH!J;yD*h!YkTE~OL1>-)f6F+uLa%Ne*B6Rz z=Sf^^BkRHtz^IuD6HtCJKuCy%ZZ(uj+k@k{c$sp=t@22D6oz?}>aOET=B&4TRDLJiIZ7FdKsWz7D9kjlCq6tjN z9k)WQGT4S$NxOaB#ATp(L>p;xcUf$HUzLgIbh>MClM8VZ7#JA~EXc1W)vI?QkkK%G z9-X6r8p{&*(T}ctzlu(|;I%Pg?dc^nw}hz4@T9^MLH!f;gvBOter|C)&!*;%vOdE3 zX-PK#yRQ}FJP<}e`h+0DL3_9`dpT-C$L^lE_Y=N}2mp_67%6r*CPX{>qzvBOMT`lf z2NsG;$7AjuFKRFJC%=#_Q&GWc7jPImk8yBXit8$5T#D4Sn2h zHn+k!B5SD6-(YZLOOAYg8}WV_JU3d>M{2hoTLbp1!tGhn?+Y5nds9fs4OeW)oE(O$ z^ch^5?6XAuJhMVazf7B$X&sk0tT;b@xNh=l*3jTg|8)D}udKPRTZPO!5=Rs|lQ{U$ zX5zC!0_GL9WCKV>x1Gu%MXTMouQtHuhmOUZa|>o_(NPv^=g`|cY(Y80DeXuBzkY-d z0HkTfTOn3agoBCA7o*o3lD ze-xxG@{Q<)Y@h&UhSn(xEX?RWLY5dfs}(sR2f{*G zv0$j1&uo*0knwUxiRpVWZFRrU)??rsLgzGquECo*d82eO`UbH%q6#y@>Vzux#?1o=c4NXMxN0K22mG9x z5C|c&wA^*ie8m55*Zb{P``52u1m9`o$NdxjdsNLW4NBI(1eEXFnb@L32%WbxrleaQ zKvFMvo&A{4wG^+d>Qs~ueVB^T>bVw080q5~zFf$EpkjDl>LMleM^?Mf8clveL51E( z(lInV==M*h=TLSmWJUO|+;miit7SWREmlqH?yCSqdyi=7lbDW3MI9QSS)uJUTUkuW zqVS34^A6Uw(LafB8}Zyxj|R8v<}UJBoI7RwPVH?eS~gMP)rsN~UaQ25s7qxau8kGQ z@%hx8bCbM2?XXH9QqZ1R$rG99mSH1!YADY`^ZWm7=n88FvF>vWO#__yxaYYOm{(q; zv78NJY(AlGKg)1#O3kgp`A(Teg0>A29Fo_^?+XR8OT^lc7%PRP}iiz{~&Ek2aN0hv|64Y z)FDCnr`DI2BTTV$HWv}IsGEz?hmgI159+pqOYPeJLG?IgrkT?ZAyJT>}HvV@J ztlG|g%ZS*^Hnzj*0b1bqY9aN3F-%wLGNFRj*VQknniBPYwV(To)9RX5IGex{*Yi>V zHh}9vEKODJvoTpK*F4UAPV7E5X*lUAEkj=8yrM(%*TrgOaRDC!q^XjpR|e7CI(gN# zP$NcxUYlx0X|#ja#l8kT)4fAqO@c+9^~I)-0SB)XG|yc#<(3@UHIujdR?&6Ud{o;; z-8+BtHjCuR45)^ds4l{(Tr(0fWNE#m`XJzwO$d!?!(!;<%d;VJe25 zN`#fc*os;<2c@u&OEcYjC6!WGqw7>T*UhB<-#VniKE5#;)Ez?PIoIDpLtPmy;dQ1s zM57#mdt`X2bIzeT!a}IQLQAuCEawKd2O-jpO$!@@MiyHIO)ZVVqYES1t+W)5p;KWY zWpGZVsjzUV`!&4`flX}JjytIheqRJ5JKv$N?mIGaf*z4BzC_QAc*UaMpDIbx*Vi?x zxGPnlxprmWBI+t|2DNPJCuRxH+ubCxF!8gXO^3f%ppU2EIfcUY87$ys?oikK;W>Ic z5=<%`!@wt+yK))Bz+0l38gtSEteTN~3fR3FYFV66&a0Rc`lD_QkR=boWPE@OeO-eU zB1j%mF!D^E5#Bq;uvvp(v}~63vL?-}_BfKU(C#Bwy@PiaG_#xWW?S@?cS_ILCNb<; zU`ktyyPQ|qq@QyN&Ch4HLtkx7TAs-zeX_Sb7UFk<|DlSX(AM#%KXPZ@K zVWWq&0>Ch5bQ@v6J;n6{s43F)mYc|%Z}xj4@8+}v=xWXvvQ3$dxe~RzLDuw{rJS`% z2Ua5@c7`}mSfqw9BjnFBVpo08Tb^0GTIur3pIW)~S|U*bK9#wJg*n9Ta)w*S_`lDX zGdwtn%2}h`v5MJmgc9XhOWl&4<|J9w;s9CaJz*NhTmHQ$*o$0Mifz4CHIsVLmDXh! zwi7Ae>F3xdE9x;@=<_;K7=Iq0uLJi><%k=ppDX#3Rp$Q=P((9+VHz^oOIwe+-*p+I zF`9b4V%$4v7<7#$iD`HGYr_>AEraT7Rmg8#aNxAg$Je?QvSDs_xp5i&wc$IX`)i^V zf3VOcW2aTfPf+nysF;R}M;rAf=<`$Q%?$HZ{LP+b26+~$8ZAX#)T-`-a9u{=i{3*< zP*Qd!Nq-x636(b8+IptjzBW!i-BW>a8Y_5c%8OTYu*CqhhR+ZT#5QU$O%6 zS(@(RjRM$M+O3!05(<&21D5kvUu$5@%kj5#O6kwji3Wf*{GN$N=CWH!1N%W@t6un0 zqw6t(i)1TW)Q><-e8eWT1IDo%tSVe3V_wvGo58$)3>1G3!as%bKZWRc5Mx}jbQzS@ z{AMUX{Y3(vsv%N1xIsGbq;LW z`h&@hn_YPNnzL*E!|GLQ=17Rizk1=b;sn=>Yp$#g`v&DM>!9u2FY#SJ-A`195=}fE z@@mX%X}pM>`Yu|V5%G|A`=!5r);Wo~XGtqc6pDOl)i1F7hD%@pd=Im1d}qlqm9tb%~*i)o__*Ni&mV$gNBws$_GN`tK*OELC ztwv$&7QYbkgpJm*ue>}g>2R!U>2TUBI#%QF4nFY%?uSI}T)^zBH)`nHyI0~}X@Yg- za?$&-Drz26wSLExcugQ2Ee%#!jo?<`cgK6(6K7_8f%UOwV>4Y!wpz2aJBpydF|bbD zZIFT38s-@FM?Rd%Od<-eFGW75kn^`o!?ky7UgpZ|v0b&1?%sh(5i`Eq1U%TcU{mRo zZV+2Snf65*CJt7yCWvhyPZT&PZ4PRy+6~BOQ`-(hN387%v&B6n%?tje2=R8Wv<9yn z=LCQ~+lf$VuER(V3DXkKmh1~}wa`?Xd3i(YB3re6@4Q<1fVl$V|L|NGNV4DSUI(B= zygBbb#6xMy* zDGTnQSN-^yO{KUTPP41|xJSCnn`^?$$Ke)B@QZH3=Y&xA?s!F!dJ%YgdDNVClcE4j zK(oK{hl~8K3Ok*uMo1Gyqy1R+5-T?CUKyr$h#2);OMLBHb-&J>Xb`m1v4_PY8s#Oe2+S9AUc&_E-Jd;5YUO%G^9sAez-+>PpjPZtznDmrGRP>MY ze-j+_{k`oCRZ9~B-H+)=wqtsB%08vCfcD907Q5$8*E7_$#$bG5l#6F6h0U<0z>{pX zGoZwOwvPaD&+Ll#2-^aZ>7{D=BY3DoN7&$-6-0Y6vjglYZiKz72_cf7<{vmS!OW#XC$)D zPF|K1%!mGTWq-oa*qVx4fQ@9+xYhLTH#J^iv^P-mInrv8KsQZ8@uaULKtk{L)lWw!;zxPNuEeuJr3b` znQVncbefFGO97!?SF%6Fe)lx5d1d8y2l;Z%053M3UO@&9uRY+FS-Y_@{o0-jbgQHQ zA;~nHZD~7(CJw%cY3h&RB)<1xA&p&`taE&E3a7Ack5_y(^4-r^YV_Kr2eymo>}O5Y zIjLjv`9Nc>H2=$IOwSu9FH!b876ZAc6yA(C_!=BMgCfFZm%>KH>!N0WT&4zygIPES z`3Z!Tik991y{ZYTIo^T8Y$^AbAj^Gt#jpy#I>(XK=>G#mG@TO4TFhDA)L&>?PaTG&8X>W+u~ z@B#ouf$%44`+wU4Bz10BIZh)*A7_nzDMfvhxInx_&zILw(;=FV1XyIzQqr;mm z%ZNx)f(0RKws^X7wb?u+oFT>{y)&TdCQqfJT~3izd|QK*r9^EVBb7@*5NMrE z3N!JHf040`;Kl;vyocpaa?Jy-U~qnc$wU%)Y`fLn)*=oHdcd~R{Ot2`8JQ({fvJjJ zo!{oJRO1+RIA-!noL;|u$>juE?_6~_|6fW%oNq}xy4$I%$xb^^Sb3N#8NIV1`ReQR z=t*Aqp76q#Ri5{#t0o;rTb{bCzj4@-es%FP1{jKNo6?f2pUPy}YMgS^*|JqiDC()V zIP)e|8?~|3Mu^Iy=qii)BVv-VB?}aPt~FB$3bjOJ&VkidEZNmxPcUrHPeM%HZk1l) zIbp?q<~-fn78Zw;y5>rlH7`W?VMQYrWSaoohJQAuGBz)knXKXn214mgVG%HP$g`0 zIPwZpxj@~Ll89+AC9dH~S{nGA^CEy1XyT_;+Mxr{F)pMlZ?MG4%V|T+ro?eX*diOJ zR9D3DFqu*~PYX$e0OfH($R7SFij%K^Wq0?~ZWFxIv)(&ryhalk73zDDWkss!J^e^EKY) z4z}}00xZj9KuE8|f28Glcev&zP%IGh$)rnQ*C13-=3su_qSS_>k6MG?Sy zlL@?+-@o~sjz)N{2V60#WGiA*tIJP9M9z6DlQ?Mf=-d!XGa@~*8;Z&EhXJeR;5RUZ zR{%>vu41;&Z8T-5EyJHZgzy*m=TB>EQ1l7ssCc>r&HP@kWe&_F-7;Z zulx;Xo7=hH_uOxdTJ6v1C?Nhal4<32sDB+gu>_j}ReoTIAgQt-Nt%y5d}O9wR%d6j zW5+4SA05wA5a$_kwlRdJJ@Im!lH&C=6yr+6*&I|gvV_i@Qv$T=XvYAE5$(#=KWoJ%?y`X;#Q zRxA_7B}Ug|JQVy?O>rgnfp{mE8F-h0JJ><5E|kbM^8TVhq+@8(1#5Ii*qawd_d*g=`=hsa63a;n&mNzwyf~lE5Q+qM%GWqhQ$UXDjHN`Qp7b;NL3CgH>!!%9->}p z3bFw5p0AXg+sZu*yJRZ=n+u&J#ADxDB%ZSpRSs_sG@NZ=y$5z-2+lt+&!?I6 zJnM+m;wz)~n&FHY-6Xz4diUne#x47iV!}owG2x4I|40A$vv2<5*K3vV1IaFsO@2?r=M zPPbzd;yGey)aZrVfNp(}3z4JH>Z=(LuCY7A()PT9n$p#YR$5_kzYUcoa4G#z<@N?Cd!Wnc6r9l!e-Wqb2~b-539jugQ3?Ahwm| zC3hva%WWbuC9|Z{+;Ie-^{wR_TL(h&*8Iig4dZ@@>J_I5DJXc}h!oh}QEau^jM04d zy%U$Tvm*B`%l{gC?s6Z}wh-BMp=3Jyf`}%`c>u;i>QNRUA;rTQkbr;p+-=NVld=jo zmXr4k54@BCXy42s0_}RE?T;ZCQi`6eKCaSMUOb61>)BO7Yw10P3o?mvY*f9wXS#OJg6+kola&@=*2}8)z#Y%f z6p;<1BsP~y3qYYGmaH8Vg*KtHG|)E>5T@cH{@PjM4uZgsXM9R}zAAVseC4GLtFUVi zJLz~9ZT~)7M%DF;a3KATT^h@?xWyo%p7dEuHciK&U_((=?lkhK*|NeF2njvhJY;DC zS)07}g(ZoktoL0);S%0a&V{_Ax+vM+a=|8ck$!VY5iFD$VIIjbu9FC*&{d=A#ud+i zO7e%afa6>08&Xl~T43A7yTaeT_;}B`=+$E1bNjt56!#kk+M%@HjcwuJ>0z{d>KjaB ztXBz3sy-#Lb-h-})GvZAyrm#sh0+-Bf-jns8F45QcXAHR@-@MC^(emQ#&m(>4v zt&b(!!vb+3{N5+c<{9Ty1J4x@n6IUXEqAncwLVCiMeX^;F6Pc5O0QyxnJSUCC%Dv@2Q_PQZGNcaK^9U4Xe0P)_xR}-PO$veUT&FO%ky%3B6$W)V;`-00eqW6$ zQ7obl>;4Q1MGdREb+k&qP^#=l0`jDa8a&Hb$^r z3*R!+Os6?r^i&6+L`3uG)?!SD&MYdvVvZ>IXJ}P)@R+0lfjS;hUet>ht~x+Uj!G5y zL~AAuduO(UH`Gb z^zHx7HF^fkhE`e}hY~`yv)3ENIT1a!MN%%AL?COU`Gy{OG5qt2UQM7-t(B3oVt)Rk z1U8@kV29bR`eX4O?MV9+63tu|(*5l(boFI;W1h=w6CbBfz3@tsb(Oi-)KuEkacO(-}s zF&1GKmV~s^jj#=jBKN|evneI6dU15SdU=T*F1xwv|8Yf zY$IE+h7%+XDLiSoH_K)4{UD@k6p8t@xI)daVKl(UDI~Y=<&!Yx-C_;~vQfr@_Qa$` zaH%lR{Yf#f#s~Rt!?7bF%LB|723Nz~jel#*!<4JUH_+0K(0S4#JnCJz=^+DFP^VFL zspf)^02(N5OHx_?)UfYtvpR={p0CqB0`{55^iK8!o7$1kbLJWbHAK)cC<@vkRwJek zR>{k}D(Rv&QLEBsQHecTyI@gCmbU+8{Aw204;Q5>K?S#>dL)tmfit&ma*K&AvcZ;= z;t?qD=6l@#P=DP$?7RO4ZurV)$&&V0A^^_j7d@_U!tC6SR@{Ol`chY*Xt>U3wB1lb zCqR*h92GCy1^}JKr+$J|&G;10EGp6{!J`>6M8ff2(e=c=#B8?N?HuBtT23ONs`iVT zP_4q2ZJwuBTX5? z2yF0XzzoT^k_)&l_rop=4Wp%bC4VH)jo!ZdtZ6%Kk1}RpWQ4EJ zVHYl&K$Cy(|L@z(fY+SoF13BFdtCOtuY2U~wch-F`TO*D_y^ttT_lmVis4=) z)@A7SMj4Ce5J52{I2bp)`v4fq%}%Z%`cj!h3-X(1#G;6MjAfA^nzph@Ft|i+aQ+=Z ziRz2YV3vVg0!i^oa9Xv2#;7#lamZvkrL`kuK!)?Yqni}=6+Ni>%zc>(&A}f;o*X4V z7iD&-WBQwgxN>;5wL-|UeYfmlSD3l!!zRSxt=nTZa9U8X4Rf}tMd5?*Lc+@@pt7Q& zLc&>|p68@Gqe|CLb96oV7#%&yE<@xjZpWvzFr`_&7dnTbwE?ld>P|WDvWQrGX*jyk zcwxCHSW5Q_aQYWTr=J3#sT$YHR(!rqXF-$xumvu>OG;q*gQ{zc#v3IvxcjwUt7e6T znocb$eaP5^lcQ^1zH7Z19mb51N9S8%ijDPZ7$_^wc}(U#ut z%$By!;n1@T?%0&g(A!plD&f(yA*n#OuHjJdRM}M%A2=ZlpJzfXZ0H9TOR-77SQ@V7 z>y8uWW}&@3Zqq0c_57Mp<~e>{(y_Zot~j+*Ww5jsRPS5L&OT-~kff=MRX5eDM0Yci zLC4AG8IlE4EP+b`9US>~q`}E`f){of%fWMB^r_{1*J{q~kgy0Y%g58*D*}0Q>)-=^ z1(dW7h3co8DV%m|);}i1fmLqL#$!8W8c@gzra#3lGHH}693vaqm7E+km7YrzauDK3 zLd@I8HUZ4NCA;PX{FSSE>BimoWYz*ULChO)pY@Vir$0*h9H6B-Pf zaYa2(7Tfa_5H6fH|oJk2{dBc>YvoX68)6aW|Qq%#E`YyCfM*2+)2053l z?_fF-wQ#DhQIvZNwaop(ItFg6Ay9C+*u6G6g9)1f#E%rP^c{#3jY^ARc(8gAA!Rw7 z=CjoUqs-ny4(hhu_DF{orOLmcGfns8@ZFXebq;_*oxpfP$$Sc8IVy!&UX(uaY&oP- zAnSxw=yFU@BlZwI=_nsl1G{H$t&Y^|A^AKDVRUm}w^R1-w$hLUTtn zqkITC@y47u=XO|f5*&tSS5-`7Mq4*@OSnQ!Sj#R|RWV+fB!3gAEdSg({DZ2@{Bt}E z>{#%U0P;?d!-`|Lmuk9);x9vAx&CzGhQAaYhO~I>b0fwl^p78V$R06ULF2N-4;`Ltm_YYx=dUr# z@%NS6nKAx(GGf7Irh0NSKgXMXjd$5$7L|;RmI5qc8Fi+iY|wgj4b1Y~Owp3ohNGtE zj_Y%^)?qJ+BVR<*oNC*{p_9?c4}R-&r@BtN*x^9 zm;YFuZqq0#l)V@1HPba_hQpnMLt*sb(byQCD*cdupW#nsMT@e5@-WCSe$oxA?BqZL zO1NuWHt34vmB>n(mm?GE>C(<*Ck;#5MEDk^M#O=HPh^f7DmeI{oG3eBO$TnZXeSEE z#_R@rvPQnjI%k=_>SX^>PHQpCnLPN=Z442vk(%Tn>~B9_xrH{N5VNE{h+ZnkKie;T z-J8w~6E%8&R1S&|bt&gKRb8ts7{nJTe4h=E%T`b53;GW%fj^};<&vE2fjkr5QenAU zXvHe@p-g8-xY%mR_Yy7d7PrMUyx9iV8f|1&H)+wcQ<3@2|HQ4Zt5O@((QL?S&efA? zlR-_?ef$nc$Gs_mPZKSjG7`>m`zfCkkXyBh!g6H*p8g}ldGX^P`p1V7rCW_3oPiPo{t^BdM2_oSpE=z-ZqFK!{LnDGVO1?Xq+b45TQVZd zKpqkzDc}%IP}_F+01HC`f-k%D4+tdUm%@TnCmhP+VGK8G#uc!=u4KVa3*sj0|DgqjZH8}(tcw9(ppic*L!a|bp{Zhi1I2RPC>DS>!3+;FH-KU?FU${78Jk>V7+hbY4A?*dM;P0%(<8Ch2M5#>KcC5RMn*du05Ofg&)ecRrkbk`-l9*J9bo_3ihWr7=#T%N zI7@jjNzxDci<5^(!H3<+4x$ys_jDaT;JGagPhPz5;~LO3>`5^wr$5v!aA^N_f?5M@ zzm!qfkoQV3_?0jW$B=ty{RF+KHIjzf#b^u!dI?LUhw@3PQGQt^H(WJLCIuo;k!J8m z6G-j8ft&5A?L)RwF8~hoj2(>ec$@=W-y~Q76R8+33PT12_7YM>3IG!SYaAmkFj&JW zS($chl>3iLARvP^tTTv&@j#K88iZ5CG9n6O9tJI~yMCZYT21sbRHvY&Q|2)uD-lp= zE!vLCmmQQlOO2iCI?O%Ek{w~79BbAc{#4{9KwIjZV2HXl2+y(nn6#nGRwWnal6M#6 zl2LhcoF-e5SVNq_{RUwZEx`ZE7V;Bnw(K(ZN0txXQ}KVP*&GC>?$>%4NgF zDTi;eH?*Za28~l!nF?1*59QB!VbxFwE+j6pQ^@_0$j^Rxw~G zq|HV1N1~M!Qih`VBhgL@E9Fq{7F!ac(~2U208+};UqvsfRH$q;HH=w`Hio18k|@d? z_#^s-g&Qyj%gV`8mfTP$M#R6(T)|cLEOcIUQMp53XsxPQ?a&0b%$0jVCdW=HXpMe# z=3hkvtvr*O%SB)AU8@!3CYZjhd7o8C9iHc=1m2&MYPjuGs2si4`8P_V5h7C`X8^r- zyGUd?_!5K(qbMG>A-iM%cvOfpT+7g-wyv`1 zPi>LkDc;~0nZInz;5ai!6-Bb{>1$n~=&wdjKUmgb=(5!wdPftPiff}@(>{W9neFf` zSEFKGe;-XlkL|aql_aM+xZxWfGb!hgkD!&Lr91%m;{b%ob7P_9F%|5%%xK=LNk~90 zM7$%Pn*L?r&JSK_P=2!0Y3x>_;KtVn8|%D+qud;Kh@@u6)))gPB$IRApUjf$7>W9W zx8OI-7Dxh&7>|5VS>8>Ow?Yi<3f#J;)p@)LcB@R`dWHH{=@_+GV6?D>In*7EVJ%@T zqLiMImcn4I<8GUj_CAQC)9lFsj1VE9>jTU}Nt(f4&rb55Lvw1BI!)1s4g--7p`Ntm z$`-f+(0vCr{~Eff!)g7dn)i#cwy-iC^U0DkD0yF~#*%z!R{5r;%bDNs@CPYaZ@F)! z;pRRNIZdAh()YyI>V&Iy&yt;14-NeJab;b*tJ_(3*g-Fy?67)tgnjr#o8|9p-(ZyO z)jMq}EBGLekqIoiKzBwlqW?AI?n+|rnzc6Hvgnf-5O&}M%7&vnS5Z?or}7mwPZyV^N<7R2wTkvJ%jo0M@2``m|k zHFpm!WV5>=-^f;iiM&QolUfY7Vj}jW_6LlvjCk(00{6^0~b@Fos3g-_Dt{hn$ZuH9WUcgC_Q4fX7bGA?1In-6=iO zyz_6x+Vb3jyb{-XD~`3=vF&c77$1C2j`U0dKOCDDjP1HW=F+lTy6T5iO$+~2Ah~^; zc;7?SGkx8=PkyJKC#c8SzIPt@@rM`_jV|%W$x{@PV6VzyzgS6z5t49Pi&30gsOOZv z8k`myTfb1$Q-F^agRxFu>Nj8j8ud#6*Bs&@*<-LO`;n|dw)_dy`q3#L3 z?M**DFXSFG9(eJY%MTf-qsDBc_s$g`eT5z~w4(P-E3)kVk^HCpL&t@B9zO@JJZL+S z<3mV1ej5?v!_E&LCiGj}tcM8_96Ka9$r2n<{3FA~f^WwNm?D%e?o9INg>^Pwv5t7J=`oSQg|F9b8I zG+cRT>+z@L#5!?A_JAO$`)k$?6E_ooeq3#XNMG*yCO7siB?-_slISeX@;U?lu(b%+ z-DKfst0V2|6LPke=vOrH%kP>u|6Uih5(~<%b4&^+f^D;2=i`}@{ z>0TNxS55Gbs1i*UaA{@VBvcVc@5Tfr{8|fDD~ti+%)5?_u-ij- zdAEI;U-;X)5qm>k$+JQQlj27ovnZ=hD-bTVv|2)-ieEWH-W6wOg^!C``-jr+l zQTWB%0C*P#4MzU#$Pxv=O_oCVzDFA?NRz7UKkpPM8=HnzN{y8O$nNzd_sgNWU1-vO8SNsJHN|;eUV|+g1Py>~K z9VN5Alq?NDp!B9f)X=Y!5EgV+YRu&2;`npZ8*)XAaE7nT4{q3CRvwd50zN+<2dM~x z?NqPyR*ZE?UpnXqx#f$x_!ItAp+t+|Bp3rcOukaTjHx<#3 zWqKgKK`iK4XlAgk)B2u6!~T*DN-r*CwJgdS`!u1-xkWZQm{Lfl>ry5%VqV#&xrIQ? zqSI5vwkM-LLFj_h3jLTlXE!x8`?0&TtmxnBY*4Vs$vuH^h(6i{#%Dz;JooiIVDsbn z&5a*CY&3k44SO9-X2Pm+rJ(ZP#=V%G@&;V;;{zWlNXN=zi(Z_i)kii^ahRf1pkeL| zu<$VJr2oIQ7N<3Np#l$`s9h6p<}O|Cvsv2t2%F3Cpyu5d_qK`I=>qga$labTEj0n4 z^!=Jc!RS$H+Jkw7T9F4!Qj)>iGT-Pfm6tADv}L>>qM0PS^S|Qp(+-1k{0D?u4-^Fm z)ep!#Iw(P?m=7JsBzVZ`UD{CEl2W^cq?s4GwkN>S*LH2Wg&9FRzbmdN$_R#xw4m{q zWKopr3NoJzqbbjnyQKq$t!M}97HBMYE!0PCf2AmNKMb*H&+*B)`x7tFVlgDvg53AD z@4NFA&gvdhq&P{G*dMgl`?&fL`C8Z6qhDHSymMX- zSqaka@h$ta9Hj!8n&kXeGrTfP7V{op?N`*VA>ym#$;x{~EHEfoWh9B46ONPGs@4e( zM42~0N{xhpKbU!RQKPc%hqu@5Jo6wJ^X|+|K{o<?#0=JgYZLAV{<>U$Vh^eaeb2Tk#orv7mZ@e9s6nL6=Xh?$(e!iC)W{JLWHF zo9Hgz%e_UuYoz}Cig*Ih%5XU6)7_9WmD~$CWSmdn#loj{VAE6sqnlCo7L2mvAS4yG zhB7oPJBeFHNQx;#Kp4wVmD0A=LZ#>>qYEa5Z-QU5bE*}&q5B}MQ* z6#D;|97l`u7?>i2HpdP`!EXRfs%fw{YTE~&DoE8(NYz#mmXM8E&e_{`;0ppZTnDz! zy_QckbggueCP@AwU&Z+`{FAR`j32~H`($6)vwv4ePjPMPjcqC!wWwK0p>nkk*O`w) zJhcxRMGYdffX&m|Adabzh`h(pREo66QM*lra37KIKD)%>g1 zP`qpS%^D0HJJ1IK+zp!)oGDZJl7VM3mY0YJMR-{mVWoU)-`%Ba&81*;KoGSG zoiI9&mnN0xNioDemc?<$?08~5kC-M|wR${z<>PZjU7pj+I=LU%s>tGJP3SpMI*=IfLd*!MVtf0hu29yD8&+s z#$@e>6bdA!O!)KR3Fa%(k~p_>g<=(bqSb$>IS~~?4Ongwi84&6i}JD|Q`l}!W&_mm zUwmH6ODDxPPW2WXvdKmg8A(KH&MVkhuGq36jc_(*#*l;C8@6$mBAzq@yS`lGoD`p= zD99rQ8*iD>i~7(#SdQDEC(J5#YJPhAqc>V1$1Hs$nWb7U@{|dj)ZJm`J^n|)y!w;i zKyNarQkU+)SvQ+Pit_}z6~N8&Ugk8T)D5sQsmC;r=(C$mgNU#Gn{O=6^`V(7`3$tE zI+Eec_JOxd4@4bYJ#V0Dgcjv70&JPxk3!!kJG^$Csw4|yY`3>Wr{ZQfI0Ir%T%7h0 zRn*0W(L$urEdA2CH1fh#c2rsNVSNHl)7zzzKWN8TcLao9mO{)EGtqG8OzFy?5OX`dzo zuDVqDtTxx`10?Owh_X(;E`jP@SvQIU4BQsMNfP$JEyy~fG^ z(;K~d-^F73{G}dLYtL#w3dVC@k5zBM>7>V5!-2+XlMV}+?-v653Na2P7=Ya!>dY}x zjvw<)Br1aczaIw3s(gQlAZ z_d9EoT>fjbTF}X) z#ycC-;Y62ds(^^t_dMUw2)8tP7*R0AmAK*Dqyb2 z=>rV5r0tLzIGP8z3XxDkw0NU?%~Y|jbv0C`TyWrixDTZY)<)`PU8hPwnvK5+nDe+l zXqZADiE;MjTelwj_D<8^MrNfCwp}Hgnp{NzFOPLWFUFaGhPOfhwfZ>{>8D21j5 zk#k>g>UaQ(gc@M-*v!pHVCtDrbYu585-`KGW8M^SffYZG-?~>}pEmH^soPqa?fNVT zT|VON><05MFA#nwdXHxdsDQ3??j_W zvR-k2J0Yb#dy_)VH{|-bz3}AO&*nUKp3w1&A=js5hmP0F9x;$djBl7cW3dP7M0P62 zBl}r+C!qrXG}SqD1ME=l*VB0g@8u_`7r(wFoy=?2L4bPq!iK(rNezBUg54OC4b*MG z(YQO4>mvlpIb(BpnVCXKd6R)p42pJ`q3_zB%DLAu)u@|EM;N+J5-`;eyL7 zc@otOr8)%G{Vn-<3q43-l%>0KAH1z2lPOkVVaTZs1$Vp=L)Gw!Q@^dWxz(o9;Nx^s zuU#M=o8h%D?KK>YK!&BF*jZC3;^dQB;U@>ZAqSXyF)V*3GgCl_Q_gXEC1+63Ne#3$ z&=}aZOjWlQ6aUS{h`22-`uvAaabtRWi%a8!!&I0I+_6;0DEq<@7p@|{#2Yd~!pNO3 zPE8~!wN~JxHdC4+y^Y#OqITnw{`xI=@_7#Ys=A{OKq#!~)*{7EZ)RIG`XGd5c@Ol> z5(J3uCPa4=WgVfA!DKIeG}O}-5ziCwLSbm9$SF)@E0Z$@b**D|FYr~GFqE>vf%B}? z^9U!AJp&+!bF9RE;wk|F%>G1NYIcN@(}eq};*{e%XYaW*qN;BFlLA-t+nNt6Fz^LA zWkm^>?6)$K05p?ny*+lgtG)x*RxMnDMipqFO19aYlUI`0ktZVbAP?B?s2vZbi~mTbS4WOcu&`OZ5YzS!8|2FjWp}z2$Q2k zmrQP!oL+g1%SIklN~(;}%*{4&K78Y@HgTN$bBxH&1|}B!I4ox^ z;OUm)-e| zlI}JP4p1WNWq}qucUG)fzWN=j7Be?^o`ck3cDhGot?AtiTBp&r^UNHk?f-%?P6yaX z3Nk-?MU{Gsj@E=nR58~PYI(!OS70=a43N~z)%)R zY|&sN5aCqwimNpkJh_*MGGl0g$J#EjCmdJTvdeQ%r44J~)n4Or1$?e(lj+GjSt3vR zLyE{#jsM@P@PE(k>ios$SJ880^?&53GdfGGn)83_tiD@&&a&KF|J$sIUH|>-EZx8U zI?9gU|D9#W=l|=hjbRV%a%>R#qEYurs`!Y zUHSzncz()`OH&@Fv`oF@A%#x}HyI9Nt zZ!Nq3zy+CG6UHA!{W_y)wn}gBam)riekk?($o2mlDD~nSxpHKD&v>w5V-cthQcr~D zzwC8i^g6HRDfE1$ooFUV>GPf+xOhQP!I~m<6xVx$W!P|HU8+c3!9otjb>ZiB=+gn) z`oTT2Xy@Q4KYD??&G^U1{7f70#RxyKai~Eg$}@d`Ay(fZU?kSuDaqhns~f>W!`@Rf zydRQ`;UB4T?`rgC%i0k|Wun{5_`oM?NZ1n9ML+-m#$y4)NuO26)@eAjebu~9)^~U; z8oA4}55{eo+33nv@gGZ?{iu7$468tqJ>=n*cfh^|QvXqmv3TOsL=o|)R$u55THB-b zvw06I&41TCPE8v1^IlFtll%H6d;kt=%(FZ3J<(l}ETgv@s;M~JcaWQF3CD@F{o~Z` z@*YVCQ0OF`z>7Sh158_Zij=$2QcorrDZNp^=F4o+1|yiF+ z)rTYeX|GF>)YDPYT_5PZMQnm=xU|xg(p%WYq^a`}rP0?fjnyebBUV_(k*hjss1mfB z5a%EEAzRQsxZCmzSMU$~(3|FSy{<2@HDlf#$uRw%=)9oYw(X5zchHx5zQU(Oog5CXKmJ&?LG;nBi*dX zrI8mI$viaSZQYh}rpibHNnNS(s=0GXj&eSVMt`5zJaf1aso};o8Nr;Z#9Mv>Uj>g3 z5HN~70cuL)X}cj3TP`0g@1G;Cd+gDhuQT2EpK(ffuW#rur>`5)Pay~N8VH=^yz zc$ly6qBL%J+%|7a%rQCU)fD-;G}NMTaEF!r7ZM;onqrHOva7m9KG)K@F}BtuLKRW<)m_KIaws$a)}jk zKiI+lR?FO7d`Rh%@yiP=*U&ya3wOkRdzxiR<0V<`$;E9Jf~NyH20)`WEKVj!iI7Y0b{C+ZWC|w zl3H2=3~k1Ehn2W4#!r_5?Sc@0kw5`<#O@1$cY8t)>Nnw<5PZ{qFNi@*--%HIK>R|- z2+iG1GX_OHg^^-HYmAk|-N4#021vDWIEJGdXV%b; z9Lr8vkmw3-di%A1+A6>meJQ(S-L6qVk>>4Dfjq$gSwN=0{Gv7PS=Tbj;ck`tW-oLA zV>~p3xyLK;rT60(sg5}~Nj^mG^Ckf|Atq99NjOuy-lNX*t6)%jZP0`HP59&?2U5VB zx%+0mLt#4Ur3sfcohC2j(sA^m2k@{b;cRBPrjQorM0#HJfp#XkYT&6``LjTqHQFgR zg;kJXwf(c$3bD~4ctQ=fB-mSJFqcPzEu_%nl_+{85yNkj2x5P)+=9k-k6|*3C=~0( zWbY|&>P_)jvC*&Q3N!Jk)os0^CtmFk)b6B>z#L^47|EHHTO@j|FwhF0KrXia5=SW5 zfwv;Dlwa~kD(yd7Yl33`*=1y~rG>x5doWmG~k zcv^j7nKI#5*|aPmTzMs8&XD$Ob2X zbZ1*lPTR)5n?cUor3+YmJz*R%hA0Sn>aEyg-@r`0ySjn(HQ!RwE^;IuBW!c*&V6~tFA$--g_>sW7J;j{ zRZ{)w<*{^zzjp0D6TBvqRzB+yfyiF$K0z?OAJ~^*f8TZJz`0(9Z?wGdahgz+#t}!W z)~{8xxY>5!v0-8jS6jA14T-FhWp6YiaE_X!!op>yAn6pFPV4&=m&qsRm6b|=u$k*d zm1B7)>`QVig*z~0Ql52j%sHD?w5# zV}`T~;-~HvOEAK4m|!XOWly%@ord#-cbmZ)Q!PBfY|64vVY~i@vO?-W^i*AWeBU{ctdNK4OxYXYouQ_o2s+dt?7Ot;fW#bZ z>43}og0CnAk*^N~_(NJV6A{||>T$^zIn%1C?(@vpH+3LtrJF9@6_ix*=*@Ok}+-sRaQ|{!MX*z24)XbtQtL!jf)i7wq8`8L5=cqu|o^HS-J|PG`p*8KR*d4n^%}Rt^#BRg?C{efeV8yIJy?f!m zQzgFq%Tv8eeEX_G!YI=lfFG2zlKqDcIettb9fj|{u_ZO?Ntu~}ih;pkWu;P*v{PC( z8jLu#oJ_>#MhH^WO0r7XEVU433b3fS3}MGAwyJiot*^GWcWZWPpaEsT5Cs(hRaRx0 zs<;@`(<~~7KfmApa|L$a-)`^UzWcs?-uJ$DzIV{?t=~KBch~Q5?QM~^*9;+$k?fdS zUu=7UvW$+IA?}?8nBHMfOy|?PxGR==@rH51&^?eUmI!5Kis7TzRM2&1kfH@jyUfaTZn7xPLRPQajsKh&0j7srt*loJW7p zDt}UI9&4w?^$JIK(#BUD@UA|Z8MhDfS+q7QjNQ{QY4OFUBYu3L6LZ}+VczD)$H+HN zQav1$@ZiodbitKKJk=ddg}I|d_pS*c(f5=aA*$?|YDQ|N%#oQJR~{GkY}6p_gagY? z7J}k5E)SI21V_T~HrjmBFL7K=7r%1nkWGP%+b5d?h-2~w)|n?kvyb1o&Om;J=wKqR z{B}XTcK{8dQ7E5qiPIMs$|gB}K*}Y6`c5xZeHGs@`^61CQgrHU;`my*rdgZK38V_y z{J%^tDTz-BzE({VY3jS7QH8r?lY4Z*-a<=u?nJmTPi~>z;NIObcM~PMdDps2lEPRHy4U^Hi>f5ET_$T=T%M$NzdP%OSClkZv~?js_?}fORrakAzM@%pZ6@qQgau)!wz&P1DA7h)LsDj?~c`8!yCoY!IGrr zFnQN>d<>Cz2IJDvODl<7E9Nvi$FnE_NK$hcyu_5g_2x}BZtzZ0h$s3|-3e8nhW-K6LC z06b5#JOB%ykLW{?w8hY5E1EZBefInIq95THw0X-#j^XpDG%;eVTwjgm&v9 z4bfFQ7i85udR~En>ZG1sQ&FVwOeb8kMkvAiPs4+;B_cC%uzhE#@nJ*lcSM?M3W&kDoEWz*`0 zDk#yOFNxCloG*k+;i-H|m&BZ=)V`!mN7{E;LT`^u*sJ`a>a#L^K2u5t8h3*k8P!|z zx-;jgQ9<5vmjVk1DR7}^cQ2=B;c>csIY$eP7L&8*Q&*P`$`a5+X1*C!qGa!lp1d(3 z#!V6Hav3f3#mKTXzO)AgjxA4z^EZK;U^xUl9ECnyRt+7g9Tv~Dxq-#j?%^<>a7-uD z?$uALFm$dTy}*oOt~qTUBYG^ivMWIeu*F=$&d;xkIquxi z7xdM#o$ZDgmSI7lHn+^;yXa#w_KzIS80uVD-SYCeTypcZScRJ}$}-pDMi$`Y8oFPq z^+jv|@xFsHAWeIVVe6e$hR0SANa@M>!J!F{12%aYD zg}swEa`g^z%jwaJnM*5gwBqhp`B+7klOjruAz(EE`qI( z(Ab?FfPwRw+9uAP*RwTD=sujz-+HH2HO|Rb3CKxTAth(~B&+T&-7p}bxS^?_^$6^t zUn_IF5v6qY#vRk_ZqRn+-^TUjg*t_+&Z;d`%G{zN_66!E+8yKK%+hSW4#=xz+h29C zM(boLqRH2pMeG-Z9lBWRjQU(O)$0yiW+H!m{4`^ zIO3#zxh{$b7bz7y9R#^XZfof>cte=iXSo+=k=ThvBf2mWPT7^odJoiVlI1s0(5Z~Y z-4{h;wAq#4(S`(Qz=D4WbRidg*lXbzOaWqly41indG{ax09e{Dqyb=lb7B!*6~eDQ z^sCL@+!O}2rN}QP$_5SkHwKc}emkJ#2tV!F)=sW~`T!gb_be&DlnntU-`nsGC$Yer=ZXls(mEIJ?|(BUtDKU9VOX3H)pEH`~oBVvsdxZFqg%q9t6VzL2>#era#QDBt()ilAET*JtGIEqJ8*b@iBB6JTn#BQKwBS+djv86XS4=O>MTr`IM+=~yE!c@mD!5ZXgX=vJZ9;qhP+ApyA7s zl*pQxRgvSG#}0cZgCCE@PL2k5VH%-7C@~&S4d=s`ZS!KWw)U%~9@g-A|OvP0!Q|up= zY0Rj0#<NPd&Y`t51?=h40lp`sXeD`+cW4*bg2`9E9<2db_N6|Y2a< z`xpTSx6B;0&NFrstjjd)HHDW%7qu+qrYIS3U0>vGs{-oC5mEb6h77oVP;l|eqCrrz z;4L8PKA0k`@8dL5#7=fFjRihNgIFJnhipdiel41HM{3%dmp$PWizeAE4gHIj7~L@S zCYpERlenUhOHQ-b8qMYTv+l-RKinJu#s6N|sqUYVK`o%H?4%Cer+KU$8j?0K$NldpBH+pezM}aLxqMB*oNW1Ywl64Z!5}T0#PKxut zP9;4Ks0%!iZ3yqa(5CaqtT1P!e6g!S5f@Hm;o==tnwDG1wzM~cSghIucB?R{0ple~ zwS-FQMIZw?Sgo<)Ym^UfhC5Y{HK*}j*5zBOWXS)-0s4kT$Nr+rFVVtp=222+2&#{ zQ_!eq8_AGCuR3>x4A{Wh2UdholyZt`mp?rp; zAEY`-NyzOOTp?^%n_m#5dff0u|wDzw^{m z=Mrc&Wu!~pc3$pfUw3J@zV~aj#aR%GTm^7D>;cJO96_&=%P}v19A5rlsL%BaY}BjO z#1~d{y0q)n)UhSe%a=#FGlk`Yt?6S6v-o)CTGInOt;<7SXdcws2HT^svjkEa+8V@K zjdR_WV^yVMbyiv&u$^+aP2iDbZ+Xzdd0xm8JEMgEOd^c1h_QrJ4RRdVU=`1PWy|=yzsH7@?snV+@o9NKsSv zrqJonmV`Q{*5_D5x>VZI@SUC(qrSYpF-BS*Q0%|$!M2e{t?D1_meAx}_+ztM7E?px zR>c?B3brJ^w}mhJ1**$56zb#35eAMKXwN@ZWFrJcnzuF3LO(z6C^nBy=cy2PdvXK* zwuH={{4NhQUI%l4jmL7u!-+Pgxi;I&Gc13y82xT|maoJ?NmVMpW6P`H7gVjngu-|6 z)j=)v9VJ4(-!_=ra+93N-&RZiY;8SB&I0rb!?Tw=QKqYV^1*gx!<{Z4YV}q-FMhOp z^|`X@pssfyU0+ z0}_rE=-@38VQ`D(dv`HB^%TCLI!bJ)@3MtL0>D1>je^_$b}@>h8Fn2(dYls(0*mFz zGR5@;3|>Rz8J$$hKd2%h(21yJgd8;JMbt~|ry+$A*)TY4RJJvW(p5T4;bcgQ!`mX0|; zW5~TVqFCU@P`ZB*G>x#)xa1!5n7oQWNXxCiEz%3?Bxx$xC79H)MTZ8mM3txcy$vR7 zJB4ws@Zvm);|kvR4rHs&s=te&Vq+XI-8w&T^N_7!kLF__;2j?r@-4su)qwGEAP$$G zVbxdTs-cgxdDN>{_8Mqj30SBcO96KWsshpDoU9SV(pB=CrnLGILR+>Mt9f82KvKuH zs4EX_7!?mgZ8&M+NP)S^J`Fr6GpT(B1xJ1$x)TGV*=@d9bLiIHQ@z< z2iOHgMj%Iv8Es=yMbjFiJ(8#-5aCL}fmC-D<7~zoR$dc?x2TW-ep;}B%*eQs%!_PN zh8)S`wM88+DZP>f*%#R%TR(CfAc=$Qwr0I16?<&D(&u6GxqRqFU%8P&t{B*s-WP$n zPu13R7!Y%rfhx&{2ERoLOnieUl0=+@-W{@g%)z|FgcZ4UC2dJ7f_H$Vm5q7TfQljD zfZ!2h2L@eOlIp~TWj_xEk$o|1D~;0ELqj{1=;1LhI>Tem@pTc|f!ssgTr?45iNMzb zv}LSLrc7$nc!yJaYU_mcv{$MvBMV1(B5nfigswe%=8b6z2n;l8I z#Lok$2{isWRj4ytD9^h)p%BKJqz2Bt_}1@gLSriOPCT|`u{bkbGl z;*0#pQyN8)|2jg6Xpi8lmvY)mYUI5DMYVC1HQ8mTr{9&p0Bz$6Dic#LB%SVPgjPDM zfS;qk4Z2%$gBD**=&;4~bGYLA!qG;T)*6Z+zOhds!=pBk0&wKyX&N$le*~qvVE{v7 z{#TY3LXtVslK*)2<%_=5q}_)vjLY6-`Q+%h52tzD9aXz64RsJ!94*QISK%CGAFaYS&8@3Y^qQseq$=)M|2@vurZ(r#bcR{iqIa_v}3yZ}S07E`FT_hXC zgXL5N9q|rY-%5Bt+Jq z8^zeFGbXqDlNzjr;|YCX3PX|oD3*xT=fGIp#8M9~@o zwR!*P>ycmp9OpMWr@vf--=k2AOg(t>D1er{km>vFfkD$~XQAAx=zu{@ZF#0IwI5Sy zHpE5&sW{9cK@0qsd^!-G>j;!?;q;%Ou5fr`aX$7=A8K$akZ|p#8Lt zmujgpYl7w6SwrH}{!}-rY?W@VL$Cv(%QsGc)KN$*07(NJ?oFLrlQ>Q$j`W*OY?y|F z4@l9S6m26zot;S23q==5(+xz*kX?QS*FkwFX~gz31?TP)ZhDU+uWNf`fZ#POS zlU!L2?8Kd?^=}nj6ONxuN0JXNKToa3znPqE-(R&rFzfGw7L7kLV`QwtcHg8i2^u3c<_uf>5DRd6AYd+OloD=R}zCO z_oqB2&44;WxOB@x?$5EsX1SYcZua^)-Q@Y1|1pWh0i9m;jy znu;v|#-s&J{;Ytgxwcd_e7pkK|EGjKRMXYI0Heh^J(vM`?U|tvby2`t{kzMdz-fxR z?8mFt8`U0;Rq<#&u825_19kX)@!%90)af1Tg z4_|+?HXCT1I=E~#>U-}$ce+)5B1`IU%hai= z|ApUv*plDUk)*$1kjNE4b7WOr-T3XHu_fM!N=*iDGqYKD%Xr3J=j`DspVhH4@9Ycc z{lyk|k6c-JW&-fRY}H;42dNLSzFrdsK=I#>$`%cEuriN>uvK_qdJDj@1y_#eV6yS} zwhJ#1i$b2>JdPgKKFGBcXfO{eZqDT;SOq%&MB2YVw{gl%t{JMqX zyapQ%iqI`)cO`qkP+Q-F-=&&>N87@s=5&pr1|v-sa&3_ zoJCWXiS|cQ=asgcWUU;(#}r!K*C3*S9)1fhc`78goVf~f;ey{!&`8WUgSN)A&{MG+~u>YdJ zw^d*1J`eh<{;OgC)qbUK{uTcx-~UyA$F1nA|F6&fs{eDiGQaUFf7xI64S(HVyU>5} zU$W&IRJuV%x88MB?5#w?;b*rRLr@ZN)hWN1TrX`-?vx7+DYbBYan!!Kk{(J$3Q1N^ z1z2%j`9<2Rx043VikBBoU);aYXV@B-#;-p&4)QejWG;e$BAf`}rA$zw%ljsEGXQgyPW--ih z0$(_Q#wh3@XM))k#1e-FHpB}hnXd$Rh)~6+q1% zRr*5)I&P3+R$pJbZQH~fVaZb6ZG6GpI=+hsa6Hmu=)2|(fof(A{e#1@m@0Xu)?l~O z3)7hGFBGKCo+;^adgb;^PsNpbiRg3Tf!}1m-GR3MnI~jyyZs>ZE=t?I7<%Nbim!bd zeyARNAl^k;U+gPHpAU+P_SCIV7n6fF>s)$*CY!rXyp{rChw45a%Kt z^t`3U)W8ADbE&vyc1Z6l-6vY&1A_{h6Zh0of)~0Ebcv42Gjh`Y?lrp&qlO!CKdCeT zXGho2T!PVGv2YL7aFZJcNlxJgDc!}@t6%kdxT6C{wNJwRYS;HRsbr-7t3| z_UU*Q0DNK)lHNPQz2>olf_ro{8{4b{yZLn46(x+FH+?$9Jf>toE~;WOX)mNI60cWr z?h-OaL_{iY1c;@d+%lrsd;Z38H__QADl)bYr6kqA1)k6Qe zSl(+>d8-jau`8xrFy2C9q?b)FU~_0v}PCG`_qpD(6Wx&=k>MAIoiJsZ+ z(ntCgOa3BGlPa)Nq8}3FPHk)iE}uY+a*qN1Fy#v1<6hpw(0#+mn-X0T`x4(uk6Z-d z$X&PtE=qyHX1^8+0GRn}!>O1L31L-m^9LR#k= zq4!G~+$TRqX&3QTfHPzGuP}rS(V`ei(7}<~r{P?QiXiu%qqz`H1@~LSOfZc!2c0k* zFdi<75_q&1BTS2eD-VKoHZVxmlSsN~>S*#Z z=Shecdf>>wO(p#)d=e}JI$s0HQ`^N3qn4;KT(PKZl&O0I@3S@x*&*RW1f3;hk zzBMmS@204i$D7BOJl-_Cv>XjYy1vx9zRbGWF=UYoWF&XRYlo?^b0xVX&^jzHP1`?g zcB^6wbxL0TRMW{?J^7eBz*Vs<)=Ie+7hz2~U?eqgcB@J}c}Ng%=#kzgSR~8xWEzyI zR4tk-1m5w{l-)jxBeh#U?SdSyK>ex*Hm*Nx??X-&)nCD}F4jeRq8~!7jMB8d$(J`| zMPJSVz_EB>=I@MFTP8yavuz2gJ50d>)|q$N8h9v-()4_G zzS@(Mqe!Bt1Z?_IcGU61tix5{deSBDm|!W(Ic-->lMgA&EaDK~ z+|xBB%2v@3DrsxiMp zy*GIA=BJ0zj=#m4m(oRjJ&&8eD*aNiaru1c*IhA0{rwgYv#w@|MLHdnxv1BD%wboM zoM-A9*m7N(Qxvic#2ITaMwtHnIf5;B7+y8YrG;};kwo4YVooQ-Mo%_Nis7TkW2td# z%7C6*l$OJiR}QU>HXUr_$oVL7$ypr<;R^IWjG~lm()*=wxm_G>*e1i}8}C?Z2+&KG zMul^2E)20ZyAyYNbE%>iLfJDeiC;hz+2agSp^}+n$?W}7)Yb^e zS-DH)F|Ptt_y<`R(KtseJ~2tQ<>%VrD{i)~AIIvhAGjp3J@kN-uuO+q48;iGtAfQSB%g2Y6sJwD)$ z5>jd!XqaxB>%1m}_zd5YoVWfO^3rBxuOqG+fMZCjR%Ng;0cUeu9nP?)x~sfnd*Z;q zzI;%0j~Wd>lzEVH9_&JSzdG?m*Gz)HX?~PWZNmtA5(_Cr{u|5rfHF@!GGlF2Pv9%l zoKGv(s!S}JeX!wjD<+Z;MJ?+Yvy1ydsLUwC*EO(+_>Z#0*1)T%tu zl|?}5+=?y$>G{dVC@I`w2dzhnDj)P{v}J>cyi$fpxn##IVRGTq;LVE(uxQz`=fmD9 zI9i^~mB`}47QyxB0x`C5YiH*~tt)U#LFXv;_?F!nX{N;oZ{I>Xn=k1HYba250ehl; z?u!gfRi~j^4@T~SDl4Fm0>T_`e;ORBU4eQN{RSL7F$NhicURXdD!kE4Gd1{^$KX87 zlsP&>C0!tTyx|%s{7N?f=kO_dU5{K?WS1ouziRYuKGzSP2A}W9epd-^6Zm#FfyOwF z<8QDL)gkbI8q(}uy9nAlj>y--g%!0F)IG1gCd!d2y(823Jq1`_MxPo;(d5~(F&%X5 z2fp^g=>r~c;^GX`?8t+ocwiYY($CSoaDBsba0Bgdb7%;kaEa3cmIH&b zFaaSr^6$Q7kYG`c%n=!xaJX~>@8^Wbw=!s!ZL~%7=wzJmC>DGhDWi`uK*PxU+$5T& z^f!KoOfM57JKFFuDf}A)Ep1P+(UOH8q|(JJ&PcAU!J-f+RG*>e8*Te*%juW$FQ@rC z)GF05uH6^FpecVHER>HW{XH zTd_VDn+Wpun8;i`elb#DCkU7c(x<+7tW+Ta+M$@R{;5BucNFt^MJAHu8bz6`WYG_> zKeuhps`|#6(feXUsuu_IZBL`uC#m#Rj5g0S62tkm&EL#MfJmGZLHwpmMAm*Pf16?pF5^>6X#^hDS{r6Cr)U6rUEi^OF*R9Jt(sq_lJs;|h_7JIgf+Fb4 zy8lk~^)RMPpMaP+N?Ky1T%j#Iv?YQEp)@9;ONzm+P{g3UXgsb9%td4ZlBdgM=bF)L``?$<&VO{yupD$D@ixEC5ZO{|vXT1g(q9!X|vcRvP~HwH(olkQJDzP12Fy zZwH>ET2&q3(SDJrL~(sPuGg(57bo$)w_R;Emjy`gi-JljWf0ft_WijKH7+(ig1N2F z3L+XAU>fj+I=JyVzKKJ=E)l$^*f3`aUO64v*9Y>BrSF44B!C4wJ{qrZ`y|ajTe!Uh zQ(7TWV*4i(Nv4LyJYi7YDC(FGvQdwGX&8g4ZHoTS8bk@3VrpupW8AB8-c~|%f~TA| zJfFAS77&-BSIm2bMF*3Y5L>9_Eja1dDP4e;eWLHspxDPRr1#Y|R`olO!$`2&j7W~H zWb;}~fUzv-UfE4BydEW!qu!UhL1s3=YLTqrYQw$3q(-snXano0yi~3m6pSsC?z+p! zR18kR%Pr#!$vd2}YFijxyX{4c=xN(@FGdHp9%v#8(U|DKbowW|g`>B}RU3hUBP3sG z@QZVjDFaz~0s;y6*7u>tWyPE`AQx@gnMQ4r%j3|lg2@hDg6DWMs25Y<~Z2G0XgP$6k5~W zD;v(H)()*l?AH}ja=?L|GXq7*uC-<=aVB8%TW)U@Yb|7THf4c0vg&`^t~a}rFLq-f zi}|?ve;m3=?7U0WE@g*XmWDns>TGKQtr4uRi{PD0)ebV!3?2zb_R%hyP3H7nm>?52 z2)iBFS+6<;R>i3pmgn+}__@c`#! zieubA?&4d&Z__8p^A!+kJv_8&dI+?tE!^)iie5=@I7@z{bk8uIgxu#S}joZa@c`Yi%_At-y2v4!pB`08a0zfFp%9cg#Z zA-2w@`i(5FC0mI*xc1ckCV@!m(cNoN#B_a8nb$yyUOJ^gc;wHGi1&1<%DMTM@we%w z8&G$<8%Ix=-{D~?YIWxNd|7vi z&kfV{32AB>g8V)cB#y_f^NEU$fhwVnrSyqGlF!8yu~PIY4ZG^HIk8Z?_NpM#VkU!1 z5_7kMs0K!WT^$fOceb8Eq}*i(dOF$H?pdf@x+%xEk+jVF)#D#L5OQl*!E+-_w2vBmq7oq=ZguBGsR~$ zvTzjxMvuC_NB)Ay{2tmWVbf#=tlq51aAe_oxWf;BY@VfWd#7}lj%37rl@zT2XwSy{X1ssDewElD*B>8fZB$ZTM<^(B$5Fa3h!W%m->v#FpP zWShF)Q-moZusc_tFgspatr1iVd4V*-05Wrvkvqg~U&!R0;zZZ-PSi24I;ruggG*KF zs})hzb7{z$Y3Q4MPYN|X6E^g)@RfJJ)?Q0~gKsup!kS9BW8im|HQ)?pE)XWHK>bmg zw#jc~)JZyAW{nposU7QXx#ddDlDhxVS5=#1$yg(;a(n}yn@TIO+&^k4ceE)ruz)u~ zY(22}Vr`H`rqq8;lWMNaiL`~X{NMj>G-WMLh+1&w|Zh1fnG%8uQsQXdsv?9zA@GEEis<%9&m4T+{1=r{*7gXGNYS{GS z=1fvJIMFvGUT}b^l0A3S#l?3N68FAOafcLm^3i-~Z-)qZf#{KYM7*R_hzv_vo?c~> zxpaJ`3wJ3(K4opHt}cNEih`BH?T>KfD)5|%HrFlQ2cmBKXU(gbiRxe|EpLQH+hLUn zkij_oMaUjrIeBg_?tb|8%nB(@$CTn!pfH)FcvlhtmIOHfytHlgGdJ?jX>DeQR~gZZWD-@Ai$?}dv1B>DNZ2~x~w zZ?y>IcG^k-Y$qvkhYO1CI}sRL(G4dj{M21=|TA-A{Vgbx^|MQHy6S#hK{t71WhnX=0Ej*wwnaeJTjIW$&v zq#yhlPp|@9%@^~LfcZ%G+2da>pRODZleNV*sNuX1F`9}e`a9fITU4zQCL7|F zP10zeVs$Pc(Pw(BDXp)DwTPI#Q7M@ds;%ad+qp`~s5;I)KQ7#afU!E8h-Z`76U{%E zP;`8axv&p3-s)C6C1bmEu=s9Ly+877kPhqa(@?faT^`vhNv0cjFSU{eihgp)L{w5| zUd_T+3GU3tD&fMup zw1tx1LdsfUaA183p{4?;(%wn}092BNmxNbk>ME<19o#wD&dZ7lDQHrbp+bNFi-jDy z+@w_%Km{$I-+uq{SQG)8h_s=`b^*BJrg|d;!SI;&F zf(4da*q$PJSUUyyr!UN@eo~j_IKL?i@iP2uMY&E4_EgbY1L(^q2N_OAFquvVYb+m4 zp3J)@;U>1`vSQTNvfrl0?^3<>ky%`nLG{V=6`KZf%VkBhC;<&cg88k%{s$gL_-%rn z8+bYPO@bNeC#}1WQ9A_N_%u6^n7Ix8mEZi}s1IR6Q2H8rS%zTXe+iSNctdSDJfT1s z5t5N=Jc<=AyG(g_brNIJYpH3n)0yP3lkO(zvg%&O^ry2U?K~^dab=q&sn`O22z}7f zjq;7_jdQK8?~rloMWt`&z3hPA^rffFTd0z?AI_TY#`L!in(YgG4w~);_IC%q3`WQ& ztL2xI0!#Csq1%#Z-O&`^Vr4a7NP7Fn=+T~pNrnll^hLr&FNh^#huV88WKRmW$hXxK zM9XP(kqF1b3tGaxCkGQEwlYTM8}2RX@83;X^v*U_b8=5(o-2-ygvDL!!8sXYbTv3X zhE=|)u~8Gt(G8NX+%5XO5*`N?+!g1PuEYo=VvSA!2p1*(b@$V|=WFhw;`3j8{?7AX zV`+Sid;S}Un)lCl39CGuU2mmcoNqf^bST#uYk2j}dfz>CFRn1B@oSW6YHMz`k)fgX zjcsH#|La=(YrSjmmcV+Pool@s*R#9^77c>>*Pu-r(n`LOh}O5$7J5BxGV{@NuK25J zM?sdS8o1MLZxXwgZVRojdX!Mi+-(dUl3mXSj%y3dZIZ8GWs7}cyuL=OKPFJ6^M%NN z-p4jedR}5SIXrUxEsjtPj!+|Glnd-}02qm}&3fOXK@($)uh(+>l=NX9$3I*n*x@mQ z&e;Bf5$u0M3iD(9osKUMwa`6aLU8r&&^l|(*e;FyO@i=aQLmtfJp({0hPw46ovT1O zsN~4SR^;W0t-L18f@Aa{TrO_2%ri7@x!TY3zB|ol{5GF-a``i~Mz=!y(R5Hr(1}7@ zm`ismU*XDRelo+`D4kTazQk#4MN>4*ZceGwU7CWuXS=Ktz@!@V)0_=lK*^|Il>@cU z=|tX|Cu8tNt>C6wNRnZtA;vyN*BQdml-()tjwd?@2~c(p0BfxZotwbxt4QLXp@ECn z4oED8?!H1;IVau%4%j(1i9XB|&5Ggj&iy)|VfzBH>h_MB{RuzfoR+SSWRKw;%LhwI{{4O{>Q$Sgot*@L zsP{?O|0ZskZyru!0y?_G07E|IQ}48HtGc+?OsyTxVsHT~Im(OzRiBuEN2-%7%hFlCxSeMYFv&D0x`Pe&pjJ z(p;QnE{8K2kz4=XGs_k;-{2LjWGiLyuH%SUHa)bfK2!5B|6OTfYP**$e~MZZTLwxYI_DOkoSr+J)K=56^s5b7`DZO6O&T(SGlOt*6?3N1_WOU^1}dbvuHHJ6MEJ! zq-M8CXub=WX1*T+PgbT2Q0zbw+{gYP@ozI z+F$-*|A_RBk#UZD)w)&3t-@_LO`52faa}`|An1bnwE#wOAwp8e+O6|uu3>=q=AJU) zHe+(}uLi4hOLwh_0P7=x`(-?Ck`7^!3ua}op64cdeDI7$t}tn3Y&7-RPbSF&)VT;A z!V%hWT~Z85^EX`h)int|>QGhWW!W(aha$%gdC#As}lzi_K|Sl_D$A7$?benoqU!Qxq(+EEM~Uu zAmSK=k!TUI-% zSD?r2>kPu+r2l+-ZrUy9V#yCNj3GLGr!zC#!Eba~ zrYsQ4CD8XxkVkKARf}^mVrYEf`@jL_@0O2rGgs>I4>fy#kDHpaDOZKdV`m*Q;@#%0 znho~AX6ku9D1`nK;vT#lYb4t7Y9m4j7ef)O2y`rio7+Of9=jB1(c~0z))UZzWe#Mq zESoAApH5hpiK{hQ^AEdL#*5v1of{7X8A^k`2p8d`M z#EmpNRk$@M6{OnOtJG5H@b~5`P9Xk9Z#B0eTP93Hghv0kuJzmV72dqRzT^c2F{RUe zoM173ZUs5E4RT4hhl>%evX>&SyI1(S zfsknG1vHze6*vg3ql~+k&y*9m&J}GgQi6&xj7qXL2|p}SB`~&$KPhl<+x9YVbS7k2 zIfeHI9ev^A!Qr9GTNkJun5?i$wz&G3poLx(Ox^ZUTAnb!a;N)Bf4Jch3HH^~ z_;+w;>D|G_RaVdD>zUv^;M9a4!S*oO5fQnB{$`pJe^-{sX{dVXJK^>b%8A}5v9m>>&pGou*z5Yw@qQ* zOl_gNskK|j2ogH>B17!f0N5`r7jSZy*y7$^?Ws|V7$O}t*r}?k&eXBhN|l>E`Un8{ zM2sl~e%ZoKEef%fTRQ0yPtC2CXLAhR$eW?5N&l2&;Lg;&zYpBI+u#6wn`*nJi8--t zUBO)?J7uFCuDO&;9+=cg9J>lc-yR5z7sxm4`DP_Ge9z@LDLITzV`{uyfjNlq+ZVq% zR7F-P9#Qjq37N;})<>SD6ak$qo3FU<(I={7uvz*NxHx?t|BnyukrR`V5*yq>_1*U>=>geb}2uTIdsoboNj-2 zPAw8F`r4erB6Ci)_#JGrciY7OfJi%o-42IFQ-}>c!AmZtR!p886jxJXfMc zia~b4f)~>-O>J*?68m(lu2<5pKFTbPy>o!fmb2XE$m!9c_xDKR2e@)Lu0LUP)*o3+ z^4IG`A^W0AAxUfjpng&NbA|YqkM{tOHoH)L?^RsiHvC7|A~OF7!nM9_D$HQwu5X7N zVaaDhkfO+w`PK+gfswB+_H@)Lmk*qhCH-&-2Xi?^BT<1Ea`Banu-DWSRVjm!UuC;G#_8P<`C zV1y0u3D#PuMbVpi0lP`7RlU#IbTuP9CK*BzsoX=xG*)_c#b#}v*{R-*6JZE-pc8J@ z>H+~JtTi(4tIB@2WxNmM!!S1E9r7XI0W~wXU`;vR!B3AOX-r$`Z{kScu zMVI38?xDZ1QbsIQp(R(LIeq)0UwI)fvZp3VFhY(#sezWh1Ynq*-6j;u&Pt5_vu{kn zI>=%)kb6;(0xF(TcTnL1C9|@rUm&Ko@aZrETy-M=96q>Ur&2#20DW^TCawQ2bW3N)uT6H0uxm-x`-K5e%g)@mSce&gyEi>4Qt*eQ1g$M|s0qa3j1j)Vs_#^@PtjS#ZLS9Pj zAE4=O;NwE}nnQh%!Vw1~qHt&)m_!}Hqsp50b5^ODleT8K4!@ez_w`>7zWE4unXRx<4O?}bIYxQ{2s6slfvgssjRSk{k#@i= zt9@buZ)JEBe+h}O4%)ip!gcuN|I1umF`tUU6DlQk4%b)mh%cK!h6HvvQ}0Dsvtf7@ znT967r5CsUSQK=vfSkL>Gm`2_Ci=mOaO^^>vhRMNf!Q0rhLv4&aAsc=O8Tny6H|3C z73+b7O|*u0Eq2)TcGYh|<;lKmRvBpCIZr!$oECit^W&0{@vNN_@HmJLI!?IjkBTJO z4Di*~!CBZKs^pBBK6j85ZFLPxd^NM#Gj4i8Elzdl2||#XF5KnK?}`x0v#2axwtIW4 z&eJe@%r`{~0TA%zx#YDe#;o`8ll*oZn#iZ7EwNR9IPQTWu>Vy__xaTuHM#HaQO2)P zs)~(|{ZwpT#}!7WGMf5AY|jo*cZ4hdA21Q3ZVeLZ zWFiY8#iQ_8D zH(p4dM|H`PBXV21F}}4Mot(@xd)Ay$i`1k|Rtdlu6x>-XLq%K3n_sXo5^HF<26D(* z2amK386{Ye)_AEEw%;*@St`qvE(hGsVx&^ha8Ncf3iSMnPrd|p>1Q!gX=t}7?d1!% zCX?-fF5~N#_?y1_Z%KF_aN$!HOIr8;se$zvrQi98;f+hb@e#uwr)oc1C0V02;qr9K zG$~y5;>%Z04YS!jy;;vxvAFAt&g(W1s0+K#F(N=}aup(-QbEW+!#5!R5(LtYY<_2Z z*tAdcV029D7q_6VRZYk9D?rC#TRl^8?j5UzAd~-~h{rL$N&d|pCMX~Q+d9vX_2Gy5 z^9ZyLafAvt6|~gN#!_IL%v&kXw`*(#I*pCEEsMhFxg4zFNb)&B9U1*%Qf81b0lPE| zbd`HQ4=`y8lNIW8||e z))p-9#R$DL&XwcB#6`e;@zuK}yN(zp7`KqU_`SOo`*=PiIB>s|UcaD9X^YrbqCl@h zGQAv(W_Jg-0#i5I!_4&3;QG@pmCntU=rTpR4q6oBbb&WB0E=uk?M{fq(Vg(_p_17= zo!9jtGkm&?+hMMr${JkbayfR@wKXVJN~bpvPk>sBfVM0F%YUMwN&mKX{})qPw^Q#v z;4o9CACFy$JWKa+k)OUnZ=)hmyf8!7w~mE{9h>4iJI+sKn2NL+FR!{j&#}qug(35% zBQ39+brY&WOOiCl_Nz|)@w>4(R(}3eoc@(T2lWgT!-4E4h1-Q38a}v5NjKLQwHc6t zq#M^#NkWYuvOGO>%h^E{3?p+uUCCc9s@;c^bq*k+?#B1b4jD0iwDiX~ICKB+cpN(a zL;nMYPdDOcSH0p@?eXs)aacXSS24qP#Hq%5 zpAFv>bo3OEo({_ry-Z#;M{l(p1>A-34%BPg>a17nHD9l4I_)0HCaVLQTi-}}6{JSAGzh2Pnhgrz79WwRA zFWLR9Z;mZ3-ZQQrvm#ox0#h5;YVFB*9iLBh5WgH-AP*oHek;c;tP0z?423tp_K2+(=p*u^9JB($x~oK2waX~<41e0?z0BnQP}7QuAq##Sz`??;KnJ(jMY zl9pulIW0{5oGbk60mENEeT5_UzAR;~p2MYI^VYuA4n0#tgAKFByj0S}S}mxTG~SIxGPOppv0n-S zWtE|qcBldIDzQ1IjWJ(9&;BLQ&4z6^b}D%Ekf}P%?oIaXJd%y6sCvKfy?^kxPzE=6D%AM z<0SqP5)#%ye8Cf^940vE-AM z3}ynfa^`}TzV8QpPtsSTc2FGB@zH~{0|$R5Jx-=4vBBwiUcxYky+30}j3JIJA&wl# z!WinLb4M?PIzz%6BPJf3P`s{tX!HMvDJSO_U+%(ygBw3O@di7v(c}4{qsTU{)s~A2 z3M&B9eOXRWX}F#_hML*6U(Ug`Z?0Zb+X1Fh36eC-wr+Gqzn{DfXO^~Uh2U!)tF~_Y ziy)O@BfD4Y90U@q@gof;ta}H&VqVUOwZ@mTdSz%h%LCflCE#_(Lmz3=1~(lV5}U`A z3H7M-HKpilPtb*IUAWi1Qmh#tajEr^@D_}_p;KVO<8($lM>Doe9mMf<#$_fK8lUgp z(rL<}_t&>?bO^TnR9kN_R^P=tZ=UaBTRa;WS$=J>m@8mjOfAYShe)dlh3$eO;S$zh z*g}{gDJR(*2qfpPP5ZhftJOJsMhG`C-P}DC=M4J-Zsyw_bUoWeP<@DEnT~9vZ zZmO9{BYnNVKH(Xm%U^q2Bv`}W`HZ3q!xqVLjK73KIPdgm=e?!h?T{v^6rYnBjvD*v zcll&@5=+3z4jSzlXH4i6tK$D?rfPOUNg3HSCMQO&yjDf1obJ#^Py~RX;{dks*syW-GqHK;C^t7FsP<>2F zo3w?dyr`eFiP`KDti6|++b5eR^fBg-Ns;XqG3x>PI{K#rjoyBjegUVBO!Vtj% zjruSeLGAH2x-!>7ouid?@UNwWk8p#gT3l1A9XD&AJddxxIy-i@2aZuVe!o4rNMBM! zCavtfUnpn%+A75{Nx|^f@b-&*yh4d}nv;MuJ(BuFrA6CKUDQ7Ym4Xe`N{OPWE!{i} z+U5&}o*bs1%qV(oAyPg3YT$;&O#PL_OUrP>78LjvGQbRWG;Kajax};o`pOAiC&Q&y0jWu#O z2TgtDC)J+=m$rdC(QAwS(J&kBxPg$7TAXqM{K~i|J>aj05GSw>AY&xfhvE|3Q{esh zptIiYAK_@M`3mW~{fdo}ugKvG*`il!nzM;l?g?$L8}i*l^{;4n&t&YDc-k$i@a{_J z65Tf(BY_2&T7!b=UwOrCRWpgc%c1gk@Y1Z_7pq%`ksOyBBh6_q(j4n=UA$Xy8Fdd; ze?2w8&xfB}$c_iM!S+t$^2E}^{}Avsok#w^{g_+-FOLouK=*<7#R1rV?tsrrWq#@# z#uPBl7qTUnTcgmNcaViC(4U94g!~F0cZ{A1kMO*5nEx~UKPO$^eq)dCv^UPA?5dZb zV|dM=wfT#&USOuIFxL6}Q-r;rX)6EAqdR2iDW1>6*oyU*-ENbu1<=Kqvt*{M9yPbm z^$rr&`%t#VELM|N1EQ2Id5Y|qj%#n8@rS+J4|)`M;PGvSPsOH6lC{DOXp{b2!a10j zw!Jqvj(twD@Q!~ElmCQs!Vw()Z(VXZw^+CkvEO91;UDlza|r*;YHsaho$NVJJW?}6 z%xNWkrQDvsbHLf9oJILcUzpcZbb$$bEz$$@n zeY%DXV%avoI+3<+V*+Zd^`6OMp73?EU>B9It4_#ICs#Jf>}$no82bo%vw)@Xbz9c` z*m0Q5iJaII)aB)mekYwAUP@6sohBV|ta|9Y_I#(^DTD5nGN^sv-*+q{Ye{CKApAK`=i{M-`bDq*8aQ#wNqlFK z;oX~H;-oS~yBV7$E2b^e$^DCZ#jP)AkpB3?c#o&G-c=KD108pZVQMZ--xX)6-cP{7 zW1=j~50_3BDkX^4!%|(KJWI%p)z1p28I+i}D!vbD#^|dQ@Q8TtlT*}m(GWltR>v~E zRB0P8R?wZZZ6Qo+a63nBm7rCWSF2c2nynMWt3|%B)o9ym3Q8NqD$#D~uGD{8IwyUo z2Q8pgqR=YQr`8&+9)7U{!(GDBxl|*BL&revZu8;ny>>4S94P7>S9is$=OMy*M)hkj zaaw%uT2}s2|C+G=uMd`)T@6tMM3uNqBQ+>A(@wTq;yI?R<6?*bu4%~>ZjCrFPkj#0 zxwTt7eagzawO@s*n#!@m1aL-=l8@>mp8z zlfTX^P5TO_cKQBVDB(^2*8F`m0M93sEa2<#XxPT8CgWGw`=+~^p$q-Vcz%vzU1&rj^PSwU0cg+V$Gc)fQL8=S)vyL6AU^6b=(AFXED0&Xs+Ei^pYUNga)r}+#IQ2zi^im`$8BVO??XMZRX{*0RLx)5y{r=q$ z5Xlu>S{4bAYHTQ(SS^d_VV-mrCne$Q*5|kAkS#jVW;H zVX#U4FzgqsTZr|vtM_Z;$hGpP%CY8|-qJM97FUVvmuWqoWCe}X#d-PFe9t(>uFgQ;}-$h6OB_v92a zn86j1LkbQt?+lCZYGX}%#h`prYkJqKsCu*n;?Ya^=|qG3-o&blQnT^H{)u0K(04*K zDV&Nmquv<8>LqMNNktfoR_Yyr_I{(dq2+nW8_SA)or9%z+>cE-dgOLpvatj&zQ&9F zM+L-VMUwZp=-)Bzx>U23|7O6E;6@cUg638fYAVU(be12s*#LlF&Y)fJ~N08f8nv z;J<0T|G6!;c56lj2l=|2=-I^7O8T3B-CUM*BT=xj>w8@w$2KL9-retqd71pl~f|?i9&4$~abgq(fMkVLoYfrO`y&x>wqCuh_M;nFXbv%|?v_ zbP20y4zs+XEUFl9yIkrcS{_D^{2<0Dnb?RiA+M;YGR=3v23amr47kVSgD$~LLg+6z zt;|zGz6)%}^`4Ua4hl9>W}xecvqO-?t<*2bVj{nLh8q{wQ+$KbWHtP^FWWA*0UB{k z$*j_c-X&tcxVNE+T}%bJ{gJ+^_CT+P=Hmif4G-u-lUKUHyrrg`BL0LD}4 zj*Xi>;C{oJ`Cbh&4NMXpvVXLpHari=J4iIPqpl5nQlZt<^+iqXXKZwUqh63s$nM=-l*~XZYLP9pe<-D zq!(;1h@tNCb~uQ_x=6XTUoraV7Q^703Fs7(L5CM?G;vU#`ukm#QAkowcX+A;F0g4&_ zBG2W1gO8eRsGw6yx(rb|Rl07KSt|c=#dR(E9Hg`Y+J3<;F13kB54LP%I4yEu6EA=8 zfgH2^_>$LFrx3tvJDwM+5K&v0{;&-JDr5*xnwwS+U< zUWjl^e|gACNgQy9P@Iv@^(Q%tMCLY0SF!>9=u;U?fc}VsoJ*okURh&qbU`d+O|HmDn9C$ecl1Kl5)23Y)0DiYE;(7I45ssGK!u zva8MxT;-e47IBsgm4O#g^I25|f!qt+x2dx`g(_2Nn91D3u9E*`%Te4KzB4+BTD~(% ztMy+QB@(OSbTwS{UmK*VXIIARp2xg_*>{P=-`<;aiNwpT1h`f0h9qfai(T)X%R6B1 z4@%uK04O3 z*;sOz-_mQ{C8hm{O8!)iEFM=mIrPxMFd*stvu{%=EiqvW1zdOkUHgrGgR!~)3- zYIsINu>&Vy^s?^>KQd04ZX971Zp>%_Ei0A=`weNma_)1~HcRAUT|Sd=N-@z!Cu8tN ztd;5Ed>ij8By&fyEJQfJ9JHusHL9{P8{%CHuxiTgm~r#d^HUM zHdrbz=lTP4L5a+0N5otHZi4Nq;yx5T*n|B8pRPGK#G+h~& zWQeFldyuU0ZIEJbsa9+>`iDOG-GOT-VoT3hA$jV)V)M)A{I4j(&74a4}CZuN-kfqc8`N!eNO2r`ZW@-prx1!Zd?#fulN7(kh*PmRZ?clp2=?u zw={+4XPj42g-CIsAR0PX5*t8)+S+_I%v)b{0_zsAObQBMGi!(|~2GC^_ zvH4?JTfxL})5(H=+*Nh3aU5cAQV&Zv=!-*>w_3v>R@z2>?r+z%=KZk~euLZfvBiDz z0=EIhziNtG`$HRemKw!j&m?dB{5ZGmj?|qD(B;&=04q`EhuWtXyI4{s%a(2vI&pin za8{(S@UaoYD;HTXnij!ql;If$*=1!R-RE~VB-Qs5v4tA9kQ%7=OG~h@Q8O&ERh6K% z7||G)G8V>^PRVQ0Qmnn?R#@KU<0=YQjDlDeg@iK}ZEZ9j$di0O&`{8zc-+s%%UtQL ztGt+1d7sQX38drN3Zw+>0av}G(x4o+0Xs_ooo$(S;4|3%f;uIUZ?N-}49k)ET1R?UUAS;9#LN0@hKIa3jC4vSJGvcyWvGl^5QgRX7Q>h^750rVtcf;3ow= zLzpga#7;#0n2@M$t;*iU9H0Epf@w_>uCtxAjYn8y#Me$ak*NgF#!}99(sdmHlMr;| z>O}PDq*m@Vz!H2^5y%F|@w9u^AgI6{g3z!|04pnThB$_bx05c@Xc&n#wcf#c&%S%o zPyKR*tj8TnrtLu*`vF8g&dbNCjvuWQ`~&v>qp?i-C6M)3#BW7|;^l>X1W+icJZ~{% z@&WYj%qhVnIVV3^@*(N4_3rI*jBJ*y2qaus#xGWOM^<&`R$$VvSI0Ocogm(0X4b~0 zLF0xRbFBQa3A3?qyf7M=UZU<|LzMS?(+<1d@x^XVnj=7PaexZDZ#1>)&kOnsdp<$5 z68UCeq%+w{q5T4Q7FWWni&+h>cjEz`K+$RuJ9Gl7)IdTUr<3OK;x#i4Q$kgmyd!Xc zGvotxE(3G}eNth*Al`BqD*4j=rq{Yzze1+oxe_;1>R$#Y=_hbQvKQubfWlB{AnD|)NaMkBn5zqgk1 zgZW?^T_C1?V%I?)jn26Zj#jf~I@N z;lHH)$-EZC@y9ifN&k*`nMNL}$z#^1;c~2nm{c8t-)4YyerJtq%gd?mqJkr~Uc@Ik z+Sv1KLxQDOv5R^?Sf87AwpC2sEBs+dmuYP<>5K(FJ}1`_xD}}YBQc>S6F4bX>5l(! z6umoZ!%7c+T${CangNdn0Ot$g1E@5CJXNC z=VN+R>~3mE>&xfXauVOJ1{7d!>@ub&b#BpYf-KqDjg=C%OKrvnmNVC)5#fwAv6~b$ z*_9+A>CKC1jW%-HYn67cSdcMi;RH0RxCVp$gXyre>u{s1>kIRD+*s<5nP0^&`|XcX zRrlL}Q=@(Mv`VtT;BW?}+PieOR1{aZ^p1NN8{2W4e{6U_(b`ThJE5w@wFI&w?4-3Q z(fD@-ojB?zw)xuNDkEmCVI)zzr4b{0q97F76b>mtW>SCo(TXv-#H-~sjf{;t;yG_? zElCP-v;UL`aEupv`7E5S?594NUZAKJ0H;wAN8qE{8`3F?E&)I8@;}e^ z-GBaTd`FFVYkyNW%{9ABZzbS9r^blz86QtMU5vxloO492C|f81g*@1`q#a+a;Fh$k zKlt%MJKk>=8^r|iiM&ov7({rm-YS~gnMM}u^;cyD@M4q~C9nUNiTK=yiS?b&_IRG| zL^mB{1>Pqc5x)zM%6OiRB0|>P7bzCI{Jn^^rmYI4 z1xw)?#5U{iy`xFV{`zJ}7(xzWq*w^13M&RGL<-y{3g#0bKE%jKkU}&nK!J>m5QLeL zf;D4g7DkboEf1Qk{_HD$N1-=)i2Efg@QO#grXzrM`O zkRmBo?bmN_b>8!Q?el!z?en|64)%N9??=5I{1orP?))9j-1^BQjkKtwOP8GULb5U1 zDk!t#3tE;tx*MO=CTAZc&{*E%!4L5}!Xf$iB zQYGc+Dy8VcfwgTM=o=fqWv7uVvjhnltBDyR8g7ldL!)kHd=nBXd#QRvH&XrB8WTle zT9$L|mY2Es(ayqemk)Z}%B$MzDA`tO=|jJbSt-^|njd9;MnD->OSFcA$3a9;c<41~ zxz-7~e3r&n?3qCN+lgW?L=Nc7+@bnUCJHpvfmL|lO*EEn8+AO$KAy=z^xCRNcT#Ma zso2(g)snOXpcXN^s;Zod28Zb0HdV0nR6P>8{QRg>y}A@!D@`fB40)sGlnSm&HGY;w zVMLa5^f;ejkr&BtDs-#lJ`4C0ZI&8nUgHHTQp!y}P@qXkdk0FlKAKgx1eI;9^%zH8 z4C!r(Sk7uz*tpy=lH8gNHo+D5RI%fxLQ6i^evFgAqykGc%he;rm1b^$o;)N(GK~!p z?$Z5|Cxc*GT`7-F1X?dE3}p7n>dDc7h~w|8hTRy6I1<-RxbSLe@o;zdDhB=&dRzSi z?|hfP%--TaY+0oEi5(mfHgIl`{U+)Rj*b#v&ldd9wYBkOHRIss!1vvgWhpl2B z3v<~;1YL(`aWwkc7^d-qX}wmjYSSZ>E^Mt!chwURlX_NeT6L-!RtReD(#@YR%tbei zr`GpjyS=X&yjcGH1wy)3h8_!*J`3SP!DAD_V>+`lRyusg@FY0s)>(hENt5&=NVrUO zCW)U&v=m!A1C&*xd+&bqX%uNh1F?*p3(;t09~OpC-wazdw@hqL4vUbNq1m$0Ly^1G zzh_cS48DP+RU1g|(xmE*q;w>_dXFH>$EhFValCUVmzaw24WRw2=PyyGkY(yj7yH88 zTk_*A!b#jW)tlz&^^_$a777I(=U7&2J0g)>^k^T)ljXjd{d#jgnRQPq-@k9YC4sQ2 z*7xaB5+AXKeDC^B^*$WT5I3?)ILVPGy_1o@@-xRoXg*)C-Ef6FQWT)%x3WfF>cx8P zdV|QQ2_|O0eo`OE@om&VNB>-#1m;KkA54`OEay`AbX!uW^Ub8nP6Tr-|sQ6TP8G-$a@H-YH=^V)Zh*GSVPf(N%&GJ}m zF(vqQcW~bkx|O6+d*YW)ddvMe1&8d-p8^o$aN2J#{cx< zntRGFahnB8l1xEHd>J!9RwVU^Cv_XO4Ahj@{;j_in*IY-a`B$VOrbQ!a0mLITS%d} zhwB-*Js+c!C=3yn=k>NXt1OOCdDss(vCutyjG2h*`1Q0rlP0~1i5l{T5ceqvm${2M zMbm;P_o9VP-8y~Bf|IR7LKWC)ktUoep%AiYSQISY<_yTlU0J~E`Q{;1`i-%Mi!k@M zza3V=>@;~HRkUF2Lv=%}eb_&!9$`!lq^9ory{i=p_PxT8Tk(|%C=saj&iouZI)`!0 z-|wa#g%!Hgz58AK2}O(1CDa%9Iqaj?@{ zU$*Cwb2O1~zt$3*4c^~}C4t`3b2O{hQ@qD^InlY6Nx^JXje&HMJQ1JEa8*-gjY zSJjsZg$Q0nE*-_gTC?)2(en)ITf--ymAjk|13m348Dx5iOPW}__m5O0~ z%wwr>SMLiPVJXFLxqEJ0xGglaX`^XjBB*JS)TY=eZ21@b%!e-nA>v5G$U%W%P30m{ z;^vJ9Uqygj&mtc|{0q0!jY^i)R^Og-UY87^+J+t^qpv=F_-8CA82|x1JU&5nB}x%bBzTHbJ+4z-0b?OTb%F9 zx{7Vtv~enn3eR9Ne5#`LTV<6OxR%j{qGMRrO=6zKkL-6FZzkS6pSXtgM+q;j++V+8 zRY^k+o5m&E{3of+6t~Vx_&ra?*I>O*-s!op(#iZake+<~riQ1%7jR<4Zf_SFOM9y) z%ZKuOzmui>oJGw?kZ4AZJaYd+d19=kjk%kj5XmSSInB{Sd5j`RJij-qmNYX`d5E5J zT9+QYm2e@@|6dTAFxtoal|zl<92kLG8_4nvAEKk{8aS`pD9nw+w39L^aet^Bo*F_# zcD&LmrF6nk=DhNxcH&PUiO}+pMGv@oq(k=>YSUS+1YDswtxoYKznGUwYmm|cG<{sH zGBeyVa|KVRm$8sER{ye9%wOEIp5GPEDfx)F8VTN2+ebcGrEvw62w!x9WFO?w+`?!) zh+^1Jiw<$tG49PUJCQKs@{~TzLkiEdMFH*{czFhlWvfK0BUx5!HD-K#Hk+)VG(!?v zzmc4S5TR=yNY8JF!LT0!;gmwHs-_j5@t_-jU$+hI%m{^h95*f@TOMJU$uJt}VGQ z<`?`5>V4A_&I(dILXz*nDK7PVLXf#LOb-d&ZMxJ?y*edFL zQ^)t|6eZ$*Tk~9lqo$M6(ZHS`6nBGa;+epBRp^p5edjZ#l6Z{u!Yl6SL^_;T9q z=RCvqz`BOlYBuM(euK~2PVu19sd&aW^$GE;t2ha3agaAZwQ6Mr%afo!7lvm*ey@ju z=nc?x1W!{QFBz2tz0)y3uQDV1$ISRWX1h zYnr`t!9iJ?5T3J(YP>R{NpPQud-nx58#GRDStu#4J@Myl=k&RK0jF)|igw(&r)}rw za{2>K+szd1xpPk2nT|_c=Lyu0AkN$Fl{d%1iiIp6uIN(nI%pA4e_!+!uA`BNSFT*3 zjE9D9+9}*8-jAvI3xOt=-%K9|C^QffReKt3-ncxww&SQ-#6iHd zEIBW;b~!TVG%Y+5>I8z4f$9jJ-YC0oN{MqLc2+kJ62$vO%Ix^HzGmZu_YPb*W~Y8O zM5BHyTD^H<4Kn@(GP<7#=#&yLDB}@dyQORjRWe>>p`WGg6eV%^&(8Y1(t7A`8f3f? zUwhbyEz0)7V~s}Sxum6?MaqL~f6jX+(l!Z-^E?3WO=qk-HhqtCw;FEVJ^=v4MH@vb zZJR~MfgsI$_Sut40pQiks!QR!fhY$@9GBI*E^KEOl%OV6dIgBM1TwB(K`8mc)Mu0o z9RU)8TxO3Nhj6Z^&NkrgdeXeiI1JBa#9QKo!L!cazx&+@U zn`GzEbH76-cRlG5CqChIrmsk04y(c>ZZ{uB_=w zD3`2yp+>=lXTWT_uAF7T8$B8>J(Fh1Xip+oQZZLC@76|J3JkzO9OL*C{lX*{5+oQC za44(Vnl_O)2?d?H6@>&)5)zNC&vd4Zz#w!qaEl3wx#g_H4|Z-Cg32c*{uULJ__y)% zS`v!CxL4xI6Z#>gb_a!AIAbe~Ew`fuw?I>Aw^-y48e}kOnTikScbMXTcJsk4plJup zt2$obsOkO~%08rjRZ_?g>bBhg{^Kcn5&g$f;fMFADXASSo;bAsM2n9XB22DSG|1*6 zibFat%+Q()2#(@Mzz!@9$sg+0k{^RWS$@H^Vq6O%)UFIgeRW~Z`AhcG^!|xLMT&3O3Y&8^0wAAUH5Ulu z#r@m0%gML*!R!1W{RU-8ntIvuM~F4SDpJLqxGC@ncW3i-UVY7!2;JH1Bdq-VsXUi$ zA2s51`<8aXM<|LkQ;%t@7aW)I{dTo8wS2F|^G%)!3NCYENlx&TrfI`sa(0-fCuxdu zc9^FpX^L`ilFnbn#r%_k*S4585(8TD;gq?0+Z0B8!;_19?iRtw-mLYgS0Ln2}4YD|KB* z+%k6^xnzQXn1r!>LR&|WbCi%};a=J_?3vY{m}lkUX7BG5XsW%Ly!-4|D4SQ<8xJ-u z0~2@cmcbf2uA$s2->=8y8bx;btwXgfVx?M{Dv#syx&uxB<+n3J8=0gX7uKJm=Y?+} zfhx$!!sH_2tkIbLBfB2_MA; zPt5b>J^jHuR!#6C!mrN0~yj-V7J;DvCQ+osNE zX4|J%w(_1C+NJ)>VE84#++qTrFEn0EviXeDe{g5oQ@D${1af^#!;z5f=MA8rzzF|A z&lcya>JO!*m;Pqm0cQ0J@lCM9`x@Ozv@-SW@u1(EH|NcukyHBGDM+Xr`{}g8#ZTyJ zzf{#<)sZD`nY-ST&O3Lrtcyiv+_H=*ZH^u&OAE@uSCOje}0D``FE(2)o zywc^;{uqh$5%n@Gh^uA84G{+k-J-vSin(#>>^M#w*^lbVzOFJyzBJ`W8Y54sTMkJ@ z$q^-WI=k|d%tp9RHGXna8sG9>hz<|%979fi!E|h#KUcQQswb@fV<$RsA$yR?#^j@D zE2&sgnMz-_9C$Kw-eQ{6K2qLQ7d@SngHprNt8M9SeS`l6>C0kX z@U?XwN(qoWXy1OXLH@h!+Fq_Nwf-c7t?f+MJ?zkvxt2E{I$DncLmt{he|x6gIR5tS zvCVS&nC9_=a)ryekNm3Nzx%xqntGRmuP(kljfDmvyAe7~kk6A2<=G|&aT2Tfh=SAp z*rxH;{b3RMzX{=?Ci5Z5g-JAV;TF~q;=~RI9EO5jcBvKq!*0lKP@aale53|R?heU2 zmY9VJc;2xywqsPUZHYvj_)Vjw{1*SE?D6N{&=r-;dXK5eg={+N@GYH*Wx@HiCc&81 zpk?BX5BdW|Ze#Zy`6B%|BGBs-aCx>xbT(Vx^*E|NOZ+Xy8}}P%JR~Al>dA)R8PSeS z@?T^|c5|BvTiz35pLf+w-UBSV;%ec{t@u!ojd#ymtup=o5{Ku-*@gn)Xvi{|`O#AJ z9y_Pn?Wx=&Gm zYg1)8S;ry#e2B$DWyf4RU0I^ilp)%(<9nYI#!f7x=qcLsIYs3-H4{M==tXpzXy?Q! z1Vt8M61p&GEiM#2 z6xT0p;gnhqus{isOFHnHBk?>lub**BsG2E`VD>QFfooUecxQ;z7-jK~WRkh~;@hVU zlHwEno_`FQ5;e?eW-38{m!gFh=N%kGmo+0!xl|sp_=OknBkqZ}T5UJA-IF<)$r6a= z(L6LqDkw1=m>MIOncEXD#@EoZtfvgPNiR)>7xUt2i=5LLLyGpAIODKgtnS-l8CGm- z4HxiuI5Ig!EgTQVvRcS6!=&loWAFiXk5F$E9UryAIIsa9FvH+S_l2C16P-$egPeZ81k zL{+a>)SPDJ9k7A1256cxz10tLX%82;{^0qy&p#htV~YuL)R6i`!QB2dB#9Nqm0F-d zVU5UI*Rr^=mQ%OIs-vuTwGrgZCFLiIc7G*a6fbdJ0Jw@_94-9jAN-AS5V+~h0ZzPV zBCK}G_LDp%+R$Y?{*dQskjwNgF;G5ZK0$z>HCc$dyL=^6_5#6dxBYfq!K#URexInR zULDNmlISzha#>^J%dyu&ia_rGlSLh|*EW;hF+0}{OcHWHZbgHzGf;mk$Nf3SSblj| zaId=x#tXAybe86%U@&#XLL%q+nvSo#;{)7)3(l_F>4#>={afd-03x$}w(X1n@{6kg z!}Cu`uEX!YJO(qd=UC{zITzU`r+Y&u?MjkhLP2o0d7H2sYa8Qr`*0Zk@l=T5jB)nK zE%Qbt{n0I`_1CR>ja3#2N+gf^Wkb-^Ev;&L~+_SLq8J&w*Z`#07C;ohg`S=Q?p<6oM;nTm9AHMzWK zd`sZO#^1){5}T`Qn%#i82yyI0%hBJ%&ML(N;JCy?Y%j??J)&Ng;+xU&_5FBQ@bvLF z!^T0L2Npcyc`+$`-LKBfx9gkEYX-}W|1YBW{DYw+jPhej#y#NrsepFL?q3&P9@E7u zoj*|r?Pbegco?42?C>BsaJ1%uwak*;Vd}}F zi8%R>$CLI-pFJ+TTV!ox?#zn|f>wz%{1j}A^ij0AGn4aL&LRqG6P_B+=J`9>pmoRM zv)0c_k2$N7ewPZ5)=gn%+J1-5?4Uj{UC9?i_65I^lsV;iV)q_OSg!B){NHkoRsEe* zYZ>&HfYicY{{$R<6os_d_UiT9DYu##Xuar--7&4~#$_)3NV4I-wNTBw);>67_gKfq z_|`GMOe5;-W|C>eGV8UGX^3Y#PD0|q#&^O6BhZXrVxV-%`s~z>TyJZL&;6TrBN=~9 z>`MLJ@?ZC!*}vbpiZ49>YHC7j##g)5Ni;a2_nf(bbe-j+E*^pBe1O4c%odCQ&&wT{ z<;S$kCi{qXiN(v$|J|B>1RQ^vv#=E@`YA=pXxG*1poB-LW9fC0jCUR)nTPq_@AitD zVe+4O*6I`gbiWWir>u+DB(7KtJZu(xYZGn1eBA%A3A+5@H|pSNZ5POMNN(LSMSH=p z#(`gSR!UvcH`FWdWs2e;Hr8$ zN8ON6w5f^ojZ{0<8awkJP#f%D78t2^*G=kH7Gv`jdsukA6h$P!xuhkAN`D(1d8U?f^zK_%_0O&mi0JxnRSoFg?2~6^BhP;Ex#{Gv#M<&)&Jmbg zPoBF0&|Kej|6X?)hxVAg4R~32^8C?L^HOzc&SX9e;FJZ^4mdjrh2NV<*!;jniXwErm&DNvjbv ze;y;#ov3_W0-l?YS)60M&OY)PKfc(7)16L<=8ekcT1ToA#L+4-N7^|d z|34@8s3BL*c`)5tp<8Lu1Lf?E7v@ee&WLM z@X%GlAbU0~se~hb0syPOP*8~m7~gv_&wgkHxqi!2jXD-vmi#2eze25<_mR5IlKX4H~OizGtb87qh8Y~e7RNMBo_7XLPh@RoW_|xzUQj%J3 zn`5#c?zF7WBtdn)e!3q~-iTmBIqmK{jM?AyV*DLHy#wqudjPUeIIn9e$%-B3&3o7C zMD4X+wRF}QroUe7a-1R0R-@x@`&7T8;0Q%5x)&n@Yq{{6v+$$c8+_52SZvk?*Zjs; zj%NejAC~RYPmNLqd|u~=CHP5tS;DzfRvrIHdvENt-23F4dGSk@yi(&CI5t;y*$E`L zBHcc~*Su6;c3-yj9}k0xcsD~^iJB~nhn7Ip;F8s$#^1=|iR=`XRwJ8`)R>oi1zu_? zEg6>$^FOE+iX8W22kn=pxccn|L%))u#Q@jZ(yy)9Dg{TnK6bp+_FTYd^RxD|UQ6CN zcERa#YfPfe+m$Gp#ue`D$jG(9bouZPgYP{CEBh~Y>WD|I#&17L=9;3o#0O>SefN6g z_(L9;o>Kn=eH63c*}OH-7hJnXciOxEJ)T;_bF%u+nVn+t9iFa@V%OQs-XSqQF`Vn< zs}e4CIq`S;uG8D^JxsgOI=zf}U_7rqXf$Xe5&bCCg?bpd5$P6qeojiM$1rk$<5~iG zURCu?VN=Rjua2uT4`ZW|(EfwVe*2t6{Dltoc@`jC|2P7M$bD z>IKDQ@es8kc;lv5W>p~YN=aP(pT~tY4|wR?W|jsM!|dCmf=!@P+0XpX93PMH>D);0!or0=C>VZHg&!(K#vjUVpL_Z!BaHGE0QC`5 zm1tyyuMPHn_^VUkeZmfLzJ-A91tfob<{NGuFs0B%q-~xtJpH#{n|E%<*seG6$yiLm z*7CBek6g!Q;u8R6=X>7esccCm`$TcukvD(D{CgsW=erp-wB8Ch)?MxDwEX?X-yyaZ z^5H$BA|K{y`uB`Z6N0UDEf??oJSEV(GJ%X=-bL@Con0!m_Wj!Aa#%Rl2NHmp;{^}I zHC$I69}Oh6JNvy(7yebRw{p&V@Ueq-GcV!-#%A#$4^yhBv#lv@HKbvn?_0~|V9-!r zdN|k7j#qC%U>Ios>c#T;an${v5*S{WTM6f8&lkN@ZhL0!p!q&`{rSgHvCQ|%m!oWc z^SF~fM=&w@#Z)ZzcS?u=8?0KrdN{9yxl`T-l(E>C3CzmU&$wu&m?_6a&)g54>&OJZD&Q#4?ydb35C{E}RF{iOsd+VI zda$Qw{kI;EThPvU>_Mt6o?6jd=T2=FT)F+Py}EE|1Vwj;eN#*8<5Iz@X$?!GFMZB- zL+XKDzp`_e&VBm;CneXg=VC{-&siYGDR>=@$8ys6~J{afAx_@$) zgxkfx$X?&}Eh*qAgIMhCM*X_X9wpfFljIf^=0y4Sj9G@X zo2c5PMel%11Ml@8i#l)WdHYdjKQQR7x?6^>(PQ^GLUjbbxbwN9?)i+uu&xg}LQ#j- zmo8Nt{4iPh^~n8s8}74}Ga&uVah}u4{-oTk$qmaB0UZ~SR64Ph={$o^6*{Q{QjRI> zC(2hYVuiDzFCG*=ggi7Xo#S=64^2JGd_Q8jGhOed1Q*bq7-#f9EJ5Wp4pu!+ciyBI8WGSZ)jI$40Ho!i5Q`s|9$p_XEf|<_;X9iTa~@8& z(RutiuX;wozZ)~;@H%g*h5pm|F|-MLt=```*09cKX1|9H=!<_77Wwfw>Dw-Af74^$ zSS&}|yIY?GCl4p;Q$O5fXIR}bH`vN7LV=R0U9mOA~dQ`r?@BmkbsJ$B#JSS^uTp!JIdexLc z=n#TU`mhl*K?wOe*@1wQP?OXVB`VqG57mKbNqIi(+9av>L~H2nU%tl{|6a#5a@@*z zPU&By_MK?m{BmW2Vt)L=EG5-3Kd2gKc+A$g%&ZK@Rfvd31=Z`7??xQv#~SRUVd=dm%W(R zNYqNs>XDVAm9~|>m5Eh(d1<+iRdsn?xu4}h=Vk}{RRc*WTPcI7o~hoc(h4i<*w5p! zS7YU3m1Ff|UE(@_H~t!r8~MHPYd&^7c0LyS(LjDerdX#^-?p;vNw3S72YLp2$$GVV zCvObiOuRYKH_)#&VZXg4Zea34GDzH4TdK6Ubh}LIOJ!?ih;8_fxLhG=pX-}1N7l52 zu5Z2@TP~b@^Q!Q>USpAu@s{Og!)U$<#9;S(W22AnCT`?a*>@H1$h4nw$)4O!v~!ay z+mmn0t2BljhdhUThhRe=hth^JhZ+aRGe?FN2ItfJ6@Mx=DfWYk_lhT+b056$eXV#) z`O8is#}~z0B}uD&es&?1Z>tig2c6ezeVXLc6$jII()u+8G`JHpL%^9u<90=}Zw2%x ziludHGHSlpZ0mbJh+E)_uWUNsd@T3xbQ}GOlBr2&T^0ja zXNr(nsKNuxYI$YeG-_=y;4m{}E%RWUGd)+yvmvSOOVSULW`qyF{Y)ck^WIUZd;+$KOs&Z>yMJZ>>_Z{b^fer(anz zZL(c@qFwu1;L%`amxEu`6SRI#zb594*WgZ59F)kaa(M1_$lqb>6dI zd7>&I$UO9Oj$pd$e6hfAzdV0aE~MO0E$^eh40a7+ce%#fqxaJS|Tam!NhuQ)>5<9 zTg=~$&=tBmy>r&KlnnNI6gLyEL}%0CzrDSu655v}+f?8BS2al*NpI7QhWX}hoLQcu z)v8*F4l82VKc8iWW_-iED!?edu27YE^^&Kj(_oyokw2(*LygU*86$7t(}LD~H~?L`|JFc!;m`xg*evilD(I)6TsIG_UM zl27#3{?|p9i0r<+s;z@LuLU)fUB(l^w?C&iGGRHOB}!0*^@41euom@ku>`4evr zS{2E_rCsK!OLLtU{u2eWfi^pE;{!PUW4HK13V#Tv!+$6{r;K9E=$~t!ry_VLrMDjl zk-XU0gxgKq8yVvHl(HUR%)<1)o-@7J&W@2ywd%Sn5kj9HRzl$A#S6UUE!LI=Hgd~- zkM3xn2y0@fHqZ{6p$}$$k5O-rc~J1`e{gJQU4V<-qh4cOw+r?SIB#WB$8dHYi$R9@ zGuvA_?#s2mW)z>k7(i>-x?O%R;NB;)sc{ZP>x&i(%s#P;olZI1d&bI)1-r*#8=huSCU zU&w_auphvXE2VtE8~wd89Y?A({OC=&8??^NCHD;2SURcB)5q^5zF<8(vJwBR`&X^EKk4Y-(DwNfR^|Ul4l~IS zaOQBo652z)Yf96|#Soal=1z!wNO-2*aM8&*KhqmkBLJBitWg zXsq)&=P|l6?_ceh<+uDV!|aDJ=0Eo8U-AB5L8ofuU4j2va4K(v&V~gud+F|;n`6gF zMws{guZ8Ii-BJ4gM7l|%{J(;x>T6Z2CKgE%!4DL1k#)b~{>v_#)I4h2sr&2q9N znM^jaMvt{I6MJtZZ(;x$b9o4;zsacnbTE4;5lzXAp zU&9{Xdi_N8bG5PI6z16`$SI`I5C48RdVG zI>%sbqu$RJB}no^-@k6JKEomlQ*7`=zLa7z)|=9nDz;Pg?Ft5)i>Ye;=IHgUve>d` zPuA15Nn}4S_DriMrFA{zpKZiI%%|Ny3t}&tjGbJ5Rck?0t?r&#z3A?VN#%leeKZ$) z^TKssr{X??J=3p$%r!Adm#HzrscZUrFMZ({Rj>%Zhnl*pCtJ@sF&i~^`PWu5aPm3j>e<&(mxW^;;gXJTq z-}Q7JId_>$>n{of;F;<%)4*4l>rv+3@S`54EOET*C0 zqf)FbZPjn^KCz!6HF{0XJV&yQnJbQV2WZ`A zC3YH@wlC}cTp?+dCoibx|6hlLpWL{_ZaQNiT)bjBFG&8}G=A$-kT=ZhQ|V>v z?*FrH{u?Kz^bW{&P54P*;)=QgQE}UH30% zwW-u=lFpGo|BqbztF+qRxUTNdTibS*RA0I9>LHElku0PC38^;Ad?N5yUx)Fe(Y|2a zmEL&eavJw+NtX|IK3)_T+8OqzsPv~BAB<1$0kNv`!6j~K=HYk{)Mx|rBqt(32=^ry7y5;v(!SCq8;IwTpnZ;CbcwcOpS=vrIt0A1g=2&Zh!9plh=YUAx=B zTL%NgDnk{IAz-K_9tKw$9_4R1h;t{gv-BSl@?h~8^0n}z3BaI>pX{-3bE#i#l{px< z?O)!8*P@P%ehHZl-_eh4?m!aefzlzeV(=aBkX_$NUVNu_aCv@!?BN|ma=YIl_^cW` zi-!W79cD`URZMG-WmS%9IKUx>ms_C2Esb!Q``e%^AOfNDFs!(0x+9e$@Jd^M{#rQ6@M(O*M(Lv1-3@(zkTT?Y70AatbBaG9@W^&czI!14xf# zqRKySu<%#&ByaHQRd?@q(lh)@js9&fK(K(^MM>d@=Xv-1n z)mph@4lSCz3}=O^7M}2~iJ9ywIy7G=@u5yE-+HA!R=SS}esLNB3TD(SeTQvCLE3%* z3WUetbPYDi%{M5L=Gz>PO?_(G5xqP4)G-?1&;T>Cpq zO@7N&J%|vh|DqALA`gMSu55(vuYr0FN{c{Gx*^dZkD0l0Y>|mMl*}(WJ}B7a7$sFX zdkER!6fTD@*Tq<49fJeyglD30VsU1b3klvkY04d(TVe>G^py#d0#MLL(TP~Wx}R|` zf0V5vJks{gnx0b@VP2VFn87_4gHbgp!R#Cu0RGf~J!< zs~{0tdRwaq=E42qzzPZ{=GlmwbkftD8d>93)QCkGAP^=O~S3bGJ9sB2^|i$ z13vk-H=Oox^SQ~k6vH4;BN}Iq$dE3uLj<7kTn)bW4t_)N*t{e9RSuv+l1dNsfVnwC zlwglQst4Ud;eRyDiSEV%RijUAD^4+p`%rwVhUZ7zVBaGjMZHetlH;V1`#O|R^vTl* zUPw!t$}dg=7i5e(ejkD1SNX0qT+OdiPz{U-#-TPHf}3ryx#;6a#2I8UO{Ii$Mf1xkPHPQ^t8e03!bfo0p< zP6tEo?~ZysIz%Z5n+qlHkaho_sgG-q@Pq#u@r6d+$tYwgIjJ1+3k2_TLM+$>7m6#d4tuwswBSH;_91N7mdX6)Kq=%U(lln2lo?dDSD@}NLR(PMiA@7t>} ziJ;);qVpWUMh4tJ7$c-poULUHjiWPv_QLQ)cfSYWyW&|F7N9Gq2l?~EuqjRHog0G3Mp3Kl-hF}GMjvb1kh3=si43RKL3)s5{+An*xep<&-vOsH zFNcGngq3V^k?7a{UVfzEoll3?w ze~mPiUe3MsxP8v!JVcdxFoWpGd+-G`ITu1h`=RL6yJFN1C$L`KUk4Ea3U~wQxUT$0 zbafEu7)|aIop`S@hd${+gsTV9L4xw{BX)9BI641yDrccj))Dj9!B04eD9GG(ux~V( z7lP(j!GgG!3?Y6NpG>QMZZfDmU`v8kJV;-P6|AzUj|jLbI`FeiDPd2u9T{a-GVc&+ z{pXXk#uCtvspsqu5bob``V|;;XLujJD!accWpSzFbR0Oyo#PI(9mZyaoFxNB#^4P= z>>SWPzY@;0M7`2+dJL2X`-Q?-htD)YA!CP4)Yvdpluy3XCVFt?vvs7v z6(B!?!f?jkEED<2KxIyJED5o5OR%1H`5|QAR0m&DjomndY`#IHTSqNZgLncmD}qHJ zy8=2>Z4y*pz|sKONj1;C1le9Q6IK7`^Se@l4tuwU0w2lZOVsWNF7YIr@? z<{Q~fQn|3Sz?2!A-uP{m7j^s~qY1bdM*T*pAz6a&I{Y&;roIPMhiBK20*xskVBTYD zzeUeIr@ha{6fK#fzwp5_EIp+bfUhAHa89QZ6Z1*s;8599d6t7)PWVtb`?;YH2Ms4t zo!U$HpnF=zO70NcMf}{1ie~W5g>PA>s&Eis<5l?aJ4?JQr12YvKO{NafuG3r>SdoD zhwy-@+>$T@XHt-)X4xa~pPo_3=8F%_%@&{__*Tq~QLd5GAv2CZRYY`z{p8L|3GJhB z(nvU77K}y%H(Bu40e@17ers68xzi+yhXaBQ604X<33G^Z*mOk@Xm7Z(sqLuf2mJ{$ z$KjVAgW4%WoJjF)O$_`46#K8WxK1_=Ecq+A0`)D7(&6e*a33Lu3F?=?)2^Xr#UE6z4R=E0=SSJVnMH}EFz!@^r*WT6!b;_LmMofo!(F-3y zPrKXTg6Mtb#XQdCSYhg8lR4sW7c0Tv+}>j^@y}TnrIQ;02};E70_)fZI=?rZWKmn5 zYLg;&gbsqv`?nG`^*q0F~w2o)(VGUd44TZ0IwTm>DA%_EJ<|7 zs$f6gSJ1lI3!8v^1t8s>%jm+(>{Sh)VBm0$f$r}OM1Sy!8Z2`WM}hKG`%Mr1!O7Ew zEaVPV1Qg3HO&cES3h#67t|H_cUx1!y)JrO7N-MQtK7be^%?kehC)ib>qmd zJDkw)u5kQAUthIVA@FG^#WRLFWJO8JKS2A%$iN4w-K53Ed?Zel(h5B4YeO6kn=dVX zs}H!oa>{b*;7+iGA8`O}O%;}e6ZGtW*3pz0)F%7KIhr$~^8J3nQ7rI{>G>s^cnM!f zfJMd{paaERG2!um3J5nS~WQ1V0^w@%g=L$iNpW0Cm{;Jx>MKgRes;$7zGUxPkfd z_*)1G9AxoB+n8EJOTk}Skl<-G>&mwR0bN{M;U|e%)PxJm_sfbwo*ZS8`5@TsH*g(v z|CdF3&O@3ptY;*G{45n6Ik7K=ibM%{h-VC^^uPm%Ajms+^2k#lk5cv zWFYS&JV1U)kP{A}efBd36%q8p47?3^`YWTwB=u8}7gYj$&0uAR=R1D;I|RmxybI1( zh$D<9CbU+gH!v1VqWc`eY*JuT=sumr1Sckk4+2*YP=n;r2VXxiMPqb<=FlUI433pt zff|Jet^KH5vS7uhd{D#8cn*K_UkQE+h#+BY5W1_w6EB_`**F5$uk+2qW8V>dO&?_) z#UpB?9dy7OwG?-1DELo2d|sFOBb>tclO>RaaubMmSUh2uFZXOdYmYtykT${1)`vI= zY6S?k&i*69Z?mydzzWEkjI0C&tMX{E9%Dt%wndj3>SVN8${7@pzmAfV6Z_62b}&k)=xJ6IH=s6y%O7 zg?D)EJ9wsp^cFeX2zF*UxN?P>%~fmB?uQ=|b^kNMNHMc&gEvodHk@62Mwv#f)3s)Z z_VX)+jd?<5(^R6_>zVwf5|{Fy1M5K{B0OHK0+|f^699{*QCIk1btB8np8>B*#)ZrnV#C-(Kt#08wjYhBC{Z19h6bWpk2bd? z4hj&h>LJe{yDw>u67{+$p#$g$CE7ypGzI0{I$qT!S3|z32k0PZ2V5IPNj->0RuUu4 zQBomuo`wN`lvN@cvL;`xv6FE@ix$~kl;6c?o97FUsU9Bv4&HxZjz_-thFMl4Qwc#R>Ram}hgk*iNjUKkd~Th} z3M5`2iJ}fgs27IEgn*>S1a-Y@OJ=~O@FNsh*QxJ_!Vok{kpOGU?hhewVT1%^l#g~l z?aob&3(Jg^`a&k(Zf7oWM2@*d*Qf1KuR<64pyA8Fq59^)A z!|P@Dq)o=!vO}I7MlJkV4`SKJy>gn>&&)%N!hcu3I)C=3z3g+)IyZ^)@SYa#XR91l zk$raTj1F=0sR#8riHX*V(d;g4_|3ZVO=%U&P51zp$a|G_G?oez@jX_#BsxGX6Q4y! zvMfrS?;@CnLo z@LUT^-eAz>XSi#^?VMBr#)pa%f};DM$xz1f@S}cq@vS=m@+z#J{xFp6K0Gl8OqD&x z0KT*Ae1J9Km-b#}HV1K9yIHLU2+vVf0LQ;!txME>1-K>Mwk3sWgQOQujX|!_DT;s* zvL`(Hls>>&wLbMgo_NWoDxAOtUo#bPAE2txAJI|E9q?-`XCGj{>5oLHtq%X@4QU44 zK`En*{YOC067{1uDa>1yxcG=@2_Ur1(i5T{sriv?;8o}8M;MQn;guEI+n-+9pPVgG zW&kr|@DCmMMa0Lw7c0PxFk&Nu6b(xX0*PcCsn!mGBD5 zXU4$FZ>$Qy&hX=_z#?sAxZ0WLf-CB%8vIHcxemYd7F<9D#Pq7X^&7iHk*I|0QWF5l zP5y7dytEP;R$+H8d4m^u@;7Nv;p}S2fMs^^W8mQ>VhGF8DoJ>G^5tWd8h?JIcBjgs~-7G2?m!qcLZrb~m9hQiL9u1*tK%O|~bg~U3 zT;0zGBE!09w6vURmbn?~P%Ab#zLT&oNldoE?h3|g^M;XQif9mRb zNZgPDhU-$k<}POX%7R@y&K7vV=TWC(iLi!QEpl(Z7`}(B4C%jKc{;S|us8>k&ja9& z^~`9qOs}?T2g^1C3~`oa>$%D+>=WWB+)I6tgR%?mY;L=>xH|-BEr$sp)*hZS9j;dvZ`Ao4;VIcPiJ(rlnFlB`6f`Huf8p7ucv`9yxk}Shos0?@#u4l({qy zEEB&dWQRUOVbr|*PQJPdq<0Im1$%71Pe>+9nivpk`b7w-qX!T;D6pPq7(uOb9D0sp zMbJTsc~yZr2lj{tr(Q@H$UlA!D#bh~T%M$o0zKZB$uI@X-M&8jre4rV*zo_&mNG>7E%~c>o7loMN)pHzWtor2!=_$9U#u4$Q3pQ z4vS{Mo&FDJ!!relZ?9WO4c7*!Ug~fLaXQlidpO-DwfExOo?3#^?bACmUJE`x$ocu{ zo=j#}?dD@Hi1Y(8+O^-$;qRF(a~G|sM)Jc z!~Fj_CgjUHgbGwQcjr9?ebF@|$j_UIZhmD;?T_NlzF99 zkCdq3p#@(jZ&r1ufvv@rObw5cgNL^{g)5=Q75A@uvZ!ro>ThYpnLx;#3S5xV>&h;j zickIXZ;0DMkJTZiLI5ek@e^1$#5wwS6e2C|X;&{z3uvWEXEsBzxiVAIYO4sQ=;K4k zorsMma}&^$D@8bsI8*D{Yswv{!vX{?nm8GCTfB=FHNM>vf$q--x{Ch=`By{MI0S2% z`>!<1CblGS;zuEOtl<7N$nSuv>&nsSzJ1E&Qa350wz)dYAKkY=c`_U2 z**4?o6E%pmeDHM>T4VXco-3(#w$|lQWytqi`(878{Y{y>$3#zo zuPjwEdYH+qQ|?4>uL=dE`^!%!UXYEMmnV~_tB6q;k!MM~D8M&pJ+mM{7Z2<pS4` z*UHT3kN%PO-2XHd{JKf#I7%0HD~Npl1jweGuhd9A)qWG`wQ~-^TQch$# zXVX1v!cFg}qdn&X#JU;qPCTVHl>FoMDk`}!FdqCN2sJL_sEF+04zL3L39|3PZI++< zv7S^x_CGy;NJ>LNdcIwrC9Pei3ITHz$`YkHmVgVO;4k_?R)5dN-ElY$poG~)@0g(| zm;zYC8{8#T)~WmymlRwS03Q(o^d~DV0kc5Cm7=pR1#4=i8I;G+hvz3<$2-B#eas)W zl(CYhQLC?~2{sUEU*9Z*AQYbq*%n1~(uTkJ7{&4wVd8AHg*Xus!zgg9Xpxv3+5{2|lq z=&W*2TQTZb7gz%FoHzW;dh}5bWHFhQbBfZQ_;x8pyM!NJrHY*74{&4bVWQ-Y9*?n+ z1M;`oKas>SgJ26)OH82d!5JSM>RjRa4*SUxh+S5#g zV8&a-J|@y-@g0Vclu>HqTpL2PM9hzgT;ZGDeqVTHG#T#7h{=-hHza<=O-5P>!Kwx3 zVtU$T$AA;!Au1f+fgjhg4cfk9&*?LwXlo7;AXo(Z*$cy9Mi_@Dy3{0n&k3v8Q{n$^ ziwCbtyaL#X1#iMvrFZs~24ZHB7)J6n%wwRQ`Mclh{q1%I6I60m zqQdMC&-&q+YJ{X?7UHL0)MNLZVKRndK{itKqJ|Qb!omLD@B{k8#Zl^|5Psv^)cG=J zpIgQJGZKruErzlrc^*WhId1dC!Xtq@LLA=gifm^kVtdNNm1j1PNhWy@@Z&RJsZ;MM z{34X7BfawSc1oYpPyJ-0UF~M;Uz;D9wwc@5)(Sr(yyi}$Ey?q1Zs5C%~5u z1;WYEWE^U%y|LkDA<(;1DJRf^HnZzyFJaplL*!ZkEu+u6Xb-FTEXf~>t{6e`uY*Hd z5riB97!%sWn$ed)yegWEI1_8DO`)h~CR;XiQFW||4KrAQuEt}m~_ z&a}0n+iek0vIvhm*Y#Z3*9cfb8F4>zm1XA*f{U8THBV2TL5!t}*Xte>i&3y9D+Ych3#1;fcU|?;|gYN96iB%CH@>EvZPne2$bS$_Fa|*+}a9 z$W|`L*DC2zq%&Uv}g1>gEHrv5yFJ^?{K|KDmt%Ro}Fe2(WuScM@os0y;e?)QdpDZ?wXCoazitWl(jMDVO=Tx`1{P=#2C1fzq_IEXz_;HDfstfK z;8~}N)iWZ3GzLE4w%dQ^+xJwl*8ZNzwLydp|^ki(%{^>Ta2348wpXsr;mR- zu*hWC=n!6kp4@qKXdeC_UDqG-`rjYT$d+w9K`(fh6u z+Tmc1fxS9c*b$&7mC}DWj(7;K2CkU{HU`Ki(bN;*8ZBOs2P17FPedrKAKSKhS`|jd ze+Ai_R{NF1ogMae0^Cm9;g~GA%(W9qJiyqZ2Zp(K5=tSFqV8CnMA3o|=zWGfi}#9H z&7`0+vYU()YI{(y_T4GHa1WGv8M=28D_Ca1%DE>NXIS>)Mf1Y2o{?F7T1XE#n; z-=O!ihp%vwx*)rK2mF>YVNYoT@RW44mf-9bxw34L$n6C$Y7$foZyVHh~qqhs1d6nb7|mUsf$XYv{hB^ z(ZrSi2em*-zdq>E%c0NA2>cUA!zB-vG<-l8AQ9>HHg3PXM1OG6@q(S`f<36w`}C^& zvq$hic@U4;DIavgKY-JdL;cf7@PNNeBjxIB*#1Q*f4peAJ#@dl6Jrp^8NqnBfyCqwqPqJK};rR}n+2zv?;;UCnk7e)M!7 zAep26XXE}zxDCQSHX)qR{371>X`46ys-I*C`Ur|0hyP<659?~8e#rkU!2h0S{g2OO z{cd^w&JXMVqx}d!wut6#KW=`~5Bs!NpZ2eL^|kIFTqq^1ANbDm^{MH9+-UnyFR2Lj zdb=p{sE@)le{2i9gntmx_Q;R-nm*tQ?E*j2X!~?WnKXU?7v6+_9uk z;r;KjF56fC@4l+4L=b=hB~|rRQzcbjeGBA>X|~%^Nm`}J2!^wJZ0KwQHdxCe3rK() zYb5MukR*g=*a?s<>MQ;I_ut=F)%9<`zTbZww>#~Zd9QQaciY_OecyAw&u6#2w>LfS zejffF)4b<@3!U8OdEddibnTjsIXR%0=85x=9&n)jQUmjWFDL-&*A&428A0dB577j; z&tyEm!=jE$PdyeKU{$SAhjESJRy%jm3g8A^1&`_0niX1 zlu&bI2lPQNi~#Ut2hEkwoHUP3{TM!U68QiRnz<(5-|3qd2N<|HMOrX*A_Mw>m&^ct zfdS&pqiTk!YJnK0V4(G)1IPBwr6f z0riCkTOdBXUAo{8Wo9c-AkXa70;ajc2R@mDqQ;ET>C%+_=5-Wdyaju z0sN*e*2wz_EI+gbegH4zSd&G+*(?L>M1XvdCAR=PixO-%`(oXO%oU~wv5+5T32s0S zycj&nNKgBPn>y(M_JEdr0s55Byg>3|h#DU4)q=J5DptRE0Cnax$nPDUTj^KO0{PZH z-mUbj?%=<3W9>crB@^FbqG0bL?f(V$CN$4}_*^sDO(R2MF^qa6Z@`y+0C;9J&>Tn-vqG0TFOdrDw*MSB8aTq^@SYO(R58{Ge z3<2zHiL>A06du+ta_Lv$fqp5I zwB_xTOdXPmgT4jphXw!8$eGK%m8aWC4*Cgk01v4nPr#HO+(38WOU4Tn;7mjww>+0^sD&*Up#lT_wE!-9PJYafD6}= z1^08Qp8gQ6J$QirKqdL&#W@;$2|?~82ZIE>xC6!z9t-Jm?6j<3HUR$d7`vITsed>N z^B>~n+){hh2EHqfcnJM4U-$;U)=6>Q4N`AOqX)SZA3QCH?5L6WG~ncF>;(sm0DE}B z_7uSB^rx_tA4CA>#t-RKgRvAJN&xTU2Z*T$V<xWU&dYgL)FQ=sRw5$KFk5wh7YN!2WTih)KG62 zK3b$5q+shb*`M2hJ{_4ZSJSVx6@PFn8;yUJP`=hx`CwnpjecUGeXy(Y;J+R<`8tLB znOFB>-TpQC3WfgwtNYPvFB<=;P``94{J<~r2EUQ0Uu`P<$S?Iqzlo?{x|M!t7uK24 zdhk^X?Zsc=0{y6K_qv7l@~_Q`e&b(ms9$g@{}fS28v6x8`-xZhz`uYR{fw*WWxmZy zzK5fXi1pf~@o3)N5iYz{^NAP4wxlbDVr{PW%BA%&bH|VCok+iKs<-NiJ3`X)dHqZ3 z$vUvjZ*`gAUdeILDEVtVIVr8LCz2yQJY%| zpBOxnKy_jR{O(@9Ezx5K(xh_q?OpndQ(G~D#x<;WF2EJV(=l;+>s^;F&r0Rj1=J=> zS!SwVu?1qtzh|mnT^B>S7wr{G;=%lR7wt7m;V22~(elS%k@F+=7uso8 z#O3;gM^`Qb)ds$X=KZlH=M34SmrrJ)Eyy9x~Qa zSbJE@)eWWxwG1AdDO7;=(bnKFd31o{gZpb}R;i1x3!W_B*wxp^&L2X|5&1r`%)O+ni?I{UAbd|r1D80t5ZO&W{OYgPuqnsGo7h_){4I1 zEyiaQOa0J&WBHJ(*j_xCRaqZb$XQHaSE!_mn9g)71R2ESg>XTbPAFHz3&AoKzJ?to z!l(g)N`+kl=1B!xLdt7`tpTVaKq|r!MD@b9;EAWI6|)3ZGl5$GY^2JCYeBKIAQe&w zl0^l2!B~KZ$4Dy*5j>m<;VdQ@@P%H&ARHj8&}CzK6?hDgZUVPp$|le%;27xH1zQ6l znxLuBgv4-G;t;&hg>69xh_J1UAkmo$t%M^ocCqp)%z4wA9%ilELGd@YHELG0k0Gme z9Lzb8rhYygF-EuiaJlICpAJiJnBCWOt448ihZr(%20mZrb8J9VgUBS82|qV zYNf~8p$_k+Kmm*J9O1&i|L2OOfw;20$y(fPJmpJcr={*cG}$~~A2oh63|G}Fa`#>Nwf7vg<387nlXhCW zgKb1=`h~mVKKyg`8=XEH+<~{@LiXN)v*5q&wxT;%CRxRXz6?9uZ3Fknd)c+IFmU|* z-SGeyzk}s{GZZ`T-LR(zsJ%Jb>tE@fLD7qKkz`)-echD>=tb~GQQz25{=f&W6S;lX zN_O7|z+HiX-MZ>CQ8wmjtEU;nFCGi{ovaY-UG;q!ysoP;6MJ>e%=mu2v1dD}Mr;4M zVK_K1r-IysBO05BLQ%`hS3Tz*J+;*%J9iK6B*!!`--PZ%ghzG4o%XQT-SE+PQp9)X z^XFpmxXHV|uS>DmOlnruQ9*6Y4`74#1r3GrKj`e=?!NA*V!PdjxuNkd{>R@(6nBum zc!2i2hrCl&e*NcW>LISHC8_CXGdtuOHNKUC(=D>~Z$L)|IOpHM&KvqgOwOg#SpU$! zUb6NsSCb>G&L4CJ)-0{ThIL;|cph1P%y*k6%yfS~L!ss?WZZrCZ5E#;>^@B^P&x(a zfI`~gjJqM7-VhiFtZoE7uiw1wbiY3LM}UWCeu{M1=ioc^jy;#|lc&+?>qk!qNg z%1iI~MO@(cE7Qp?o_F+ze}wSP518#a-Es&fWOFX!U8zL!VrLaHqEVOxJ zPp*z?Q`WIsdU(e?wy?$wEyCZJMLYlOcBQC{=B?t_Pe^Dvk+PR9%(5sgydl+74md8d z{qS2(cJjXA&Ry4R&}dK~&Y+)_{Rz(5yT@(bW){w zKHPl=T{+uVc<#j|Evxro*4_3Jd3(YQs{E>Rw!ZP(T>gq7d(hChMZ4$r-wS5@jGXPW zymy+t$7MIo?9TCbD&5rmq>JHg!GrtqSL9wq&Ub0swrH%{>?h!%THCfxQ4(lYb!d-LE&N@g$ zY}~l&4%zC?>~eAUCvHm1zqaEX{m;i|nG_wgRh`7xU)OHB1J3bQT@s$@bpH84+f7;C zS{elZ5#hnwGnp;N#@}u`We06lXJ)i_Gykd`r2eAepPjo*NK2?YYpXkpz8mLxah~O*=XXCZd_FXPIM!ul#=T>*jXW997NqLjm{RW-F)rH(= zRA{%XhP?Ln0rLQQ>S?ihS!-y*NgPhPz~Aep-DEZ0JXKl_e*-~zkAcU$ zUz=v|Y7XlmuIYQUy0yLEF8L!{o}Zi7$9A`n;oW{i%9sD`&1|>dBhy*G zty(eHoYQ*zRAc8AmE{iyJOUmjRCsa2Qt`0hzi%UWj_aj6@a&s^Mekc_yvDn3vbl4N zIZ<$V;6sfi{CrElb&C<*c&*N#wk%zO_!K-_qI{^i&|SjC!S@@Q;cvg}JHMg6umN~~ z-0s3poo}*s@`sxi6m5_0!(E7JW=4^>zC_63?9d;Nas$@~4u=7-t0{rdCq{@mZN_ZzQ285I$=(>_Pd z9t(R6h7Ny=p;sOw`}z^Y%+$#{d^Hs9*ulx*!Z*0XDE>Hr)=JUyeIl0)C)SU}LI3=; z3XdEPj4PJDCt*6wZ`MGoW z|GSjcg01j;1=tuJ+peQE6K-ajx^amw9W>|s_D5ojO2g>Zz`R-bhFqG{U@y*`&W0%;2th%f;E|Cx)jd%I!P5t>~9kS9OE zO$w?40GJK{_<#-o0sf}|00D0f0091{000Pwb9WM0+W&9FC7Bs-d}sG#!LZ!$I~WMf zXPUrEb)HYM6m@(Az774JVi*~lnVFfHyTAYc-Q6d5PQBf2ol!4Nl$7fvw#g*6*(|h# zl0|4jptjXx0U$s|6(B6Oh@z=lAYw8gA&4*>jK(7oQ3yyJ2?7|1NPE3K?$+3wZ|8SX zVEF$d=J!%7K2m@G6+i!t@T8OGC--_!hOR%$Pe0`RMgQ!{)&7!s*ZQmat`dJ8-*?@o zf`xyiLKph0`mPmUi?ZzhSUPE>cL16g1TQGK2+R!?7XzFOA`x&otg1AOV=chuf*Vk# z!~r1at^=`yW_uoua2;MHQbh$|xehG`&lE+T;6A`^Dvk@4Qr0)t2Oi))$Kloumf$|c zR6W4no(8u~-0F;IaXgnl6HN{c8J+F}aiPUjaFdf#gnyS)fNaJ6n52UoIKY`Phf>u( z4K%uiJxGT&E9FeeUJ2*X4=mo;nd{qKdjYQY9TE8o|sR zpl^DjiCU_L9*j~@H(Lru>=r5nDBx5HfxiH=p$j^o5;Sd{sPp3rWF??k8Iletexlq8%$I>j?%LudIZ-RW9CsUc}!NZk&~ zM0dS(Hc^b!Erl88F|m8}>2$eVfwVohg;;|z%TT~J?_wUKESLmM{nkLPc4&~5Coo(TrWb1SaK4VB%jtl&=Hx3vlpO$NXT z=UZIwiLryvSKk;mDEt8Sz&slYAl}nu2EhJ%LcusH_d&9vwFf<+bk%Hfiok63)DhqV zZf_a#gK+1x8+gC&gJ^-k)%lHc)36}i2FV#0N-TifuOICO%h?9+*_qjaux19}c_hZE ztkjD>vIeL(5q(a=v>PMYNW?d#`a{(QuVs+CAU7%@4SK<_A~qI7Qvs%+50sn02Hr1& z7I-#$0kP&s4#saZpMel=qW#w7UJc}`E>}vsS7a@KZn1t$s;2~33{i?L!}L(w28=%S zgLO72a61oft7BwphZ>f2zLhH$Gr&D6AX3f9htU8#EhJ8>B(Cfws&Vdo0T8 z17OIbJ@_`cpT)mmucsk)Ky1+7njqUYKwl_`wn4Lf0Bv*RA5DVZl!euUa;hF_T*L+g zbK^s1L&$pVS#rU#WCq0BAPSpAqz&DG+2EvSJZR|t#xr@PE zzM;(2X7lknYN2&OvgJc>zzw#PW5S%k+u-jcC%rznH$M~`3L{Y4+XmYLX%DOoxs2|R z9A!BCU~HK|vZJ#G-q1EiGw6+T!y)^j_8kP;QI-RBQI|TZNA(RujqqsurB5CJZr9jP=4eF$47h(n#zfpXy4@q=)R zx=X^Ix?6k@Z@-m1E`AwZR1VsH_^bxX*|R3^7@x5y*0)`QT~wA0k`|2x8lrQ?u+yUB z1FD&7N}lRM@I!NGRxdU%ZJY{q&YgRcm$@>fJR2-5j85=u2sWrUF9aJswd(-N&yH0& zTBt|H4dT)U{25hhrAd1SB2=dXV2yyhPX^sH+a*XVgA!7#EHUMwBTnF6pbd=bn zj3}=1%!u1F@%JSfzvH2^fwS6(=Z)ZEHIL_tn1!q=E3W528>GwJ!Fyhq%12Ln+sQM@ zVk9ztQ+_yp<$ad5#xl@sFO_{@W1}`QVaRJyfQtdJCWm?jG>r;eLz#EI#07K{u45**MrO@@SL~Hmn}m=vwjxt5NJ|~T z_(8a_xqBqAwDm%3552V~63|+jX`PfPSjOPCFUi&(&m(vA$faHmbxk!;HoBfxQ0M|F zVFadffV*Jb{v@eb;VIw)c309V;tjK6(CX=DrlzyG%O@R3N+>-cY<;s zzP$}JpzVomC~zJ+g4y;~ z{h(|UaVckD+mvfaOVmSZRg`IQ>HCauo56tQ_SyqziFjoF_&OxJF3Ym)?q%)CQnxzq z;tl;-3%{0N+KZ1uXhRW0(GpT_Ts_qU14L0dOiDrm5c5DFLRUNa0iowHwDz=oeRIw!1C_MYwe9 zshjhnKr*u$t0uF*IGJgAn62qEx`8sMf*>QS!z;H6>*hntQy&f2WTy$S16GotcGl8X z@EZAoe@?BI37ujU!8-X1=^f)iOm_^{ZwZ~-uq2O`>R9L9l_(jm?>Q2seUVT?%~@N< zdNG;^8D*|>I^~>FiK$?Aded3fl^eIlx%WQcsB`Drx-$U`PYe$Qb`^WQt0^s(y9r>P z;5oK=X(}jDIZa+Z9cemORrvG3hf3Yhm<`VG!0+sk^fo;MrKf;w2Hq6~th;BKBGl0; zkuthDguaYV^djiN$87L7_-&5QLvzV!Hb>laXf{_dIVzYe+fDyvvbbtuS=slU%y$+r zLy8UU%BzRx#wJ{V+n9l@4S^A4akW9PJ=v-83~U3#Svi2*o`k7H#?Mu3j9VbtAG_1e zKBzWGHzWm~E&(T$4c_zTfd)5IhPNi^gJp{s0Oro`!MA!)nMhh|7K4-x$>++H2I;uA zDDrHBcEo0FKyI-bLW`;m`WRbM_>Y3WR2v15L4f*T+Lo3MzMdX8^@C)!v4!CScD}x( z4c~)dv__(*?*7nhHa0L1QoVp~DBuk=HvStlXY}-KIVHgb-e!w@(yUrM}GBdb& zpx#cZW+BI#4d=m`Y(D&ITqmX2SV3*B4bS3(X$KukYoHDF?7Wv9KB+xWZlH6d4c_b9 zu*Xy!-%J~qMwLv+pkGOi_&V0?0-BiZ$T7QM8y6@WOwPv_oDJUVTd)J+{RCwt=pndw z^*B>U+`pW!FUimxhnwqd~2%%^;8sZ~HYcO%HmMB@56bD-< zR?m%)pMH28jBqAEZ24cd$&Q~@G1UO2Yq>@&c3|;WZ{o0S6uC{!2Jc|#!|vTLJeg|j z1?+u|mjb%)kgd6YSHX1u?Xc|ie=VTf;un?vw7IB%^5Y!N@nGS_k{^}ss$XEFYqwAq zyC^X^gxlfs9n4LA+os#xazz#4t5Hcp!Nn#@(OyidxOpJlk2)OX8fjJ8g=*oeX%Pcp z0Xt*zhVKIV0Tzn796?-<;067zmC#yiMrYvaDlN4Oc z7UYZ-_rOHL&jP={59&XgV!F`&{%GpIEI+@|jnHF`cb8$asK)82_T5#7%JGu*7~CIXQH&iF zHmZt|`m0Oqp~fD2V++$`ce5lO4qZO`HdOsre2cb+8QlLDFHd9_*_M9?K~$`z5zoHO z+l0dRn1;!)v(saHtz*4OQ-je!FU?<`C+O807lFJ z_%6%<0n=vz00AA$007fx0RSt|hTZn9rtANG&Mqz_(@i7*CddLv1}IP>fY}HXU@#b% zNdctTHk(v!yGipTlG!3@1-My}fPf??b+MzXvzs&i0Po)<)!w zzjBn!nSv0E7vIf`v-fB2&)uK9KX!iX{n`7o_h;_U-Jiez_e(FN`CRs_TtfxM9?5-o ze=fefZKCMDHG4gsufn%zp|ass{4J1e@vE$;_63pJdCl;!nCwO#@fX)f!1&KY;jLd> zzjS*c(ZJ{Hkmr&Zh^)t%TR93luEURxG*1IMtZKmBu0;E+9$mZ(@0wA9;90;O( z!nVx8Sc`G>dE&ht0O!%Ihk)X<3hut8yrte=rM`l-(ji_8c}{J77WxiuTq}-x*}i;4 z;h6D36bN)k&KA8@44;`o)M!ks9aD9%W@D;b{U|dh)VIySnPXDlIR<7*rM`9y)Qc;6R zs#2RHf0RPq;)~jT#t-i5fgdSF~FO|X)7w|2Z06!#lw;(CPWO!mLT#>32{8J0*h>ZTaLp3;B}vzHFr zlW35CNkhz{K^ZF{N=ij2*!lL&^T0^H9IRBz4V4o@aW_jTjj(8u zU*U-JBL-yK>Q%s5zvfj=(p5Lv*eJk6223XMJ?2~n(jf6{dEtj2h8(ZnMJK|0#a_EY zE;up((A#Uqg+93XUQJ&JbEBT6YX@$7_?-8xU&OC_mwyry*;ny8FMG%FIl8Wkjpa5k4u(#yhrSKaCHS6wTBWcs zSv-(>pr24fx0vlBhtj-JwL)hq9w(X(s$qcYwmBPlgQDs!rWLTZm|LhEeOkj1ZQ0EJzR~MqK2#} z?#o0JQ$IqBh%NK7X10R#!mR}6?e2PRkvB9hA-%x8m-OS*yh~bWb@m27)G%M;_~IHH zbz?)uT7=2SPag(|-&@9qsxCm6!+GAJu%xuSKg#x?%&u{LN^So#ZNTVVUjh`tGEjCD zgMrM{4_q}CqfvSs+CjYf6TSo*9{1LNU}levx6M@0=Yt4tje8zD`*8{^SF9nh9DG;7 zUf4LfdidDe8p+J(u|p;sN;UQ^^TYQp9nZ5xkrU$&xj} zKQXR~G|d^pbX1cr7nwLHlf5zKJe|3K5$=>Do@0VjrVxoT!g$1=nMo>CkmTHV zL!*%es)iR{2>9Uf3T)pO2g8mZ2BkCCSUI48aGaHBk9?rFTovL-wZ2OcrHXpNd9;H4 z6=;&iE6nL5&tGG(?e32b?6kSUCw~xVal)Cy;Fqvv3d^Xl5GNV>BuGn)05;gy(bfwut)GWB_v!Ip>zYpp(m6C0X1B4r!{EdX zRt$PhsS}A z@u|w%7L5E3Dwj(w9^^*kjf6S}l3**vD>~zk_F)OYE%@SYMLr2wsn~Y@<;6>Oz{P;* zheJSCZ1x&}3N-*yjP9F0MmMIYYYrZlg|<*MI780y$E_Y{GY^d#`USeXo$s->Xoq;au+_+94&6fg z9ws+7gIFbP4+cnV)q&lTp`jC}NsSzXd@m_5SR zJ;;(Igljd0vwelGeagWbsq%-71HX`eUeElY?jW6knBi#eUgdFvG5FR!V6T4!0(#s! z$cKC_2?9YFI}F@z>-(1@2AX2UBvX;H&x20(U34I!$|IQqY-B!eoB;z>*s;*Y>Q(=` zUPu08i$M=`Jb+m}Gm-g`8z4VOsQ`MlEqY!#0II-nIEE9Vv=HpWzwTM<`o<_iFr>lM zTa=7X+lg%5vVyqo9L3uRIExP+S|?d#L59N7S7jt5I;t;pUdDtw$$aS$fDDK)*cbSd z3=5NIDGiC?eK1!`o-ZA(;k8>0Ks38mJEq24ZcsztmTF-0yrAnAE%?FW*F)0#z@_-) zK_9F4rFje;&Ef#@z>PQ;3&HdPz;$1`UtQOLdFtMiyA#Znfq?+xS$5rS|Mcao1<1Hj z%54@zmG_|4pg<%YB1{%4UtYh`M(-?4w?8e>%VgPSna4BCvhA5^S$OQc#$SDvn=6)8 zbUqRkI^tB`qD|&1B=+%9yzhEs+kA+o=E6&?=Sa%1oSv0xJI~ra1wl%X3rEKaH=kxIPN8^FEP7kS-9g58*V4gwq#MKJ-zMuO zz9o;z^Z@y3fWp2GmeX{Dr0E1n#Ie5m0w_}m^6#q&-SmSv!R!LYc7W&m@QE%kF?B$yrW zaHr{xx$0OypF}uuwpQ{usacQV6T}D?p#=3dD~WRyAe~K>@Liv)^%JVYtbU)l%wOLv5w2q0=ExsjF|Rvk|>N$U27lkpwU*)lBIT4&rtcJt(LXdTBHYyA2GFf|Ezd zG>BGLpTx#1>T2k9XjAEG+v&fVTxl_Qc|7i`%*gmJ(`s+#NoXZe6XPr^I!&}vO<`uR~)tHdRODAG;NE5M zc-Ro}17*K{5HnX}UDsx`6PaWh16&VSr$iGwFt4peZ(552ZUAmx*yR?}0Qp?Oq5hyh z&Wmj@q&=P=>Vy4Qf5!*>$qmXDK*mR>M-!P#3{Om0ffH z&4Oaa!6adXJ0^ir2N6i@(qTm=d96w^RX>2V={mSSF?NUN$-c2#1xfZmXdpVduK6BH zlFJ67*`la32Fb6fm^J^3X|I<*@m8GqTmKe7$Hv227H7U#7J0YF4wD0nI!qok3OY9Fa7RSH$Mj4qLzbjrRNug>v;YJ>;8k}l zIlmqXs|b-6KEP}gaaFRu#I2ZxFL(y0hd2#Idbk0?an1c4DJ)lf(oNOKf7^z7r4+Wu z=E^bUaKXT~9#;;OBH5Zb%lmT$2*=qn;cHlIAK{7ggd11!MD+P%9-9-0H*~cv)srA- zVe3G}Alwha2as+Aft6H`T26ta&6-NHLviXaX|fB5%M^4A;A*0VMRqzX&&VXSEGY(k zoF^juyUZ1%`EOqh3sUIZvClh9@!ew#`c6d(DC78pa|{?s_L9=8USxc+VpjF9oP%`X zrV2V$7lK!R?Gq-QOC~l7x_PK zAS6Esc}5aTh0zH4j&u(a2|w-@Ezp8&A?gW zdd3FGYUyp8t6Cl-rOB%mGR4HY!=}3(6g+t7iRoV#N$l2(6Q}t;Y(DcG4s2|d`Cq)Q z><5?}EOL0u4~$OSMDK*3YRNhr*~Z$+k7%r)5%`C*CD?;%ecpq_nYt%=egC9HqR8>i z&pE6Gteyl}c1ovciOLn6fUzfff0BpGzhtN>%7iG1O-&K`4)F;l<+y0CqQ26Zk0ZCAq@AMi8OPLNXqX5wP?ylta(LIv#own0dHI!;^%n z8%RpwJ9 z-Y|`vFHvz^S9cKMeq}v_6G@n@MXs?&Hwm<3!%g?wg zKO976s2&{NsV21PGaq#!KPAbqm6Q0J386VfqwX44Rj^M0EYJZxUQBt?&)<6~ks-|# zx7r*~KiqjQ)BrR^1tjlICseQj+^^qU3E}Ja#1u1^@2^D%lov!v+Re#IzS@F-(;k^Z zeh<7C+*K8$q(#K!+a=7&sS{`{v_gM%<8M?G^QhjKO2CWPy)q9dmFhR<8c)Kbe{N|% zxj<$Q9Y+2<;z2G3+o;~2M~WHHI|+WGUN!T1)55C*b@&dxU zNKo}baN0p+dUxunvA{p|!d+X08?bG;@B}wOVCX_l{Mv5SD!^^hhCZJzKF*gPY)eJJ zJgY_uLv83%hDZ8hw74{)z+I*_X{$_a=zmm$hSmQ_O}8Re4AIwi;6qxm2J%h44-7$s zdxDv?QVSK!82ULpFs>YgvAESEp~e6L_JlF&R^_b@ORgd)ao{4VHOl8rkY%P7tTU7& z+Xgq>?ilRd2YBY&KhuUseY7I8o_6J2>yo`BAwl=sL0w8NP0+!maLURs&knhSjs;4S zSDgbiQtwD8NwrH|Xk;yMcI~*04FWEM?sY;ZkfJik-4s2t3`DHo+Mc1Pc&DISLZIM` z&YvwX!R{;sN?54}IE{w<0(dGOG%g!GJQx@v3B|!p?v1(Xm2PxSyBINdbX*aw5_maB zUk7#4Co9WC{DC!KEqkzvYHl_pbc_>;_M()m59)?mv*zUiPAvtxX!{`Yi$=joU;%u(on~+Sbvh6F^*Fff&c>x_I@p!9cDP^W)a6|GVoy{98GgfY zwLmpIaZ65d#2#@S#e>Rq1s7>m2?cnVuAPLc!gVoGus9}mm&q|vZ2@;xQI0P5lF?l~ z$GC9|lg-)_DkogpFoBrr9zBs}fwhqnI?czIcq`I%WD#)W9U^lp#k<;Wjkv;}xav=a zpwZS5ju>c|AqDQ22r``@Y^(h_>l5t>>o;Wkq9#u&O0&tFV4g`Z8qvpy5S_1zw8W5| zHx#ILqfe-d-bt=i--(#(<;78_mli6QxeClB+gw#4xUIK4Fj+GhaaPhIk+jOj(OGQ7 zndjRKAB4yT(-(b`D`Q|G=N~Q{ueU#Dl5p9kY_~r@A)$~DQib%FQDb^vNDL6pgCUL_ zDhL8nww4N^H0ke2b&~%KP@E*S-Ysyv=`FKzL83(ih(SGz(A8hCEMt% z>qD-k?vmAtw)tK2K|+t{Ip^;pwqIhoYQ_8iW`8llU*!3wL(V66&y&MnGi@?^OC0wx zEPK{Ll=<={%RN-Q^O%U2W+sYz&&nbmfAau`tPg6I6*m0lF<$p6rWsu}JPrH25NMF< zWhC`XhHN~lcRS@4S3>5r3{Odex-ox| zHxxVeT(QJUEG;brE(@9J_~Ue`nCTT(`+xERhN6MhYiO;aNU}f7;#Jx%W>!S7q)OXX z1^^~Mr-2zU_!t$KM7fZy3qOMaYV@q`@Bui9aC!cmI6U_-p9miIgNveQ93S(K$Semp za=m^LiJCLbplSW)E1sJTQf9RtZl2wXWdUf~rA){$WA8DdMKwLR71GzafF`&|nyp|Z z!L@jLZMg*4I$gE8S_QWPXV?!-Rch8Ha8*^SSdyyI4rGnO=5vKyiXX#~bPx*_Gj`ib zc!DrXH>Z_f>eg2KVVH4m4|a|9Z*zp?bC7Zokl6zw&-xM=R@o z5AXB-=i~dlU(fx&;r-sBRmd$TkGk?apDL#}1q!b=Rc?p4k2OKcPgJfsXXfpFc?%EG z0xcy@%P$wq#;+Z#UDWiM=O`Dw*;k~f5rxzI< zTw-+8*tF+OP76?U*2GfhO>Bj!I%;%Uqo${Yt2$}WrVg5)6!Ftk0(5lKv1^WZ+*66k z&h%8`nK|BqoKr_T(9?=+=W>+doH^XBIJBzWhFF#lI-zNU&a7H+^Dr$ydDaSDTfGN! zPAy1!(bJ1m9<-F=)vI?YpQjYSdIFU2dICG3^aZVQw2n&BIV(uyts|1Oj!M!wFfLMH zT%^FcNr7^c4FC(vut?g$GiwCRtP?h{OxnRSYXr@#5;m|%+QB1h1dXf`Hn2$A(cZjL z%^mCorfBYHT6T`y3sBM9kxR69HZ4m>bAr`0cd-_&qrH%(8atg7^G9>SbkWS*n_rrJC21vt~j7M5M!fDSUj=na}+^akBHdJF-m4@JrH>FM;kc|u)0 zp)Q_Kmrp25r<5hr$`a{i33RfAx>-V9ETJxzP?t+6KTPiZGrRQ8@6$WKOz!uRR?)@{n^v>_oJHIJq%k+-#%4?c_ToX3@xDIjoa2tua#~}Y4eck{h6FVR$t6NuR zWC0z4P8@+hsK?#9%SX2jy$tMuCli237bOFh%05^{#?wd>eba@MCx9o)3E&wI^fRA! z4PZHN+PgU+x>^l!s1P_n4jOF&5->n>?eB?a@@|Zud~MG}E&*M#*ypOHvJYeMA?AR* z3QmT4Ud7i_DtJCMvZQbTRzB>Mf_X0oh~`_g+sQAnc4oHeo6JxMS~iNYN}Xb3Sl_#JS9g{Om3=MIkC!D%`=}2{$KAtH zOn1qpyPrmJ$T#sRAXfq8GrVXRCO!!W%ZlM$MjweF`9L^#fZ6~*K)}DKFDJp^Km`D( zJ&Ulql#q51c+wy?(uG&bNvw+vfnE%Ha2?Mjv{HNhAcKC0X3PltylpD*I)v)pmr9iv z2;hc|Q}lxP9@(SdVaQt__GATYf7*}}{Ww9ydZU5dt|HS{`07o;sEMSfcdiqwF+_F#k|ptiF4g zjehqd!FeG$E6ak*?MOk#JBSuo5Y!X#84lh48#l`L*ehWl(1#NG+{gHNXV~)aZek%Q zu~Ogc3&(+NqYGtWGM*tdxYo|X+HLk)6~R9QNK<6{kphieNL-RtM2rKZ02!2kcF`eB zlf)gKn7_b9gIj*M4BiMbrKi0O=d6;R8R2d5&@Kn3UDw0QO(4K?h`YN z1MUC|lz>=7gyfOs0X`%yK@7$L^?(OlkPkx^7Pyy~p+@f(7ZjfcHcRt>2U`0o7XPmn z7POY-0pVi8;uG~o0f+V<;kZZx)5V0~o{2y!@nLbobp&7yd;C3mKoD_ZYsuu40sbs6 zXrI@N0iJ({-J}8EV#4mpv?v7@EG{u9F@Ph&1Q*-rr%@=2C$d#5%O~c=c_jyq8-)dz z*^p6(yNDb*F5%R%&d4ebJC(cj%+GQUO)lEZtQ`PBTv`mH6_xk)s^8$Sc%l8R8v7r5 z*67jcBwow{F}YbS+uU%_R63~;Wu_o_s$-wbvj{2W9N&a+>#P5A?=P4~o0q$<%vqJC7G0L{$8wd(K#r zxfATH@F4&p$Z%?8WqDx0XE}*cNZP2tK}(6f-jP*^ULrz739g3!uo7Akf`!LM58UbR0#*9bXKw;hB%x{b61faCrbx%w;DH;Jya<9i z0M_*~K`q>!@i$E#<|9X>3tS$w4h*12R0HWTzwF4kCOS|-z@D3)QC?m_>fFWIRsbP;P$Cvx2wUk zHA^B|HuM!Nb$OC7m$4&3kV*sEc}N233xh9(jj5t00kqop5vx-k*1t)ahuRhaFe>Bf zi;;AM%Z72W%7^^*J#J|5;#zrE0RaONL?w#uaU@CQsdP>cM)UBAFej?g>5!iOBF1dx zu?QD`0}<(YPin(ju_R)}OIFNJR_7c>=NkJITVJ*O0R%|?l#6Z8y2aDHXh{+Qw^W?u zp(JD>vBqz9K{!ZnRFhZHhSA6J>$gbfMA7t9her%ff1>dx!w(l)|IrAzKRX=)q1MAX zfzZnc$RYhvkj|++zJTc=^Fxh1PHdXztYb&XQcFH)O>0%X5g~J7-lxfbN1F>9ivD?_ z)ZTJvQpvsUzn(OfIoJENMJ+kPBaAX+gz;if&V={Vhw-LgEP8m_XWCiu1R8Ce=9f*L zElIcTc_;2+gOh0Ea%b)Yr)T$1-{Gevx7B0ZCFW4Js`~c20BoErd^<>IA%@xy>aJt! z=t015U5RZ&HRD=Jg`_4W?mX*>zc)p?V~E-b&A}0o{b*cJ{y&ugKDoVQ1jdFbK!zq((2ZmsBw=eb?m{Y+&NcW?DE&=F{zx}l6jRU0rp zk)57$4bgeJE$b3Y;~K(DAW5E1T3q*IV}fY8brLQNJh>W#wT;if$F7(eTSSuvfo=J0 za43_O(5S9lgUVo{-jt0H4}5YaS=S0zlAi0|^Aunq@B(XW=7c*aq3{mfF&wWYtQ?bA zFN_?o3D2y&e1cORKH;PbFOKJ@KH2yYO@VG~1Wmd9qk(#ur}9u@px(*hgr4HhYmIux zoW*A)>9IYVH3gZLzQ_1R42i;jg(bE&Qx&!BsoBAl;Cm?!xL>A zBV?V%BKWpRD;UCTL<_U(TvoFfO7e3zJL^efAv@N|==hs`1N=#?zIhHLrQY#n_sIW; zpF2L=b85y??hmopu;GVe_$*5HYe=*-2~C(uVew%WWbaRy9BcWREme&}DDP1#;D?Uj zzBGOeT%);8>L`>0Yl+B_PB|!cE%Q>%Q)wpm?G|jfO^#_Ml-T9vjjCCbK{ihh0v!== zKu2mFyF%mA1hN<#0<6E%L`i}>WA(x{t-1ZsoCrO4fiaa(7fit{ zfAoG?ysaeDj&i+cT5l@#ooT$aiQuQ*-k4KQn~klyncZWZOIv+m!cY};hm<6=5)uXB zx(Msmg_?*pGue{eRcjX(Xm!4`9#zPkZt_8kg zayiu&{Fye$X`=hIG)&jmuk@8x^_W7(#==I!R~uGTf~A+N_Ulshg(sNJHO*?XT2{JN zy5RHF&0uDXYo$x_#=XR9GRam%bBzR1css0ph6`@wQ#K53lpdLXX1MrKCA1fpR#?_P9yJnf!1>Ln*&h8 z1Ri?MFS&?uF&)9@7JLd@`cJ-UG-RtVf;1=N6Ui`_<^>Ncgi3RKt`xL}-yltYP z))o@QmRPb`Q`5=e8cQJ)U@AmxlsJ@%iD#MvHE?c;bYoa8#jH=2vc`?m#VufrTEIks zJdr1Dx(4q8CYteT!WvC-_lC;y?s%gq{@lPhNde0&2P3zFhnEAP(LI=XFgs+5n}-h< zN^)XbKZ%ogrp8E$L`hJZ)SkU1gP@zjK)<_lPpHD#+Ye7$cd%B)^NSWN1ysMuxpKXjzC(0U5U6 z#Hh`568R{-_;Q6tKI7k2FIhjSsKMstAAb~)f(*Wu7z>S(0Z$i-nl8V;3=wsm_v=ft zpo^s3JCCNvCZR1ff$K8~F7kt5-GNV_Ms6qeC7db^TP z1X-E5-GEm9A=_mS`U+e^aed7NjwnZwaEB??0xggYS4AyYgQxnveOOqPl}dI$*p<{_dpR~sFv*cgFBXB>YWi_W*Lwo9DXRZF9oCaSI$2n_nN{ z-!Ob95V7G^+MrGl2iXW*XAqhNie#;*uUUZ(XG}e4_cr-prRD3i1lcPm=~m(vTmgc| z##SCCmXp*2CSWXy&OO8|$!LBk_YkDQhw{Os<}!8xxuSx1APCg7IDy8#)F?QGn@i8q zEvB|f#4O=xdQs)WV{jfxVeO69;x44QD?VGgzowQ=E2L{XuBTJYj|%?lz)_TB_FTI1gK+PsnZD8*(4V(71H{Mte3n*-p9NQ%{kU7!*DG_WaO8-19*Kg$#M*+6GiQ0&4`h%|iBQ$;`^A9Tm* z!^b#Y|&K)t38Axf82(tU|{-Uax9L}+q`hY)CS#)at6z#0Ur2Qjjfhh8|R4fasINYv7VI&*ggziM0(Y8^~-bYnaw5r=A1W|AQLc33r zO<>HZYX+3!d}`iH2DnWhbtKjgY8J*dLV06UHtO1;;VmO2Z!*QcU3HY}-($l0fL~-u z6d4SekmLDpb9d;!6WpjNcZQ@-wQw+W`+YwISGH2*1+nndnSl>Eeu<)b zyMx~-;8Lh2WLyzkQ!xRP@4-TkaoiuSqk-TkBzRlip?VVk@L}KsD|cPweEZ8`qmP;QC(yM~!g-QIDx)o>M{gli zc6XIkmP3Vr49x*g1olALse3gm%f3G(C+|){lHnI*LADAp3gB0z%3KSmlCf;s391^y zbf~;prWJPCfH#9p9)Znjl!IXapC;|#Tb*<7@NEnS9KYxjTS!-WhURU=XOF>^OT&f| zclaI{tc815%8T_CK;f+m_dxL5G0VL?de^4l206rJ5@U_|fzK=U?O*n>3HgNc>r$Y5 zTB(x|z=6(HYta-4rc+G}IgVQm9j`@12&U6%#u9V9-Rh?Vp(}cmDknGozEQPQ%GYj& zqojrfM>^2UUWxD`sHVt93MPdhkVInh0geL=IayVl3G3eLGy{*mdcZlN8f2?~#>*8q zo(xi|xfe8}Ut)f_>d^PS4`))11Lx6lIm%QQU1)<08%w2bYu?(G21UfPkS?@#u+$Xk z`1h)Yqo(en=rCL}`t~4yTM-F(S!o$Fu!V5 zETZ9V4+RMBJ+P^xxSs~XVm{4)e7`f_v-8Z{dH)eaA+bvSTXyv?sDJv-h3D=s_~6Cf)W*pG2L^R}jB4SgqGKz7GqVmrSYx?7^|HcGrp! zC8*2Fl(|m(IRj1#dwj?hF|7qY+T0(xTq?UjPA9& zA~Y|{v>X~WA+d2r9M%Oo(*8uYoN@l!+0o3sn;g&sQq*baryn<^sHZnyMEg!2*ilSA z(FeSKzg+pXEBbtm6YkUzxdPdMM&SbJ=xJBj>=ctCC>E>V^Dk*oZp1gMZ6ud0$44o5 zOX?eObA%i^FAYIh_OR9s4lr}!WDFU7vViWSFTOyHCkUBAA@4%{07@=(L6$&JzqpEo zOqhy>xyKN0lGW&zka@{a2D6-5Rn_h}VNOkdmBUY8Jb^k!Hz+pe6@DBX_%2s|9W+FC za(#^RJmZ3}R#D!!wc0wO<2Dy=DN$%e+zUi4IJE)<1dGQN9|EmoZ}2UkkGFp75>s{m zedjZo%)g03)$${m7}Zy(l32z!eOX9M)C4xu`M)Cn#h zd?0L;lUZR8VPN7|erQcTYYteqH^I{x;W|!&n)Pt0S#vEU67{pN;FFUS`IA{y=n2m1 z#mqjZ^Zyw+r{f@7^D%2D<78`J1qt$1vCZ{O+2X)MawqaAVR=xTHuglrE__i zrWX0R(0Hu7yA^qQ(EKqK?ZAiBupMRFY0yM<4N5nFuj{)NdOKzT-DnP+j5qdA+C`Bl zd6k}_f)iT>*#KhOYX}53Uk%C2E&*fJ0G6Yj$rw}K@rc+6itf??cif8-SgN8aEgVCg zO3~-;?b8;d!RBtsKVvmGuSWrzz(8Xf1Edl7w{A;4bE^qUJCw~HCcJ;cIU7GaWBQg7 zbpy|&bmF9*03;@fU*c3Ov|8!>J)P|BJbgUDPV`G%pt;|X4Np8@55&WBIslL;hk4b2 z1#7v8XLwg=7VpS1o_Tw`>7afEfHZ!%EP11+M-m6k0!5;CS8%$D-gAeh^MM%0e?yx0 z>rZ7(f41|fI)^n=CIH9jyy^3tK34$k?yBMhkDk0otAaYtphR{4msgP;XW3GUJ|8Mk zhntls)5^S8n2@R9JGxpT;rXYPZc3+6nhD{=+G028=q9%xHpo{EZnHQrR!vB`I7!_l z{}#+@;Xx`F?}rj0x)AlnP2{<?xlJyD`i;ou++-GS8Ice`GN93*ibHWfFI46=)`vmn?C zJX>0SAjY)$&|H3rn^%5DC0)x^*0<*F-;3-uwy1hb`s7zVruGtm!9 zK-M35<-Hb}Tyi{+n-l=-7JDYkFA!<)2sLDUBNM@d9GHjW8k+Ef-3WT24dIZwB^flA zCcB_p3!}@-W);tS&D-<7VUsEV&)5pvCiAfAArF2V^49#`oAlwY*pd?-oA+IUwYY{I zEy`S;XG3>|7dMZ(0F*0JF8`0st@ZGtSFZE}0;ur9(G3v~z7+CTzWI4BcKPFdX`F1eax2Otv;ML z7cyxg;z{9|JTLa{0Hp@B+4cfo?SY^RTDs4$C@fgXvSwP%z0zEeLo47zDp``%G#zqY zNr`MBo@dwm8@sClk1ybQ<~8s>>}elZVfP@t;KD2>d8it^qwx{7FPG7JQ1}7GaMF`> zYT>E))~M(3WnEVkehuWlvFS~U)K(Kh@gI-7ANk&)jWhdW*Q)`-`cb!H1ZRb%H!?XI8>zrcg*0%VX^nj=e!4ho)>J zHLOwBG0W>$qpmHREuZWtD56S!?OtIXz$`PJ%wb*VyK1GP0!G=0Q-j;}XU=ys_yCuN zR95gsR#1SzS$Jf`S3`@5<48jJ91-0Dinq8B#pcnRfM|1KbJ5|_Oj-K57P_IcP_l= z^6>=kh+dU4u&+8yxLy$2FL4g|?c&AfWplG~`Sbg-d(r04k2@=#(9F%B+t?f5uV{5P zT1kA)V?xmQkcFTmDG*{OIM;WGUe)7VI`p{rR-lKOFw;4v>0+KyF?lXs)vsRCbdDkc zQ((8=LEV4GbO?V1%xeMh69@ui&*3;fdggs6$;QHo>s-%;hLl7r1uk${eGSLavj<~w zPV}(PG^}a#raaP@Po;-;Wj~I_pEw8}M)7{Ix2x&p*MqtNuhtU`a9Jx_dNxUQ!6@Ws z-uES2j<2VfWKIkNS{ge2ecu~daP@jR{+M+Y>ojwQN-vjS*RQhvfrpPV)^i5DoBb}c zb{0hwDbCH0KCO{1%S^e#mO;@aczBh`v9=QG-gHceo0wFqudE{zku(W%d3^_;L#r~S zerq*YLWYamzm1`M%XW1JhR!+cid=uX5Vx<3s?er?10CR`aShxzVhwKajfdM9m@l?TVc z9GkXc-vHA!qcyQzZOBrs)umg%&sSR)O<{EWDSM|Bm`I6BqgjV#)}kJz5n>SITCdFD z-02s51p&iDH9$(+E#V&%B5NYJiI_eJrn5i*PBuQTO5flbhjtw*qm5t&Nl zF%4cWd1W6!=^NxwiLDyg;+b%G;HRKNm=Z8NSf^37*dur%IgpB9XEM>32k2S#LUK>q z!STaP$O{y7Xc9w(9H2c2Y5lMz;5eFo3aCpHh^boHbJBqe!l~E>ya5)nTsX+ES0&7c z^FfIt=Qw!iy0b|fgcx(wLk^YeT5mpxxkyv)IC&n_{(mwdX3f0jS;m54r*DZZeClv(0ASTMn$Lo|FsSEUQHbvN=bQb z2X~#%<{D-+Ikx8X;kt1hHeEa)PYct-^zl77&Ymx)9nWW(XnB@PF39R-@4IJq>c1kYis247fWS*F z)BXOyg;)BT+*fI}!w=~y+Zq?)qWP5l-)o%r?t7xf0Q z7ZWNfCwXq8`XV(uMZ4)g{PCx34PsT{1#?C0QEu(uk*9TweGxU@@C68c=f`M+K)hVf zY;^GTf;xKwK8z!$Z`r{NB@c=llO zP;kPBwZJ_L69ts{8Ep{~x8bp=T*huG0r&XD(Y!${H%4dx%X921zS2%EH%1Ac2?c4h zaHZz&{!Y~cOuO@+g&dX!Q|LqGdGsqqO7?y?@}a8~loed*Aer!+!P$4ISURm)-SBZ8 zesj5UxPG1lf9-)E%)pQQa3lD*5&xVh;NP2YF2Qhsy8^%jlc*|K@>!79;{-cZA4X0q za{YLTJW=e!fb`e>97QG0<7M88;WJV^vF`;x8u}bv96>_Q;!70nBn9Qf=qUU@C&@jf z4yuWy-5-xf;vUmiN#yG2=^9FsT8fWZsPQP`Sa~#!GkU68Iz!=0XK3iP6fHFxrj)AG zsOY~+YPMdkl8%;?5J}@v`GT01mT56bN#xQAy$vRy|1$z6c8A3AbsDNRlHM&JiQ`~N zok8yh2NsVQqIXyuoB!YF?8My591}5Z`r^3X|J3u*C#8B)ZXTANh3drHgH0L7t5eNA zH92>ylazYBHqT*`$~|D8diEVWi`azm?_yKNy<(hm)=9K_%{)`w5_osGG~%A&6K3`) zIET1Y*S(8O$GBv~N01eF$dAJU3{Im1`a zGIM=*n0AplZ97zU9m3QXREvf6`Dw(f7{oF4C2+dlSW$EbX(-unV>w=1tJ5iQRCN1p zUzeu^c;fk%ly3H)KbJ>-Z!60O{37#$32inkk0e;lrS-{m^Cp98gnkm1Xaq z&IfhxO--EKd9hNkIm4OSnrqLHu<3@5alY4&l?ND5$DG_7%Saw8iIc9R?V8v5<=p!j zE~Kz-0P|#d z=Tklg%Y~-_{V8$BC16V&ErndZum+H>4s}}7Pau|f(D6RNEW5L(&T^j%{&)wKXfxt+ zvb?j_{t?+>TtMRqQ$CKSg5NQnn?u1N9w1{rV^3+9I#21P@B=65DuXB7L-9}U>OP~A zmuhe*ix@_(I{%5lKi~;_KZgP#VyPlXSP%}xxCA~-wER$*W_MoDlun`E*o2~pehMEP zpjT(-4z9N{qx_xMuq3?t9LHA7mRwSNhda+(5N0s_oP z_0TzeN@_XdN=(E~HvW5+c$@+B1cXIS%$wlrK50&QRap^tR!MP^=)0N5ouY8z+|D>O zm!(xJ%Lf}kE;;i8=?4GjA`SxCPIs@0+RWm%v-r)d<4vj2+g(#rlIo?_bzzYS?0k|^ z<-3`TI!TwqE){v4KG*0AGU)2-V-8u?oZ;B^;24u{xOv}he$xq?J|{MK4xqpXQ#+=a zoixg~0LpuRxEsd9t7%C)3l$*1sRji|Fe*WTQVa@~zAB<;6;VHos5&~Jm}HUIb~eikPKQKtL?8i6y`nw zL)VLO5Dz^u9ke?U@}hSM1Wm$(@fqU^;qyF`c@5>GNak5ia3958A!yLV{1Qlm(Td7N z$Wt}6Xvs+p-J?iT@(aVZ(5Oq*p&KDvA!-up$wVt8xmv1>oIbz_RDJ-eu!Zk^Cpvph z?BuUbN(7B>zY!zN9^_P!L#z-vdr5LSMLugtcgVmq%=_da!sQBi2Uh_ZHrSb<9A?34 znUG27AVO+Jw@%e8B{UTUtu{}WtSv4n&Yw(K{s&H+=1>KN11|wAl4>6!Pglp|{ynxN z5~1fs6of;o@Jaq!z_CoHg;q?oB3&rbm3yu+nQH}t%&TQqf}ReV0vt|Dlc#IoMW2EK z6s9!xcQUllZ^cP%c$spyXHLFu7$RmWu%SA;Ec_(1tF?#3%Vj_-_0F!%Jh>1Zx`7(w z5rEF?>8*fUE)OEoFMkm<-RH^k4b_t=H_j(dUXS2qpGNM45#4**4k6rQ%uRqO;8Hh0 z(nGvV)utCE%^X2>C2&@boT6e&{w&R(N_Er%y8lh1G5#fK+P_!@*@Vo^oxtYc1oI)JaTYWe<|g0cpQ3oD~7#24mybKv=9ZLL07xC~PLu z=WZ#O3gOP3tv`&!Ja|l~o=jlsR&Z8ti$fc}F!o#$_sF3Rm;1~HWidQ21fZZ9zGn3h zdybeYGT6$J#*m0(-k2JZ(M`&p!){hA+!%d}54eE)7$0$g z^{9Qv2iXAn%YA{i3a{WX7l{-eDSLqNH;WBQmWvYIJ6j26g%N!_Pgw0VXNz0h9XyTl z!{j48UJ9^_JQz6s!3vuH4k}*Y7tfY=iFE%DC)cHmRrnhY;N+VVQGDz1*rT&b`z>E4tL1?yB-q(zO2^8p=P(2Z zw*VEeVkfe|WO92kR-BCie+cYjSVQvQx9Gxee`A@!ptuLz{CDEKa`Ud{b#vi=uixwU z`u+aDf3M&9{hXuI(D^V3cUZ@JM5E^QDggtI_LK4N_L@lY#Q$lfj}q2CEw(u46xV_+2x3c`Dz3gb zD83wfSDrv#nbp9=FBl{4d}kT7|U#+e05uw$Vp}^(Qsn zX93X-r|beY2-;EWLMEm>C4^8x{lBEPu#(h7rusoFM-Ua3q$ITgCBKME5ya(XwNc>W zO6H(C?LO0W9@GPnr`mrg_FNuy`LhxA9PnGV$o;rX$3Ed3{wdF26xi zN0xJl*?$gZJVFJwgy>Obs^$cA<<6hj2e=(rX(w#$&Y=wM6EU_hobLxd6=FD+ypJ^~ zB(~xC47M+dnmTP-Ny%L4+V}Bi;Rx2PpH)`1HJ@?LXJC53(lf1mQH-`bSWs57*!lqm zn_m>5nQV2ir2-F-RUL-Q*K(kF{%%SJ4ME-R0iOwK(t)rCD$)%;Z-B8_D-X^5Fsp^2 z!+=;-y{9Oq$AD6>L>_)8CQ-ZDe^)N9)IvDw?mIAO#3U+Qq#O}Cy0x2?Zm}k~C4J{9 z|AGJr5V!6_!`C!)`>oh``1gT)yf_%rc{0c*J%=NGnL{B)mg=R+)Z9->JezFGWBp0P zuw;T~6c(oJFPjaP@yTfh>?>{?q6YRgSgku+iI~CoS()X;Z=NmXm2Huj%KAEem&Qwy zWUzx&tP?}T`wH77h}te-_$8{oga3TKM>KZ@lhp3y2;+YkS;wx4%94Z+y3Fd;9oMO=YpjLV~fD z#y|f20~cq2d7uCHzxCU_w8#E7?Sw6CWwNIIcJec|w$yIEKkDT~A?DTPCOg#iqui0b z;s~Cq2Lg)-hy}{f2a1$yPqg);+Lj1T_0SL@f;%kL=e4?zM%KB7f3D0#0BNd3Mwavu zwh%!WyU<2+QgeLm?GmzJioNXsuGPXm+vQ2>esAt_ArQq-a!8Q^_I&wV0}6pm$M!i9 zPMH4ZCAw?-oZiO10;;CbzY+cROOOs*>x$9-%(sSh9Xv#zT?SNetd-PnG^J6~;(~ul zQ2kkJ`sYu~0jBbwjVIBjN&Ap1lk;$;^@x5|Q$oCa-$BA?A@6u+v~R!NkJaIy6TjXM z%;CLhY|+G`aPA|oclfdDIBzTEGf{-nKVQZaZjr|*10ruX8OEP2;^y9|{rhPH;+tiU zX4**jhRsi2+K4wIjRK{S%k!xtrJgR910Jha0f$RbzBL97t4}srw4vooJD)B!%Zct$ zJV5f4?ON$BZE$}>D#>aebQ|d!+KzHn?yFeGU4Z^Q)pAxzU8Fs)E~2-GtFw@~_7dzo z`D-FXn!o+o_C1~*mL2txwnD|!Yn z=w3eLu;n+&R@+<-s-?#yzE|Op^Fj11$vl4&c>ZMZz$c2*c;u7EJf0vE$6THk`N87| zPZ+T9bps--y|RRR6-GBdL$%|&vRsCA>c2FgS5`;>49p!@<|_^7IO?*DBon&)P~f^K zcZWKzGXBL5l#e5ExBLZhf$Otej=f|B-UnT%V>L37yUZYS4o0_<%mYMJkbDYk28_Q} zLU$)OI&Sy{|B}dc!>8aQYTKzp*PSDEA;yxC>*>x}tX=~}GWdD?%R`o2>C%h^zpS}B zaz~y9+G+jf)<_qpAr}!%qELvxuF7=vg}mwHlup+D`gTW8!j5y3oNk{F_Nikxz+69Q zPG1kKrHKjBw@?YvfTM@QxFmw%`@s8ICjhe=Yt%{u6@S8t&Td=ZLL`E)2_Pk#(h7vw zKSn$#oP|%QrH+f^5SWJ&XP*w_kxCMG1M7w9H6zagk0)Hd;oYfYQdR^3^;8WcworyblSIWxis|+nY*! zRM(~lT5A>xGC@fsMH|etkWd#)6b^@c5LdhV4xddv!##jj_{IVCSW9a&b7t@7adqLPpWjD zm3i?Y3eE&7YHJQkAnBkBQOVP@@23f41%dx+)+!Ze@Tw?WAl*3=y7KW0!oxz`=jJPY zKbP$LUxDr*p41CAs6qlmfrNSY+$9vMQAfv3j$DK-2Vzi&0;{AAx;Q#a%tP-B3>%_x zqztX23?HC5yx0ENLDykJ;f|B>*Pya>Jn1milOqnUgREjNLNGUTBa zpF^{PPlpTEn*36l>xBMOoq-eC!27NOHngz{8XzH4oDHMt4x3k3^ueq8Fx-F{4Cicd z07t}T3_M6hvjNacW*FT=lH(mHcXase>8#0|on8v@mc*j04UA?&5KUH#|2hyH7$uOA zEQE{#ff;%nF&!tyWwiJ~Y0-?!L1`=N321Q%TJzPdKPI81wCOW&Z0RIJ)LT7nJdz70 z3_CP;erCORS$g$^$boAtmn5v3+EwRw{oN=^_hDe!@9-vuaE|VVbex7Ep1TT*SjKnZ zXco?v813m~%x1F!lahQ*L4{`qW0N=Yrba7Fb{>hI!z+=CJUWMO3unuajAlXC4xSA` z1eA9iQ=A_Xa?U7lWH(47X$h+h!Z+orD%n5vsjRj} z;{X2Bxky@OYdwGbX+8#zD=+^#C7littCopM(j4G4Nmd^Nn$j3S9bNY@jeH1fbzgjR z=eE2@;fdAbA?;I#7*7F*t1i=74{LaI{~=Ug?qHg6I?NAjZp1BboN`}?6htfF#8H;D93$fyq~21HnLJi}R;J5i&KWX^x*=x_l@%z`8B*NEx-`)N*7z=K~a#uW}&7P>SYTNGa@6N$uqFxqIH7JegMz*AFE3?Y;)onS2$(W~N{o znjkYpT4U1fksT7`@6O^0XlUCng^4sMGFNrVI=TU2kgjy+d!x)6Oqd3nNb(46WR20% zDjg%zI-1lAd=-oc+MoCYCGHB_cHY*7!9LqG?7?{Y+j-iC{@WMXh8P#MF7(gNT(8Ps z^OaNdm3%)%OA%-&(u#G(UD2aULS#QQ{41y`9?n)*qS-^@0gvVBi7{K<=?GAu`JlcH z-V9sjjt^M_mB4PRU;L;NYt`BylhB(2hW-cmzk&2$z}?@~b!BSu+1Ua%`cdZ1Da)Na zwK#{`ddjYAVpUuwvaqo_ zuP*l`Y6td@`}>2j_Xq8M{l>ez6~Z^uXe@y#+ht1XhrS270q?j)v_TA2ft_DKpNs6C zu)K$4cinwqmykAL+$+ecORL~PWn57eM>KYffglGSXI{fyS}mWuoJ!(B(um2e#XW*swohp4TQx{**f zC(yc-LX(*Sw!w3=DQhIgAO(Oos6kNLm^cqlY%#Yw)ZL~dyv&F*0Eq}I$Y{x?ggw{ zR3^!-uCg{qo|hdjn(Q&n>vxs-^nA9>uync1m9H|%XtLTQhai;5rmv6cbOO?Vf%Sar4X*H>)SD1b`rrkHfbtV zo3Rg^Do*-qK^Zn|ZDE2RU{hKS0fV|HrGx2-!p>WaCmt73G#ny<`(BQc zI^jOuz#sYh#mlss9YVfo)$`~JNae=Ux41`U3zS5fbSNkBHWyIWLA}* z=f_NFCCoVK&U(-|@Eo+f4PpxNxEc-6U~t2@!T$K7VIrNze*tYx+zH%XLP#weq;`3)!`v{`Uvsjw{KP=o>~v5?6{=CrNU@{6_aY$^p_X}dx?39*3g{-s6L za)5g05tyz{_M=yBP*^(%JRm%NG+V367sLMQSe-!!bHWCk;zha%-Xs%(Tkul=H+>e@ z{oek|ZCN_qRhaC*J{@7=ldkm^RRgHy{#|z<1XvQk?>z`07tnq$7FGw)!&533rClVd zacWyZ3%0M%l};aT@oZ&aaM*0+RJJ9_wd2ZjPXJ@t#{!Uamfbp*;^00AP5`5^&}Gb^zz=KoVRlq6vt1ABH!ygi-QgoooDcMwv4?Dc%Ct-V-`9bd8y zDQ)iF#LB_99X;FFi+kS(!Id7q@1j38@1q@e-sZM-;DpB`#@=#;dwe`yr$5QU!KKtTzd>>=eL*x%eY6-*nWr~;+58=ZFEN@eeKBksd#GbkW9f=fJXs_08)#3$0#o9N zMQD2TSmA`we}3qcCU7@`ZO|pb>5BxMFhAbBkg#w+V1qm?fb3D*0qH-H>xOZM`Kj{< zn*KokutR=1a}PG97TN?C-F)pD;l!JU+7uzt2sgDwY@j_5(4cyV0713-ImbYIJbClR@oN7B%`7in}!z7y|z&ZnHt@hy|A%>-El`1)AFH}N)#0Ei{B^w& z*OL*{g{1Yfjc>ddu0)m@h;I>M9;$`1ZwqBmFpThz_!{E^I>;X&pfoR&g@K7Idou2W z5-&a=c}>yq%Gf8Cp0JXJ08g`MF&uvI3n4a;UG5GC?fxm6I`yOZ3muVTh}|C(S%c0F z0d@hG1fO$RgYZH4rpzgDj~e#E<=U5DTWVQ#{=aM}9;r&u!JdQeQNHib!2q6dDXyuq z9fsus>O)DOd}R+%wOinvJrMQf)_Oh&_NAkJFoc-@j^z#!GRpD)b-$)qM=hHY%YK_b2~k`Q!MC zZJ-Wf|8kpm$Vm?4)ebKHKB@Th*ApfzKe!$%^~ODzdM--Y;&VRw2HZof^-zX|PR6Fe zwoMC~tc8>hbXAx?3AE0$y=^&5ksj;SL0d(k@ztJ>gq|oo1l}Ab;)hM@p%DsgXjFli zIs%8F4D;Y?F%7&8WLRrsG;gO5iFsrk$I$wrmh6+q55o0NybO`nR|3KPcwMM63SV&f z%KGvXc((Wtu?k{kh2;k8HyCx{_Vt^W*`8LACb6E zg$3A2xpuqtwpkfeU+ut=4niw^r|6wE7;ACm_K}N-K-FYHO;U}A=bw#vkYUn48SjbH z<2(hyYhr|Y@Dx4*7U105E)OEHc@7BoSvXx9bm$MnmSnw^Y53JrQzOlVsw*9Qg+k{j zK`s|If(enbd{7Edeh`qtY(uGtLzAjm5bJpNAH_Tq<#>Vv@=O8Fp)uD7M4vpezvIY% zfOT7__z+WqB?%NQiOFpI+GiA;VfHha7z^0 zN%hB<=6Sw$yU*9`5vKGVTzf3=SUebcwAr$eF4 zp`pF>d6Ttt-%Snf{og?)FZAXt0^>0%0~v}&5GUx>HXpwQhFgP*?Xa-Snc{nP3KfJf z)yvpJ#1eZIh{LRlEsRQvdP;g>f6wWtD11K>ij3_%#Ll<&Y-%ZX$L-Mly3a@V1ufgn zH&M>R%G-+YSCBB_XNsa#{U{)nRY-LC@?YIV+ydw##MI#|8hP z(N1XGPU#%!XOvUE%6I+Wdy|sxyUdi1MnOe2+e&yUMSI z^0l;dhxv$VJe^ya=#?mGXpYnPp{&w<%>tTVH_P!go*t{n$H-(AzvSCxa@l!I#H_Ts zie__JzV850K(4>SxX$-k_VZc**ZnTbXaDAZ{dfIO&wtcY`Tkq}O@C7Zf7Dah2#pl| zKYE|T_}qHCoz=&!yWV>H-~V_0^XOfIJg3&QTjJ1ysQ)+;YaXch8#mp}Rj?AIZ_b4b zu7$t=JYB5>>*4(hSj|ZCFe#>GD^p;t0uBWAm_KiAL_Nxoh;(mlKs~+$Fhm6a`U*U+ z2|aKT1#Sba9;4st6z?HR*T6*mi0G7i{Q^Almb40yM^pBuT~FEn7{Bp*%(kLcyR~uY zEdR#198@FZjJQ?k)7y%FlR{xpF`&Y z@4<>xUjZXFJ*yXU1-RFVz+vB-|8x;>F8T;qEkE|PpiVy5dA?@%e47pPL^`&(z432< zsssHoUGCp*oAPOTA7Dnh0LO)UfROlR?|-J^4sZ*49d}JsVbn%36$fQnW0)}sJ6a2) zT7n&NdOjmjCEL?lE?kU#-b(cR$HFMV_9>CQ0lYWWs4(9zJlcJxG)b3#V;g??e{ZIN z>WC3PetbY8X7~e6f`w&EL|U~L!FYI1%IaXGPx@yPx#D9)4|Z6k^E|XvH2yAo4WGhi z;xp?r_nGdVd+pD2bI&f`PZ;yaHR20X!jdA#oO%?MWnVA0+TJ}lf|vT!}TLEf^Z+F^xc&}VVk}Fu(S{qU-^cOLmEGN-<6__(YI{A zk!?v=iQzjsLPrCVyO2}T^fT#nY0fIBqUjc*bVdGZ8fGEJnl^it=;!{-`g#8ux()pn z|2uo8=%`g9i z$jSW=ha^+qXmLG)Se*yRsBX6%HuLTHMIiHuMBVMrYNy63k%PzT#vNHqK(nVQth}i$ z@Nw@VCTKP%pi_b>H$xUnd76LhNh1%!BBc@QkyDNg%`PO$^w|>av+&GxQZEIk=?cK~54*Pf9fY%Y*1j~p=*X~5)Bmx{LSQq(V9L*PJ zwD^7iul`fnR(pi?rK}RfY+7&ep-Ug0Dp;jwCSgux!gGI(Pbl1dxlRzBZz7=Rg{Gv? zB>a70A)5|u$d95VB_4BvnS&odNMzn!geAlJ1co{1ESstZ$q(-m7;;-&-hYly(;&+;ore< zogG^-J^A2|sRamuybm)??;gIqbBBw)#Q3B50|8hN1|Eb4jlb} zY8?Q5pH3qFy#E|N>@Vxn@~2$J@}Rp@6Oq3 z9J=08#vf?#kZ)exk4XjN;pm``t$BL)syyTr_vy)lsLw2;%%!d4tYKxlBdLMw3?%(Q z`MY8ITVM*llWad%Y#V2?A3JS&4y4p=fy%k_(J8DgL_(oNqy zsy^k(Xy_r8fD+~jqOR)wbOZ-?ba!2LBLTG%l9@|E0R&%l6?JJ#qvbN_RI4qP(r5pf zC=UDU-@X3(f!_D-2i%_U`@!!gzlYu8_wgz2?PQWT;w>9uns8O}2Z{lM>%c%R{GsX! zmnkku1kEt0AO`a~yBU!W9#C1??NVHtxTy8j7;wA~Ztl2J%mQyes@_Wua8E8Wt6vYi zD*tsX9i%wo4R%l07{hi@%?rLzp~{8_Yb-orR~UtjEKCe3h>S6bMzJk`j9>soCBgMa z4ei)th`esh-Mp$YS{@0&se>}oox4)iwE@6DMZ`jnBima&~QO%W7 z#vpdtD=n|(%&Zh8GsUSk#-zM+Eq#vdlunXXMcBuWISG!w$a{TA0PLjv^RRtlRzMSk zyKnbtdCX6e@he;yrf_J(oIsXedeUk~%@eE^sAM~u|$=+p*# zM(VmJaHJU(OM=vW57MM55X3RRN{u-|)rR}Hs*z{~uOk{#sJqo7^>)HgjiJ&AS#C>G z*`gx_nJbcSB+`q_m3q_xhG&^7Js1Daeq#USs9|fsSJDis11<4M_XhvIz#fpmKb&s0 zARWgi-;JpbtgXF@)A=I0rcWWBdj2xOv@iCPLO^->Gn;#i6=z_w%9-oz#Jv%5u3|BY zASeyWGEqcY_5l9U$0BG~A7Y1^G&`G58mnB4I@^!1S3oB(Otbuxv_mj0A6RwrnJ z?`6R9PLL58N_ZVIP0pdQ;{z2<1Ijr2*1Y z33`9U=t}M$mirGdpR>Dq2G6$$9?R3Df65aI_N&em`dsb!wL%c_Mk9QR4H3Q*=`pAb zejn5!$O!XqK;CGo-!Y(~Py3x?!f&5sPa(Z&>hguX5OBWZ;b`h4oy|kz;a+lW&zQF7 z2MHju>9<7o;RxtcE zgQnO~2hItgAS~-fIw1n} z%q5$?jb|}<$I^NtpGnMKPV||EOUV2+3oEc)9m~+<8Jk%-p_3=D9@HhSrsmjA)(D zUIBIyagYN;clH`pmNrq7Cqrv2TAzM$N9aEDG7_1 zP8@%mF@9gaFW;B%%lGB`^8NXK{J(x*zc1gH@5}f9|CCP8+?CtnE#!agGuloPW?!(6Murg#XWcA<^lbi@Nu|^2 zby`}@FYMC#`dS(J>8NAS3n%lTJvcf-d++B5L{E8X!RLwZyqp~IJ@*rX&J*9~oCDQ^ z-ZF4`qI>J72bd?hIl=eD_aQhusXdiBM@dSc7*oZt*~C}6u>G+W$Jl=eisNiOxQe;3 z_u?yzu(XJ-F2j`(Tuq1fh^(c6;wyx(yNCf$Mu@4F5*LlPONAFqo*J1f+d5>>Ew`|v zx#rv6AX|}VFE70h9jJ|_kB(+NUQ5`Ys`p>DX*yx^!Jo>cc^3i`g)%@s=C!HGex<&l#SM$cF5!yE1!)?Qc zTVKNdsIwhSm`{3?>j#+y{O=d@`ks@{%slQtThIzt#u=&d-}6j=en231MJtPceo#Tw z30X(?;i(b(Wvb2n`G6mqhFfw*d879Y|HbCF2z(<)j$l0d5ByJB@Q1NsO}WxN9POQN zHjDvf08#fIgVK8S{H`Bbq;`sFU@ zojo<4wY@sS_ROZN*2+`U5EALZ0YJJ_5A4;DrmX&!4^#Tpkn{F|SFGCDJpf5#S--TL zjlo7VvIX02>7Zm9Q==G9va8nwYi)0?Dr(7y)WC@CX^T3V(TI-CWvAytIj2h!I|HYC z`VRyn$%xtVBz;1WK7;iFW^jCGU&;Q7+s5ktw(+m(^Vobr9jOrJ$BX zIqfOdLynh2nR56O^W*qf|K$#QRQvyaIvg={Ilm$t_rVT%MFJeK{1E46SK@~~|NcjJibx`O1h=($V0tJ>h!Xe4Svh%a~(2qKIgdTVF{jedv`~S2z@5e)Wi0E&}j)u_d zA+%t#A{+F0J!ChST@Cle@G|*v?!$8mXn;DEy2xWDx(+q=IDRl0JR|Y6$o~EN*1;-4 zVet|2p>LVfBa{XmK4DD)SM@zz09$ahVA!PiVP%6Sf`3GJX;NfWWvQbCboq21;h-cx zE}93a;sOiU0H9RWpR2_=?d==D7`{EREQS;=k`EOk7B;)zdj1|gSs)O>xT%cSLwlLb z+ggKGExx#^8xH&vW?C@~yDhwKyx z*W-;2Y_s9GWuR@ik93mC^;fd70cAuH?XYa42VzQ%&*MwpuS>~IM5ap-#;2xBX}_m~ zI0>rung{FLz3S@@n$uiO8jxYHqu!k916lOA&oJkMWMq3hoE>)WjgP_mbJT!$ubUPO z9l;>Gpq`JKgGQMj*4~{C&=FO)+>P?cW}|RvvRH3S^yjQZSKIkMF z{`52;4JAE-_4Q$~Io${i#b8Iw?mcJ6Iqwa81Qd4b;wIukL?51N@3d6Yoa_yztk(fW zHY08jH*aaI^}svaT2p|QiB>JQO}6J~sgwSYUhKF;DOe$UPh@|~ZEwIQ{WXw~a{pE! zA1~h!{AkH?XU2?Uli{5`M8;N$w&{HZhTaE>unny)Pla;JV3uS;%r+;HZBQ%)n_jl| zG%guvPNSqh%S!xsxXE(zJQO^tuHb#VWPSuv=^c}?3nxZV?gKaa;kRPa`A7SAzbO4KsB_~`rlr;x=6>bbXhe*S&&sOp;)pm9o|D#{7!5+Ng;)@Dt? zM2y7~nPGgkHtEe}QBT!pjpe^rxijW-0~1R|^onE|WyYuOPX<{#Vs!!2z`M?OO}FDy zw%&s+ecm}7Q@M`MJ$B@rDZ@1=-+glUEvjUK;)%>NmUFmn6P6$H96F0J!N{J zVDQ}fdgw1>wW^!E*1>v0Y3D7z=&HF1O`vY8B`e0Ks8pDw8c_X1Sd$^usd5@`O_M9o z#OhO7&fk|dvG`hKr%Db^4ZZ`Zt25Xh@Ee1K2%TvcbLnzZv>%auO#{P=NbvWkO??l; zW^@GAiXub7_U9sV6TJ>rI}x2@YG`H1VV5L>ZJzGd#pqam9sps0yNdJnu-=?!Eq!&f zBIZYby#_}b9Ii}Wj-$BcGIHsX*l*sV1sJiLY&}toA=n&eN}TGvq`SW<+vzHFb!L=%E7u27979kqGvHD+e6XCP=vjd3 zuGVi^R1K{ogzc4?hP)i=`3_h&=t!#F0ZcjtFkN!QJ^u%yQ~%z)JpNZe4o~?C7(yg} z%isUr^czbb^3DHEni6mNcyt=S>A69c){{Y?_zM=-K&|Iid;Lmh)46}bFFv1?D!=p5 zeC~lh7r4$P+GBe1uZ3!4sP+#snHmu|L6(94lqnqokL-)9|2C#o@Swh*cQBO*RiM5l zD`_PvI!BpAbz()q>@>R?rA*TQI;8GascP*vO)DKWOm7rN01o8?`;TGIH)boOZ;2ZL zo9OX?8!W(nNR`4r>65JfsD}e<`q{;ZWhnVZ z_Evg^iF2{$q7dmmMxdMvn-KfXPNOCI?My+7t8ca{t^O`_!d{=rsF+XL`85Gz-sov) z+$aXU^}k=>BZ1%4nQ^qnqk)z^f;YugU9XAylMnH{{k#y^)-OAMfYROchaPjEl-i2w zX54zLz+`Qd?Z%wBS`p(hsb`C&a26#;xp9P-b`HSrS&8H9ARvl}`R3u#WI=LZg4=6; zXv9R!CT;IkG7(WjE9k4d0Y8i2R7gRUe->7txIKLfxDxKOPp_U*)*Ck~v~92SMQJ-L z{p>8~WwF8E8?c;w-0Ml%e*S|kEDcPooyV&$nk0ZY>RJbjk9Q1aK%MR$OR|AGGeG4x z1H0%zotk>(EXlI%;f&Z5xe%vzxoq}YSUuyVgY%e~oGWx15?X*I)oKzAClFz2JB@eW z(9GMm-sa_>*~UFz$V(4`96Qm<1QZyy_8d~Y z;)k2?u{Q4Q^lu6DEa7?_d_612_C~L0_=L1T7ms9-DajB4fc1$J$0R@oBhe&HIU)cu z8sbE#Buhw_6-yE=Q6lo9Txpk!sU%Q~ev+z|F{2o(@-*Ts;6Z$iDyaH=4S zp!Smd9uAV73Hjm7$W3t}BU`fj04yp>hBns_kyo^@8G$%?)K0;SB8;zZ(Cz_?<3k>f~cG@lsR(o`7nUv1>shvQ>#NmTIKAB>Mw_1KRggH-ickGGFh zU^qNs0#SuzY=>w4EL6;elhwHOG_B{1DC$aY* z8A=ZT!~Zb#tOxplDFYzR4m5%V!S9D`X!|2iFlZW}@Y^7-vM7EaSI5ROptWfBHi_Mj zIKXqH5_NG-Wb_=nlZK-k3h{m)b@V9hzAD15Y*=Vy-SaIz6;`UgXo{AxzwD*S6Fj2)5pL zq$Kb5He<}25sgTppj>Mq_vVksEh{U_Lj?N^x-Ii)j%$Qe)!g+Nkorgm0o@mE7(UPS{wD}%25oA{2f<)O$P__O-} z5q{;&1{snjerT<()vib|t4nkWilF;o!(ND&R6fXC<#n*{^DumJgAUpLICt&BRA~ba z(vRdYFz*O=%!3a1gZhgeaI^D7(H2~oBW3mA;aK=bPag>N!O_reOFmdIrpxO{*If)8 zEB6v(>JCq1{RM|CHSrQS1%2uc0Y~J9+{C%#+OQ^xsEi-*Uqso%2jegw=PD1DJsD%% zlztRrmg0}|6n|hp z-dOOg2g(!{<7im?5~>&t(LlVtLTmg%q3vm7P)Ewa*^i!3@ueSz0b7Z_7*f+^MSNdU z_t6M75t?$Ac1w6G&R}~k^O&E&pC%EPxH@engd~UUn+E1cb>!CaPO!DMKFDbs5n3%N1BA4^P&VJO;X0Y@?6|D5v5<4`i8(UqG5Ils5 z5YnYQqyg%AAzz+%UM8cnSP&)Aon)FkVYe{9mg;c^FsC<7-#51ULb^)T8dfxPkyLp{ zNEiYd+*%9T;cWQ$d-LTt+aY_+#21f(76n9)fcx&jyBB*Po~S-j+)%^y;1A-4LT6jX z3^P%L|Ew+ZlPeEyV(UgvbZhLyE;i~}_Emfz-V+C*Gz+ApJ8|pGT~e32DfF}=f|b|8 zG%6L8Q(kWzp)2u(LgzAhH{m@bhn4JHoBe`siPksA0pAg~@3Pbb$%jG#Kh^eHdY zA2n_&_|zKFhq1M1Z;a}235oJ{HeBptvbOt=_>tUos51Bb?yNN@(^AA{?06<{c2M8* zTTMgviWW6T|2VHIdt~`3x{=B9LCw&l7t;Luy}d}K*{4ET7F)UTpju9vkGv5XV>BV^ zLNt*3VG*q|;ti0b>A3p^+R=v){7{W3Hlilc*ob|JbdMBYaY_MEVWaCeQUXsoBUzkf zz7ar%B~!6&z0Mlbh=v+#m3j8oI%NWeK{W}jl=*OqChA@grhu*`oRHoL{;iOZV776W znAe)vk7IQpN=@id1G2PMGxO9A-OWRQ>8uA*P#rgb>QV!&Gr{9}dq?XuL4)IvvP2X{$~&4CI>{0sm5h zy3jcdVUa+#p-#jFjBD0Jwiw58Iy~mhInWNmg*L2|&{^SmXIR%1FOJr+(*km^bS)Bh zqu7?6onxZ(Z&__nGUB{M#8`q^IH0RY#^I!P6&rh|mQWpGLclf#az#2G*I)gi^ccTb z&I~>{t44kbK8VT}oTi^qhKI{S|ZSMUC05!LlXLq6zLOeJRE$z1NL~TrzOB7!*_=m~nD|K8TE;#3jsB_b) z6n}i$sgd-3=%JsUua?TczHkwx`_Us(;=XVrWonq8hmnSaoq8b`RuNeQQ!CcW&%1V= zj7xC8FD}V($_22DRgh`P<~}dmS>+y2OklgcF`}E(Fcw=(#7?x#h2ZI#iQbw(S^YCXQfZ__4m3}LyGFxj zWnYRE#!S>1M&Q4*mbUwW$EpU%bTNst7dbqu=0UYdLZ1~C>m?{B*ppA4^k+AjnMPt| zNcBiS>5Zei>wIJfSet#s2Uw?@RR{h+*;jYTI>hs_i8{q|w-_>H=p5U7fd8YGt6EG| z9k<2y2S0CzV5RQDQU*2#o(0yz>tU&Zu3z8!{&GRuJ$8cC-~TN8?v}sntfiN zM86ypv~Cam!~PvJ{a_)0`qVh}t~g-$pF$Qqa$#fqF(G$197u!V3Adg4Rzv#SEB6k( zA^A&OXYVCK(@m@Ry?sHhE<81XnSrm3^2S{3e9jz)V^MX=wI{q7xSL7SR?6AV zvu|fQ*DCDk9t+2>vFUtcmc4SGc0i0^BQ8*pa+_t?FqJ%&W^6l*GlAl@iEnw#uPjQ* z4G73c9a%cwvpt4YivHy-Cvie9vo;Os?VMa1u;j%EquR&kr|CsJwvg17q5%XaorX6? zZMprjVN9WNj9q0@f%Z|5YIWr6Q2-HWVU?0O{;8;+GQ6E=E2IsJaa<(lK(2pxJk;wO zX6fgeS$JmFXC!B^Ss(f^0g=~ZdwEH~&1;`I>axImUYZS{RLLD<&u;>Syb75~n2{$z zmQs8U-(0uL{|vN1jI<+vNxnX_fLwkK0-b3RcdFhLr%2o+vwc?Jrfv&xIJg}~;5-Hm z(Va<4p#WI~-)5AaB{^yo@tU;p^=Zy*6Lq@;cb^^P3-= zIkEZZc03G%RpGddlK^e4p_b7h6sfZdXUZ8uP?(Me4=YCsO??wwNtl(_q94#4z$?2! z59KKTEb0efFnA024FVqr0S?H0JLo9%2mP8 z72VjCE(~9ELyRRM6sNjS@d8jT-=bzGx?OZp51b`E(+GxUW8grNFr)JW@_ysz0^vu3 zP;!mv4tDUEJ8u%bn5Tx;B^^Pw*NV8>O5aDm_(*kdj-AHTe*fML_`*cNwEfdbYWbp5 zfjpIaAX6Rh;-&(Q0fOg+|D49t=s>@7?FuZwluMg4^bO2>VmVPquHpoK71-vY+@)*a zT=&0rIph+9r+}2+iVPBE;r8M`w4NXAyQ4l@d+^I1JVIrQPriPnA? zd`+W*Qhg&IG6vr&7(y!JW)IlIyPJXp2iFTaAsz2izGy40(pgD?aea;1U`osPI=1YUSUqN}vED1Gr-7T$HxP^%aR z-v|rftk1J^X_#v!AoC<4N3(F@rB>c|3{GG9vOrz;07J)=t4#d{{kVsvDei)ZI@S-{ z!KO0?!t1U|R!?ILF#IwT0&$jyKZf3XI9(mlq@TH8oUBA|_-HUj|Fe8sR&Lke_uqHR z%{5}YRFvv>D26+Gx0H=aAV!j*2Wc-8{ZrDl3Xa!89kuAL$dfja@J0}S>>+^Gq|F*3 zZ9&egp$ee5NU0taP{L z@W(}5!mewT$MAG)lw+b8)~;h#uS6wGt5jj=+O>I-uIQ`;W0cz1^9;*nn7DswC3pL@ zFB~bKpp~Ld@%@~aT5o_O6Z*n*8ra(}mjsy|If6g#$n29}sLq0TY=uVl*;l#+4zD8! z4o~U=tU#tp1G_J@?#t#oC-nyu8d{$4lK~p7LUD9E8}%KHQS$?nQC9%9W}MbNHO;17 zh#pPCX60FsQ;rlL+P4(>M{te&d0Fvbx2^gBf{^bW6EO_=(s0x0d}wh7!=ue)gpxPr06H{nDh-5MrNS!q&5l??xV(%T z`Hx0cxBHf)b&UUmRL^cWo!g26jM4|jm+SwUR+~i zUdavwW7!hjYab{~!;5kDio<3p@X4JdX2nSO8^z>EAiw}zSNpUMhu4;7m%z%29?w`y z*u-#%(2v28e8@A&mS*}u6cFhc($q-~U5dWU*^jywX8MZUL^ZqSL+@k{7&ouUY1FuB zD~$fA&HSh|t~2XKZxR47a1*-V7A@h6kpe!&k^bs#r6z6VXZp*i&yLo;5bnPt%A|1l zo@f&$sf|M@QVHi9t5_7&a0`5FCrZc$Acf!{TrT*1dk~ii`;7Uc*suU2jqSc4F{cx@Y~pTvP}&6Q3}d?+A$a29BYC1_P8}ufjc~fZDU`YBF@! z6E^2CP_THCbeNahEL z>WpxoOL)YZ$<`0BVt*1nSbBya{(psuF(CLR^|h^_z#(?MTz#Ctnu#+LZrlOjZLLsH z#>O-`n{@9Ls3`-+y3K9}F28tz< zBn%H}{b|O|n6$!r?w6-#>9JD@@9;f3+8|)u3Rx%zNstcumbPxNg4nt)vsT0b2Mo?d zJFCB%SU8nR3uO!|0c1@quN6P8K1R2Zh=r(Oil16)BEKw$Xxlp>os`bY=X3g9CYMj8 z)oFibl$qIxZ35#Vem%1k4TRNOvLNKBWV+k9Yzl_1EQe`fpVGeit~bIBUP#B1&c66n z%gvgGK5Vo*3APWRuPrZ~LSn8grgaX~lq5S9eTC(lXHdkF#(i3>dqgNKSFtNFV?o5& zYP7r261yRtgX&mm^t;l~#uBp!4`HMv&KQ>LAC|-RX?La|$_f@0nqBEo8BdQw%8@2g z@X>OZvaHyqB;ziRffa%=U4_#&_Y>FK(%||^@+fDg(&=v529e8;q<@UV{0jzR-W4Bf zwniV5CY6g22~d7KAwrx>5{gWe-YlTHgy2VF)gX5S zAM61zCz1<=FM>6XD&+hi^{Z4f9?XyhCM>EWTDp5}gc_=BVW| z!UHHn8Sh0OVNH|iCC5*yrJ^z=JBXZ6V2b$(xq)hHh4^Gx#h+7ykzSa8kND(Qp=Hs} zSTBJ3P%+E2^(PS&3s_k1!*)^t=&;_(9dk%w$Xfps1+X|1n#v9s4ATb%mj$pe)vr@N zM&YZ1fC+B^3lXDKH-aa4JEZu_d2zBAR^3i?zRXJ{VjI{`!zWm077OLxl2~MInQwap zZlprUQ}F!x$y0cXNby( zF2M2&7oL3f?5NyAFFdHP_W4l*-x?nX)^N9ssR)?&R8dA9A+tf3gXHe1$ zFyNBF4+UXgvX;R`@4n@5pYdY=o!}L(6d#B5Y`%^Zs903xfN!n?9OSBlC}gzZuae=H znP91jW>`RTI3&4m6rKW8;R*4vxM)qJY`Y{f6J{YYKk8jX%y)WJcF4>0M}c^MVi~u1 zQ2bt*_^sfFpy{6{3kBljcwVxRkU(tL`jcXT2B-O+-W$)UvCa$`fiK||Q z3TH5V$Q8;QQm|7uS6YxvOSA{4=1NZYcw>m{u<)Z?c;9#uc2Kyx?59+ordTi(j_o-i zm-mC_jD|C1+hoC9eS}an2~x>StO0@i%K|Ghg$PhN(DK&DbfLEvI{i+HN(ZIHj&v2wGI?1T?WSi@*{N=IILx&pOXa9JPyI| z0m6UVsO&b~Gy4$HeE}K0PL}bhtYATgSHN*~V$Q71~^-3P2 zTYHqT35u@T9t+R135bZo%&-{_lo%Ack#?1sFq5G1PJSEA70?qP9rP2qe{xvy44ZA` zYflc5(yg}y7Iv*}yay-XHWK2_@^+)|z=f~O1tLI~ZMYrd7xqPyw!u4F`~`ptzVi_2 zOutl2Lvcgrv5mp7%Ly2wL8>uBppAk8A@0|zl@^Unr3bkzjt5N!UgH#SBR(xIYtR^E zYjIj_v0HB^Y|CtDeJB3M1_{59wp(nURzx)*0Yp$x*nK8%f#j+cO7%%v5%~)xFG}D6 zcE&MJHs4>zNeM>-qFS>#imai-1x%cjEe2~8=Ucp&>O&(@cg={68l#OF~%&eis zRyxC3y8OmM5N5CyBpyYa-~#Zq5$=+)e`}QjpY{B48RbbL1D02)w1F0WJWbj{M_37@Xz6zB0t*?w{J2b&o)^jC^U-Y4FZ?0&NC%nqZ%X z-7gMPUw)4_D@x%!<|u`iuZmKs!_gsdKNdv@nFEXn7u8OpFqvS>$6> znY|WR3}pY{$t%R~(&W6z@M!=Gb0J7YT;?D3qoB)|wZ5x>-=0IotjcoCW1$aUIhVQk z`e*iy9Po!+Zi7I6AubJX4vZTggl)K?qSA`#mjla@RLHHj98yy(qijx%LU)S%EI@da zT2*mAD`;5`S%!UHDsCxcw5)dRw)7h#qj7kOZ-gKV2zHAfg#uvPPbb46+RL3wZTHcS zy)H+H+gs8R336?)=ZPP)SdIJ!+UrpwuteP^@(+)Mq_y=YFvqpGfL03m~+2WOahYZu%$U6=*+j zNBM~IClzTk$^d^)@+APRT!5j_o%-6T%}CFEiA(weUf8&9^*QTfGNTweefKs zmW+0V>YetVPKKMxr`8qm!VNg?f z6y72qgp9PdNLkH1wqwbC^-Y5c4iT#&noiJuF;mX>woY5c!0%#SKbPUpD^U-^`o zn8@UR?8d<_rOZpCKjnD-R-UWM>q!z*>D+z0hC80abC2BSH#O`SFvVa)DE*XG=$I`(oT6QPfnR940=|fP@r;X39ed0{f#kvj9RS{Rh~zyfT2f z^l!ufvQ5Bz!n3-6XkE3)Nvp`K=!+lmbYxaTcQpmNzh814GdWeiczUnRih2yS zZkM@VVynqe%E>se{kw|ac2^(oS*CfFWk`G9qK_^oUy zHzr+7C)|>(oJ<<4)Rb$FUe#W|m$tE9)wJr`q`**P&};PqUiYoA?t_3XCVIS6m^-B& z4F+l&zoNHz6R?FhghQU~c}JM+dL4F7(x(qSTitX5yZ8028Z~|AaAqUl%hH=~ZoV#Z zaD|Uc7M7@_^Tnr|VsdCRVsp9aR#Qs_; zkD0f6ud)OsHuI|lxpl3z$dE9Jy=7OJ1RfCoq?o@O>nWV2;cY6wRB$pO{PON1E9Tp)(paUD^_XGu#Jk zYOHj3Cw6MJM*P>(vEt%F)|HJa$R57pzX~hA-7{~YrEtkY2;mTxxh98!(*b@iLVkwt z_Z7rK-uqb6l7GJUy;bU|Ql(W$L}DW)BML-9m`E{*MF1*EVt~|;B&i}vC86jp7TI+w zguJ-Mqe>F1$}U~nx3dE5al6|aZrh60#z0W0dJ;jQP#d*v6=4X+>OBZV7D|#rz5nl2 zkP%yQ^D}RGyv*Ki^K+%0Eax{joZaU)o6z2d^mnztfLq<(uJt#gy}j>mV|mT|7~Y2T zj@{Ns+>N?d9`1WmTc3X2p-a*RsbZ`61p z8D0T2gU%@WwXtB^7WMj~AXghib9hHoH}Hr!PHK6Y=jxJhx4IMvhRXj3?4;^tTK@lB zkQLu&n-H!9vK1!1e}O)f%9ZZ)=}cWO@MjXBo&cEptUy#f9V-6*T_EixuWng4er^`n zIoe&I5yK%E2tnJg@8c5Zu<7{WLFU7m_MFVJcQYQ}JjvZ#0XXYfU^Fe$g{1TjC=brS zN2=%TVSw4hDr#2h1GAA})A_HwfKj3tNHqepeToD5HS;AmGG#<6StiJFe=J_-Il0_! zb3SW7HK&`b^Jm-V15PT8gpXM355(^z#hpvcqCQO&xDD?`C*gkX$P{$ z$`Ln5ANyYMnu9GoP@2*bxFE0&i*M7F(boH9n^F~tyl3@@BwgSnl z^z97*M0FqMQA*#m9tn-+kHa1CceWDV^E`J9XWV0=&?Mi;s-eZ?`I=Wal)$F>rF%P5 ztsk%tC*Opw#ZQ&liCS-n(ZZ&pqXdDVbvWb{5Azh=jH~g@2p&WRkuO0N2Lc)1Rth30 z2ZUk)I~08?nyjEVcIVzYpgH^&9fF#uqBo1dI-wWOn4@Yx&=5We&#+}GTZnQ08PRwF zC)zKH!^I{5>q~YA6Ny&jZqu?Pt)~4z za7-Yn#F+}e(fAGxR|eYwwvUN;IC$AGqK;<06&yG`&#-l;uE8JBLb#lW4NC%j2@_7I zcY475T$-RRvT{Sqh<%uYqq>29Cw8nq3DpXukZVE$V1bj03hSn9fbWB4ZItFKwV}pa zY>o=Nnk+8<6rcw+J=FQ%TZocE7R1fkNg&jE5}WCV+K7`$-l2RyfXy4*d+Iw4z~_WL zDNW@k$ke_J;4xK5;biTf;VvTc!2bqKQ@jWR)RJa6Femi$KF-~;017tvemRtL&1GM^ z-xYifg*FY!yaIlDhJgG!_|2fN>1nrKNU$vxgh0-v*BMjdxR+zf3vGvbKHSBYx5J<_ zZ${Xh(7p`Suoul|?^^AHRMqbKkv_z&!}3E>Jr5=FTY3Gbxq1@=FSefGUkzK^Tn-iX zB==}N33P5UccY9mz_oB}s055KEpsK&xr9k|7RK#FDJ{EdO{cgSrq{u1!Ud3+^vmaGLSWw9A;69;B6a1}o?uhB(4(lTi@N3nHPPIJzb|wnFyv`XJj)j` z$@jN-Dpv7ef;{-JoR|;Zp*zm*0UGcd}+oT!xc! z!&ql$k&F)%0O1JrU?5!hvHOVxtKDf^m2OJH0?7`3!XZECB#D#$fTvo|ZG(j0xcUR$ z0aA|SrlsP`_Mnc&@_D*XV4n&Lo~y~1{}o0V<~ zLvo?cCgi6$B){oI;y9Q3MDNuQfQgygVc0BAf2Hot=l8@Ygs*-EG25@pF^27#$EJiI8!9}$(2r2yTt0;N4{VY zj#o^U=PLRgZX$x5NIrFh6O~=s$9@n_B+G09HV$zv!Qk zAIOvnar~mFYWX3WAmvr~ajmHO?rV9$=do-&k+sE7Xu4Q*t@`n@NHpD>X0~D|AyzG+ zKM)WF%=;U9WKHCc%S!7H=~LrsBruV~$PRp|hd7w6=|}HkPc^XeN!_9B5^Y95PZhqD zavav}EaZhdk0OqV@Q0S>@ws2XXV?D$m``GFla;$3a3ds+pB1{n_b|dLIe^nX6Xhrm z-wu-vwj)~waS*?bGHf|)P+dI8V;q_VtR}z>#IyMdKMx?58*DDhJsK;Uv<}vrS?3#OTz1Iur0}GdWVx{p5U^32|*#`v)U|qHlTNr zM6+BHhh9yrPUTtc4S6=U6-1I4RS$|r7Bj1C2fCB>t%N;f-0{I9o;hoI zyvl%c#h9fVCYB8nXfO=}g$EWH^<~6y#sd2va?_4oY8V#m&!#PMs{F_ChRY)q;xo>m z-3Yzf23ad&k5lJrM|_}psG;wbw=vfndOSsKLMl{?x78*|uR3OI&>}So+1a?*9-t$4GvoGtP*#_hZ$M!%)7) zZJr6sKz~T|=3|&pa5($=)B{89^FY%0bb<6y+5Tgh0x{OOYNDL3IhDNDRGfchZ8at= z9g5oNwqe#i@Fq`aln7P+Uy1^~fcYj5_Ns5L$0BLIVkUd{5hi^ENzF(6s@%te2J>J) zzjCnVPbRXY7`i#J8+f-+-D+h9K>+{=4-`MaxY~71nj~^{0=US@nRQ+eBIyt4q| zuwyJr-N$yw`rTNfi`8qEi?$N-{=T{}J;fLHb;bv{;_CIv1KgQ@KDZJz_`GiT2Y!d{ z;-}8_xTDS%KA_YI$eygR>rEaamh^+{4R6^WL798*1YfG{?kB= zaU9ft5kv8flkcWXYznDbk4exi$G|9ifSrPaU|!JRDY9XlAc<#a8Z8hw`c<3OhW#Pn z*j?ub^;wb%D?*v)vZT_(F1dD01oCa3Ixtsari>X-nO6s~#1jnT1_F&>DCPoUz+FoL zWtYnJYz5UWm6K5`moin80ZK3yafGNraIfF~aNq=pEzQ48U+jK>ryXDBhh3_Tdp5Xx zl{LpNs3Ny;Ng8@0+7^**75!*-gC`{|#Rafo5wgXx8!V>?{FQ`)b@&9BX@7s?hriK& z&eRd;pOuc_#{-0yT+#1Tj)_Z|Df-&QdKz~*H+72`xnWua0d8Wgrs9~}&8(*tCf^{^ zEPt^<9gj-dv76ej zr2Qhl#&2@G(7vycCaXn6ZzLPJK%IF`MQ|i{XKVd(C(*?@o@ z;4%W$eT}X+cD`pD0l+YNCxBCYu=l1n>IXI^{W^L9^*t6xq9SP8Z$*3f??qS{5$LZ} z9*Xn>e|O{j;8{yx50F!NdK_)0rZ~&;Z7wY79bX9s)Lm7>g87>LyiOyod}4dP4?+Ht zs)89uzCv15gt8?8Eu;SOTc-L+ViH~HP4qvwl98Y`Nc<8LA7>z#?#T!%>L(@&s(*}5 zc);?Y{4$%!SNtTxM)Qg9=q3Ifa$dB!gum+oUdRc43DonUIkJcWwV&P%mgj?PNDXT| zpBMh8KBHao4ZR0}cO_vtF6-h4L8oWsxEsG$LN%c^lB<<!keGzyoZiGr z{Py+%cH@yY@5eV`X%}X1FN)+)hEo#sE%)b>?nf^WAx#9@3G@` zcyYlaZ<-xce~Zt3mf22c_r9h5IpWElt@-oaclKweQ_s;8yV7;qvfgRUO&7WTcouXM z4l&`?5^8T704A^w^cGR=Vbw;2?BZ;ipkf8NZ=vBJL~?`4v4F%!Tp{n$Zkx*^hlbsZ zjW|rg1-q_zpcVe{p=4wgpi^4$p|uiFkPHI>OFwv^F2dnER1;`{tJ$_e9pSa5;gz=E zbYISX*Ukr_mx@FG6P#Sv>H!X@Q-X`EBVA%JaH_&h)*}}t0#GUtpq-yzxdxe6`Eez8 z?>t-!HKLZ{>vQq$6=@yYMcsV8uMduAwwqJWc9GW-OZ>V@Do}xH#2iv<* zdQAHm@Ky2!y9S7_rgshs(o&{y0F>)>L}i*qP(ybdxPip4dkh*HIp<*sGkSTb>#)}h z!4d}tnv!}}n^U`?K#>Rj&OS;>0(AQTbog(IJ9g-f8c>~PBE&AX1%Hj@f(HSP0F;$j z661R5ZYV*}cW%rj$qrae*AiTdjFev$%7gv{MRYJ|1}ywR$O>?Oa6vUG6{p_3o66U0 zdO)4;2%Wp1ouNx&tu2bjcIrcS!8m6uB4R=h9d^ZBIkk1uaYK;9PUsBIE$sre`G)4V623wz{aSl8ow_&2^~rxMeRX&b&{zRPc<_tKl=Lz?~N zyCc;Dm`snHBbZ_7H!&{D{--eq?iSuRhk09UZNoI(0|zx#L~~mOo376O+)fsoPCtmc zg-#4kX&C+>Tes!&!4m50^S+35FLF`@HJ*X2gi99XH&b7n^aG*;-xl6HeJ#6n@h)2u z=g%d~O8;1u`HA9WB7+mjw#UTJ66ZksBNL-3zGNEJhwC4xS*5MQNX?0sX&JNiU-6Au zsESRiXCis1BUS*K;EvRD+i1oRp9ZDxO`+m!fgk*BU}l!y2c#00$Ygq zNb$G5FrfXEj;F8pEW=IWMt zg;q!o;v}9bzC(5bl+se_v2eS?2D}nGa444Pq^`aZGA2Ru!Ts8B(X;7Qo`gn1=V#(R zT&N=}Pw!Y1cJPQD4(qSNrw8(^++S_g6Opj=# z)!u>|^X>`Q7c3pyFzsBy21@B$Qc+Q(lRgr3+XrQEdm$*;tFjV=OdmGX5diTt+q~2( zd8ScqHn}Wx=EP14uj)<^C^QprnRH~opd<~RpK6&@ejK(3pWj2@I>UF~Mub=AA0*o> z^x}s+mRbD+k-LUda`h0KQccnADL`;8Bl&IwB=_qtiaQZEiU>KXc^R^EdvguR5o?7iAbR^i4fBymDV zb9}?9vit7ys)#Szb6dzg))oaz0F5^ISj~sF0-g{;g((~`o1)$^Il1mYy{lH8vI6=( zW_$me_+1~mKXiWR{r}&xOVa*}e{$Sc|L4u27j}kz?FdLhfD&E`!Ul@8x{Xe9TQ{6% zEW}h3yUPuAnxQk#%(ziEH+6!!R~|053ZY>B)9{9-TgkeP}D77SozSZ5##h}c3HraROS`62}4F>aJa1c#d=cLIDRiRE4k{9*+ zHTF7U=}u;Tq`>geQWAPewu1RBt^_OC5queL2?O+j=eXdz;Q3q>I6Qs{o~bPLPO(@w zQu?G6(1_;FNjoEx6E(Jf;TZkZ_ODAa4*5WD^P)CuA2~D}1F8o`z zoCasfCC5jovaJ#_1T}vaYk-VWbQ*9G5ILTyFJhB!cCG+pk-!fKQ^?D4C1154@s!!R z*l)qv-HD9Pk4KYJzj6zUc%VI+@;*wSC)iJf&YBq$YHfSc**#K!wmG7k_MuePXRYQl z{A9$`pQ>41tSs~$;ge~w%X8NT+~9ADa$q{vK3JROA-^19RYlk&m>#)Iv-MI`)U;tU zn#tIa=2>_GM)>S;P)n9-KYUG_(grm{JQj-!6P-;?4AQWltgMyY3By3&?%cp1C;{@k z9rh|tbBj2RGhjAwuFYV9+t%@T8{*s=6U|56ip#+ha`DE;L>uzRH{{6B5cVTFG_pug z#5!%1l+STvg37vRrhZSOf)V9|03K8-ra&6Ofln&@Co5^eiuQOaiW8Wil2et!OV|mr zFVXmF5T9yBE8~;Agym76w3|unHl#tdf=J;H;0e{h*t2yE&+iKfy-EbRf0h#OXg88^ za>2S8P-9h4X8`x=CM_JUe3VLsz4&1x9}d$RtUdhP-E1~dZT(y)x3sOE{4_`hI1o$N zfS2sX>rkK}6Y&dC)D}H?XKtG5G^}@GG4OGWMmI0@Z(%2V?+qszL#K|kx?q0{>rL|s zUMTXVJ{3`Kwr5eG`Pn7>h8!?Ke_M2rb7bn=GJ3*s73dT`P_i+Ji_=A7~m2_R9#c$={U{|KR!W=&~=&iGRKM@B18!{9ymX^WWC}A^rc)e^K;@ z|0mCXqQ<{NBf#?}MEB{GpRkLSK|`u~fYp@u3RjChKY1tob2p(aTeL{$cu6>=-mVbg z!}P=x{M|S;)CFFer&v4jI&sn-i>^AMzDe&K|9RIQ63=$G)f1(U+^Z&fEg*jcIc{P{ zT0vHJf7EiOF9F1sp{e`#zT0dB6*y520yZ>|&~=F=vD!N26;$aG+d|dTQk)RpP!fEk z1Y(4J-koFoCmA`L`l!%so>uLDmA-7;AZw@yx=^YUF^-=)bm|56E4oe*+szLMLIOW$ ziBs6fxQaL(JG%LBk?JZ=@b)Fc^&axy-4~hmLRFWzah%GRq2I~^p&SEH>X`v@Cr}TE zE^u`ym24tuIXNnrp{(=gPi@Y$xnO;}-aMWz>Jr_y8Qi1&r*}qH@3B_a!xBzZ-o3a* zg={i{mn8dyRGrB<`;EOB&7psA744<=I28L%PytW0JCzU$gYBjbxNIWI3fsl|4+b48 zfYAxyvR>l^>FOHaixqh5#Y}gD#B!?%^=Z^-_2!T9x9)_i#i==w<*Gl|b;dFO7{k4R zow^Wo1piq&w?|;{4(hkSR~<$iN&bO8iyTfqz+CYTWYOrzAxykBrIm8TV^c3eo5hH! z0mH?Lq6L8;c|EB!jwC@w-okyc_N^|IZ24y|^#jGG`Dx6|3=$9k><{4k83GB{gn~&^ zhZ*bp?g+2zaJFu$9E98$VZ(7r>1VYi1|LJh{|7_j)EAWz41S5c6YywM0HPz?Z z+1lgX{3$@NTsw5PFVG*#6!xRtd9q;n}EuQcgEuN&Rf1frY7pb~y%&Nb|~AVMYU+gr+@pRy4?pa$wefVmGjC`e>I ztb+Z)+heKMYraky)a?A40eCOmWcIf#&zEd1Vp-i{P82{14f}QeN(WRx$HsL$PwK`i z=wlaayH0i@JE4d!20jyP%_rN6McU^-1tWkrS4)^1J~OH3OyF3<8d~H^spYxTS7x;{+L5w>NEqL*sd{5JDB& z`(UV0jcx%k`BJTH3kn--G~;g)I5(1Xv-7;J!vycFcC*U2>I1oRfe-3mc)&pfgHU&s zwG@+E0~5{^*1Uz+RQDA6QyXs`&UUfHqOrODd$;_pdNslKowppdGCnRjVaJOT(0VD%trJ&fQQ!{EMz=zJv3Z zb9ISJE9TRuS*!la3$>GPBtV z%b9!;7q+}vWW3M4=6&m|Hdf}=1~+=>gQ;iy&oWsp=N=uK5q?R@%dAc7@`0gL=@K|X zV12e26KU{)*2v5_AqxVPe{r$*Oax4Bu+Jsl};RoYOqtmg{cG`BjEl!t5rkY|( z+FABGCOVnz6G^Q;ihH$V+fA_v0W(wDfWda!jTV`Xk5xaV)J;#%vD4_ZpIDSY0X)^1 z2B7~n9wdn!8K9xwYsJ0p#FB?4q@~|wAm%oO?4WMblEjmH67vI_&f! z6NuPrv>|=E<(Xi$(=7n6@4Z~E9fKRjG;O54bi!UvNK!~)K0>}ERr+^nW^ zJDSmbjcb1AxTx;f>GicW4jb!xy=7Kuj+eXc8R)h8_A}khPPxTX8SQOWwZ6w&tY`mC zU+%BL{#~d0efX0<;g_FF{o{Z6d&l~mRQF5%@g)9J@t2ar6iNgY$s~1u@{-&}bSvY0 zO60ften`xUP;7Pr5%M`fXXJ9Ca;C_?7uD%82dfi|G5lh97WjyESK@GN&HIw<1QNDg zV)z>zldM~pId|Dvm5wsAF^(i3b?C?TS0Zq{n5C09?jojcak0THBM$)IAX*nH-7XJ9 z?m!|r;RD_GiDBc84^@waTAmb~t{#9fB%!4oLl;PsbadKLdU zipeX{I{%!)S2v+uJo-swWBp>4r@N``pa=cp)Z}0L!GGWwy*lK=_#vOpm}W)(bSu!A z&d1QFT~|W9sRQ`M{(&(1u7H2(`&dGM8}A@5_+$^`8~if~U!9*NaVS-gZ=_~1e~pj# zOU4)UEAy|&KTlWjzG?*i+=2XWw&oJNRzdzs{IUc2aRvOc$zCra{FV1)zsA)4*jMZf zS&@I(27kvOf5(Z@-yJglou3kdS6}p3Qc4jC0I#epyp2!R6HnAdeHi|B|B}5)eC>ZG z_wh-${8)qjDTJ=8p3W*FR2m&()m-HtsSbcd5E^+$tWWN1T!~ zK_X;oyH~#G@|~>rTf`n~wH~Xr%RdEFu^xO_7QJJfq&@V<8$|M|@y z<}SW5Xs_T`_`t-sM|A)5^@WY*lO09jE1yS@qrDy7LtKfjhF(-o*@=kR;?Xt+smF2u ze$qkM!uhKsmlPd$LdFiPm7vl>gWJLiaC}V}7zUR6VE4yevK9Osr8F4^kaCS6Dm%Sbt3aUJMbENm9o;ujwz=gl;{{XF&x^1~);@1*; z)$J(o(e#MD4mh~tykkrceh)A!&4L5L`gQ-{FD_i4PL`(udbmHuspLqFlpg)c>muuEQ25V@cFdy z6xx}}X-yD)&&*>V|L8lv)%0S-^)aPGjc$34KBX~~>~r0GzI(6i7|?55g|x#tNk)0e zNX4J{;C_Vkv^|re$*LbUuvO9r#(2UL9)>;sp#_Jo0PBuY2s zE)cc_FVH%5CI6^_>!z? zeGVO5!vQdut54j7&lN5#gvfiWO0YeMQz7v>I)Ho~daTih)q+a5(+{gsUa41m!Qk+A zTOxRr#gvkk&`L^dFYa_5$9>#)6*rIgyjh=%;+f*{U*E!q3jO$vk?i62awdvXWs4~( zi?Wp0li_Q{-*I@nU%Aut;+dzJIO&r}I21T=$V13hOvqLzj|7F2z-57@m9W;5BTE{1 zbm^pF`}kz_C!<1LQv~r zOl#&g9{&eo0{V3D;cF==AhbdLv?+*M`G|8G^uiT@5XTM?TeY0=V2d;{wC}}N>wEYY zmepdAm>~gJD!XHHy9;P(`!p@`vpW6^HLF4qo++fSGfw{&*geCxOmY}|Vt*6eVXJmY zhWY>Ugc6XSOne`~OoNe3oF0JhtG4(3|9$;f8ur%E?X882-JMo%V^g>-J)W z-JEgV+#y5y^!qA*uMQ`=d-U)9W4ke1CziGp%6fq^DG<*bu@70=}a%Jl6u4Wen{bd|Lxyk*F?q)!P ze`Xvo2kYhtT?so-!^7Z#;2M82n;6p~bo__$qM0Esw4A>?p(@fsL2f&mYih%Fz^$t| z?{q8G+P}4{5M?U(A#NdTxHzflJv<^6;ugn)!K+(Wa-KZkjRmj)e85JA%7OpE*<90x zfNRc9)Ry8G1eyRz5=1ab)AY>r>(!7Tm^>E+?(9H=Aie&`H$8-=%2HE0P9z5=Qz7CX z;t@0eoM;ZOY`8Hmz>f)d!JrtTT_GW`kdRy~ZjFeQ0>}j3>St>LX{c#DA0yQNTHb7U z-|j>gGW(f)h0#3fQjeANv!9Y4(g`Y)^$#k2Ep7gu7K#-W?_=>%LS{ZEC|5kY&h8xg zQ|W#?`*3;|kChoM6B@xkf6`HYtoVWb0eXrB>%o@fW3~~U2AA_)hhZt3mCnoN<|XAN z2Z*EnkWQe_=l|nBzK|#Pwt>6~Xy>ED?=HIUJHP z=;a{y;)4iKX^Mhja7``@QE*n5e7?uqKce}cIE`Q&ODR^bVv< zRZ^3Z!~H;injh-UvLM^e!X`^f^3L2YU^staAEd8F(SX(`tLm5|P*;h>z)z&J2A{p%zIWAfI zCzD0CrKTLvonnYBf)Q@aOZ=7oT#}?V*kf2D{z-G(L)*Kyi%t%~&1bhzmYrqy!e6P} zt=1~jxhF;vT>;#xGn*m%@3QG7%}OQpgrLfXPdJ>?dHGZG%I2U_a`^rXmqn89kKG@- zKXiWouiB~o8yWW>WxYjCv|a+Ax^L^rb$KfRBQs!9GZqD-ov<+(O9cq#tQ4b|ur(Pw z1xT^5R*qJ}DH#g|h{xDPqQb#yD{LbXS75mn77Ni9sMY(P=t{N1zhCA0VifB88;&}c zd-@x!N+xem+MLsN)6gg$BJ)W5@Y5m-GwSA2M zo#Cje$!lTFi^BB|w7Oxs`w>Snd6Ux#f0nCP0~!h;Wt1ZdDM3Z4W_v=KySbRO8IMNW zF8r%On)l(L-b@>2Xqo4v+?vlk(5DJr+Zl8c9c*;P(wxlwNrB;_q%fd**ou73CCbhMR$^iGCpa5?IO;mI*95uQb1WwWb$g45A!Tc=vj8)%p^*LsF(me zvGDJrk-gGmaq(zE-A_WjlbVAibEfn3DONs(OFueWiQ!xwX>y}=@Tws=0+nRZwW7wn z;S%%1p!RXE7X{>U(Et`b(Fqv^hi;=t#n>Fm4vT*0CE?QhB&e@vYIURb0p!jSpeLyg zZ3}?|x{LeKYhyZy#&Mbm!=p}(`$_rz|EHICE5AbP1>Zfdw7F{eh7(LDm_)8@Z*sf3 zi`(M_;#tD}0XbjYo%!$knAWC;R#h_GND5_Fc(s<}rWDSzyio~LWEBSW&uxQddu3-k z!V{dSDJ@QvZr;qHSc<>v-irL{GpL&(w?_vI*%PVV-t>pwpYo4_Qp>ge4}>N5HIld! zePgFOYSg-sH|kyTv{k7^3ag~y{7lmEx9Z~3a~~G{!D!_l6pGF2@h5KWUk{Y+E|5B$ zlNT{hCi9N%dPqp=Ly;BCv_eK+wJeyM^$CL53afygOvs=G^neSEN7ly!`%2xVnQ^^O zF5p$iN`M{KDPJko5=yZG5>_`(O;4<{=d{i;uBqwe-n8o^`{{b_hg`~BIVEJ|ORP|B z?enFVZfRLP4jk7sC_SwYYFQsR9YqGlkDQDTYJ%P@Ez1vU!`Y#3z%Ao~yl_{K4NsiO z2N;?~5|2tsF@blL3%J>5>Zv#gPvj9`;WIgfP9q(mLtBZkQs0&uT~f{L;fo)+QaN;y zqahL&3J65AK5Zdw z=`@@#u?`SCnqU}QfQ( z-#!&lZ=#h`QqhqQ`~(|QCXy@X*~EDOij}jo-g%aMxUu+f=;)Bfuuw}1zI}p{Sbq^L zB5b)Wr_IT#4V@q2hD~JsCFRSG>C)HWFIU?O;0lphl$w&Gr&W=#gMzh!NA3q=W99AI zW!MNj=HrRytPqjzC+DT!xGC&7ezfpxnV(qx7S7fE$Z+GgEn*F6DAVA!Oe6chU}fx0s1_VGtn;%*d!%Ia*jk%*aPLQb>vhf*$V9{UM4ERO5Kpj>;JS) z=Zgq~kCJX!i2(^psbmg)J51rw6%l4j-j@BMdj{?uhMQJFl02Z-- zq7XO9(BPsFCBvxnoc@S5p`bqmcV;i|-iVkMh2(Tpl~hFNsVN)vbXMfX`ly{1)I{j4 zlcug+)yrlVC&W+1d~HDy8cHNK)Y^D>zAy|{ zJqZS44pjbsgqM*HNJb7nh7LSfHWG=vI@rUsb&*goZ%`resfT4x>B)??V^4B~PFdw% zY%ZjeZep8?fC?|1!IcT|hAB!&Vx5me2#F_efg}jK{cb6XynlQfF@V2Ms1F_Z@l+&x zmwpIGsw_&xDPjmK-XrUrD}3P}T4InrAm4C6^808iOG^Q@L-Tc!ed}nE%4BKZtE`!> zx*W{3?n_Rt)4o=nRm>+>3CV)epl?`uT&Hk!Ble7aAODGsf^!vh8TkxHwRO9$IYAM3 zFtv0oK$B0ALsv04rFBcYgJ0H*d55oRE?bgq$HH3L_3GGPPSNL8_o4D8XG- zumu5J0#KX)!UuSBgKf2JEG?*U9d~uxUfjFLn(DgkwY#lwt;!4#T<2x2w<@;L2DgQc zwYJqj22bz)Nd#MV?|bi^`R(+*^}X+3FqL(wI@;Fr8fm`W zq;q`dIvDTKl8q1miF6i`IaHNhr7U=(+ts%U5eiszKa^h3f@e%}+d~c*b#oP!zB#oN z)aMtLnD2}5bJ^_Ye#YV3I!Q&5h`} zES20GOpi_8^o~m-$&$E#IvU~Ltq!T0`#F^S6(Zk|E$ZG$Mp60{9707>S~t&~)Wf6E zeNwF->iBk+^NjekDeTnBi0D}!n{;kpOg#D{wbS$*MB*KA0pr&vkd@C@lATL*cTcCr z34v2_aGkn5*U3f8?bM+%pU%B*k2&z+=3`Ts+`y?a=HRB_Jbxebd}I+JVn+Pd-OZ$$9Z1&72+%Yo#5Z*pAm> zJC4_2rGhh)Ou(_*P^d8q6-a7UQxcfTi|i=vVVdb4od*$EwPsGJ;YbTH)I+POyCg^9 zvQlK1VGg~eQlliUHn#>`-ls7&-IU2DT%uOeWj@fwHw&(`KY{ajQ4Jeh(#%-htKBhOcm>${Gn9hd81*j3<78 z^VESApAfG}>uX1_Ti;AV+^W5!tRURPM?*F2sLQ6866+p-xB|G_bL<0R`oGe5jO&P5sw^y%imEj{cIemBDjYj$86JR)egtH+!d?UDWn3dcUEHm-?DTwp`a_#eE?yyuFyl+w|;oIZKZzbpY zZF(DLa8BlU$9MAp7g=+w!5Go_1$Udl19-7DeVb@NL6#g5ove|uKnz@A{I)_()7QQ1y83nHSL$0h^7_DtfBR6E&mbSSu#+|LKc;isk*DN^I zHMM9s)ud^G@ao}kZSgv8Rg~(;CyqTD*eBjK9&XE4vJMw_DHgJxT8$(iX7QP{HDwuP zI;e6O1cdt6S4^E?hL4t!Z|^8|hFRGga#Yx1-H7HE`GAqe4XIn!gpN3DzciU^bbXvW z49aL5ACZs^kLkQg!rXYrIIE>`N?yUn!m!^QxNEb{9%*MSFuw zsMt}{I4+{Nx{A8+Q-v>X(VdeoBsC&`&e{Uu-2^4My5|(z095yE37(TI0D76+$NvDq zwfSViKf+s2$5M|I3j;h%5X6ukQy=VrzTuEyXump`c^1x8H95>NckiKEWzG6_s4bRF z%fNNZ5;=TCd~7=HA~`%owDKyEqQbMfZjbrlU~-86&MlT+he}?5J{#mgY^rPaa0dV` zSpZ!t09>;S-$fnv9o2fH8eVAD4K3kjnOM@xM=p|kLPm&mD?&z;J#Pk=?hXmIi?`Y| z;E0*k0EnMY38q^|33Xnb1g+6%BnOQhjZ_;Qc zW7OB1!V|8kC}M?a{o2t5Y5n7@I78Sosh5ro?`dtKMIB`_E6I@HZ#M?&$LzZ62X?D< zhMf9@xCf!6F69*(Up{16iII2HB*$x%896&V%?Xr{U2($@md9FV?G@tvU!Q91FpHo( zS_~9sP;bUK#2M;@IjaN}w>RZ*L@mA7t zZOX)S31gF*ev0@AowzdGc{Tt|_=Y4>2%U9+2%!6iE_H|_@HV$L7a)p@m!A%?{o=?G z!-1y5eway_GTV5;#|94@%zif`OP1e0S|=^sHGI`zzJ3?$_y#I!_zSA&P~dLsQlN?t z=+Vx|q7H=|M4gy<Yu+`^mTVjgQRMAov7835=65L)s7Mi|)*o#~~ap z$QLpMBlHB&-2-4)0+6B25b}ZMf*oF-vW}Ez$<*#2p6}4aWgSIRidc1FwRDvcFmbh6 zjZoDV3au`VnvSBaB}UXkBhKr$N7L)iorK*Tr(RWo>8IX*ocqUyH%V;5a(rS^2n31` zi9Z;7BY2q*;(7{!pMk~fI7%~7#i3Dnq(a+i7D+w=u?4L~%fQ9@y=}IUY?I)fAQQf? zSt@({;P-8rOcx}57r_W=j*1TN|kuj3<8i4kA+H;iYJ&I zus)sgNPUnRA7BJvq5?($M-Q)E3jiGR_M`cG0W1m55Qo76RB3-XgR8Qd%4XyQZ&fQt z7+4UbB!GulGv@PP@26|ml@b5MEH+ybwz@^_Ho7tT$Pmn^u{7H0;HyLsMAK`^2up&6 zte6t|L7?j`28S*>5ur{%JhukA;@o zn?7T!)z1lenWl4{5z)G1vXsUy-%pTYXLQbjg*lS%I|0Llm!AbUVqPSJvbZlYmhYb> z%iuePo*2s`aL|$_8cEPXAJ|uMZuRhVWsXY)C*7oQ&6zyUhAZ8-!sI#+$Db7DSb;Y@ zq2VWdCbGk!cV3+QJ8SMbW%K{tWV6Yu>Yq@Hn(rGtHka?C+$kzl;$ z0E%d0D{?)9IAgzZV+Yfx$y-j$q)z%Uk_GDk7Xf{88NlINF{XaL`bs*gr~E1FkF5^# zM>xjfH>i-&$^Ufh4};fs+FfN>Bn&BQO{}B@c#n)BEp~yVgDuD1fp+N3sAvp3IU=Ys zP&+J{pIlHE@TPWnfnP3iwY2&|k>qu-H9(5CWsn9Pyf3hkhoOOF8MYb8>;U%vG-!+gZ@-u zSIWc%!FlROa4bS|((4$9I|5DbpfCUYHcpA)Apk=|JP(K)E7$Rd*zCFI2e4V=B)zmK zlflUoa%0Ini>t)r$27qk`e1CvFg?K7@8O zaV2tOG|GMkD!`o9*V}a26@|kjXK0`Q337ney&6qhib*)=~Va zG8>yQzy5^iOsYzY?G(IR{7yRYivE4Uli)2>30fGx@IC~?mR3kwI*K}Ky2|6KDGQu` zyP)3CCLdt^oL-|tFkXh1l`a-i82=XB8M|sv*m$AR&HWF49>K>gL;i$#*3CD8;y-6M zrkk1x1?u%0C-sA9us)b0m*9VRJ8bm@GgU`S{DG7Ih%^G6aB=me>Ks*`5~`e192=km8%jREwPoyS>M1GT*(p*$opMTv|0CQRP&9c!x9n-$2OR@n z@wS`}pq16bky?6=l^{Qhne}K++xzLkF(%{iLU?O9)0=9oq=C7N!Fhq`7!EfsKMnZ-_i;6y-P9J6-`A9(Kg zLdnHU#cG3F5LqmlP;GJ9k@MV7bh{-d4Cd;C$~KBwS`9yAHbSZ$vTvcI$O>vfY;Z+L;$1%E`dbmHvKh_ltNK=lc`2y7Lm`K6Gn5(_NOOwab&gab(ypl4Bv7g*T@MW4wtUi&xGix>(!e74c7 zV+3?hQZB6-wqRg)+(+>fYQRXkCw#imu6cqvN4BcPXwB0EO(e@zfhxU%Clk4p2|HE@ z&XOH6Qt75@ak3AzXZTnnr6+tdsSU{)0(;T_XwIcEl?=KX5 z1Gfux)Ma>~JYT~Vc%z~e4te}!X!S88s5PTQ zB-gM@#XfcH*RT%bj9tcf3_Q5gUc#Vus-Ddl^~)eT)oSNK-=0jw!(F18i#{vfIsXQ+ z*zsi+>J60K`itdQhe9?%(2giM`7j@0Z$)U2DV;yJCXcm#&Y#1RN7=u55Q`BSu^$+e zS`yanN6`)|RtzJk9f_SiD)fJ%lVRD@-ozy{=3QNsTTlAKxV`u?ValVi2!IJ&f7@Uu zg@HmqFv8sRav<|sBZR0=c*iT@6gZP`mkp<3>j+b|V6@E6c9 zO1Icxho7QfZI(@y6~=rz;AQUuaHa1C=IUPUM~b|MTsd{%%(!trJ{t4SmtI*3R3H+q zx-k~fz)V(w8*ZP8_I&k4C( zfdf<1c2~Cf*;{<0s|R67!rL*5wuy?h89b*xB$EhV(6N)18U zOE*eUCnvO))h|L3)$DvSfI6A;*<9bIhIWH7MO@#g9FLSJRSrZ*P{PAIvV;si?vOk3 zl8c14gITTDPlF+#-VB#Q*71}5tR4mP1^~_5!hg00^U4# zeIiE+^mT)?ZXnsDJ1ROc0g(A%N%mAr4q2ZF6s@QHYfI0OswruS=VQf$+#luJ%7iJ$wHC8K>+b4bG3UJe8gR zE%N^|h79vL!^77FT#wVND9} zO3M^^Rpog_Y)bLUvn$9e$t&3@0=A`kWl)twR=lopT=Ks;UeR8mUg=vRwqxCL-Z`-OOAY0A1QidLYlF+?%-O5PRk6?|5ozTuVEE09<4D&VJOaSHxLa!USX zd_{Z(d?jUA{DnL#=PRsHEK@O)V<^X3$5_X5#?_B7uE9$f@yhBI@sx>5*u}AjV$q7$ zE0~nVA&VwG>l~9Dn;fGU_A>F>80OK^Oml2=jB~7fmOfJ)^AWHLPC$AnOmEZ)K?;PZ zJysvA57dcC3P^_(GGD@v@*zou27SZ*XqJ$)l)ry0ON6+E#I6)bqDYA(Ativm&*KFc zKzb%W^ZO*fih=xCf8JyN5Ff7=Kv@DZ1mp)9BaSptq(+k(lz9o3dSA6Jd$X$)EG#JXF@s5v`koFle>T!-g%j zdhoZ~9K1MT+j$Gah84Gryf|R)zdH1PbM4otzi89+FCLvNnVP=M+VuJCU(GvRbe~1uF1msk<8${vvlW-lF`8 z%tsS5mX0Xnl#VFV%7DxaZo^on!+8+_m;t*1>~fv>LY;gXS>e*ng)BE5`FOR}3cS5ABG}G%+ zYG7(z=AZY6a1Mj9m<5l#aNR>)J!UrI^W0sUd$z@sc-uSiW-l8wmlfk+TNUGMx`2Z- zA}hAh;p<^p&}dxZFkNGUCpe5(Sp5MLCDuP6MHITm{3458W6=n^#nwLPjHd>#qDCX- zbBLXHofu1;NJE%8#84bwaTJFoJVi%BImCrMhVVqLvBMw-0thndg@N*r=Mh-!@WZpL z9iANZ+rbvQ&7UK93Tx(Ie-bX+WP;4Kb&Ft$a_bpjh^5v&P#?rDvG{@|>#TkNiZJg1 z&L%+YyPQbVvaWG5Cl==snb`+8k;kkvcs775yxs7gMY+T*=$AN=C#kz_lOqGw6}bfA zV0fS?E)XzlW0=6zgto(;oG1ITLo8KYw#pC=Pr~OiBM_iZOb-My3Q*(*kDo^ahO3^C zI`w!}h5P8~fOS}~%*Qy+Tf;1<8ff&@)la43Z3VIap3CbBYX9DAKZ`@vc#Z zv*Svtuaou_Jk9SV#B@$qLE8%XPbz6qUl7XDW$Sv9Dp!GrES%NoYF>ucrEYK)-@-k) z<~V7CL^l|b$b3U-dK#BzJxC3sLc%eDat|LLnMchkia2c@JC;cIxYkHyteX6LA%W49 zc7!!5^xP5!%)fzY@_t2%oa~Dr;$!5G>f7K<>LsF}kewFtu`UOEhBz`9CQOTV02uh`Q$Uw(fxB{kN~RGV za_jD_e-9eR^k5_qjEA>Qn+fJ@XVL6q@o}s9cmq6IE_oRrhmA??U@RvZXYIhjqSosp zpyd&b=JC$#&H_OkwmrYgNF(kokL_boRV77owd9yvNk27?KblIb^esyS@jF=HeBxC* zSM@3$fe4m4!69+TPgN9%NTr11=t~6=-?a-~cc~2WQTSNZUiwv1FT*~6X(+u;(pbq4 zkB3|2Qp2x?7&T4X9HpIsj_;4lRKf*!;O$hZ2)g~C<*-m=|3Vxl`>$`l94m4YQ9r|Q zaB(HarZUkzp?M(OdvtpL9D0+QN|1Wc=$$Ecdl9_Q!Fa}0lhbHkDV0uoXICn;F0iG| z<6#-B8+|5oscSmDQ>Uqo%^fP~>T{%BJzRHw>Fi0_XHR2J$~t=-b2m?6hb3U(ha3w| z8^rgSBz7;JWI>M8$g6(wQ^n{uVDcRX%$_Piu}>2q*?tWb4mP7Fuy)`s11guaZm$h2 zU&sX9SEkCOc8vZ^5`WJZmSU%h$2mYwb&B}>yXx`akBy5`P({(jHCk8YUUk#N?sYh0 z#W_c>eRwn>w`Cv}S&TUZCtTi= z{SL!yB98y4{y-6&u^R}MPxi=}$*J0s41Hdm9YiUia?FN|5}oP@-3Z9(E-iY@P#fIe zk{j^-V|{pl-qj^(NAC48?na2!uAQg8=fDWoLeQjvMUX`!2h6~%_!S!{0k8NB#g;%J zm#F?iR>;4!GRL?X4N33!K5|x-NVxd7WS+1!dy$5wzWGB}0jEd^-X8+6$BD4h^?G+c zQE-c_eNj2`n-G72Q{DzDXr8X~KNx{PN7B0EOW91lf}c^=Y{@st2%QMio;GvkXi7go z03^rfgF{oOsd{Y&@Sz`=smcW0F44Xw@J>(2!->u~7ryooPv?q%?h=gD#1aWoTw zTcPb6piRb@l;@lDaCjUH$2!V~6brmiF6P3w${^g6otx4RWcFqAotxz6L)*)Xuw&;} z66kWCe(aJbzZXjd_(Sp$i9(TP`Q08>-W+rBI#|-b0!+Gpr*C%zUdPC~>yNVhtY${p( z$VcPEC^Es&esL}mUzY_647;a+G9=vwV?iT)h zk){{*Du9;T>+Ra3)n7awpB_jJD;Pjk%22C6^}!qs3E4jA;ef$(_)=FN;K+cv=lS1m zB#^}lHL-nbyv^Xg)E>}3LG1%d^&>&<2GDyRSo*zN^l4!L8ax%+8Xb;4BfC{Miu3OG zXg{ta&kZdueU^SG}qr4)Lk{dFH-`*f>r^sr3(guP4YNT)S6_{S+WEgW9T?m9tuX1ZWrkAUwg*t zOhb%54TqLxJgCuMGt$b5_IzCf*BMW60MjYO_rja;bcXpsP?Ei<9JeAe8s`~k2lStN z&j|ivV$RFUdoDKJ90PbIgZDI;tV7@ydgJrSm zcd5G_G|ED`FxOM{;TtvCQb3N=0NrV^fJSP7S-QP4$w`#y$1m~T*=ZBJ?}u?qMAtY* zvlzip3L!%rsmA~98r#t9q@Bt70wk^|wb;cB?AI2(KtA$-)$jW?b8{*UT&8AriRMyj z<9n>eS(~e@F{Zf3TQKOcWBEl=sU*7Ouz?w%&kR*CsZWRr_@?ZvHg9n7&dj>mtcEtX ziW%8D8odWI7kV`v{oajCf){SC6SHpmzZDvAq*f=IgaHbv0Kc9Ml+GElXiVXc2_#)$ zi0=F*a_@Ax>6M1$(4obcLsN&Q0IcFx|ILDIKGHvFqaZe;ebu{8EFt8y1UajIutf$= zO%Idsl#ixjF(ext9lNGga_>w`+e#fbET$D(kU}w}8lZhTrV0*sN^#eJIxq>7c;G+i zCEjNUPui~U$`PCZdQKsgk=ybIG@;EP=zx@1LzDPQY5~ENzBOBoE05=Lun9#ez8_WpW2a z%Ep|+R5&e4vjl!e0zV4`NyMeX2CPQs5Y#l#nNHkcPG3R)P{gKX`YC8!m(Xt;tNj=wOVcPAg3}Y^Z)wWPqZ`fkoZ{M8pax zfGDBBqJ;vA5>_V!{_`B1&2$Fe95uU{BKxZZeFP_r5{m$n00|TUC4drC0U@2RNw1rq zj!kJg7(Kl;K*R>bV4tc>w;(l35{$5LZ& zhtrp{z3I#DJnN)6zikI+nwi|B%5zcIPtb7*9sX$zN`7BTpX(tXVfFS7uym~3haoMu zHs9_{N+>i_@yC(;szqUnB>Nba`(98a!hH2^u89lhv@a`G)zq+a;5Z*QmP1=$_Q{@1 zAY~p91EvPMP;}DNZk|EKv@qNCWx}I2)Pb|`GH%hI#w345{l7p>a?L6N1px=1qO?s! zIl>(6%8@nfG6*D8DHN;YtHG(HnkZf*@2&zYx+chn`r{8K2eabb4dr5}?k4 zolI*eqdGy*raHVT`mIn4jp}7( z+E_PFcYwzjo3ZBz$u5T1kO-$v)Nfu$UFO}0$-0tEseEHq-@QX{Mjh-Sjp{_z^FKjr ztDtCMd{P{v9S1z$1#LdcQ5IKbYfRsPqAUwAY$v9xuLii(qazD2`np81I;{PNis06w z3$Tyxmec>NqCXE74cX?X4gj{%)m2tfKWtXuZJ=6-m|?&Wvd!Qcrzr{B>0&^X_~Ap2 zUfY^uubnxoDU3lpbupGn;+}lQAjbm2cvu_mTQ}iLU3g?|w1F3jHRAB$gA!66o*K`|k!|9NIjjfv z@-H=zZZxB~=7Qr&DbMY3GaBN5eI?Lp<)Pxl4T*UI12IE^T;8V)U#HiJZAg*z_^E5X z;%*6PS4W6-Wu;f>j;|^x8G3TV04tdXl%)vOcIXrgY1;0I77ho^$`(Jw3+($xrk~7b zWF%V23;*8_mKt~RpAE%+IV3?i#L{p6hqFun>@|NNq~e7sIST?faP?_Wf?^)U2dsnE zVd~ zS%I2;{dP5ch^-7Eu@TkH) z;Ewn`)A!6l)teD@!`?u9`~%y7_1JsF4}Xw*$q#>+d+`Uq0ZfJPhq+cPh4K{?CxP$I z9`%FLSjCAjdnU)c6rg*p4|Rd=pyj*g!0_qizBjYO|N+B&<9Dt(O zgAK`%VSX-IX59P3?TF*-5UAqO#ah)Kc6ae>gvC#M#p)Dx?v9F48S zHQ~^WFCh~HlYw$Q3D*Ya{2vQ7CG`>PlPsIWP5KjDCX7$QPlTUe2w_6T2qU@{dZnAWUTVZG^ZQWl$Q$vV*ooKig5AYDf|5e#q-{&*QzL z`y&v5J*l0{5Kd?Ie_&YbW4raKD?krh-K#Kc%hFl!B+hl3h1-y5Uh4&x$2!++&#Wu0 znzT8y$~kxKUw%nZDWU{(v~`~j@?i)(v4nQR35d-@Gy#^d> z#Pgm2o~S7@v}_zzw_8tQLs!|fMN%$9tEF!^MrzFd#2Q1oWGEI>U2K-R#AUIQ45K%~ z<=@XJfJ6?Vq7Z}Xq(pR`O9nrjpeEFb*g_#*DCGhbS|He)Z){e) z@n`c(&r%bVTXV#cvO2?7LUS#@P%FmcYsN}sAkt0=w#5{c#@ge9P9R)RDTdfYC15Ji zLq%JBFzH~YaO`6uAdH#RiaGs?-75}xML3U&F|DYGGTNM5i0ooaLUxqY@CtigP?}jb zBy%YQjUtnFY{5H-`3p@w%(S>V$Oad~%;c#`WNi{YvV?twM$aXEF$JJs+uo8ssdpwi zxbodzgWf-AMrJN;x`KpqD`Z7&@FiJo>yDIkSD|w2Nk6$;Z$e{~@FrV{-MvVXHjhj_ z30XpYheg_qArA#x5@vtS_Wn=Sd?4sZ27(H$=)`VS%(WPp8oP%UByw@4LxFHoE~9vN z0!Ah_-TnZQDkvdhPKO*yJGpZLrUex8CBve4U=%y6lRx)7nVn1kQr0jjCIB(8a#mThvStr9t6p66gkM}51@}aE*xat~$ zQQAWzsfPP8q5g}ly}>27?r6Jt%i99kwkLOjl-i*?gOY>JXoHy!CFd?j!&C=n>(y?0 z!Us_hsH%oXdZiwcw1FXunB;w~Wi6@)653J7PSWwRj)*6GrqnA$k1ZooDtZ`^UWoSvJ!QP)XAosk1)`BZ_sCAPhh16yP! zUX7~`sr_Izph~uhZG^XEQ@V5IUrfFGDzsy~0dbQGkk#X>)g*sw7D#q0Zn(9yTIuj= z{tS_Adg97l0je4W&oW6p66pGDsnJY~G|`jp-w2n_h)kXOu-r4JZZe@-K+kd=ojlm* zE=qS4Cu)Z|{t9n`cg#7(r90J!;Ybf^LBA-D7HCg+$1CAyM-pxnm>>M`w9chy*~5bQ zWzHi@l@x8tD(xBA!nOXlYCi~w1_7#vAX~3Y8AZJem=L$V$F8jge%P#;wHGEa&M0@5 zog&F>h;S6ZD#>hsxOtSUa4O`&uQvj(G$7ucq_!BPAr4sT@jZj@fRp~L2%-TPd#W*6 zwoSV6QoZoXf*QmZ0XVxCDb6RCe47o^=>3dVICI|$q7L}obg@ru!}OpHjO_Bvu;~w} z8IwUn56O&yPd;R&%I`OLAZ^g>I5;XYAJPPrkAp9-w=&wOTl^K4OLHXV5!^oO5>oD- z{^n;hGXpaYW&i+)h6(~Ks>sf&;-M}q)V3CGCu?r*?YnI5 z)otBb+jhHK*cVv{Q5mgjwPjgR4cg&xWK@|`(8*H2BLI`G25?cq*h>p4RD2So6kkylXXx+yvcdC8DV6B5yY&)PToBQfL zoQ9~Wh>${rc*A{=TJvjfVQ$XaZUiN zkJDJ`L1Dh0e7QZO$$f2eDgBGn*)C5qztitX>OWfH(Z8tDPC83)Y1=EJTk?q-BK*oy)bfQ8 z&}7c5LM*) z`{cG&>14I1~?O7?@ z7TfaVw;|V9vE6vQ^{?2bQEPpG*0k^oX)RoF6TV%oHr5i26S-WUNpc+< zecU=|LT~0KY>4ti!ZGRBu4=hDX%#UK6aGu5d7)E7BS;a973T`9cq@{06j*D-@{&8| z^hx|K3z^tuchnRK?_3oRYm=Ih1_wOu7yNiChBGha+C#LA$pDu6uU@BsytbddhbBKic6&^S6y$r}~@@ zG&Mh-0sadfcmQBceL#jUu~w0*K?b_7@X|GqG>v7PXwX_k7L$L=Njx+CPv%YWGD+l> z5oD9bxLIgy@=4*GSuyDmn9R!|h0^FTSA}=f86?;^7K^_#bLWmFd_&toxL#n`^c$aB z9OO@Lz83d`hr*%$wE#dQH9wKKYztEC5C7W(Kh*YvT+k=wH!iuLO(yYm%>sT2Z3C8d zO~;mQ4nBJOV|x&~@YMT(kY&B?>{IbY+9Um7Vt3XCCOu$cyVkEIj)3=qgt2DjH!aJ* zUjsLwnH1bNf5B&6AVD|DG?&*fBdI|2#6aoXoDm3<`%ZtsYirZ>zLHly4MCw#mKFxu z!KOZvluCw)KKSFzV`f1oEhy6XiM~dOKICa{$-aF=ofy)uB{huow#TXuCxhnAre6&e z!9ne=eu$hG zbPL1AC5U*%W65OhbU(W$*HK3L@=WT^i634{9axxpl{&MW9;J?~ zjvb)k+KwHvM{Y>u?Ux*aicg;3w=&7x;9;Z=tl$8|@?{(|>&ze?h2+vWC)bl{M~VHjB3X4MpI$jeMfK#8Ol+OuOj8|NV(3=t z2JmvgI7Jy-eqisw7r8Vm{;8qW4D6lZjJMzq42HAGd~(7zI7Y#&CeaGb(#8i@PZ97= zG|LywB2yp(UR>~^E29u(;}?l7nyKUk*aD~-k2x4cx*HfZgM@>6BOVo;jb`JzP;Wd< zeS&Q^wr-i!Wj(fPWOp<~MoN1zeihpb$$qYKS8bby@EK~6338cpP?3S3h738nu(yx4 zVGhIR@8`h7f(uz^xf>c;IpGN*sgZ$nZDI<5vx6#ipI-?(4mJ{GxJ!)P{t)+?B9ib; zi_Y&1C(mrQC(dZqm`!al71OY9E5+Qv+iSnqI^_{$p zg#IllsX);q3Y8Qsd5&p2)S=}-&xGIN=V&4=aV*ky^Ki`-@3>|b;~^5)>49PZnYgn^ zbQ%!@)0h{WY-!bdNTrd>3B%N8)MkUrbaL%zqiBitg_puwb+P-0$xZ~_^&Q&t=XcSt zYnl`x3maN!AQvJ#=_y5KF&6&TJa>=$J5pkH?lq^!9<0`K)US_&O{S%dG8p%o91Yz^ z9#D-220zXyM^^53`ZbkFY_ty4$_6!ZSquUHd|RxGvhbbd_5dHYEzHWdEMbO(FFD1~ zxEd4r#}`6NHC=#0QN_=4^GadLGn}1;8td(j8?S>jP|xDNFRxzsyvW-Fj<_+!T#aob$k(WuGMsV{$E&W-#kBrM?{N-oUJX$o1@ z4Bx|EhCvrk;hK&;{4?5u+Vf}+B^Ap zQSFMgq~v-e}ld01-F+tXi+09^j2 ze1)Iy$%KP4fns-gEBq4>Hk~H|px65X;k1eSkdVk$vR((rZ7EvCd<{!HuX#VMk6*|S zRSaub0eH#p{HCFAd!h_?p%Dfftj(>=9Y`CqAPY5&IRqzIS}s)%(qrGB3ngd6l)YxApF|bo8HL`s0P2tW?UzMCnU*Q1;$JE12;XE0AvbI zyVLT^iDsXW#2XQ61$*q#_!hkYD}X0Ok-RIb4tUUkKU5m~VC8}+KG;#WOE47IrIQZh z(kGXOhM-%O?5Xg+mi^ARe6&3|$W@hlRiLnfadsPoTXy zcYKBkeVb326E|6x_nC@?C~NAWZue-LTFrbaZBCea#8gnWl)VlaDk1=;m>pTNAbT{V zca31CzRNcZEGXtt1ohG35pJZ3O0)Cd2B#zBO$+lVerqh;LO|ru@Spq{jS!WE@)?Ep zd7Q5$4wmzGyX?6eO-<-)yU^Eq5WUzKgyZij8Hq~6&BT4>L^T%Gv_$Hk5&eA>50OuJ zFkUL)Nk#&*qVdobp;Zw>%HPyAgXwv>xOZWV_U{nRhp%GpDV^sb2anWR%Yu$d6c3$# zk)O+I2BJCwf)xA-KQE0=+-hLqW^;MG>La`S8?`;SI@4e0;fxghzNVTt6*d1F5mDp~ zMFaa4+A4V<&iv3|YB4X=3Zh+G_#xt6?7E^VI6bH((CcVlRtRWSbRVEN#UWQxE)=J0 za|MN=FYD>2o1T}*mj%u&FgUYD*o?gSV6AyC)<=VUClb$h*JJr!R$`}bYKK+1w z5cFo-QIy)dqje;US5g51s$d{BVAAa7v_O5|fH!t_?GF|MA%Z`IfbK$dm%6{J{g<)} z<>I$4%IysYS&&5a&Vb%Q34qa>FB2p%U2??PXGXX?!bCcF( zU-_GZQ8n^egD7k1wDGkLlR?0!V*@sCwr`hcdBH6DyxppEr!~hq$5Y})5yEK4Tsno=>%`wH2#Vc0CyPke1aLr z)h^6LRkjAb^4kIj-`-==VLw#Nfjjpil!X0LoW<*=<7DP0`l|EtktqPJ9#WV#efyqh zAJwnJ2A5B%rd4lu?+568E4UK4qE%hNYL-y{P$rCYReiwrnX`9ytwOh{;gfd+C=FhK z6u@C4R}FE|K9NR%;Gw7VU;GB2(A(*RfoaGHRERr+LVM5t2*H5?vFr&z^$H^!;S=_e1`oMi8wrb72x@c%!auTS+$GI_ zeUjF-uE`U!`0@4qPh)$MBoB_7Z&J%qW4#Ibokx%18idLIyZdusa9`Rl?4b5n3+&)n zSSGm^2m1Z8SC9G2(Kq(zQoZ}2i0MzzgbdE?*cp3JnS8&i1Krjew8;NrZF5a`3(l-$ zWDez<_)!k5_Xzu7*doI2iNVb?i4puPk=1{&l~BIM2YxR=C!ORE?6N<+ol{Ip!WcH7 zt6HLa#DSV?pVKWU zC?wji2|^j;L-@(VXCM_)kDv234QKXxi3$CkNyU?g2F3xnY|`vDXxb#22-S)$z2g+x z`^$@-Lyynx~#KJM`@6xnQB3aMTEYL zN0^!6l480`ZF4PL*vts0HFjjKSU}mv_hy!rubl%zR3Km zw}`h1X(+INV!=**YV#o|&l$DO8?$$;gQry+Bq!#ZFrGBr=J&^&mnJ%FlD(YVnKAQo zGQXB>c|SbfV2#|f86xD?&Hj+~vpCu%R?AN&pARDUPmKjdb7uiTwCmNWDTWK5ZzA@H z!m62$80xz60_p!=M{SY!@YFmZN*sDE-8Dt7+avX1oiqhswo40)_F!4#J&{k;v<^Nq z*?28N{5Vsp>j`Y0fj;*lrK{3Vlq2rpP}Ts8KamA3sxtL(ptDw~QiO4BDtZ~jG!wzv z{lQsU%}ybifya4OZ20H)n#b^Hwan6ORG}Cs$@*>TlzbB5HG_K7k4ZdBhL$fW=0hy= z3WHj8)bm2dt`!3c=`Ugo*;<&%&7qb*g6tPQBoi8zg86n zz_bvVVp`BAJtF6PS-rp9>N>C!I{@9#a38Qj?VTLpnxqamM3RB>JS~>kFMPs4_#fJI zV%d2ZR6LQe=Ebn^aHvzgCaj>{MimW6X}BLF`$@YGvAg?QMxO$>T+S5?&@SA>nidrr zZcyzM7Ho@Fe+q^j&{6nYH_riJBst1Lx9t^h3vE5%D*C5b$s8KYQcFSy zSfmR9N7{xkcS01Ycth;MAyN>F;C!|g>?)xG%L55cMOroF!&A4dTnJMl^cRHU0C%=f z{iD4b`&qHGNpLxNc6CM&_=#xZ@+F5khJd=yznnkKccVf$F@oK6d!I?+MjZ?z`@!i^ zC3)y{n{~D85W?qb`hK3?|pB7l2VoqL+@(LHGn)SbW7g$(`NIfFe zB_aWEQt9v5?b3)K5!?&*2h>k!??zbIEXA-o0c`5KtzBk7kYfWLwT5r3R^%L{ZK`TV zgG@tJ@+Ly1z-8b31z={!6%;9}SSgW;6zO$v0*wCflH1H9o2?E6W5}NOjy*er>jP)1 zx1b3gO|MyAwFd zdoYhujwmD3qlXCj>34&kTT_nx?)s{@;1-4E9;j#Pd}9&F79AI9i$0MIKmmeo64`X@ zE`m0NxDjJAK{=!^9fNE#o}QH&j38?xdDs&pih%^Pe7kX95Lf$ zX~pGl^_px&&kIPCVId}?@C1J}GvmOxQnjZt9E;^+f(vksvUg30UJNZ=wa{gId`Z=Q z+VuwwrHh7<>*0^O1nGGoGhl~u5*jtx!``{13x0jf^iF7l3s#EiH%`xtX;?>9>4Gn* z0$6H)0Ag+fbT1>Y#jZ+?K=gT&>YF_a&L_v5nJO>ye1w-!1%`qQfov zOQMUw*WEz@E+lRj&xVSSN>nr>fUC^vD-Kw-C~ilnP*}C>OPM0K!(k>mz-VrIfIMGt zS$$?Jt%lm?s06??Hi3Ri(Ben-W#A&(af0;PV4>l4FXWRJ!};|FO9*rugs_Wn-f*M3 zB1Ys7(bTuFFiU-?mir-~Ysush0(+lk+%8URr!^MRH;B7Iub<-4u8bqXnf*X?moiN=sF(8%qasZoFXSTBg>IZB+E4Z%| zKeJ#IpsMZe+-1icGUKDhTyp`J9B}cgax7F|*QEqt(`&H+rgQ0U;3a8BWocB>frnOb zj23g|4u4)_sROF_W-MP>4v|a8@dOu8PH@=adROE~TMchWC}hHeKf2^>DSAs5AKP$z z4mn?RM>y!@b1s{suXN!a&D4rGw^Bz|e&C$wb!Q+aIh|S1BcPfO^^w%D%?)%DL3u=U z6G1qnx1BKht`MXK-eFoVf(oS&igwop)ZehCcPxKcTf}Y&85>TCPaJT(D~o<~Ql8V7 zBe98ptcz{_*9#MtRZx#MF+us47XP#uKJ7@0BkH-uG^IkWE*29iH3&_Ep&P~;=&ls- z-&D~r*2#(rbFI;9md`g3CkUuyRB!Qgdm1ANaIWEOuordF|FJ0fcNkao^i&vds`cL| zqXcF}s=$Yx6|V5uOOkRu7|5`kWgt7qi*?PP+8pwpU}D5e0|^S{cG=ZsO%@o)U2Lb$ ztN!L$Y`n4%Kr<-Hy22wO>S-AVQ)tJ!!J@3x!dUZ=zpD25kZ+b97`v1ie+UF~IRGR~Ry~4Bpw>7mGue%7 zaMmPi-C(jc(&%-a>emori7TwNQ-YQrgj&x=x5dy?6ev~#i>WbUJ}V+c#(xfg-P4V7 z<9}a3CJ^cH2n@0(w5vlqm_ev(&rPY%|7k72=cE9VPAVPE5q#+CKJj7leJ*+L?K;32 z;O6f}z&H#h5*B3BHEh|6TD3RFRr$k1k2ZB*;u;;ybPYzVB?*J!ABzn_4D;%TPix0` z#OH$|QBG&4&!;gqR03NF$}MNG=ZQN6EKII$^(>8b$$+Cj?T1++RNV9TD}sVjcB$Dr zM9Qj``ljfMx;IUbjtde4eX1`G$Ae83;^!f*Ju?XSB}5n6ty`6=P-(GYs~&vxPp$o( z6m2!719MHhx*fQBu$n_MEZPES^OOtxt~nA&D>sXw+=_BIK9@I%+QkOS~u!I!NljKsw`EWD~YujGpN> zyC=gC6^KpTWA2%=_1^{JPEy4eVg82*cvIULitP{SB8H@`IMujAy8%+IKUT=0+ZKn0 z;S9&Tzj6tzj`x>tLL(CIc+H;nsGD8wSqr3_5?x6_(oDlfg7B1P`Xcm~#svNu7`z~| zD*F5;jWs`ZFfSY(S8hl4a?cA}C>$lpA$0dWxz&6^2LIiVkobtl?%a>1`@K*=PyLMn z_u!s~urMcGS*}-S!vI(79%rYNI;>aUBzDVeN37YE-0jG5L*f-EzI${v!O7~SO3lI) z>mmNu+*6U5zhWkb>1D0GXQDjb0YK^N6`+pEHe@ zIn2EvqAtaQ@B9`%7hTxkmULNr16%Ow;Y?DA62#)!I|I(KiIKpa)=)uevjcz z*Dl~x!L@g+1FdH0B`E>ej-{`>Qz+?*GT^`@m`ZwBf5=@@zi8bIg1|2G>i?%pH$PIK5230JZ^6xEDZk3W%hI09Q>y7K_NaL?(Jw+;coJsdH3R+|oxM_zdPUGIL0^9@wlXK~`f_v8I*K;~r%|A8z<@LX_J{k=b1y+Gr-Zv=mTw`U)pll2Z@;G3yYe4h zuL6dFV^96Woq|MY5`5u#|6&23 z!eAiDQ|$Kxk133*&%-0&D8>N+^kUg*g9)87dodAMxIc_AnL`wqDxvb>cZ&sBaTQdu z0e3Vr)(frmVO6<+z*qB|DaIqapj4rmhF7euE9mp8`Q#Fc(gMhSdA{8)SYcJv^5LoQ zf`&nl9*mID81uz0T>u(4x~L0x9wx|IU&cIC7O8A%)7c0#pro-|vp^~20lBhtKu7xm z6;AsY^fiy|Ac8`{HRZAPnklIPwJc$`bW~7jBhbzQJXJ++n9&TOc)p4~4$d-4Y8oLr zEX4`wFG^fjHjIj+G3Nm}7gEX!Ilk!K=je+Kl&;EB+XA8vuZVu|mkYvp-Hd1sUZu2G z4R6cMRFP4et??G^>448{M9@Hvz>@&E%M!QsMlEC7$MOc+!; z=z$)7zbr?w*!pFMjqp5hKR8jcHc z9wgt?p1l@8a)8sVD0*H+G$VYJuz6;afWjoy85~G(Ylx?4T-k3C`|kh&E&$RZ#5}Go zkaGJ1+<@n5z))AN233o27CVS)psxKT;{aJ+W>tyaaCbCJ2qzVs;B6PR3K%YMyST3= zw&xZB0dNL$mUqQhcO!x9dMNPFr!4Q=C9DsBZT$z3M+3uZ1Q4O8zv0V^wFM90`NH-} zuz&f~JfrA%K%>_)Ig{SC8}CNY{H=m3z;8O>ASJP?yiIx>uyWRyuI0SemN9s&gp>3sB-i>W1b}_h%y|lp0N>i@@ z??>oEFdQvJLLz9r_O|2V^G}}sfe2K*4iI}9gim4MYdo=GD-H@y(dui{puylUo(4i{ zW|Qt>_RD1ahHzbmzOr|&BHTr;=Iw1Ce`gP`09rt$zg#6iI06O%HT#27kO~^I1dqTV zcd_G=UASf}cWa`tZPzfAu;pY}USBSfn+=b2sj?p zPq*gR3j+!FlM7gV9Ky&AT#D;d*2Eex(q}oVNAv%VVD|JSqsfhn9&1(6szT-jc{vG# z>q`M53-XM@ZI^-&7{`GQ3~baC8GD)#qlweRTPUf|J_eR?p~ zuSOcx=)+pQm`GBzERUS4MB+yOh8?{E=&t|s1t9A@%L|qjE=q)&Bi_CpAN38C5PQ<% zE8z!hxS~v^o#p&wR@@%5>t^mn>Eo*_gQltpZ~ozes1!7qR4-(W1T?El78JdM3aAjP z`=l-Q<_<)yeTpmnpYC;D)XVh~_T@%SYW+m{KD>2}$1E~z94#GpCCi<>9yzltfBsqT zcIAMZ@(ph*ma0E7L!oh@5XN+9dN6~Ejxp#5&zq6x^a2LNw#p}Db-47SuhiQ=?8Yod8042%l zme2hENU9rsfTe2>q^26B8DWLfl+M=1X1{eB2otF@`3|eD&wOoHvto1P6C41#I+!)wTkd3FI4b~c0zOu1HEom;q+6# zqFC?u1}b-B-113b3U*S}RUw!u0ztV#bgj{P7bsxBS0fVHU`R#g^?&TAnd79tm(zA7>xY9t@qG6qDTe$HF4 z?s*`6uZGUWaRwFb6k>BM=R(~Ks8SjhOS4Of1e(@h-Xv&IVG$!ymFoMbeYjj_a_>&7^;YCt{13f-Z?gaIBpyUG3Q-3nI#+{3 z0=FYgM&+5RN}LW!$P$qWtPV+?A_ps*4H7(=Bu_|nC-1#mlA{%${qkOK1Csl|pYa=$ zyicOKsc@bAiq;o=Yz|Ic|9qUzEDv!p?c(AWWj9$JHQZ^_QD3|?gQx#R;ts=GlzIwJ zn;@|EVB7sp zF9PloL(hWey?Cv3cYINA4m5zG+4|g2PX@iXbXu1FSFx$5fH)#FaOigQnf(b^^l^_?{$pi$) zzu@ALDgS&rFt}dVTD}UM(y+8~4woZ52zs0dQn*6#OwHmHF}T}9dW86F4tdH9PoD-F z66)oI*ak)g*Bt?ruUKvaUW)am_hbz2=t|2M!**X*H(<*uIe=>g?uchB`uo(+7hD>TX2eNM=XTH`@mCxmbW90hjqL%Hk?s?af03t zqakbgp()yJ9q4J~)6Ym1&L3716QGD2jia}efiWv)@5KNrQN`$wKaO71oB9wb{dOX| z>ldQZp9oY>dUt3_J+LJ>^?&8NKr^MKw7b9R1}D7HX>@_qoBD=(S9feoq~-g_I=|5z!qvOFr zr1g0$6Ji!j08#z~|MR!Y2g9|3hmtz6@hlW%8n7XwuK80KT4Y1Mjl3pcq20jazqX>V zQHbvH?dtHE3i&5f&w)t{hnv!D_jX<@>mi4KXaLho!TjE`694<){VtIAit1_mBVrE* z4~4_wc=#=w0r13pGKf@#J1M56)9LGp3MZ;29A`7ci$cChO zXmSPxk@T9HWpr)(Xz^k;H!lRp^@2gD@e-ZDAcqJDDZv1OPyzW;@_$dNg$(fwuuYnn zlH@tvR3{!PL-dJBz4u3mK0c}eJYQamGRzPFcVc+E$fKM6buUjOC3)3Ce#zdvz>gf1 z$WRH=;EFz}MH>F95$ceh&EC8ohNQoI&En82TZ+HOUL46c5qA zfCzVs{C^bW8K=d5wbRmPq zT^(25gkc=R!K>c&POHus{>62#FeYrSeZ71SqU^E;6t_$aRwT;lGEnlUeqcr?7C5%w zWy#fYKmj8Ek^S2WiAx}vv}Hen_q3ZAF2EtxB8}hOgj{OvSu;6aLL2*c9s{o-^X%?-3d^x+mCpQW>LvgMN-jn`kta4(8VMzPs?(LYETbt z)IcPGgpT2<W)-3TJ z_eL)U=l&=5k{MeVDH#i|6fI()r@<5+ygI-4kY&e+p6jSF|0&hi358F{Kqa+e|AAaT zR+pL6L&ym|%z>3I{gtmcVdZKWED!fOfjny-o_Ukog+gAhQ4H`{I%M>U*nUo+B%29vWaR26IpI;Y<;j0KZwLGuC7ob}i1u4OO(j{}1>opV9_(i~GWJGkP6^*KJsc;B0 zK(Pi$Ban1*IOkGG;)~O57S8`KgdR7T36t0`nLH5VL9S+wrh-bVde#9FSQ(83NDd>+ z_;(~+lVCk)Y%Nr+U=BBg;%YYOGOfW8;&$vH(*4@J^_{_^2_JxpAQ3kK7u?!TA#DRg z@PlbMp~Ev4(Qu5LCee34=-saC+PzfwUbOVtxo|NK~<8 zs^D>y;SulE;0Gb0CPP9?hJ=$12;4V2S5sl69G6H84WGh9KLiZ){Tc6G30ry`C1Qpa zr$2ZJ4`m4c!|FLqF)O z-Gum!9dck*#1`oDR$(?GI5n@lzSo|nQE1O2bLLs!;byGoT%|M^U&t6$tmEwGd9ksS z)^MqR!KH?)m|Fjr!2vUD42Ck!E}NSpp7unGq$bHljlq&%&XFLz?djuO5_SZME+EZ; zI=3gZ-N9|^+~Eo6&dn3&932FiKcTZ^)ni+e`(h@<>B&T31LoV2jH`l4*2)tSWYIhT z#nDa4lfNKWB&dH3oZN{$ti-7zSIZNhgqJ5q76^^kO_B7xpgWKr<)uKt2i&mm!L|1|s?j)j;n&L&Z^?VX$r{Z@M77(b}wpR zk(m!N=*o+oNVm&pTcXn~o^Fd1_l6b$-2k7ns~|h0t0#=E$B|?N;w*&>O~Dx2b1hU_ z(oV{HAz3CZSGG%bb@u=tR}nQ!9l%E=8HhA;XI6g!1((100#dOEEbMKvKhBdZz=*cn zWPOTEu$4~RBc`MsJF$*GtzsdByFinoA`e`-cw?7v+4AR)W(DXRAI61B&$L!>9zB{H zHeVVZ4G#%P+-I^?&cNe^3(2&Nfo7*Y{j}RoL12kwM20p21I>~Hi~=x{mB0a^IRUb# zD9c_{pVF0rwCQ_898`L5d(mKZ+LigWy zzDc$O3vOm^b8hE3yS(P^?tVS~2;TR)=_75oxzb4B2M#OT9zXA!bMX8_K4vGa_1>?E z{ys$=^z|{zsf#iuE>cD-RNwCI}X@_=9^9JO4!x&2T6C~iU#gmZ3 z6i$;2Nib}8#KW0WV}W0EHsj!c}^E=km4=$H0d0%RFzNv36@ zC!)(vPhFOzp93vX7on>p$`pi60H_j%u$$B#6Mls$J+v~RY4a`>hjj$RGuV?X%q{`5 zsV3!`gt2GklcEqHG!#hL3Ydszev{7AQmIR**3$WuwA#knifvnJN`*BVooy{c!NAti z(|K6@emtHIdpn$<(YDX#d=}Z9-fu&d9mxqprOr@MV}VqgHYE3poz3N24nA&w!J)^F zUxTfsq^46VnR}{vmBDK)g3r82kaHpBcFxvvw%(YDcNG&EVw z41PQpue>)d9k24*5dNEg|M)p~4kud^Kci1aLIB7S7aB4MA~+4RI+}N?QU&@77qtFf z#KVRU>U(F0HjSI*p#vYxTPp%2S8K=sp8-+Mb!Vyf&@7{Dwy(k0B0N8)~WF zYfrG&)9SSfQa02F6RLdnklckM(r4*vDg^hK30n{d<84N-R`!yjpqZ@hiMFRu2suon z-HU349=_EmJMB}-O;?pr`&>h4b(D%WsHN6ZY7Li5OzxfTyHKSl0&evby3rCxO6~0> zBW-mix|}$h>~Y@eX}}|=)cGJ^8)_dY@}2E3n0^G^OJ{oBMzTK8c6ARQDXXX0Q(s}y z$4wr;bZnh=qghGcYM#<+z()-eYLL@v`(X_&GL)Lfw5n`l_N!&kQYo;fd*vJ@)oLlV zK!m!s+MSDUDwARaPM^vK7G`ubEtI9#Qd7QA=N6w|Nln) zskMEKyw0ms1>Ln3Ek3ls`45oxlT}GeQXQkWwEE`Prm*|h)ZSGvklKBIs-IU#d^fa! zZTkKA2O@z+1~pXl)WBN@p}xyD(A^#GfRq&HSAYUF@)Am&+qy@!4Ym}3e4~TFk3a9A zY}!W|{(JDwF=loIlABSkyvrtbn8w+#u`#x0hdSBY>SF{Ash?}LAVQ9*@x-YJ90jjC z;DKv;+g$rvr7o*cP@=_GVDL;$E%QQDcx`b%?V+Kc@w*xkCh_wCoV%sgK6-Rt&FU1? zf3~l(mU^+)M;XPgk=7nQ9&%FPeR7YMiW`Pofx-7;mT`fkcoD#=l9gM){wF&cSWEv~od~yl%YQd(#)zdx~ zUw6kzy>`7z=0B6c`I-P^TUkz|6;OA|f@Q&%)X~+9QIyWBae1fL015>Ku&X9K9ufM# zUo-qjPWi^0WI|pyZv7{s&-dB9{&lu%JK|`hB_%^@YCvQDtakoKiVrmM15+g*`EBL+ z@F?2^78Zzl(nNOtsi7Yr6(4xMk#{~sEhn0~U6I511RoU}tc=!JaMY!AT|pafhd_XDMWjXLz~&RAwmFVn^E~YiZSoFt{~s3pl%s7y+=O)$X+j0UKbF_A;#sKEP`TGP7o~P0f;B))RIGbZ+{76LSpGK+> z>D4#K=rf7OJ|A+@C87R2mXSXx{y14EoAdm0l2GRlvG`=6Z8P0H*TA_T#-g%asn}zYKd^hy^MjB`uK$gC&D!R&;DZCQ5#g_aADKefrluA+^)PU2#Rb+&q_`PYY%&9|;j>bi>V zQ;zwTO3IIm#NBO_40Nox6=7Rv$3N5&F6sbnO8>`yJC6hj!dPR{zUX0SQm&ZMr4un> zr%JnROa}iHlfNX3Z+wzilR3Qp)y34M0^R^;Ler#NCRO}t*V0b$)=tBF5eZ9_YkbvR z*l1FK980h?H4?tIbAhoTbvg)owP4yIwMbTaDfvaZ7Oy$ZRmx_aE0oL!?wuuak5aKF z%XyOcOYUW0TgqFg&IiBiXCiO`g*Y^VXpgi-x*TC5utP$Y3z1i6R{Seo?Yxz1y!~l_ z2X(-(Wzcv=?5~J^uf~u=?jQj_Ek}$Aixu8DIEQpSaAHT~0OlYEFaV3A0w~spO0TZ$ ze0d?`DWNc8T1hZMIUpRdM29A<64z-(hK1kM z1rzLLcK1@Q=WVMD{YYoPp2mQOMgkv>9VHs7?_H|?&4?Y_V3Z6{)&%nR3yAfTh2*J@ zvTf;Sm-LvjQwj)IxucBT{>_OWO*gfkW71+fH~TPbOyGJzkFtQAE$gS60QzKvoJELSep2{P(^N8*R1=G6f2(I)ELc;+5mz_jf z-5?wvc;8-C6`dSeuZg{Xh|+G_tJy?TU%abmKdnIM*XPpPwLcih%hPMs;K=E?00M6)d z5&*nBm2kf`h@{B~33TJEs*!+BUlt(1v19$upIdsH{m;qPu z?Mb?xUWE?m2Z8guH=m>)Lod%Dc>2TR&>tR&0FUj1$JN{gxie}ZqFsC?E3Co)9Y_Y;W|&65}7>Xjb$IA-H0MLsZwpZ7!X)sFF3(jE`} z1OK&~0RQwC%XIF;k1riT#vNtL5*xx7*y7LiGu`ZPhew}>HVExhk%}rG_$a2_m<9bB zFkzK-6jJfDc;xQz^igFw52ymBwMKPfvmB_(t?hm3VOc9Bo#+93ujTnB&jXkCog**n z2=Wqk{|{QJk1c}sp{f7qN_OMPiCLFuRr)xB;HfxE+TH*gspJ7D1uR1E+|P&^+J2{WCsRbDR=0(}`o%A-KU#f*NS zymt=aa7=@|NH*8=cXtw|aK{Cp_5;>cAFK#GOYdh#tYLfBbqB1|2U*kzUeDHD&zr0Q z%XcW9(Yo1^L@X7$TnV~cd27y;!j=&IEx2^PQMyzwdS00Hw>}g4uAGjS`s8%CGKt(9 zrN$3R5^cpIjE&X-W8x299Cv520q3I}U*7mqJD=Y^J<9)^x!HC5oHuW|Z+b7{Kg?fq zdD6f)ODB8M^T(x_4ws)JrTkOfu9v$ozA)V;P~o$4;d$J<>I)Xcu1}$kLd5}o5)9@(z9`r)_Gyv|QjjQ#>Fl}v$Sd#NwUJ_E8 zMXKcbLG7WEDgtt*NT><&%uzuse|HD(^BtN(P=zE0dK~G7erN;`r-Wx^dNcC`XUFGX z)pH1>vBrKfVl(jNNG9i=N8h~X0PL}q7rKwFB^9a|G>4%k|GF;VUoM4)4Jtn)iDuSW zCiQzY*ouIV^MQ>aeu(k`kp*Y(t}U;G5EpZ-cg-M7OC*vvK1(3dzE zxdEHBW+xBUAfB)Rm!Ezxw{z8s93iE_88?<^{HYEpj{~C6(9r{W#lGQ~XTYGl4HxeN3aRXejka#)V$)4NjxUN5V=ZsnSvKSXui-JtUWJs?zkKBohSsUYJla;G{Dk*vkdqocp^8gq_0m z60i@iK7tqBN&Pv&A@D2cM(S-x`JXaEAQidQ)7x$8@0LCcCA*$NwwOkQu{8sja z$)u}y7RyQ<LA3@+JT~l))0zb9udtrOR54KBtL2q)4dzD+= z`EO{g?pbem1-;-__b|7<;cs|_z2jE*-YxEFZ+PVU0;WlCc}2bDR`)iyyt3Z&OMCEE z_g1&PqTcqadw#dN#l6<8?`*fdx^OKflevv-A7&JHAd^SOb=M{Kq+`;5XuJ+7jjuF@ zIDe#$FT_$}Cvve;hop>ui#U1s-Bj)s*`r(i!2tBYMz!DCARd~$pIlj7;e2fDFKwlC z#~Gv!9HJiEMGqh|Z{Zziq4Vr)K2qpCg9s={$FPks`?XJ(^W+kO?K7}0 zi|hDilE^e`&yh#jM-WJnl?KnqXbjwv8ArM8_WFWSNe-yoC^s***^t;M&lprI!|h?| zf}G#Yho_0?cCg-mF5GbJ{D*@5)(?gq7>mY#Fszxk+>$1%=HT^k`7x&uHCBC|6eKX% zW=~du4&(4k@8$UN{P}ySd0C0UaetJq&jjI^d>g6`Qpt~u+OaSWB}f%!X2TwhR~8{s zQDZllToN)cw{=q)9lwbhj8Fm%uucLG8_8Unv_x}>Ip2o!=q^Xj*2v&1_u*!!#0#> zXm4GlK>CI^+K(TV|Ju)UjN$x1`J)W60 z0#>gomsrUVzbMWI%pfrXTFB80SEdZ1Iknpu=|A?i!~zY+G$Lr$+Y=>oT~it#x=y&B zAG%39-F1Nw(GOhE-Egy+Xm@`cSaqbn+~C7=F%j=zq4%o=z3A_Q@3J_T-k*dxJTO8u zf%3P3_A1EU&&}C4bEsAH(B-S=RgxoUE;3*QXa>C<9A^TJKdvw$DxQ0f${#$8Zb(mtLX=g>=x6g)nw6zjLspZPFmY^85CO&u1;OAr~p|Zl|#bP>d=@ zuGCs_o_C0}G$T*tWPB!Wx~464P2F`((S&aTi^-F*^~u$5ff)33uKZ_v$9-Rs+zvaw z7e-jVu2j6dsL(b0K~HvW$9zKfSz)ZgoMTpC56>ha{-H0m-hyB9n!MwpT+*TP;?mlA zjF=&GND~)f%Z@;^8-d{8W3uTn(9p-g2*)rt`dHpzR0+BxcmBq`kV&=`0*<=svx$a+ zIiZsDGFlxBkb(*(xQUMmIkxi=+R&U;r^QSuM!uE?a63qzGakZwU;T7cfQY5{ui z_hP`!nD9S02ywDE*=-1S6Oxlc`BdmR7Vg4w>`~BCX zL-R>GHl+eMz!)=nyA!-qrj04Ubtl{aMUKJNqsz^mHqZ{2>x+=GQ-!;RYF{rKIj z-W&Oapf^7FM~JQ9k{Ylrkz?RUCf-+Pn) zUiD9e-$jR2KRxM2ePn&&HNM&>FIezP?|Z7g<}Y*9YTvr$_dji}nXT{( zOdL$$ujMLW9kAjdLMknuospvlW!33f3j-D|a4Pidg@Sg7OObR(P*iHwbSY$KBkHrwbBojxKFO$KpAd( z2Zt>7e_Gv$y_(3Y!Py+#m{j#F)KO}WybMNe=qM^-2wDlqeAuu~UL~O3W926#7*uy& zc??(Y6wyv~@&x{m{{h+zoQ_8KZx^$-i`v`aKt_sPSIQ*YK&rs~V_2fT`m=Y1MnUm~XcMnnGzrifg`yWBSXX|I=8om4U9b^Mu0kfOhi197rWj#YV;&i6 z-tViDJ6E8r(Ub+FC$7>5l^;~me*~#L_DpGkDx)(~34MMP0`P56UeuYmm{InRtF)>> zoY$72B@8L;SLu&_2oKbCITOPZa zoUbc+ONCWUa+~@*Dw`t@>n=MT?ARXWNUb2HGB<4=7I%Ygj!od4K4d5HZW}HSqz3jV=0Mbg38Usbrs3y zQyPkAoYtaTEGeFL7ePA^H))^d(@e?rvG$5zl}_lyWFjf3k}CXwm3=rpe&}Kr2u0|NxpLL! z;cwRvW^zdbKmv2)2l zwBd7Cfsbkx#m5IKkU^G%-Wyk$WyN%r8SKC5D5I$T(*jqu2>um!18?ZbJA@Jz*kXaX zbMB6#BSA14KkHzNFy=dY?HUVeVMdpQ>N$i-h)N|2r6SfkIjS2;@UY2Rp@Ab3LY5>( zb{G;aLRgRIWr*1q_2e&i`?pEmj2=cwb2K#$v*rGUS5WIt7`sUFyA$XT3l42XRRiL^V z&Y#Yx7TrFJ`Pz`VPuxG9B*0iVxk4g20>6+3{-;;= zgp~g$%nXH`KBmIW>lwSMjtDg9xNLk*2obO*Pp|89`WXEGQ$!P+#9swBRWWL@J&9T0 zbZ=!@<_53DAZcG@O)2&`(WCzzs*<;xSJF1BWNB|85ZWyRk=*aJJPtAbx?@02TIi<= zfsR5I7h@JZ&jSY`B`Db{1iIajzdI&rJzwnQj~rY^5M$BdtRbwZjG30>C7f0Tfzvej zkM?*nDAXL)gKu*@y?U4_8jkdJ8G;v6d#J?6)GktDMx$Cfin0~gP9|Ck+P#qw$sZLgzWInCH0- zF8nVc+0pOEN?bln#(oxQ&}4exh4yrQxw04J#7~8obpb!iD4zlJm8u$WvlSD%0=K{y zPlT=E1d{lYMxxxjzW0AM&xNN8LY7jA@Lx2wLFns(`R51uYhezx=!SfU9+XC5Xr~?>d5N<_6aJhE zD|1|J8Y=o46PUJEB&!izC6X4IfwYx^vrJVFyZO*+KEh;COfJ#DqPj10)iuBhD}npb z-52b2LR_Jl{P78TXFO_U#LxwUi=qqrytI~y=h_&9hMykZ-aILvV)`7Pxil5wg$soR zWN)1=d^f#~=*kxdl)e97BA9Z7+}->ZiPUm9=V`f?GmcObqTK;}LP# zUHJ}b1sO&3Ut<*{7BWKr$RfKzy3{XfIWc2bLGjhvr_wwEJu3#XPLt_WW_tUG6n!Io zJ=TrgGkyARKF2+Q)t?9*?e4T>z=8k_2Ct??IN(ocTgp#RsoVnU(2DA@QdAP(U_#bo zVf_U`qWv|*S&DQZ;<)-{<8~XSH(`SQKbSmCpOK?APyxM;T15{|yn&_rhti{4(kJ?Z>#u?L zg6*|K_`jdNYV+S*Tr}7Ifc(0^dw=K$;ZLP~Msrj!!}N^`mrA2LUmQCwTH^h#@&bJz zg2jMCn?-UFJ9PWSja5iT?yf`l^4vJ5?>`M0=-iwG2KR()PW0$k)m_)op#p)WeN0;V zDBp_(UYi>_X+O^_&EBJn!;=<*t|6m}J?raGzcsqsJ2Nx_M;lL*b+-5;EY06zt;iUgfJ9U7#4 z#^ww2*+SYEi8F#E^+Ewku=k$ofvkq>FTCMF;ye>YJjG_6h^?KHEV15S-ea z0@xvd#FqO7?`%(ivER%s&}l)?;ftjfVKbdEiw2Iaky2)m+CK{!LE0EUh@ zLiFJdDoVTR%*ieGGZAXUt8cGxPQ$Z>s-X2@D@}M9*dGT@-OjKj595PS`HPFhZWiBK z$KK7_RNsJjU|sWYj%7E$EIOUz$U_OK^~;S-tFsdcnbsj5LRK zMhJS?$a4K-e11G(eH?MmhjIz$8#__nEIU8qFfrB$*ztG31}^m0B0X;;#Q z{L=q}dhNBOY0UacV)hw#7Sjy8nly6e8KLGEL2<50Pt@b-qNl*%m{mD02_~nyJ~*Zj z`Li$ssV{T@46^d_CSq9E?Y-F6d)_=|?pdQ*u2l2dAMvZr`Zg_4FB1f91$#ZfYU{vX zjl1JUlLp_;sv>&3zED@(eV8wOG}Yz}d3IAayK6BdcZif9dYOnGy_{nrhlw(%U_ap5 zf-3UN3uk6w`(0t;{f0(95AN4ttge0rI32)swct=I{QGFYbK&q~HF-3=xK+9+6mh!g z;%=iAd5R~T-Kh)9#ol&-Ifc`q)iZz|LEZ)dEb(B0Ru4h+ah~rVr*$R<*ENiq=i`tS zle>_3cU%{-xH$#;o<8o$->?_(3Guu8KAZ|Ty>KK>gIAkX?%r$2$S8t9qPt;57bRp6 zFh%(ftOw}gq=ou4D*E=3oxCA6@-*L&CL!emcwWXDH5XXm<6JT&4fc`-_R=%{BOs#t z>imGN^}r;=$Jc@}taDVv|09>xz(_e@RD4;GNB?lTNtwnN^)RUI{vu8h6)_0y{n83U zGjZ`sseg&^NJrnV76``prJ}SEM8rFI%;N8#XBmYR*@f=sD0=G<{H1TSZIuI=J`mJH(JJCe6+Nd5 zugKPJ`py^z%Wu|(MP~`&jduNp0mElXZ=7>)%70^mE{7Rdk7* zeVjE#^(RE{Z8GFvRo{kdFHI()0-#oBg52J<4f6|z%^~tl6QeTS${!3ky0N8&mv?H0 zg(0HrdBHXzbM4LPsrV{5)_?=#6_N5HvN%H&i||qGFXry^1>tvKvX9W^xnF9A$svLN z%MUghbfI~PUh2I7)p`BcPL^ynB$US0&in2{ZZWCO)#f47SD4V1Q>6l9mgK6+0(G;o za!72L!8xClF`r}=T)!`MVdf-V?jUMoH9s7UWAa}r3F>5iJNzrTai*`d3)VJBg)&@f zPpVzm1;%$sS)%(Y0K23;v|nUT!UY}>P2z-6w)P&{B`bNmeTSew9$?^rhwp|8J8w*p zD;?N#oS%emVVZP2BA=2bAGQH^=K!B?O4|@1PlTz*>^XVY}^$UN_qM9B!b8Hj=CS_jImS3iU+>MHF>*USFLy4luN#9)#skPw1MlCiD=rH zt(rhAoRmUsn;Ei0QF#3qzGq{WBt2k(e3V)~lChi$<-9p!L9xmo;ACp=-I+t#4R0S% z4=pHfWdwGL7=6^Z@f#g>k7 zS=u4ca=IrdcOC9B7b;%D?p?zY1T}F500lQLLZgSV%d8onlV%k~ zL%3)vRmyV_sr}lZ+{vh$r9yAT^8rWjjSEMMS&6`d$D}_TbA2vlsT)zz)~y}hi>!C~ z+k~3tTz?uu-QxzR@$27Y3bDpy;oUxBWh(hMMiC+W(>h%69 z_kAhM;C3HOkm^-}V(+KC*tl&5D4LX~vJjW6bD_n5EZY4vR(%PR&) z1N*Te5{YSE6-T3asL09v9gLKBELE`dlCDnX!_yBp2kcmnW7z1ztMLYetS?9y9dQfO zN*ugcCp7lKBoMEzHw|isrsOPon}P%08e33g2+x;yF2`l#7rn)vi1E-07pCMGpM^Pk zz>N-qsf+eGNYLmkJvSxa;%eu50LYn+$P#8mzGrHM*f%US13_%;+kTD$%JcBGB8FYD2yh#_4{@6 z74#9R|6?$(>B;9-@YKMXqv`;XLr4gG-Hb-bx&)7@2$nAK!vqs_vjNGiZ1LU4Zo8l* znXW?23{gqk>>669auQR~!S55fiKT*i+_f@C}mi(!LzpcQqKV_tA%Cw5qwq zuBi$uLFg1ai^R6TnhjIIfoOmg!&w#3r9!ZDhi``pl@Y~;KgTuc;LuY-YO$~K;cI;G zbn~2-$iK>2d93VpAy=CaLF<Z(26%;3fpysi9L4`LM{^BgB4B_seP9q;6FF*t zBlsqsDbu!Cp|juv2vyK1d+GwnV8ixUKX8V#eE~L^E<#@ka+e_6z)hT!jG$0X2%Ppz z_3VLj>afQ}yb*E;m+#-r&>OFb_=S@q7(q3lz)~{tep7IsY{}bV&c)G%6RsS&!E-(s zT6%xB`=I9(9B@>)(aWs@{zY=mME;Hzp6)_xq9eQf#2bQli79t@l8Dy*vO7oG1BmPf zd%6E4hcew?*&@#n2v9kD#unHvU3CXex{ln*VRx_!;TVV%O=kITZ^37h+NGV2RKidC zajYa2%aG(V8_ahP-nxPC1!I7#$X57pD$Oig8-RjvgVtTh=A1TY0ivLL4mo+M4SMlL zffp))Q?BAl4D?`A2eX8mp$J1>r-T+6%S9Fy8c{OvKo?FkwZRixy8!)ko*^BthOha7 z{(cy0G1DrrmbpHm*rz6N2^!A%W+zH5)g!g;V;vZbVhi2hhOg!z)a>Y*p+)(sS_9at z=0a21!VymLt}bQkO1Qp0!G&F$Y_?_U8E+q8y^Cc09IrJ`(?-v_Jz&7Go*y$mG%F*6 zrzoA8O4Cr42=L~)@F*g{_qboNdk<}g6^9ANKp6$2~`VE0PBS7{7Jg`SocM@TUzo7*(k*r#6?#^PZqf+BJmjzzs6jHQZ;~^5@8e@EZzw|a0swBDFGVOE zHcbd!79JM$Bk4@#h+P*awOS0c>AAE+<8y$p-lYoR$nLIOj_T>i;N61RMRGy6Gb_4l z(F~h%`$)pyBz_y|B_oFO(hYffIA&Nf7oUcOxJcm825O)IzrBV4-qj7rVQ!l3lChHr z<`IPjBMk?xJPk)?K9zkXXoYG^q5J_+9SWR_mLN&q7c-skTs!ncQgu! zv`Y=bMfR|x8y~=BsM}1g1{TVTccYNBYcWcghND@9R5Z>oV5XOKZtm`Z4-NF{2~KPX zmv$x3Uxkod3PMMZf;$Wbyk1B4*5FL%Vdx7j|&u=FP5Oke{kwv&+X=1rPovLM3S8wNZ z%}A$&UndDSF-FzyXJCZd8fLXFi}JF6JH`eIw=ao=ufP47C;ziAj`&5$kN8} z`|y|Fxmq0lGB3Y2(szJ~7e4k)!F@&m_tDX=efO+5D1qX&LxPBq|HO!p_cF6--M;>) zTog{+oKE`98Jm2!HTDujT`FIl?I&!}=8%C9tFVb%*$%@!zP3jgi6_+Vf+bx7vNed- z=G8PH8fLJ#&SCfp-tOj=FNNH8NF>ZVp_upCM*xj%m=t=TzQHkPM}s=o%Db?$Mc7-` zMz`XPVZcPa8IBhYO551%q)7)HTpfW&+#O+IE8o6)SZ8mUZ!T3=Fb1I5NL|?4#*?ZfrQni!1_r3zs7@ebKOP+}L}l!iwen zS45AT7^e#_!S?NfnUa`rV7eivE@og8=vks$c`z&}*0_uSY_Sw{6s^oH%?Bs~%9x`f z3_J8-2OTCz5@e>A%+k6>+s$5gX zisB|R3;J%5OcT;zoz&WW1a|ulurX=iJrs8OdvZo3vt4M7k1&Q5;B`v?I6%k00lZfr3%4(z9NoC5!KQZz-VI`RDFn?s zGjBYqIMVL6_%^Say85#PRuSv(-C9mr+Mm7bgpxuMbb%sOSVcxwt7RxPr~*-kN6_yw_Iooj`!d_8nVD_O%=fLnYejBa3@9dCZX(>c)xNYv zt@>WAt7@nK&j0=IWEQtQp7*|c-@bm`;BN^Ymj~Y5b8#QP{+7J#Vql|G1R38HanXdhUU`wt z%1n;ls4f*0wCx?!^E^9 z-*v$EPU(K@V&)pZ1mkRrG=MpckiI*t8Na;`c<)Wdo zY`jpifP7CUY!wf_TpVO3ykwUR*d*-f3-d_x2yae_P>=V4^nij_`qS9nlsDVAB!D-s zUI{H;KG9HJF2Ni%;~FFHnp}gqTqbQVLHmeezk4zg#g&Fj_M*U-YTty+m{sD-f85R*eI}Ly zd&z{;k*zr>LYF--w~}Kmp3bPT&&E zK?CTMx=|sko)CwrT8}SsI*7Q2f`7#jC>F>T9*`?`PUZrAv9)#*E9(loZ^F>IN|?v@ zVFKjkfXhAf4ajjq2VTZs+hbIvjEzBqf88Q1lGWeT7Ij~3o-O{<>PY3@q}VTHcQA`R za;!)D6?Wt*?YvZkB|^R1Z3Eq|+h&kk)_>OCSQno*O$2ua2z@42uJiHKWq9w=C^y&A zP2WQTs5LCE$={@duxsb^sC;+mB{}E@s%WiU{$S4wzTFtkf74fy-zS^M&ue03@L{UT zgXpz)^MOJy?bMdaX^%m(!fy(wuji%WQ}e4v`MKB>M*ZcP!8}<*J3XqsSui3xr7|MJ zuag3-jk}m3UXX=%_+Z43$PhuMNe>U;26uG;h%dVOW4{oOtGk%f2-iDZ5l^@xK8?x~ zYQo-pnoBF>oU`7|##@QAn>n_-ymp{2OKpJ=kgkTh-}Gogw2nn+Em4or2~qhpmK`LF zXf=0}2rw*bCPC5LZFr5h$;n%H;+HGO`?Bh+D6Zx+f^%gM{`9mNX$5TTS>6&C|Fj~u z-4|rbHY6E$paoVFdJl6!rV_4(KiB!GW97bj=)vYhOgS2!N<1`lBmri{Nvze=Er1m| zgH#}mWkR#Bp~}C{LzdG(#cr{l>7S%;g6nV^lKxj1TqciW4kIQJVV=RRWBR{6=>P7|LqN?WUZ^y=C%)r-&7frN53SOx(&ih4PaUKZ-;{QK2`ph-YA)wXhUjQJt(j%Y@@ zy;uZ5{2I6Lyq%r`WqRl6t_+HbqGfM&|0!?y6~*QCINNZ_zIHD;5h5pBw^N~&{QYLG ziU<6zjNJsBtEn_Qhc00*%`;d#s@QcyksC!(n1mtC%{w4V)bqPz+_VX z{|QTKA^>mjN;!AylIAMo!oEkszR-pFV7KWdz)3IGHNwHgrlq7p1PR^p;co?h%fI6B zJ^3sSC&gU5YxP|#+WmgUTZlXn>fi@U{AJ-Mvhin(ycT!juLz^NHR2=q#8T`6GVbty z3PhBNvtCCGld@kxAF9IK<@Qah*N_1cf{!=o%A4G&HpaYp>K<_>9#21av& z2It8LkR!fw%arpc147iM-7jI_hnXys4v}U^vFT0`(vB;7sTISCE)vMzP$+5c$GTs) zcL#OU7KPjsyK6UacYQ$;6DiRg4KQ+tfjGDY$SmRvA-;4h#6Q|ssJM3pQr{=6dEO`{ zVO7j$7qj)+uwY3xoXBY&OpLZj4=Sk^yOJ)q9BmSBRmf@@%sv9^=pDXLqrPt3dE>BD zU{&BlqEX!s$es#kWB17n1u4vOL95#YUCeOJ7kfa0*i)1zOU$eYC}9P40D_i-aDvLn zAhNgOwU)X+g)PQD?oX(RPT#> z3q?>NQ&&d-Pbc?`xB^?lGL1g$2HwQGR(5F|nIVv`J%f6$0dW3Qf?B99SbRj1cC45g z@Is0B$(za5dy%Ujl(;xlKO8pnfNbu<=0G1JMB@7rLcdlQpdo_{Qlj-856esJ1=^4k z-pDA@0;V7==P-x0eSRQ<7<0T{uSAS`kDeXV$Ake63b_&Il1~AX5{1^4B_QbsFtk*=anGeT2= z5k&u<&D<3k?+Z=ab0mqdx>A)uBsh*bd;n;MKwxLq`T{^EmmM)(F2yuSOp^9YlD>ci zlP$5uGIGr@LO=Wh3UCL03iD;d$#^M@;!eXZM)^+?<;S%C#BZ*E79%u zBlUlszr%-bT?*dBE%&P|SBhjKa0R2P6w*|48*3Hsxq%_cSP~@eMvA+v1&A`SUv-49 zJ9T;(fC_CSt+vbM0_=Gc?u$TVneZp!kU8SGe4KFUy|`mLZMyV=#u+#u!oFT@y_)n{ zZbyFyJH;twn)tTXi_J?xX1>{^mUoN&5+DYUNQw>YSKp#O*q~k4>LO2PgPJTy$t1Qm zp`#bjAIt=f)A~V*uLzqoNwDFx;F+V*NBmQenmgEpIGNk)Da>+9SHC@BBs||hyQRkn zX+BE<9rTB$CRh%;ni?>`5PHV{=fC6qpIq7MSU=@6vYaH`kVG>O;Eotu7L@M|*b*Gd zSTe68;23S{pDwsqA=X3&4dfEbDWzI<`pNQJNBVlfBLo}G!w9w{PauqE|Tn@nvjAavn8NEou?Q^YrcHK_@`+v&X~r%-RS zMr#fB$>b9m+MBh4L5H_DYLN$?)ZG-6o{vruUo=_$29Hi0g)AAAxC@&?Qz*LPuk=Tp!~!Ii%qL4hD3Y&~xNd*i<7Tbfn>^N*UYsTvc(w)SoIb~=B*cFd zCL{BlO5j*7ddmlqgveWz$=Fc>OuHY~D~2hbZ|8e~EWz9xEh`|*c3M*`nb}a6W#p@} zuvuxPU1_diX)r24a~>RT)DIDbDZ$)IZ-!P&^Qw! z+(2@I&3K%k+hQmN=8^~z#=JJ+KY5-xxtx_1T7hMP*Q+I+ ztFJ0@PmB1qC#~x8I=pxMfl<=aQU?H(Vl@fI5j-F$p1g)0Q3Ox*c}g42V5vWRrCe$_ zR~M2D)yRWa^757H-#db|j6vl(poJOw7W@HpHyo5W^Yhk!RGLn#%9V&ezS6<>kLhbC zneTo+rQ_qXPx)-nkLq4bo(nL2&5?W)V&dOHFy;@SxH(WVxDG(_!@a1K^;v6C>dS-; z=l5#uIOwm|QCf0lkMtz&Wcac4)NnVk554E!vb%{|bZlv-^%UFIezZl#nx6{2Ds3jC zPffj81D|`+Az`Ga!lz0>=Edgqa$x3tWw#&IPlc#TntxY6r_xgsye}ede3h`Gx~U(f znvEd#u;C-A+@FdRO{AwV&f*ifAb=yUVKZlDx6Kakp~58$?a|zn?&AON=+%WsZ(7>; zO8y^d+wbn>@8_~jeGOOXemzX5x~n*=?6kNP$h;94R)noo=95m_o)VzT=R}EjLZhLq zc{Qh=>)J_IZ2Lza`ZD=YfeIqug``iHCN9@oAR=tA0T77-s9%&`$U(XnFqG!vN#-ep z)o#ngdsnWiImT{lwsG9bN_Ty{l#g>Ko^hwxol~!IHCp#&TK1gky4{FdH2WH}s_FIh zel1?dT&06IJ=-|%Yimw%qt{gIPI0B1abMiJ?wx1k#i#FdWUW810g@s31b09g-cU_a!NZTZi)1ghDsmkCg^T*rgDN@*U9eH|4fCkX(KPR)mA3s$w@_i0fOlL$@C z%D02#q@Sz)xRCDV+W?Q-6VDqUI3uJ4n{{$yz&%kIw!9X#Ajpl4#`|v;+E)^mvdX=Ym=Bw_8%;dsC=!r_wmCIqCHW9`>ch zg*|hPh;#7T)Al;oLfXJct*Fn@<4_1pYE2D?VetCp;OmOd4X z5@}YVMs8Ka^-0fsLLlQ~QgwxE-wnrv2sf5-vU^iqT;gtiX~EU5Dk=6g6*~7ofRLLDegbkWju3m*>?oct2kk3p}b9N93eK zqxyYJ`-+{J)jJ(+PPN9ur(s(6#Bopxb8%Aj?Q7Rr9ZS$kxFWk8YhKmY)V*<6u&38l zxT~&lSFx`JIBR#B9z095x}i76`J2y>Jf-~ADR1XBSv zTe@Xce6)NVOesR)mL$VDO@EpK{>+eQaKA#Rn-<<&IXT7$MX6Z>z^dIK%3)Rh6Z`QG zIgCA?Eq0W7jAm6*ONUK~XLj&^e-jIcSN-*E!;K!9#*0K9~4d2czDwFs*edHKX%gN}ov#9vN z29L-F@vDIx?yZar)hQ8RVXkwr2Dz4-U0fc6aE+oyc}qoyd__PAOa)yt*ttE*1xF}E z8t5Ui01}CF3)DbfW3maM3Z@{81VSm337WDEC-53wSv#L}c%4wkG9?e96+^TWV6X+C z2R>3Xi1(39JNnvvX*0>yRVrt75X5agUcRSW6u>&JnxZC-d#}#;1XNfmwZ%TVp08q> zqiW(u@bumf@^t8q#CScwPF^(iR7m~$BvCcuYi1MU@@dd05-3JV$t(?8DuxW6f}m)j zGWHBgH(Bmdti4(xZZxc9(hOLGCqlo%$NK+P<4VXK*+G9pyC%zwBnHdY2&X<9k7(i7`oLo(+Ab7|khR)`>p&8HANxQ2zSz+rtU5Ote|2RJ|^ zLY#Ffnkv+#oe>`V=Bxn;vyZk)!--aFc;pql4_fy7EwwhMK zip6O3lI(;w* zfIYx_=*1L!4!cXTe3x5rXhGGJcY;OZt*at&RntA{zz1&d5CXm6Fo4Jmnhuk!+Qp&* z7nowB^H!WEQp+<19hGjff`@U(lj=I$1!6!XbXcUXzQ4~+O13_JiWC-gA@YM4)I^-n zsSFB2A;tznuBlJ#s%mw;#b%- z-&Pmn6Fu&xA^sxD|E6}Z9Hk6VYxRRt(Rw&_wx3#UQt=;oD+>r+dgtCs)lX^7Byxga zx)e1zP%CaZGo!BtDX|5sJ~+@pae}a9@Qhh*IP^xpz-EbP=e5tYB0DRmJ2S2|p7w~N zRY2E204mLyN2m;NmXF7->P*HIc54kB$Us$1uYi0s@YY!?mnD@n=2ns*{-X<Nte-SITUFQL2% z-@|KS1o9JjpL^;KB>W*B06W-q`KU5lEHrq)Vx1w1;ICE`RBV|X>G7FWH!x>(aT6u# zz?TVqay{5FTQ#Rqef1Rj{d$a3*B`P6=8mbzWN%R;q?P`O*dq^Jn`?^Qh$IXG?4H)t z0z62}A#S$e#Di`K`vX1MxuD<}JmfXOvVii*x+Z1@KVENFf&=DGV9KjXVEx{P7k~(> zZs4HEcMJVg@*(t2rI~32d}@LV>xl0W@>x}NOdsIrVP%qsmOGU)#Q-sbTJ^;^GVP?P zudAr322U%TYim=-8wzu(Dzf018CbE<^a#j3pF<0g1{n)J3ezJUt{&8=o$?eaD|RN; z>yJ_eyNd0VJw-?}X=KURl)~l;;e;$N=#AS(epNzJ`D2*Nw>fmYdCKMTr>`^?kPu4| z?la=Heg@Zn0q|MV%J{r)5; zMR1USA|aj^;)x3NPhtD93!OP2bSBC1P^MQ8WM1Y8vUz9ss>!ZugW7?jNEu>!wjD;` zr_u^CEk=9J#RZRSnr(4#*q@>X6fPPY^rp!x<3eyo{~d@{b#3gl-{FN4R_CU}y~kVx zoyb_Ik%>+Vr_%p|tlod0tRxm-ePn-?I74&By#K+RBNQeJ`I=E?p`3%rYx;ciXtjik z_-P->AN8aOhj3bi#$>UQWmvS_)S)NCtGsZIaVA`I%d5dOK}-F}T0MTgw!^sA)z?#!fFh@3+tAg5F{~?` z0%<^weQ;oHZ9d5Am$37dg+GT<8W~YfvZwH>_4Q|Xj)mY6F*Um+(N9zlKzLO(I~N-I z+K&tqP(+7>5dtI=!l`jlRZp?k6Fm3v}p!D>vZ)0Cp_P1h3Tm7AEU%1sH>VWOoe8MY_5$bXDY?^u?R8OT|~Ko6)1vqNIU6 zs`Y{h2(BD3C8K=sA~(_x;7b1sS?gx=m*f8gph@3v^)c51S!XapL()^~ot_`Ql~wSE&H1&H#q{9&!}k)Z;Rt`om9OCb;qOwa z;0SyuRgSFRmG#yV z?^Av^u!5##dG-mS0WdBEP-I!^4N@BhTiD&#GCAeq&SZ8-eK<5*zGQWo@pgKqh#s+5 zQ4NCyUqr$i5fA&I(o*XnPP{^5>9Fq7Lq#kU59!fr;84!$pI#RGf>{Mm4+aVw1|#xd z?azyS!OZRTO#?$=TX1PLbkGQC{-OCvBPSD$d6|Q|xz)>~lfuOwPtkJxVjN zln+x3>`xCxGqJJ{P7mRm;H9AEM-YV{y=7|aCmKHX3V7<(yxeJ^{^0)!cG036^7pLm zT}noeGX~j!ty{m18`90TVic?6Msa(oV54aoIs(DWl-$#LtdN84TmNKe^u_N?wRKw> zK5tspzUnsHNFnz{&09MV-3O~iL+wM>;gH-HHM*4$+5uzc5w`x!ZuTzK*Y?Jb`@-#e z8*TALjtNs%*|kIJho>rs&<|O~L&7R)*6YkN&CNqgo?^BRe*+=>1$vJN{zyRBW9oP2 zryVfz{Z9jTfg8PPYU=7VbbW8U8JOC9E9EnI^l(toDXCrD94+J^ndm5a1)@7wS@zHT zfSKmNkWUYfwRBT$>}r-Kon-E+Zy5WowieC`6Kf_y2W@yt$p~P>`MTIz*d*MvK1ATX ztO4N+m^TmPKj~QNya|heUWmQ2OK6f(pXSxZD^$Oa|cr653 z-Ku`dIz>Nf&dDe3QOw^=R5U35()DM?OK`V**4L{Q$9$P9)t?XmMkta9Lq0@aEatW- zl@+H`jHOPDU5d4vt{G9_1AC9i1mB%=kdeX<9fvNik&|1 zt-2g=bg+E9WCJ)4^<&BLN6p5Mq}CA(lfJ2Ft=nKu`k^j3)_f#F2bT(W)m#$QRoRX~ zn;25{T|VzSbIY2Vb+=nJXYN71KjYQFCajI($Fke6&eC0|I7ZkUBgq4PQKWcV@G=qR zH>%>wkJ;t7s{4|o_4#PUji{cn9?Y@1E!E=Aj8LtkV`J$c3B6Xep#Or`u}$i*BGak# zGp@|Cs{MfYzbqjz=7(S&fQho@_23EOVN#S3Ft=RnuuRsA_Lm9|2<9Hqg!HT0jS?Rk zWRI>f@33vRpwQcM1#P=&ZyGA5fN!LYOmC|ihne2Ax6P`}3g<));AbyFu%>TGChBJK zXN1tF{@lwzhFnic9}|1#Otf%PVh{>e{}f%kfk<)R;3}353D>Fy*PqNu2SmvOZT!S( zM4};E-!`|sY=j5+5!XXiZ}B#_jxp^ybWP+%Q2bJyqme&083khLEUvAeW zZyA!dCLUX&612lK#_JCMIo-A8ACv`aIwiqOlHa+zv){`O!PQv z9E7&gG|^{ToVxX9k*0O3D_=|oK|Q;Asg{+DYa~<9xoEb2QV>(6F3q2m`VJfbhamEP zdUsXr;6>WZOtgJ5&dUhwovg;0Izh-gS%-3w+j!X0ECP0dd1YkCJtHxkD3i_4 zVbxgZqJiscu@kJpH%+R1c3aA2RTNOf9=@Ru699t=X7l0Mqm~-V^D&tN=vV^w=0U!4*B0GTmh^tTQ)WEqZOZ zRFRB?;_r4GbMRDu!#<=4hq@9xk0)n@3w-70ki<|XWPuyL#3=En_y}a^|S{e`*Z5exOvIR9nc|t_8S9vVmWF;qDNLp_ z!874AkZ0yI*)#K*{7mu;+8N}TzBBO|_{{T6-%M&ydX1U!25D`b_8;TUAYETFW)oHPyA< zHMVQUGpJ)0x5jf!`HUHi8pkz?YUQgYtlF5?Evsg|t6aNW!(7W*2D35xIQh8wHo6AA z+g%G^8Ly7kQK=vWD=0pSBP063EGcl82i5`oh<{oor7bEbQ7QjkPvtKycth?d_CjP+ zBGdk*F*6e~nU>5^f{ZFKu<~4JzTf#VWXcbsYySV+C;uf2{BVEmJ0If1`$1&|lq)D+ zP@c;tyr{CJWlPGZ?<_2_Sz_|SZd-8s9w_po$>dSxxD@>hpkh+hzc(*yG04n1mRb^I z;1>S$y{j%%e-)rHg>SQH3}Ej6GeP>v zZvQ(?yPwd|oOH5o^`)E%1-rg>TiaHrG8y?p5^$mULVbL;;fi3tih#Z0LxP&m%HXIA zfGazqK|Hc##6ja)&>?DiM1sG;R{CS}w96dSo|~M=o}lP!}>G+G+!^=8{NND>UHyS&in{wzoz`G@%qsN&UUrVCnz-^&gu`LR93xue#tnd4^w_=N8##1Pm<&{mL8*-*!)53v}a@dL~T$-eGuaL@3ED$+hogqjSzHe>}7z<&N9$xPZ@F1 z53!e@8|jF)b~vR0;6dX!xL92BpJOm3o+OrbB(udH&(jlzeq9k>m?^J~h5L%Uo6Cin zlRFu(^v#`&z*Vx_A_&`kFlfA zVsEBMfGqsI=#h?njNs_U*wKfryqnAwh3JalqVX`iAT&6L4H~e{;c9}M*(<9G|He$1 z#dYM~WT29M7dK)x3PpP0m?4x}hq@d-N<1VrU2=j~swQoDX-CZjs>UYgeiLueHp-FV zs=gC!wHjch-_}Mqp&rqTKP#js+{>5P@0r-)2Rvy2W~0A@HtjL=pg-TpAABrKE5dBZ zX`Y9Po($+sFlbFMk2@q96nmhEW117-nDL@d%@O%f$4ZmNq>`odq!tA>lZuKyC<_8s zZE-iqp+ev@qE-!(4RkqxR&Ywj2C5kJ%+R)XLy5EDORle#^;aXH^yWl#W^26bm3(w- zHKS=3+SS|_m4#L`42LkS>qI9YhgPNTu$XeNR;fJ4`Rq@ILb>x6O1(c0)@uq!nF9`I~C8ohXov5 zhgL%y%cWd#Y*pkD;C$pG#~5qC##;oF^nzFDpYO$4e_#v)Q%Pt z?;}R8zepZTI$?~?MhI*3?}n-sJA5xm@%ehlfzh+U=SX{b7Cw#=Wel8E!nIh4=n0;W zYax%2KK}@r#mh8uau~S*J)9;b=FC4#M&q&WDvlK>zq6b*ub8M)4-V~CH6Qa zhB9BZ43X_qIpyRrG6jE%Vx*KT`JH6_etxog$raest?1L!uaYD=P1ii9y@9UjADgU* z0pHiwtXv+tePC-~z}NmvP*wggaDGfnf|XM#rr{vsPWxPKs=HSiaO``*^!{lDr#Y7> z_CVrvwc+haGeZp)vgMwuMvB>WXR3d6yGH*KW$z0R-B}~)H=s|M)$53 zl79u6-MjcPhi2cw%AJ{i20Z5P;KY)P5_pOyhDQ=&dO2~}B#u}h?IV)7?H3}^3Aof^ zkeh6Z8Wx#8AFHX0k|?&x2*S7ik`3K0UWyJM!(d+A7~pVv|(mps7pGrt6#l-2cdOBi4ZZW+Ty7OD>M^4i=iRD~+(Z@T8Wg0F-G@itMsjMEB9Vm6#Xcd^`9zhA$SOutuVnz`j`|UaWeB??UCC4j3m}^NH?^m^x3~uVan}d#+hw-w)VH*N75rQg)I3-fv>$^iNqo zfUgIU2%}oQl{5-5hG`)^+##PD=d!?B|5D6zf`JUY)hH)yj{aqqzhPuKC%)ZnleDfK zPs`~Rdl2RBS|?qD&kkG%9U&ulj1`8wPX`~X)xPoEL^HAUMEl2^DE{KJv<+16V6*bS z5P?8P>tFDuY@NY|pHd9k7Wc*vPsH@(X5V=FGY{_ogsAyI;MD-u!Fx&Rm?QJGnUJfA z)_bY+#Q6NQP@i@P#1-9^_dXt_#P_$8-+s1&6L7&a~Bk zC&|07V~6K`=WuaC+v4Lr(}$|;SbcIc5S^t?v0+54L^#T*7hm9qVhMmcIBrml+k6#< z5~ni`Y1_Ry#LenXqtveKsV&E*cb>$LNJp zbcWXqJaVxU#Sqdj;$f$O;b313m=#P1;F8(A#NSaCM8f{H(30DOgXu0kb_yip;xZ&k z#vo$3YE}pS$Y+8fJ2BZjMv#|Pi6?Xa{z!zm7jP#Beu$Euj}O~)A$ zGit6tnr%?N@CN)mqE1j;B=2hpP4JD0y2x4q{G`4FN(8o>*I@d5n;C0KD`z*Omy8IL ztb!!&Od?L@5AIvfhkLuQ&CM}h)}Xci8b@W2n`I!kc&n+*RI~>wBIn}7vv+`PlGAFHlAq$hveK(Zwk5?r6J26GZbO3LG%pQuswDrh?63jlC2x=K z3X{2}qsYWG6Tanoz@6m^E8qD=bA2umT%Ehyt9G1M91UJV%-`MOku}D@+5?LgKa^FA zlS{5&5D}UX@WoiYI`Ls&9q*B~+Cjy|J3Rkr#wG5{+zsrY4qk+ri_Id=-t$PdMGMFG zD%-qDzZ`Wy5rC1@AP7}Vh3{e6JH>k{gS=8{B$NCx9ovOV{0%gtwl8xCQsd1bIg6(P ztonBULk;X!-a~JsC_1Bq&b(GELTt1oIh068w_f*F(tB$E?n%icvP&l|w%bZl*afw! z4Md_K5T!6cMMF>opa@Y>;dNC`_;Y~e1eU;1AUNA?v)hAUO|}eYcD^pn2Mwb_+F{v6 z*}@8xqnDL}lmH8Dw$JbX+?HCax6b#z{Q2(ayz0E^yz`>-=r`W()=3;~w+t*1s(H-O zH2h}7=3??lDK;MN%D3a$Ce8nB9NgJt+tr|g^C&3Poa)J>8@g?NyZrHJDdz9=KV;7; zy<;&IcYcwR;0dJWAhK_MfmKMVpsawT^r7M~cOhZ)JX+2N10R`gti&q_Hu)8L{L#mG*otIF5UiFO+8<%(#LBmc znQ*f>nU?r#Xg2aoGlA?@pJqtB=Nr|uL41IY6_QWvC-y3B%-v7fY@URMZ6z_y^EJOq zt~evTdL)iiAiV-MWdxq|AO`bDzr7Paq}f(#F{1|I6XdsuERCJ4G8>h(?lh~D&H$Q;OI~ANA4rtFod&>#c zv;H>P4HlA_hGStwKMQ7$!q7FiQyo=5IuP@4HMm3%Q*vl;#^1lO53qAm6h)rU#DHG! zL<4=lzMjIlSAx@`V2=+ikZv9vo1Ck17Egh)_sO~Q0cSwLUTucwOZ4s*h(pCj+&@{N z^}}ZCdxD-6%3xyX)IRhgm%DO6%t)S+kYjH8oP zvuAIhjnt7uk-W;q$n3dHI^24ee5+y!Q8w2vd=xMdV8BI!0TuuRQh*|m0Tg%$qku%w z^p&#M3-EIl$|(5Yw{YlL^RIX7-A*>8E;T7JsU$TgLsD)vA{%c(ub-2C4Q07j*TmHq zkRPFJwsh}u2&raY*5vOVg><05?=_z~9y!s_1JZ}4C}G^R8(I@pV9j4i$9u$nMaSzr|F=-qY}>BKvuI$3MRVpL+vB|wP{sr!1Bd;baUo5b(fi36!y zQK<10RPj1|O+n&TX8z7&Q$S*cZxA$K5kj=~IPr5{JJrBwiPk^pY8n?z1^ey3z-*#sxa3 zL62*UL0IJA*d=Gk83f^S)23}{+97%$_P_ZL^BIZ*MW5F)C;H>s;ShPR>KWNhOz|tv z!*uobl97SEf4pSqd0S2}MLIMEHRT7J3iBtMsAQc)MCcxRjcEcf?3yP@P-+O1TW4^1 zVj+c^P`#w!hVy$jbo$(S^0n#cQ{RC^)|)XHPcPx>gj{Vg0gqE#!|#vD-WuK)d*7)* zVU{x8d%Ay19=|V%dzOct0|3VNo)3fKcg#jB@5(d{0j7r>02YdpD5|SrTldj20H?_u z8O!qd3Bl*0qpdn{k(<+}vPN1T&YUhvbkk#7ph9a7%`j0|#%2q(6|s!h+JAK=m&kv0 z{C;E`Y(vd|{DtWxtaKY^s^abKKYt!+jZ<}{9UHsEAz;@^ZsEw}lkckn&%zb*Vm;fn3)?*9Q@&YCY?s_8MR;l#>RjH8OUNeDFb9&;mGT73S|um2!#tM*eb zpTlD@7@7(bfB*QJ!$pcw3PpYRB!eix(?9*|*r^}?w^k@5iKCK52SeO=`t2r$lpke> z*-`dreRz{oNF>z+l5S}fo1uap7!lVm5y)sl}ksV64Z54y4U z?WG)TnET@;9EXmSb1&Q}!bu}-2j4V((j@HE$vZ=r6h-#l#?z1r|OS=x>9ED2j1j;;g7sQ_b@)?$J8Yx&H9p< zHuWilJ<;yWeeQbsK`PEr-9h(^KJZ7{(e}7~^~c{}ef~r5^B;e>`|zbIZdm&}DJpN3 zDPuz)dE@P<`pQyV%*WhxrU2OS_d-7C2i?f~x*vVSqz%;{T}nusik1Z58dwxQM6fKE z6x>Q+O)n{dWgb4y3U1{lO!87?1f?cfND6YJ?_4Y3{|DK^U(Dfr{=uv5m$5>g=ChU;M5$}2Gj4$be<2dC3??%^4TbDdWoio-WqNFlzrjXY_tAam zey@6rYaZ;o&#T#tHSErN41+8`?f)8CV9PIS-)aVrsQPZxC}rna@JXI}X{*i1h+hWU zS67Un^5(5g!}1(LhZ&<)a^L@+E%eZg1DZ9(4BG~5m}%HVgL9CpAv8*nFfe+`mIG;gI5nGHG^Mh zAy#@5_FKPf+pbBn7^xMT3e9(XlO0(Wq^yKf-TuI@8r`Ld>NF&igxg&jhPTVD^=Zr( z6cod|G6%pVwQD@zZ*Uy2ZMd#2$qU`eYM|3>V5-l7#Z24V-Frr!**|1eJL50kHdDx&3EW@CcB0TIsKl&+0{FW)_Nhv#OuqT5{)=@fPn}K^ zupiagGAB~_Nx`kxL9!Eg|ACXkaJPRMnm{(~b8h|<-fsN@wJR$jlC_~@CA;*+NC?HL zR%+_HgB)5}nGlxAr_?l8wYM>FtM*CcJfCmn^VVoqCifefI|7TmG@6eqCCt7O zWjOF0B)l1#%F{0;Ggij{vNbjCtjSpN^w;U@n71)(saJa*yo++x@I^f9yfo2II`0iK zw2F2OST8X_Q_x?oaad$m{a6?_S8KVMU*dI5enG!pvIJCo>r+O+Gcx|0s%@&x=b>gA zuUP67*TQZ4b0@m=&9$P`B2a3qGRIZzhFQ6IaAQ~Hoe#0%qp*IMC^g9@(9J?1>={}A zHRR)~5}#iIf!*1Z1R{joN{Uamte2l(!oZMIcQFRVlKticxQC%IypyAktpCYnGBWb+ zgvt-w-7l1mEXNLDhAI3Ad&|x4i#zE|Ma@e_&3GoSYtu35H8ppjhmtD3L0eG|6_Y(* z!hLcVTW@f`1fqI_n`X0Nj*C4B;Ft~FTFA&_kiOVrV2>+y7p09q%knq^N3{89Z<8HmO z&|L1ZCF!2)5MG*Ybf%uzzj3<7m011OD7`$s;E$+2rP}LRZENw*_q!Oo(ejdJ=JN) z7D?{7XQ0(R)rsghPj&1bgTJGyezD;F?WS-3??2thNc~&@VD*+JUr#T%`uGC9`&0{* zOOqSv56UCMg7D;!^P^;)Pc+)-krSSd(YOD5R^H(EWKUupg3TB03^uD~dbDm=%nDn4 zg(i7vovhciXKkwUIppXeO5Gc9QAD_nV5V!$AG5fii9ivwM!BArP0eUj8m(9Rt->+b zLaA}??9oM1HSUl#;HFy#?1FcxNMFHAC%q&YD=Apq%e)myu3-j{lb!HQQ!m-zH8@rL z8Dhz@GoC4MGx36hL>m!SI>D(nHoeno@vWM_j0r7nOo1Q>nK@(9AO2>0A)a$zbnW#O_2W>EE!<8 zeM4wzv{~^L{6a4O{7^nC{qroFRl zrl<}4rXXDh<+I3ao#I0RmWgbg;tg4cJ`OG3I9=l6-QtW7PisYRYWX3hV;TWMQ~xkx^ezsNl7rv=xx*8_$J@mI@vqJ znz8X|4bQPHtbuN2b#N`>DyGHWnAM1t+;bOtSR7W2SUO_E?1HJjzR7G|=}wr3YEYLL zR$`*wZ0$H!jrp^1t>WVC(p%>cDj2E+wlxcCYU;lH*7ViM=FUM&Ob&g{uGUR9a`8Io=@XwrTWFIzKKXsik7;{3KOmeQ-$qBw|{PILqblH{YZrDMy z1l{oAPwUmi5!Y#Cf!3_qd|E1YP}nKn!vb6u^;Y#XSc6c?Eg)JhgECm$Nn=6?KFd05 zYUmVQ>4$A3fdMk&A|?PtM3!0LC1vBJw}`yhbq#6CG-!+SD@#;LA7P)yysGz%G^d*X zRMwu!pEP+@#WhV5hRGnUJLvshN37T94`n>qdPa(B9ZX{XeVfQSIFW1rd}hM6ZF2hI zXP3RR5Wk!dvC#v-j2HL zNNenK7Jn=}bX$F4V}#KOL80>RBHC%sX)V8aW$xK(QM0#(<$jwb`V5rk+Hfx^t;pZd zT^SPOiG^G*TFKKT>7-%x^o#!HQ=G9=HzS`Bj2Pz%oJdzB;89{Ui{qqg5~E-E$R9JT z$JS5JufdQy9@#H7A{ZRocPswM1I#;Qt*J8g`D8!SFI^c5YU)-rN&?Y5Sp?@|M2U94 zy&yDBVLL6--&u3y9_Xp`NBCwF0qjo4zlcUo%f(sYD`vS#IXsT_TP8NCUSUO^}} z4fpQMM)@YQJ^MpGlpdOvj=xRdh(y26@(qKlK929-HvRwzGi&?;!5cejWb^t0DjGHW z*NLFk#KcZirAyc~Vzg`bB};~C$P{bjij`@ptEYLo?x=Y@K5ZW}0I0GQO#q~|=Nj$q zN#wA_#Mgp~bK9Zg4P2ZXX(c*4f81Tax; zjM-#UgJO+mv}OADiRbBq8BAaSVMMIt2U=LQrOhwOywGf&`{w4(RyWRo1r_a`fsr}q zo~BU~^CSiSGO>eRm7gw}_jF-~S)zX6q%&8)ddk86GR{`P{Ph{EAJ4NMI|if19};T! z^MmX2Z1j037cy@({PRG$lzFdQdX;&v<_}WOHT;q4UFN^s9C!v+yov zRl>lz!2{5_npXh==51#Le{IaQ6gg-YFIAC&b0o7`_xMC1;wsQ(Z)pq;4_XcpR#wyD zA@FVQQ5F9r(FG0b-{DZS;uj2n&l&usi*|ThunZ>E6_Q$jb#&>V3C5WN`OmE~G&X0? z5+b?r3QjTjlbY%uj4sBNKHRy<14Za+0<1Vl4vM%Ho|R;XX;CTDc)TUt?Cf7R)nmOD z@bP=vGb<%Kk-pV-r1D>#mX+G&Zz%&UQX*WX5-Lc-%-#kZ-*BxQb6Q?-z0Ur47;u8t zdG1KYmQI+2km(58UP;tKP!?FFPPh7Slb4aOlPAJjpcUoX%YD8>-F+83Wv6qFMX!tA>*|do+hNn=Kxp0eSBB zPb#)orIGLn!`UQtSwZC`Xq{2U0w;9Rz8R$NEHF{jv2O zGx^K7)>_lqW}m~y3~ME^SNs2Zd#qdY@SV-w{*T)p=4FePw}1pcIo^P`;3x2oI0-E2 zmH7!rA3gA8A@#@H@N<^&uD*EUy7lsh)_kk8`u!JY=1BYgI=Do zMW^Z-3-7ykP*dDGmtt?~L!bN%p-)V_6WJ=zXH3T%h?G=3T{?SIcCT7WY}fj{I>HX}-zX^zF2O-J1et#CsPylBf$}~Su-vK$y z)_S1<8dVkW_;m(L4hX>Yzd@AA5FJCr)jGNxzYChkABUb%ZlMzF4~bvGZGVzb$~%Kx zjh`kiqnX3$4uMBkyGd#JSht)UGMMqLf30R*PXb;^vlI`Em-_Xdo*MsI1t-7U`6tA; zU&d-15p)Xo&&g@*{$N)Cog$-nmsUCBHVOMwj16Pfim3xxl1Xfcrp;_=0s*Krp>fDP4A~l*JEEjHhEm%Aw-${D%8aUC;JEPF!87fM;Uo z+f@zrP7TgSRSt%>rr&|URT{SJ?di0d66+FCL{L)baLLgS3TdOwe!#=pCnLVeq(2tF zD|jq2Q!0e@*RBURu^hyS=i+9{FOQ$ zuLFUG_qJL~pdH-+?=~-Wh$(}C#uF4qQv~azsexSj4jDkup z)t!6CK&=j_iXK-FRO;Jr_cFJa0~_evsh1wVUB&60<*mn$$a>6$9A&&Oah`d<9?Tkv z02B7}(4_pIcA+Avfw#%!a=CR#Z~Ipe{TppcFmpGB1wV15rj5l;zsLy2`3pxs2Dz4U zqDW_byJ%WI!VED~i>rrhJWJdhD7{Aqp=@v-C=2IX02P1_@s=_jzW+YRlAWo@#YwdS zJI3obvxY>A4-ha`Bo*WIju!LpcY;8^gX!Kog3|vry$x^s5+bdgj_<26&{rHXzqhFJ zt9oy(0NOSX4WpjbHY5XDY)HA?2}sN$ZfTqiY~WR}A=$O0KAWwT)IRU&uy=J2xH&F; zSbx;Y9w>T$Y^3qgz4cz2@*B^l!CTF^^OLvSQ$;u^#{S0|+cIIHbz_0T_0(E>Kai8} zn%}+5#lU}K-~&)i#sRGrn)d7{Sv=AEWB_c|(fZkGlZs6JZw6*3x~63~RwTiy&r_#- zNO=3qr%e+eZc@TewP`(JPH(tOFtR5%+nD*Xi|l9yP0tE4!gwsAd$7<6Hct6~eBpFv z*GG=ozsWw5RnzBU1606()qz{Hn$836?Lgg^xKqT0*r1Q#p+9#x+tX*&_?fmB%*k$8 zYlSmiX2K_~TyE~vm;h#UmpXww4Ni$uvqNQ;Mju{T6OlEwx|2n?HycE7=PGvRU-}!w zRYn5Y6ew$Hv{8Z__G^i%YYQrmqK}hgo53vlwH=!Cj~!wkV|7fCZ2|XUvn;MxVvbj5 z#Ju9IWuT0&$UHlOOS*7;hT;h~n95{ahDpdaQOf0Y@~k1b7Pc18jYViy%SrPOGQJQh83FC zJmzYKv^K8V{cD-xwNEx4=g^hTl9=TOngqhZB9>HMF_UADn$qX9nW5Ze&F<98K-RxO zQdZbC?msjjehtngW|P$|%qM>0)^|Np_ak)qBC>lDvZm+o8E0a%gOtKE&|dPv{aODT zZ3c@;Ov2vpo)69K?jcIy%~Nq~>1=X)p)_Nj!|n;W%A>%#bSrMW6L2ks0;}@^m>5Xa zz;Vw{KMlxmQ55;`eRNa#w;B>4T7v{CL?MGVohSabFu;LW{d*`qL+oXITR%T=o_|70 zlTMJfzrzqc$i%Lu>f=g1mqewA_Ea^ngc@G1S<(v3Y_iSvIcHfb!39h}%E!$vWxg_l zj}FM7sqjy8dqb4DbhltQcm zOEX?<*N*xH6I4PQql0YSMpQMszHzH1@r%<$t1VlF2DWYum8>bMBQxY|hn#%YILb_6 zhmxyPb85{;REL05?NEKjv_e3WT=dl}(^;c5WiA;X3BZv$UzZ z`C4l8drnL${vxb|lYcLh3f32P)z2we&8WfmETdsN7BGmfK71q^_Wi=#xHovsORfGe z*l*>Dt?7Qg4lvNal{DUwwvM}kC+c*mAlss(%73B_qA;u=*)zjiVXax%!r^e2WUEB~ zM{Kps9%D68{P}gRzK9|;spiBC&gmFbR$^uIKCCZKP>#zN@f&B9b-ZTtUfBp;%Xl{N z9&7z0K-Ncyu)E_}WgEna2HzO+tMeMB-{olY%KTz^-YGmbFZLU%iVJuJ2GlCnq~4*S zWgU4uKS`EBt95XGlRSrM0a=eo*#kFPOVUCHvRSImVCyk47HMIW#Dvf2V#*2k|>L)rR_jsY!G z0*FsfT46eykDKB1_sYm+pu{35iH`$nxO+(Wkbu=+lypLwj!BkgD3n+$xWuG5TH4ae z@B?<`#?+3oNE;Ad9+!&J@wP7>fbiGRFAy2;86mbF5&Na%axB^61s0D>!bReb+RPcX zA+xAA+Yb@m(7{J;MHd^EdDI;G1>$(s{5Gb{Ke*_-iA z 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‹sdm`+*_ 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ν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�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

>0oHx;J40lVG~J6Z?gTJcS2J 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

|<&(P@S#%24G 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�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 z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## 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

}n#vs4ba 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 z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` z00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG0 z1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5 zPyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhu` 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

Xu?H=Z|Cv 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 z z(ge!F=sc0l#14$skD@gfVse4n+1}nzv_OPkJ7&Z9ZA|C(M`zZSNp`%LE2Hgox6VTv zt-x&HZMQ1OwNEO1Y>$s(mhX6EWNpIR9>>>$2h(u}jXMXtr;@hgkD1EKc8r7SI(`=| z=o72?slb&*3r^@?=+8fvUwwfKNb@v&TNV4*(@@I~8QK$E<^=h6lo~tcd$x5x;`VIw z?ie47^S5e8BxZ`mb`gu?s|ZDkjNGRjD|U>>X1$s2erbSxQjh51L`KCBRYZSktqt|1 zv8X*dR<2ZbGhz~FmV1k>Y+U8C>puz^>&uLX?~<|3i6OafmM78WJm)(KOQNV}ql{>i&2mQANAGy}%pD7Qg z=SYy9_E{5b#zAp1C&G^Ls{9}nkFisJ5M0M7MPnf$bd1fU)KoX!JHZ$o6b8|LRXUQ9 zILdKa>rHKS2(8Y?0PQcx-+F>~Ig~g1kN+%Ha}>h*9r1a|*ZX|MZ>1o;YqCVO0q3H7 zCwm$yF&az9YJB4;RHv>bt)m1YRXLONs$S=ihriwvDub)9y`h!84jq-ym!wyzm!BcA`H4HcU3qErI=t32@n0kULGtuTPR5WfL-T^URg#@?|79nt3njyi#1v zm%tq4tT%Jkk^}oz8^>=HdD0Diwf($l!H#Bc3oY%4l(!%UEz5B?7WKl`RAaXB8|99Y zn$${!+tlwZXMOja^?m3!Aax!5y+h%0dW-5xDv|b_mq`D3oN7~*dvD>pFaJL zz&{n8yh101Jg`A`G+qKBP(Iy*+|l{R((iorAS;p>%2Lf}?(y^obrB48JCPZj$i70ni||dskZ2 zp0dv6ucMFjuO`U{k6b6M;$+fm%~2*rZ)FV*dTO{B$h(1uiw|9v_X*Ua-F@H?NN0P; z8;TW`=nQ5}s4(`>5>!C8OkLT#WP>Ei_)blZ?*+64-f}Nr>R$x@j701Bj)xYv3}Dre z0gTVDwXZbD>51Qw9QD6lE0DQxpGl;4aW`VS?mb>viMhMA&Ygnl2IZcCI8i9PZnED? z3NcJ*nOJB3GQgRsP>}QaO{V$|;Dw0C;ohNYrLQ(>fn-*f_<&p(Wlu46B}?eT04T(r z0p8+5mv9fAV1n_^6;k2VBv-8%rZQoz&?(oFy~12H3i0dgN$T5F$C!oZ<}KeM6T|Ka zYLqmCAs|yk+$$;zQIGTMdJ!Yc1XSUhSEL;$w$!2K@{P5`mYS2+gEN59T)u%X7^&I2 zF5=xNoWw&z8#sm{Ez~m(dxQ`N#62@NIsQ0&4D!=j2qOsa7REZ4r{Q^8)I3GE%1m^x z*61px>aSp$z)^LMlyPzc5>^r}xCDHsd3!Ogn=DqrHlbg!)}+wNqxNKhk!KWODRIQH zb-)U+rCFy^5UVg|C@v62lts?-*m7inHR*2Qf(LX{2t`Wp%7VfWj0cd4Z27vI-LdVL^1xN(29&Xa#H8ohwCFgx+yH ztY2ccBv9Wt(3g#kIx^7KV#o8fqP2bmJG|Is=w*k1>{JAx~Ba4twYiS~zeq#WUK zXZaQgU*3w?uB?>HcNIu#esE$Dv+jQyMpVL3I0T_)3A zp-{|EmF}%bs+l)$Q9B2p)yq#&Lon6O)yp@@(z~X-2USzm#vV~x$Uf@V;1uz;M4wTY zfFsTn+lG2$w5HB9aL6qixk>Q$i&Wr|=86<6M@^k+<**8Er%-6eIP=`39Er1&=a3rT zotzbtr>E(lBD;0Vad@IWmHf08?S-ddnbKICkdpv@>w1UVKX?o{VXn0OOGRw0{<^3; ziIFYqPoKQdVdWnppP*n|vrLrt2Dac`E0<(}hzWp$#W^7UT0?x`d=SH*gP5ZsibeCB z5a(%#51tQV(U}lUM`UHulB?Nb^fHZaNy`^QVpPAtfM};>WtWn&XPKs?*!9U`GIq+m zBqh(XKuO6oN)8U*TxBoJW`yJf`i<0)TU|iQ_Y_R1tTMW;k;9#7HiQjL%VEdNf?P$G znFV=5m%@_~EFi%bCB5f8VD4&>9kQeBtW}Xasv%esh-`Q$Y zk`b9xzz({>{cjAL1z>^#aQa^piTarZ#bQL%fbsy89oS9fTs77Jl)+XAT*3*>s;?1v znfkh(i2$AY9!T+L?HIb5kz#s0dlbY(xo<;Cp>xiA!peCF(jAnJ+8TQ9$Du{E~ zAHQjW_;2iww`maPwLe~y1aV&bV}=HCUi;(Qzn6|CdB}GT`{NE(MDv*M9QMcO&jN7{ z`(u47h;!HGcUGB@8D+7iRP6@iN7JSJOY`)hi2FVY2oq{amVDHk*eboszcOh61h-9dwhl8 zo=qP_Z+AbqbFK>9foh|?FY-fmv7w9DY1m>W{}^U&=6Y#)zr^q0Hk`WHphZ=MQB)3r z)qHmHI-1mwARgv5R2|8cI}N(DT!V0@l;Jh2izDJ@ual$+%lRbHDj*aYw!CO(&1 zo(s{b7)cw?Co9l^ll?Mv& z^v2}@JQrYM+%q?usvHm)sDH(a)w!68Wcg;56R`RLiK`|T>RkVIAE5^A7Q zv=%!34t5S)Km!k%TDyHmQ&zjm(Zm!I$F!(-y}YUH8;jEX%RDExBHDNlooJpx5GkI} zs>C_0%((q>0iP?^Ojc}7GVCA!APmb@Y8}R`!Wg(r`k!Nt@K_JGBYe7=3Iwfc4pynBielY|!rq63y#KC)f_wvr#Ff8Z2GR_H1RC5F zrhNfZ_ssgB6{vV(^VNnI*TTjU`eU1r{d*{w4Wo98%BuL3U zzV#Fo9qr?J(%Z7alNMpOwL-vUxJ=P4hYG9p5MAPK`ikmG$RW~1&g;stPbNcC2<1GrY=|6Syn^KmI|ccinKYLOVim@oV&>nOGTL6$LOi&t38{( z%wXy_*dpaV^CGx8oM)rEiMnSDWt4}tHC5jB#38K7}B%MJmlG2wMYq%#_fSRUY?p`4-mHQTmy1o*8hL% z{D`_xC$6Ie@B&$K;5?6U^5Y2VU4%ERr*YQ+u7K9OL#J>bk5tRlBi{G9vARXDlJ}Qn z;tjDTUKje<^9Al|T2;%8W(PM^;`V{N?Rg1sGdNhY;{-bxnQ2!5L-2CSGtfR%i1Ze(gY~AA*`(%* z<;VVUE))#hhtwqcIBte4nE&~yz!YH^sFd*_ev5x-@Vhf?p2mIfjWs}?RonR@0806y zM0Dn5iBE z?UE<4ViHRp9%rZTZGA9#uT4hYZJ6$tKI|=z~R|n zsgbTUzBNivnwPo-I(z@4JvW6f+KdaI7gX4GC_e&%tDoT^+5;~q&+6a5h>^xalv7dc z3+7&W>qZ>`uj&^@9vBdMk=)1cP;_D*n`c61^Ee?@Sj*tLtM(cADYP<1buKwS-HPF| znw?obpMSVD^0Bdekzh3^xRNjyLx7meHrI?cw6!(a;;+}KBifw`8Ma{yh~sxA{=KRA zzjk2~|N12U_vnKF_}>FGjsKq8*+|@~5lR#Me!9cLFJ0sJ*M$l{?srxh4=Oo?ZVOzq zRLU;JvRP`Uy49C#;PfvQx?^cONtsB4a)NWBLQC*}Y`wNOP1?7sh35um>JGu=Vn@3~vW z??~xjPHG3U|ECV-SRFhG!lOspnt*T4;b?LfGf83tZC3EP0 zVN9oz>e6;K->ohU`YeBL&@{A`wdSzFmg3ob)@r|RyVm~byDb=&u*f|xrBb^WKoLnE9I4_=Jja%(zfIdHGEwa+XVX?rPgI+1vVXPvpWv!Y;RGY$$5B*qhPB)HhWwEk3wq(gcY|;%WGZf5AQH0d+LyKCx@ki@Z<%7N`c?ML#;sU%x9<>llbO$?u|3 zlKQ5V`dL_&bQ~Ny%5l)c+s&I)UgqxEo`yys&-Q<7w*Oyd`)`~*+tYY8ScGnOlmuJ; zNquMJc1K_ck86|Ke7hqu%dsxs(>R2$b!!4M#wJc7`%5V9K7VolYwU@RT~3wy+Z{og zi@T_htw04X9kV_2&&{)VX@~EzJpP>+md~D&lyzl+jsfTpF>7r72)r)sI=@24lYB#Nt0WCb}%m1%{B8B}vx z`92%DWKNOHM;zfF2%N~?*fF+2+e3%Zx8_faEh!Ct>ImdC?&RgZ0}Oe*xXu}O)H&wG zXT^Gk6n2cYq2Ma)0FSePZ=o>2|C%lAksZItx0nPIGt#%IbhO~e&%5WF+7u2D5`C@j zfmUG=nTypm60BSThHqM#i0pk}r-RPJ3mZp`^RQ;ld1!bv=OO3r=$&8iwA*d%4qNaR zTXPkTKncpV+wH+eoSAId9U>9{tCTERx$X5$MGT6w1La8gc31GQCt92vUA-5gHMxVQ z9RA_KQ@r94JjIm~@jKRKn%v=8?t+Y_)g6=z&q`}GT=KP3e-(HpIGR@fr}}WW8qR`@ zle328HhBjE8SSA*NT$jVDZg8aC>Y%HTpa*>vP5v3fOZ6i1-A(xCc#}~2e(NR?42Zt zO;|Ni?DVWIHEZr?)a;&3AvK4uV5%Vm)G7aqB9nh8fOrb_m`jal_OxA|$3_U8s)42- z{+YanSC^#|a-XZmn2~}lJEW;)lfz9y3<%&)gA{=)!cF^9zb^8+WFVhm?l_$ zYWJ)b)(p?eP+^Hz%UtB6)o>7`c(u%1zV;dNArm${>lz_Pm;T9fgH5aV%kSGuI6FpH zzs7GUuD*ow`Aw_;P7+Rit9}5A{QaKzg4f1++_jmpKL!87Z^EcN)!MZBAm#95(|%;w z7hA=WC_9avZA{DfN#WiPVB=GD7sfxXOXGKX{9P5mt14kio895ZhYID?d+U+T!d3`a z0tNT?R5N`vt&5pHA}>!2QxdQ)BfhTA9e=)VNPMjo#)R-3HSMd8GC~8|@@*Y|@d9v3R}R$+VpknlWD{<8uhO;{gCBX{6v{dQsG z`k2fT-T(+}3T~AWw!l?%+q0>}lbqtkZ|fa>g~BnrZp6G}zXFUz{Ew~@VHe#hXc6iM ze?iskHjPst_|Tg+|F==LHS=!36K-S=1`H{|+A4eV5)U_*Jex*60I%C@Pk(Zn5t(b} z%|r3=eZlG3^hWJ8*Me-;jb*NZT@Sw>AtK30oCN!p$yG}xd3{VegacKAfHCDK0>6a+ z(p0}Xbia;+m8VgxN0<%)=*`5Y-B&v;%d4QK4U}g-d`yz9-tsb2HvN^CnHFW?9+w{e zUK3& zo!`i%P(eoANmTx(^qabuI+`vE-r`*5Y)=Qj^pIimUti`QTjn2H7MS7NK?B?hU(X*C z9?f-Rs>L;4;Co7EuQ(%n9ocoGjTw^_J|@$`O>^-WkqGQdGuUOuQPN{)7iMGaFy^>m5|AIZz`Rb9AujW_v%iS>< z0h}e97G7Xcxk;FmiS(PHY9g7vwsI@X+^EXUf`#L6s`+)NvhIb`YYG!}Q<}W!kk;2! zG_UM4nh0^`*|dPYqL%nP zo>}zqnBB3%Zf7U&h7w2h`|Bf)X|d&w2=AR{x|$t<`Gke#F&k%B^qI*bdpw&)PIG-f zml@>8=q6o$;uhcFME*G14iGrY5Ugrf)Oeu$%WniJocY zN0)k}XsIr{?CtnGvgU?bC3dme$@un2e>ht6Sh;LAgxRvXA27GQdLfV!#gHF4i*<&Jq@45wCL{drkFnm8{~dPcn$(JEuq5_V@553udUt6YFtJhYRWt z+nBDIv7%=M^s*Z~n|{!#YyCxP?V29hzaItn_hf+$9r47DWKk=dT2#yI8k_L+CNj4N zw;q#yOwBTPsOQ5_rz4&g>iHnEEyDR<(XGZe&(MUc$PmJ1Pj2;W>YQ2}wKc+2?t#|g zHA~)$r#G!SfYe)9yhbjsXo8QU9=o(rs#;dv1@pK))q3~6ZIL?*T)~%$q{Ef|uLi#} z%;vv4_>#h6*;gjB(Qb2Y4>#3-G}LkzH3@0_Q*Tm#12=@5J_O&JnuIWctHMq1s4pQ* zU{tv2g!+cEqL0oWP_Zn(X!m##s!-K*YR~F{`3|GG||ShG#SU&*#oCH47^v^ zs%>%E$i&<*ceWC!-3R#pGiR|~M;cI-j@2>m2^m&1*Z3_kLVKZzYg$JjBhqo~cCw<= zham!R#qwqklz%2mBmzCWfC+Jl%|E?Ni}t{!;q>U-wD-d4Z0%?&r`Wz^XmS2>n!Usk zzZPbUj|-;f=OwX&~0owsnZokSJl(b-Ghi_Uc% z4~!;^pl#VGDze=jApQXn55p{xxpze8X1o{pAUf9-ZhJ3Gyo0$;{v=!_RC}*B(sg{@ zW&XZ(uE4j~x&4=IaKD$8c#rM{SAItOSsP>$zUOJgq@0M$I+8656<6r|?y|u24Z-)~ z#b9|n+$|j~x@@U*#U9UVIJk`V^9XI`*>sxrc>)TlapI09N8p3t%1dlbmvQ_m?@MIi z1kv^020JZ*N>%UV*7w+J-@T9*aRqFoDzC{Ae?v*^aY|y#P0g&xn_2=#I?P>pgA&kU z_#^*2_$2NEL4qR$k{nZWsG zu%$Tjy@VYDDxx`%86Nh|eep!om!0wPD1;_1g}}vlG5Q5CVUOrhuV)jS-yh8>GOH1BfLfSE z*e+>11zAX zNMbK0;aqtPFnYC;W<}5LX5jqJP|w>j!Co%oDig2#G)+ZVh_A}MS4e$tZG=ve^U6*bAWE}gO zqS1lT*r7Q@HRW1BTTGzcxN}op1^nx)_nweG)py7)moR#cCC}qB?!S&HncTzreqkyL9kB z$C6h{r{<~jz=mqW#Svyc;Vj3Crl`0+wubV9JC&IN5H8q2gBvW*&~ZcA%)yCJ*%BW!e ziNM9yARIEMSfwr$>Co>0M+jM&RoT!QaJ`rvPv=SdIWLYR))SiH3SaR%;OiE<{AGeM z(T{Al9%IW`AqNT&`S?8_taGuR>|woV%_@ADGUVpQfPa-i=NUBo|3>JAO<#cy$Ww?7Phs&|3XI zgU$P8^~)sAPKH|jcCv=DPLu@hWbGWPe%k|mET1fUm8^S6WwuSsXKUT#UiE;@Us~qB zq0B$N3>83f-TTa3_dKk7nUr$Gr@(wW+hjF}U#(X^-q_4ZS^Y+)tbS_MP|IJIx%`2I zx%_>mmOu1BD?elY$#aM-e<#jb{<6=v{C$(R4f z=UV*w&Bd=jx%lOrXYuR*Zx+9WYW1_$z8u!RgK85g4wf~(bqt-hY#^In{!GT2=pgBc zHhJ;AK=d{n3e*FzrxL>uoh(mMkGvwu`>NuDDGOyAngX>o73%%xgnE~T+9!`(qyWrL z0jPDsB@=wzso*XG92~|bE17>hHUA`$Th7Y2#Zx-@`sed=Qu8-`K7U+l{trH%KQlFd zSu#I`Ad6B<+)0VglX*7VAv%9fGJi@Q*96Wcb1)U^!0B^A{pbn>^=vZ#Dg|JYjB8WD z{T^^0$mcM7&mGx_TzCCm+i29{ zQxL<$>)%fF;z_yJ#<@Ly1%c$;r1UUfFH+*J1U$sK#%+W@RYa;81X}^Uk*zXP3lNSo z3$kK8ql8o4m=0Xc_zMU&h&Fp|bq+IVepINnfRCq+7aRDMO|N zS4><&kbVD<7#eKnKxaHn{qSt52W68M8S_J3zb$00ut6LY?FYn$+GO=aP`RTaiqx)ti_4RvN~saZ+d zKS<+l*^;|h`z2g5Abt!8sahlXAF$G3Lk@M09<1|g>Ld&7lL9^OhdM<|YgTHOhISO0 zwq!Qv!Yr^uVJr;)gnI1zdlY9>R#eXYN(-&pJU{ombojERX`YVWB@WLdSm3Vtch7?m zD7mp0Widt3TtrsAKSA!}Z~cfrfs4jI$^`=ERwD7(s zMTMIlcYnbINj<81Hcm-JVbek9`ZJmH{YyDVt$K?Vk*~0*f~1-8XC~lK#|Of=u;+FP z%c;rhZeF#GD#ECUUh_~mbK-rxTH&C-;UD~*+@=w112c=BmEQp;_MMXHiSquyk>DdP z$C7aoZ#J4IY$3K!x2ACx#m?uR5Rl=4r9C`8+$*E(+4K==2dNEh7!&|MyThl%#L_^ zsOJb88Z0q~-HNS|e#{J}$>BxOC)d)$`WS;@iyavmJAAQB0$VSWg$6RaB21&vXn*KI z56Yj+ebVSxEIdH#HqeqZ->764>OiP@Rfiz4qhM@L5Bw#_2nggJvt_j2TBKBQSx~-^ zgi@gV;0l^o?KXRZqG=%1nJ(S=EYz7M-Emp7JlQpw;mCm4;VjitHNWLEThHeVGdD+n zE;c`N^`|XE*Ud9O7Z-L)*XH^LvAP?qRCg~)BKlqBp9Z3P2N6AKBKq+lqV45j8^u&>B4fO|ivrN@t{h+lJ6TlS_a61sTu%^loh8{g2oi+MU+kP;qgoSqIT0 z!NX;0eO*=gtE$pR5Gw&`W{t91&^u36yhs&4sEQ{ZR=ZC}YMpw0QV>KVsgU0>A^(b^>=l|<#VJ_y z?2q`@pEcIjnq?bS`$cCko;EhI_smYsG{N{1Xa#)1ByUWx5Rv_KjqkB!#z-@x#urMa zB~-I0MmSS`y^^!@d@B$G3q+O(Rki}qkq4uEGGdk3baqoGu}MoWCLtDFmAp|UivX4y zO1wzve^<$t>`-Dxl2?%|<#5nSY!cz2=C|a0LsgKetl-ETm*gsyEE7{D%k+@sTU4@4 z1C=aHC&^c(f)_UO33Ex#FjYa=L{%7SCZEieP6<2sgh|w(QulQF+JwUV>dY^Og;4~dTr#68=~GE@iMa4-4hKYjNh{z zJtK96@eD~QUhD3wvp1FAX#DbH;Z81_v6=8}f-_Wr!|Iw!U#r@!RvG_zU+q;{i@9;+ zekn+6k+%1@&IaFVTC!Cc9XPgallaS#-D5hCj>ri!=Q}v+nLmF{p)nn-h|Mz#a;J3% zF7>T78(2vLzQyLpV%1viw0jD2136~ZubWk~r*->}i<^bsLh$B0-ENB+7qMw5z;4+m zA1Ki>Dw-E$$G(}3@z0xGQRBDok*L&1hF{`1$6$$w%&(|16Bp8{YIO}_3W_Hp5IT%YPQa;w9IM35lt2nv zx}H?asp#E!rhltEp?+9)c_d+{OEzj^>$u=bSL)yu+ZB@b2B^Y|EnW$Yky|DbgIr~$PH^mtRmv;9}2!|-l#Lr zT#RTSo?Tsda(uf`tU1u{pHb$Ys_Y(Zrvut(~jI9=_E_V&g$SzT^&@KRrCd-ZaY{dcO>rfM1QB-F0XMij#Ck7QS}gc# zqIN@?$gE;6c!?hvaPmz!*GXaNw$!{_0UbAaC)bJfR@~Vhdh&fyOAFW86_Qs>* zL#?N$b+0HGh~YG~WWP-5ejW!jLZ6DT#59oIH0wso`YMg?)K*n^bCN(IR2q`OA81=0y$zD*unh4p;em(7~X2*YPdj*`wtwH4$C0SkIpPy%zI7!Hc{DcDcmcf z7E^)+H@H?V5r)((WWA;Ea3{D z3ZnwgJB|T;iO|~_vA44`J2dfAN}Q&I)Y_I!E!mFA>2DN?a<1*!7JDl_Q=B;TZc_4g zsXQV;-K}MZ%#%cU)5P2Ij1%BMa6${}P#dZS0-&+U7NDXeToFX8rO1)JM7gcuGEIFNhtZSkn*qND$@B zd!Rhw-IpfVCCWE?8m}EdU*+8+=KYYj(-HFSa3s8~EmaJ)-Rrh{k0;7E@Pq~Xn0l`v z>p{KusMs}I)-&1c-Yw4VMEN=<4EK(Z&mE=t6G?6_E#UvLj`q?k`Tr{ZA2+1E^y)H% z!!KYK;(|7pUehA7rndQx?82QDHSHN+YA?0VY%g_8Z!dM;*!oiVey zlpt_-T)_WX#%G9LpH28RpIOW%NeP_0IpzK*L2oVj({n<(*Sw^X2Hl(v>E!2Ba;Yrz zT3ngw5uNT}@i{wdvCfh;{fsK}bh_*8^b(z(R^d~y%~}=4IGvt;jwXibtU+wMHMSog zVUU)yL)Hy%)TwWh>e*Z>K@oNO8lB#u(=h`K_Td{kYrW38AX%kMr$40{z$T~x73kDQ zq_mlot&<*1N$UMbQFxw8D!m+~1z=0BkblM`8`z->6{-ffH>4YQUZ-A4DvNdS(d&>W znCNW5N3Z19ANggL#5~-j%YJZJkSV<`3E8L9|0e01OD8AOXX^BrPM?xY&)4a{(&^Wy zQm6kz)sye(CMG4T9Mb8_NLOnGg7B%x%6;g#L-+4NFuKjKTESbvdLL_$ii)bcxJB2! zNx>W((Pwn>7~Rw$|EASQW6L6sb4hY7a?AXmX-}{sAi+Hi6IGL)7FF-j zFgkda79o$0HrbJ4o%37CS=kr5e+QENC@tiNI$Ryz=S8dsAMK|T63&BIgcig+T`xdA zXy2cN*Z+Yc*aDTV`+GZCa-N%!casU*=@=>9DnWjr=(wc*s{ar>`RD-Bw8b`?h>Red~=Q$cnIJ^Zy0l*9QUSX@Jk28(_3FAV{*EITOz-6`uJKZ>w+>?ynZ< z`rlVny)zXY%ZEa7i=Y@SedPZJ@sNh-I44BUrq!$A)#ONQ(S=|8yRgLSrqrxwbk<8c zOLhp!S}SzcPj!~;8j@M}=&S~vB|C{!IZ>>0Yjv({Fp?GXbk>)3mTWqbS^e)R8ckGL zCdcWdOH-0sb<$8t+Pqq}E2%8{jLtoNNaf0sp9KGq&g#-xvH?hD-Kn!S=`7g}B(o;! zte;4ho(6Q(m#z8AzRyqnEz6a^m5>` z8tBvw{PUoi4he4-mo=Ub{LaeWptIY_wvv9NlU^iANp5=3X>M-%i73V1#nbqlI)0iH zS(gu~7EnX&G50xcCuP?+uiWQp9G+5qu`Yh6E^ak?pH96+rzX{8(8Rpj$8pP7axz8r zF_NO&`ZyUy{@St@f5!Kt%UzMz-;H!~jI^Pm>nHtrNsqja7isJmi+gtPtml50<6lKZDn9H9Y-02GLF0z23V!)Rw)62uMC{td4-vYKU@_M-K-uLeI5C79C zX}b%@QrGbJP87E8Y};UOo2(sD!cAec{lQcAWd-OU0#`?y9^v~XnQgVs5$_HYp91Ua z{rJ#2f}WP#Dr$Yxq2+(5kFh0@NUblvkE!+9*wY?oPko1S9(0p~WzXM)3Ao;-yk??J zJ~o!Mp{ce&dYzj$3r1A`$;M(vto)|?$SK?@QC^#B`T4@yXp^|8F06Ch+cYA$-7)?4 zz$bSEK4=ftk(wWDQO$J(ALMH-+suyOxB1n>uZ8WwzvDs8Il=)(Hk=nk`N(6a7s(plcSORm&zT(%@t#ttI+iEenHvA%~idj z?Wgh74;@R39dU&Ydop)X;=<57Y2v-pLLf8J+nCwJ(po

>ds^2Qh{5_uZ+f+t#IdK`wuJ&v$xhnRSs{}33 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�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 literal 0 HcmV?d00001 diff --git a/platform/broadcom/platform-modules-dell.mk b/platform/broadcom/platform-modules-dell.mk index 1d0c41956bcf..34e404cfae45 100644 --- a/platform/broadcom/platform-modules-dell.mk +++ b/platform/broadcom/platform-modules-dell.mk @@ -36,3 +36,6 @@ $(DELL_S5232F_PLATFORM_MODULE)_PLATFORM = x86_64-dellemc_s5232f_c3538-r0 $(eval $(call add_extra_package,$(DELL_Z9100_PLATFORM_MODULE),$(DELL_S5232F_PLATFORM_MODULE))) SONIC_STRETCH_DEBS += $(DELL_Z9100_PLATFORM_MODULE) + +#flashrom tool +$(shell ./$(PLATFORM_PATH)/sonic-platform-modules-dell/tools/flashrom.sh > /dev/null 2>&1) diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install index b9b6abbb35e0..b0c27702cb4a 100644 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-s6100.install @@ -12,3 +12,4 @@ s6100/scripts/platform_watchdog_disable.sh usr/local/bin s6100/scripts/sensors usr/bin s6100/systemd/platform-modules-s6100.service etc/systemd/system s6100/systemd/s6100-lpc-monitor.service etc/systemd/system +tools/flashrom/flashrom usr/local/bin/ diff --git a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py index 53d4eadaec0a..d03eee255d3c 100755 --- a/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py +++ b/platform/broadcom/sonic-platform-modules-dell/s6100/sonic_platform/chassis.py @@ -10,6 +10,13 @@ try: import os + import sys + import click + import subprocess + import glob + import sonic_device_util + from commands import getstatusoutput + from sonic_platform_base.platform_base import PlatformBase from sonic_platform_base.chassis_base import ChassisBase from sonic_platform.sfp import Sfp from sonic_platform.psu import Psu @@ -76,6 +83,8 @@ class Chassis(ChassisBase): power_reason_dict[33] = ChassisBase.REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC power_reason_dict[44] = ChassisBase.REBOOT_CAUSE_INSUFFICIENT_FAN_SPEED + _component_name_list = ["BIOS", "CPLD1", "CPLD2", "FPGA"] + def __init__(self): ChassisBase.__init__(self) @@ -141,6 +150,19 @@ def _get_pmc_register(self, reg_name): rv = rv.lstrip(" ") return rv + # Run bash command and print output to stdout + def run_command(self, command): + click.echo(click.style("Command: ", fg='cyan') + + click.style(command, fg='green')) + + proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + (out, err) = proc.communicate() + + click.echo(out) + + if proc.returncode != 0: + sys.exit(proc.returncode) + def get_name(self): """ Retrieves the name of the device @@ -230,3 +252,127 @@ def get_reboot_cause(self): return (self.reset_reason_dict[reset_reason], None) return (ChassisBase.REBOOT_CAUSE_HARDWARE_OTHER, "Invalid Reason") + + def get_component_name_list(self): + """ + Retrieves chassis components list such as BIOS, CPLD, FPGA, etc. + + Returns: + A list containing component name. + """ + return self._component_name_list + + def get_firmware_version(self, component_name): + + version = None + + if component_name in self._component_name_list: + + if component_name == self._component_name_list[0]: # BIOS + status, version = getstatusoutput( + "dmidecode -s system-version") + + elif component_name == self._component_name_list[1]: # CPLD1 + version = None + + elif component_name == self._component_name_list[2]: # CPLD2 + version = None + + elif component_name == self._component_name_list[3]: # SMF + version = None + + return version + + def install_component_firmware(self, component_name, image_path): + + bios_image = None + bios_version = "3.25.0." + bios_file_name = "S6100*BIOS*" + flashrom = "/usr/local/bin/flashrom" + PLATFORM_ROOT_PATH = '/usr/share/sonic/device' + machine_info = sonic_device_util.get_machine_info() + platform = sonic_device_util.get_platform_info(machine_info) + platform_path = "/".join([PLATFORM_ROOT_PATH, platform, "bin"]) + + warning = """ + ******************************************************************** + * Warning - Upgrading BIOS is inherently risky and should only be * + * attempted when necessary. A failure at this upgrade may cause * + * a board RMA. Proceed with caution ! * + ******************************************************************** + """ + + if component_name in self._component_name_list: + if component_name == self._component_name_list[0]: # BIOS + + # current BIOS version + current_bios_version = self.get_firmware_version("BIOS") + + # Construct BIOS image path + if image_path is not None: + image_path = image_path + platform_path + for name in glob.glob( + os.path.join(image_path, bios_file_name)): + bios_image = image_path = name + + if not bios_image: + print "BIOS image file not found:", image_path + return False + + # Extract BIOS image version + bios_image = os.path.basename(bios_image) + bios_image = bios_image.strip('S6100-BIOS-') + bios_image_version = bios_image.strip('.bin') + + if bios_image_version.startswith(bios_version): + bios_image_minor = bios_image_version.replace( + bios_image_version[:7], '') + if bios_image_minor.startswith("2"): + bios_image_minor = bios_image_minor.split("-")[1] + + if current_bios_version.startswith(bios_version): + current_bios_minor = current_bios_version.replace( + current_bios_version[:7], '') + if current_bios_minor.startswith("2"): + current_bios_minor = current_bios_minor.split("-")[1] + + # BIOS version check + if bios_image_minor > current_bios_minor: + + print warning + prompt_text = "New BIOS image " + bios_image_version + \ + " available to install, continue?" + yes = click.confirm(prompt_text) + + elif current_bios_minor > bios_image_minor: + + print warning + prompt_text = "Do you want to downgrade BIOS image from " \ + + current_bios_version + " to " + \ + bios_image_version + " continue?" + + yes = click.confirm(prompt_text) + + else: + print("BIOS is already with {} latest version".format( + current_bios_version)) + return True + + if yes: + command = flashrom + " -p" + " internal" + " -w " + \ + image_path + self.run_command(command) + + elif component_name == self._component_name_list[1]: # CPLD1 + return False + + elif component_name == self._component_name_list[2]: # CPLD2 + return False + + elif component_name == self._component_name_list[3]: # SMF + return False + else: + print "Invalid component Name:", component_name + + return True + diff --git a/platform/broadcom/sonic-platform-modules-dell/tools/0002-Flashrom-support-for-Intel-Rangeley-and-Denverton-CP.patch b/platform/broadcom/sonic-platform-modules-dell/tools/0002-Flashrom-support-for-Intel-Rangeley-and-Denverton-CP.patch new file mode 100644 index 000000000000..ab77df9c4d3b --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/tools/0002-Flashrom-support-for-Intel-Rangeley-and-Denverton-CP.patch @@ -0,0 +1,8510 @@ +From 482e06109190eb918208820fd94c8f4a6963f77e Mon Sep 17 00:00:00 2001 +From: paavaanan +Date: Tue, 21 May 2019 10:40:59 -0400 +Subject: [PATCH] Intel-Rangeley-stripped-code-changes + +--- + 82802ab.c | 1 + + Makefile | 109 +++- + README | 26 +- + at45db.c | 562 ++++++++++++++++ + atahpt.c | 2 + + board_enable.c | 19 +- + buspirate_spi.c | 7 +- + cbtable.c | 7 +- + chipdrivers.h | 21 +- + chipset_enable.c | 610 +++++++++++------ + cli_classic.c | 40 +- + dmi.c | 332 ++++++++-- + dnv_smi_spi.c | 185 ++++++ + drkaiser.c | 14 +- + flash.h | 56 +- + flashchips.c | 791 +++++++++++++++++++---- + flashchips.h | 27 +- + flashrom.c | 162 ++++- + ft2232_spi.c | 6 + + gfxnvidia.c | 14 +- + hwaccess.h | 6 + + ich_descriptors.c | 104 +++ + ich_descriptors.h | 104 +++ + ichspi.c | 557 ++++++++++++++-- + internal.c | 5 +- + it85spi.c | 3 + + it87spi.c | 47 +- + layout.c | 126 +++- + linux_spi.c | 12 +- + mcp6x_spi.c | 15 +- + nic3com.c | 2 + + nicintel.c | 29 +- + nicintel_spi.c | 26 +- + nicnatsemi.c | 2 + + nicrealtek.c | 2 + + ogp_spi.c | 14 +- + pcidev.c | 2 +- + physmap.c | 170 +++-- + pony_spi.c | 1 + + print.c | 15 +- + programmer.h | 28 +- + rayer_spi.c | 196 ++++-- + satamv.c | 19 +- + satasii.c | 18 +- + sb600spi.c | 208 +++++- + serial.c | 113 ++-- + serprog.c | 165 +++-- + spi25.c | 35 +- + spi25_statusreg.c | 2 +- + stm50.c | 115 ++++ + udelay.c | 10 +- + util/getrevision.sh | 311 +++++++++ + util/ich_descriptors_tool/ich_descriptors_tool.c | 8 +- + util/z60_flashrom.rules | 4 + + 54 files changed, 4553 insertions(+), 912 deletions(-) + create mode 100644 at45db.c + create mode 100644 dnv_smi_spi.c + create mode 100644 stm50.c + create mode 100755 util/getrevision.sh + +diff --git a/82802ab.c b/82802ab.c +index 608995d..2a43813 100644 +--- a/82802ab.c ++++ b/82802ab.c +@@ -89,6 +89,7 @@ int probe_82802ab(struct flashctx *flash) + return 1; + } + ++/* FIXME: needs timeout */ + uint8_t wait_82802ab(struct flashctx *flash) + { + uint8_t status; +diff --git a/Makefile b/Makefile +index 6e41e5d..d66039a 100644 +--- a/Makefile ++++ b/Makefile +@@ -39,6 +39,7 @@ CFLAGS ?= -Os -Wall -Wshadow + EXPORTDIR ?= . + AR ?= ar + RANLIB ?= ranlib ++DOSLIBS_BASE ?= .. + # The following parameter changes the default programmer that will be used if there is no -p/--programmer + # argument given when running flashrom. The predefined setting does not enable any default so that every + # user has to declare the programmer he wants to use on every run. The rationale for this to be not set +@@ -50,7 +51,8 @@ RANLIB ?= ranlib + # values are those specified in enum programmer in programmer.h (which depend on other CONFIG_* options + # evaluated below, namely those that enable/disable the various programmers). + # Compilation will fail for unspecified values. +-CONFIG_DEFAULT_PROGRAMMER ?= PROGRAMMER_INVALID ++#CONFIG_DEFAULT_PROGRAMMER ?= PROGRAMMER_INVALID ++CONFIG_DEFAULT_PROGRAMMER ?= PROGRAMMER_INTERNAL + + # If your compiler spits out excessive warnings, run make WARNERROR=no + # You shouldn't have to change this flag. +@@ -61,10 +63,13 @@ CFLAGS += -Werror + endif + + ############################################################################### +-# General OS/architecture specific settings. ++# General OS-specific settings. ++# 1. Prepare for later by gathering information about host and target OS ++# 2. Set compiler flags and parameters according to OSes ++# 3. Likewise verify user-supplied CONFIG_* variables. + + # HOST_OS is only used to work around local toolchain issues. +-HOST_OS ?= $(shell uname) ++HOST_OS ?= $(shell uname) + ifeq ($(HOST_OS), MINGW32_NT-5.1) + # Explicitly set CC = gcc on MinGW, otherwise: "cc: command not found". + CC = gcc +@@ -94,13 +99,24 @@ CPPFLAGS += -I/usr/local/include + LDFLAGS += -L/usr/local/lib + endif + ++ifeq ($(TARGET_OS), NetBSD) ++CPPFLAGS += -I/usr/pkg/include ++LDFLAGS += -L/usr/pkg/lib ++endif ++ ++ifeq ($(TARGET_OS), DragonFlyBSD) ++CPPFLAGS += -I/usr/pkg/include ++LDFLAGS += -L/usr/pkg/lib ++endif ++ + ifeq ($(TARGET_OS), DOS) + EXEC_SUFFIX := .exe +-CPPFLAGS += -I../libgetopt ++CPPFLAGS += -I$(DOSLIBS_BASE)/libgetopt + # DJGPP has odd uint*_t definitions which cause lots of format string warnings. + CFLAGS += -Wno-format + # FIXME Check if we can achieve the same effect with -L../libgetopt -lgetopt +-LIBS += ../libgetopt/libgetopt.a ++LIBS += -lgetopt ++LDFLAGS += -L$(DOSLIBS_BASE)/libgetopt/ + # Bus Pirate, Serprog and PonyProg are not supported under DOS (missing serial support). + ifeq ($(CONFIG_BUSPIRATE_SPI), yes) + UNSUPPORTED_FEATURES += CONFIG_BUSPIRATE_SPI=yes +@@ -215,6 +231,10 @@ endif + endif + + ifeq ($(TARGET_OS), libpayload) ++ifeq ($(MAKECMDGOALS),) ++.DEFAULT_GOAL := libflashrom.a ++$(info Setting default goal to libflashrom.a) ++endif + FLASHROM_CFLAGS += -DSTANDALONE + ifeq ($(CONFIG_DUMMY), yes) + UNSUPPORTED_FEATURES += CONFIG_DUMMY=yes +@@ -263,6 +283,10 @@ override CONFIG_LINUX_SPI = no + endif + endif + ++############################################################################### ++# General architecture-specific settings. ++# Like above for the OS, below we verify user-supplied options depending on the target architecture. ++ + # Determine the destination processor architecture. + # IMPORTANT: The following line must be placed before ARCH is ever used + # (of course), but should come after any lines setting CC because the line +@@ -307,10 +331,10 @@ endif + ############################################################################### + # Flash chip drivers and bus support infrastructure. + +-CHIP_OBJS = jedec.o stm50flw0x0x.o w39.o w29ee011.o \ ++CHIP_OBJS = jedec.o stm50.o w39.o w29ee011.o \ + sst28sf040.o m29f400bt.o 82802ab.o pm49fl00x.o \ + sst49lfxxxc.o sst_fwhub.o flashchips.o spi.o spi25.o spi25_statusreg.o \ +- opaque.o sfdp.o en29lv640b.o ++ opaque.o sfdp.o en29lv640b.o at45db.o + + ############################################################################### + # Library code. +@@ -322,18 +346,22 @@ LIB_OBJS = layout.o flashrom.o udelay.o programmer.o + + CLI_OBJS = cli_classic.o cli_output.o print.o + +-# Set the flashrom version string from the highest revision number +-# of the checked out flashrom files. ++# Set the flashrom version string from the highest revision number of the checked out flashrom files. + # Note to packagers: Any tree exported with "make export" or "make tarball" + # will not require subversion. The downloadable snapshots are already exported. +-SVNVERSION := $(shell LC_ALL=C svnversion -cn . 2>/dev/null | sed -e "s/.*://" -e "s/\([0-9]*\).*/\1/" | grep "[0-9]" || LC_ALL=C svn info . 2>/dev/null | awk '/^Revision:/ {print $$2 }' | grep "[0-9]" || LC_ALL=C git svn info . 2>/dev/null | awk '/^Revision:/ {print $$2 }' | grep "[0-9]" || echo unknown) ++SVNVERSION := r1781 + + RELEASE := 0.9.7 +-VERSION := $(RELEASE)-r$(SVNVERSION) ++VERSION := $(RELEASE)-$(SVNVERSION) + RELEASENAME ?= $(VERSION) + + SVNDEF := -D'FLASHROM_VERSION="$(VERSION)"' + ++F10FLAGS := -DFORCE10_SPI_CHANGE ++ ++############################################################################### ++# Default settings of CONFIG_* variables. ++ + # Always enable internal/onboard support for now. + CONFIG_INTERNAL ?= yes + +@@ -425,16 +453,39 @@ endif + endif + + ############################################################################### ++# Handle CONFIG_* variables that depend on others set (and verified) above. ++ ++# The external DMI decoder (dmidecode) does not work in libpayload. Bail out if the internal one got disabled. ++ifeq ($(TARGET_OS), libpayload) ++ifeq ($(CONFIG_INTERNAL), yes) ++ifeq ($(CONFIG_INTERNAL_DMI), no) ++UNSUPPORTED_FEATURES += CONFIG_INTERNAL_DMI=no ++else ++override CONFIG_INTERNAL_DMI = yes ++endif ++endif ++endif ++ ++# Use internal DMI/SMBIOS decoder by default instead of relying on dmidecode. ++CONFIG_INTERNAL_DMI ?= yes ++ ++############################################################################### + # Programmer drivers and programmer support infrastructure. ++# Depending on the CONFIG_* variables set and verified above we set compiler flags and parameters below. ++ ++FEATURE_CFLAGS += -DDELL_DENVERTON_SUPPORT -DDELL_AVOTON_SUPPORT + + FEATURE_CFLAGS += -D'CONFIG_DEFAULT_PROGRAMMER=$(CONFIG_DEFAULT_PROGRAMMER)' + + ifeq ($(CONFIG_INTERNAL), yes) + FEATURE_CFLAGS += -D'CONFIG_INTERNAL=1' +-PROGRAMMER_OBJS += processor_enable.o chipset_enable.o board_enable.o cbtable.o dmi.o internal.o ++PROGRAMMER_OBJS += processor_enable.o chipset_enable.o board_enable.o cbtable.o internal.o + ifeq ($(ARCH), x86) + PROGRAMMER_OBJS += it87spi.o it85spi.o sb600spi.o amd_imc.o wbsio_spi.o mcp6x_spi.o +-PROGRAMMER_OBJS += ichspi.o ich_descriptors.o ++PROGRAMMER_OBJS += ichspi.o ich_descriptors.o dmi.o dnv_smi_spi.o ++ifeq ($(CONFIG_INTERNAL_DMI), yes) ++FEATURE_CFLAGS += -D'CONFIG_INTERNAL_DMI=1' ++endif + else + endif + NEED_PCI := yes +@@ -597,9 +648,9 @@ PCILIBS += -lpciutils -lpci + PCILIBS += -l$(shell uname -p) + else + ifeq ($(TARGET_OS), DOS) +-# FIXME There needs to be a better way to do this +-CPPFLAGS += -I../libpci/include +-PCILIBS += ../libpci/lib/libpci.a ++CPPFLAGS += -I$(DOSLIBS_BASE)/libpci/include ++LDFLAGS += -L$(DOSLIBS_BASE)/libpci/lib/ ++PCILIBS += -lpci + else + PCILIBS += -lpci + ifeq ($(TARGET_OS), OpenBSD) +@@ -635,10 +686,11 @@ FEATURE_LIBS += $(shell LC_ALL=C grep -q "NEEDLIBZ := yes" .libdeps && printf "% + LIBFLASHROM_OBJS = $(CHIP_OBJS) $(PROGRAMMER_OBJS) $(LIB_OBJS) + OBJS = $(CLI_OBJS) $(LIBFLASHROM_OBJS) + +-all: hwlibs features $(PROGRAM)$(EXEC_SUFFIX) ++all: hwlibs features $(PROGRAM)$(EXEC_SUFFIX) $(PROGRAM).8 + ifeq ($(ARCH), x86) + @+$(MAKE) -C util/ich_descriptors_tool/ TARGET_OS=$(TARGET_OS) EXEC_SUFFIX=$(EXEC_SUFFIX) + endif ++default: all + + $(PROGRAM)$(EXEC_SUFFIX): $(OBJS) + $(CC) $(LDFLAGS) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(LIBS) $(PCILIBS) $(FEATURE_LIBS) $(USBLIBS) +@@ -653,13 +705,13 @@ libflashrom.a: $(LIBFLASHROM_OBJS) + TAROPTIONS = $(shell LC_ALL=C tar --version|grep -q GNU && echo "--owner=root --group=root") + + %.o: %.c .features +- $(CC) -MMD $(CFLAGS) $(CPPFLAGS) $(FLASHROM_CFLAGS) $(FEATURE_CFLAGS) $(SVNDEF) -o $@ -c $< ++ $(CC) -MMD $(CFLAGS) $(CPPFLAGS) $(FLASHROM_CFLAGS) $(FEATURE_CFLAGS) $(SVNDEF) $(F10FLAGS) -o $@ -c $< + + # Make sure to add all names of generated binaries here. + # This includes all frontends and libflashrom. + # We don't use EXEC_SUFFIX here because we want to clean everything. + clean: +- rm -f $(PROGRAM) $(PROGRAM).exe libflashrom.a *.o *.d ++ rm -f $(PROGRAM) $(PROGRAM).exe libflashrom.a *.o *.d $(PROGRAM).8 + @+$(MAKE) -C util/ich_descriptors_tool/ clean + + distclean: clean +@@ -698,11 +750,20 @@ compiler: featuresavailable + @echo $(TARGET_OS)|wc -w|grep -q '^[[:blank:]]*1[[:blank:]]*$$' || \ + ( echo "unknown. Aborting."; exit 1) + @printf "%s\n" '$(TARGET_OS)' ++ifeq ($(TARGET_OS), libpayload) ++ @$(CC) --version 2>&1 | grep -q coreboot || \ ++ ( echo "Warning: It seems you are not using coreboot's reference compiler."; \ ++ echo "This might work but usually does not, please beware." ) ++endif + + define LIBPCI_TEST + /* Avoid a failing test due to libpci header symbol shadowing breakage */ + #define index shadow_workaround_index ++#if !defined __NetBSD__ && !defined __DragonFly__ + #include ++#else ++#include ++#endif + struct pci_access *pacc; + int main(int argc, char **argv) + { +@@ -853,16 +914,20 @@ endif + @$(DIFF) -q .features.tmp .features >/dev/null 2>&1 && rm .features.tmp || mv .features.tmp .features + @rm -f .featuretest.c .featuretest$(EXEC_SUFFIX) + +-install: $(PROGRAM)$(EXEC_SUFFIX) ++$(PROGRAM).8: $(PROGRAM).8.tmpl ++ @sed -e '1 s#".*".*#"$(shell ./util/getrevision.sh -d $(PROGRAM).8.tmpl)" "$(VERSION)"#' <$< >$@ ++ ++install: $(PROGRAM)$(EXEC_SUFFIX) $(PROGRAM).8 + mkdir -p $(DESTDIR)$(PREFIX)/sbin + mkdir -p $(DESTDIR)$(MANDIR)/man8 + $(INSTALL) -m 0755 $(PROGRAM)$(EXEC_SUFFIX) $(DESTDIR)$(PREFIX)/sbin + $(INSTALL) -m 0644 $(PROGRAM).8 $(DESTDIR)$(MANDIR)/man8 + +-export: ++export: $(PROGRAM).8 + @rm -rf $(EXPORTDIR)/flashrom-$(RELEASENAME) + @svn export -r BASE . $(EXPORTDIR)/flashrom-$(RELEASENAME) + @sed "s/^SVNVERSION.*/SVNVERSION := $(SVNVERSION)/" Makefile >$(EXPORTDIR)/flashrom-$(RELEASENAME)/Makefile ++ @cp $(PROGRAM).8 "$(EXPORTDIR)/flashrom-$(RELEASENAME)/$(PROGRAM).8" + @LC_ALL=C svn log >$(EXPORTDIR)/flashrom-$(RELEASENAME)/ChangeLog + @echo Exported $(EXPORTDIR)/flashrom-$(RELEASENAME)/ + +@@ -876,6 +941,6 @@ djgpp-dos: clean + libpayload: clean + make CC="CC=i386-elf-gcc lpgcc" AR=i386-elf-ar RANLIB=i386-elf-ranlib + +-.PHONY: all clean distclean compiler hwlibs features export tarball dos featuresavailable ++.PHONY: all install clean distclean compiler hwlibs features export tarball dos featuresavailable + + -include $(OBJS:.o=.d) +diff --git a/README b/README +index 7f24cca..b3e50a6 100644 +--- a/README ++++ b/README +@@ -80,11 +80,9 @@ To compile on Solaris, use: + + gmake LDFLAGS="-L$pathtolibpci" CC="gcc -I$pathtopciheaders" CFLAGS=-O2 + +-To compile on NetBSD or DragonFly BSD, use: ++To compile on NetBSD or DragonFly BSD (with pciutils, libftdi, libusb installed in /usr/pkg/), use: + +- ln -s /usr/pkg/include/pciutils pci +- gmake CPPFLAGS="-I. -I/usr/pkg/include" \ +- LDFLAGS="-L/usr/pkg/lib -Wl,-rpath-link,/usr/pkg/lib" ++ gmake + + To compile on OpenBSD, use: + +@@ -105,20 +103,24 @@ To cross-compile on Linux for DOS: + djcrx-2.04pre_20090725-13ap.i386.rpm + The cross toolchain packages for your distribution may have slightly different + names (look for packages named *djgpp*). +- Download pciutils 3.1.5 and apply http://assembler.cz/flashrom/pciutils.patch +- Download and compile http://assembler.cz/flashrom/libgetopt/ ++ ++ You will need the following library source trees containing their compiled ++ static libraries either in the parent directory of the flashrom source or ++ specify the base folder on compile time with the DOSLIBS_BASE parameter. ++ The default as described above is equal to calling ++ 'make djgpp-dos DOSLIBS_BASE=..' ++ ++ To get and build said libraries... ++ Download pciutils 3.1.5 and apply http://flashrom.org/File:Pciutils.patch.gz + Compile pciutils, see README.DJGPP for instructions. ++ Download and compile http://flashrom.org/File:Libgetopt.tar.gz + Enter the flashrom directory. +- ../libpci should contain pciutils source and binaries. +- ../libgetopt should contain getopt.a from libgetopt. + Run either (change settings where appropriate) + make CC=i586-pc-msdosdjgpp-gcc STRIP=i586-pc-msdosdjgpp-strip + or (above settings hardcoded) + make djgpp-dos +- You might have to add WARNERROR=no to the make command line. +- To run flashrom.exe, download and unpack +- http://homer.rice.edu/~sandmann/cwsdpmi/csdpmi7b.zip and make sure +- CWSDPMI.EXE is in the current directory. ++ To run flashrom.exe, download http://flashrom.org/File:Csdpmi7b.zip and ++ unpack CWSDPMI.EXE into the current directory or one in PATH. + + To cross-compile on Linux for Windows: + +diff --git a/at45db.c b/at45db.c +new file mode 100644 +index 0000000..5c90418 +--- /dev/null ++++ b/at45db.c +@@ -0,0 +1,562 @@ ++/* ++ * Support for Atmel AT45DB series DataFlash chips. ++ * This file is part of the flashrom project. ++ * ++ * Copyright (C) 2012 Aidan Thornton ++ * Copyright (C) 2013 Stefan Tauner ++ * ++ * 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; version 2 of the License. ++ * ++ * 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 St, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++#include ++#include "flash.h" ++#include "chipdrivers.h" ++#include "programmer.h" ++#include "spi.h" ++ ++/* Status register bits */ ++#define AT45DB_READY (1<<7) ++#define AT45DB_CMP (1<<6) ++#define AT45DB_PROT (1<<1) ++#define AT45DB_POWEROF2 (1<<0) ++ ++/* Opcodes */ ++#define AT45DB_STATUS 0xD7 /* NB: this is a block erase command on most other chips(!). */ ++#define AT45DB_DISABLE_PROTECT 0x3D, 0x2A, 0x7F, 0x9A ++#define AT45DB_READ_ARRAY 0xE8 ++#define AT45DB_READ_PROTECT 0x32 ++#define AT45DB_READ_LOCKDOWN 0x35 ++#define AT45DB_PAGE_ERASE 0x81 ++#define AT45DB_BLOCK_ERASE 0x50 ++#define AT45DB_SECTOR_ERASE 0x7C ++#define AT45DB_CHIP_ERASE 0xC7 ++#define AT45DB_CHIP_ERASE_ADDR 0x94809A /* Magic address. See usage. */ ++#define AT45DB_BUFFER1_WRITE 0x84 ++#define AT45DB_BUFFER1_PAGE_PROGRAM 0x88 ++/* Buffer 2 is unused yet. ++#define AT45DB_BUFFER2_WRITE 0x87 ++#define AT45DB_BUFFER2_PAGE_PROGRAM 0x89 ++*/ ++ ++static uint8_t at45db_read_status_register(struct flashctx *flash, uint8_t *status) ++{ ++ static const uint8_t cmd[] = { AT45DB_STATUS }; ++ ++ int ret = spi_send_command(flash, sizeof(cmd), 1, cmd, status); ++ if (ret != 0) ++ msg_cerr("Reading the status register failed!\n"); ++ else ++ msg_cspew("Status register: 0x%02x.\n", *status); ++ return ret; ++} ++ ++int spi_disable_blockprotect_at45db(struct flashctx *flash) ++{ ++ static const uint8_t cmd[4] = { AT45DB_DISABLE_PROTECT }; /* NB: 4 bytes magic number */ ++ int ret = spi_send_command(flash, sizeof(cmd), 0, cmd, NULL); ++ if (ret != 0) { ++ msg_cerr("Sending disable lockdown failed!\n"); ++ return ret; ++ } ++ uint8_t status; ++ ret = at45db_read_status_register(flash, &status); ++ if (ret != 0 || ((status & AT45DB_PROT) != 0)) { ++ msg_cerr("Disabling lockdown failed!\n"); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++static unsigned int at45db_get_sector_count(struct flashctx *flash) ++{ ++ unsigned int i, j; ++ unsigned int cnt = 0; ++ for (i = 0; i < NUM_ERASEFUNCTIONS; i++) { ++ if (flash->chip->block_erasers[i].block_erase == &spi_erase_at45db_sector) { ++ for (j = 0; j < NUM_ERASEREGIONS; j++) { ++ cnt += flash->chip->block_erasers[i].eraseblocks[j].count; ++ } ++ } ++ } ++ msg_cspew("%s: number of sectors=%u\n", __func__, cnt); ++ return cnt; ++} ++ ++/* Reads and prettyprints protection/lockdown registers. ++ * Some elegance of the printouts had to be cut down a bit to share this code. */ ++static uint8_t at45db_prettyprint_protection_register(struct flashctx *flash, uint8_t opcode, const char *regname) ++{ ++ const uint8_t cmd[] = { opcode, 0, 0, 0 }; ++ /* The first two sectors share the first result byte. */ ++ uint8_t buf[at45db_get_sector_count(flash) - 1]; ++ ++ int ret = spi_send_command(flash, sizeof(cmd), sizeof(buf), cmd, buf); ++ if (ret != 0) { ++ msg_cerr("Reading the %s register failed!\n", regname); ++ return ret; ++ } ++ ++ unsigned int i; ++ for (i = 0; i < sizeof(buf); i++) { ++ if (buf[i] != 0x00) ++ break; ++ if (i == sizeof(buf) - 1) { ++ msg_cdbg("No Sector is %sed.\n", regname); ++ return 0; ++ } ++ } ++ ++ /* TODO: print which addresses are mapped to (un)locked sectors. */ ++ msg_cdbg("Sector 0a is %s%sed.\n", ((buf[0] & 0xC0) == 0x00) ? "un" : "", regname); ++ msg_cdbg("Sector 0b is %s%sed.\n", ((buf[0] & 0x30) == 0x00) ? "un" : "", regname); ++ for (i = 1; i < sizeof(buf); i++) ++ msg_cdbg("Sector %2u is %s%sed.\n", i, (buf[i] == 0x00) ? "un" : "", regname); ++ ++ return 0; ++} ++ ++/* bit 7: busy flag ++ * bit 6: memory/buffer compare result ++ * bit 5-2: density (encoding see below) ++ * bit 1: protection enabled (soft or hard) ++ * bit 0: "power of 2" page size indicator (e.g. 1 means 256B; 0 means 264B) ++ * ++ * 5-2 encoding: bit 2 is always 1, bits 3-5 encode the density as "2^(bits - 1)" in Mb e.g.: ++ * AT45DB161D 1011 16Mb */ ++int spi_prettyprint_status_register_at45db(struct flashctx *flash) ++{ ++ uint8_t status; ++ if (at45db_read_status_register(flash, &status) != 0) { ++ return 1; ++ } ++ ++ /* AT45DB321C does not support lockdown or a page size of a power of 2... */ ++ const bool isAT45DB321C = (strcmp(flash->chip->name, "AT45DB321C") == 0); ++ msg_cdbg("Chip status register is 0x%02x\n", status); ++ msg_cdbg("Chip status register: Bit 7 / Ready is %sset\n", (status & AT45DB_READY) ? "" : "not "); ++ msg_cdbg("Chip status register: Bit 6 / Compare match is %sset\n", (status & AT45DB_CMP) ? "" : "not "); ++ spi_prettyprint_status_register_bit(status, 5); ++ spi_prettyprint_status_register_bit(status, 4); ++ spi_prettyprint_status_register_bit(status, 3); ++ spi_prettyprint_status_register_bit(status, 2); ++ const uint8_t dens = (status >> 3) & 0x7; /* Bit 2 is always 1, we use the other bits only */ ++ msg_cdbg("Chip status register: Density is %u Mb\n", 1 << (dens - 1)); ++ msg_cdbg("Chip status register: Bit 1 / Protection is %sset\n", (status & AT45DB_PROT) ? "" : "not "); ++ ++ if (isAT45DB321C) ++ spi_prettyprint_status_register_bit(status, 0); ++ else ++ msg_cdbg("Chip status register: Bit 0 / \"Power of 2\" is %sset\n", ++ (status & AT45DB_POWEROF2) ? "" : "not "); ++ ++ if (status & AT45DB_PROT) ++ at45db_prettyprint_protection_register(flash, AT45DB_READ_PROTECT, "protect"); ++ ++ if (!isAT45DB321C) ++ at45db_prettyprint_protection_register(flash, AT45DB_READ_LOCKDOWN, "lock"); ++ ++ return 0; ++} ++ ++/* Probe function for AT45DB* chips that support multiple page sizes. */ ++int probe_spi_at45db(struct flashctx *flash) ++{ ++ uint8_t status; ++ struct flashchip *chip = flash->chip; ++ ++ if (!probe_spi_rdid(flash)) ++ return 0; ++ ++ /* Some AT45DB* chips support two different page sizes each (e.g. 264 and 256 B). In order to tell which ++ * page size this chip has we need to read the status register. */ ++ if (at45db_read_status_register(flash, &status) != 0) ++ return 0; ++ ++ /* We assume sane power-of-2 page sizes and adjust the chip attributes in case this is not the case. */ ++ if ((status & AT45DB_POWEROF2) == 0) { ++ chip->total_size = (chip->total_size / 32) * 33; ++ chip->page_size = (chip->page_size / 32) * 33; ++ ++ unsigned int i, j; ++ for (i = 0; i < NUM_ERASEFUNCTIONS; i++) { ++ struct block_eraser *eraser = &chip->block_erasers[i]; ++ for (j = 0; j < NUM_ERASEREGIONS; j++) { ++ eraser->eraseblocks[j].size = (eraser->eraseblocks[j].size / 32) * 33; ++ } ++ } ++ } ++ ++ switch (chip->page_size) { ++ case 256: chip->gran = write_gran_256bytes; break; ++ case 264: chip->gran = write_gran_264bytes; break; ++ case 512: chip->gran = write_gran_512bytes; break; ++ case 528: chip->gran = write_gran_528bytes; break; ++ case 1024: chip->gran = write_gran_1024bytes; break; ++ case 1056: chip->gran = write_gran_1056bytes; break; ++ default: ++ msg_cerr("%s: unknown page size %d.\n", __func__, chip->page_size); ++ return 0; ++ } ++ ++ msg_cdbg2("%s: total size %i kB, page size %i B\n", __func__, chip->total_size * 1024, chip->page_size); ++ ++ return 1; ++} ++ ++/* Returns the minimum number of bits needed to represent the given address. ++ * FIXME: use mind-blowing implementation. ++ * FIXME: move to utility module. */ ++static uint32_t address_to_bits(uint32_t addr) ++{ ++ unsigned int lzb = 0; ++ while (((1 << (31 - lzb)) & ~addr) != 0) ++ lzb++; ++ return 32 - lzb; ++} ++ ++/* In case of non-power-of-two page sizes we need to convert the address flashrom uses to the address the ++ * DataFlash chips use. The latter uses a segmented address space where the page address is encoded in the ++ * more significant bits and the offset within the page is encoded in the less significant bits. The exact ++ * partition depends on the page size. ++ */ ++static unsigned int at45db_convert_addr(unsigned int addr, unsigned int page_size) ++{ ++ unsigned int page_bits = address_to_bits(page_size - 1); ++ unsigned int at45db_addr = ((addr / page_size) << page_bits) | (addr % page_size); ++ msg_cspew("%s: addr=0x%x, page_size=%u, page_bits=%u -> at45db_addr=0x%x\n", ++ __func__, addr, page_size, page_bits, at45db_addr); ++ return at45db_addr; ++} ++ ++int spi_read_at45db(struct flashctx *flash, uint8_t *buf, unsigned int addr, unsigned int len) ++{ ++ const unsigned int page_size = flash->chip->page_size; ++ const unsigned int total_size = flash->chip->total_size * 1024; ++ if ((addr + len) > total_size) { ++ msg_cerr("%s: tried to read beyond flash boundary: addr=%u, len=%u, size=%u\n", ++ __func__, addr, len, total_size); ++ return 1; ++ } ++ ++ /* We have to split this up into chunks to fit within the programmer's read size limit, but those ++ * chunks can cross page boundaries. */ ++ const unsigned int max_data_read = flash->pgm->spi.max_data_read; ++ const unsigned int max_chunk = (max_data_read > 0) ? max_data_read : page_size; ++ while (addr < len) { ++ unsigned int chunk = min(max_chunk, len); ++ int ret = spi_nbyte_read(flash, at45db_convert_addr(addr, page_size), buf + addr, chunk); ++ if (ret) { ++ msg_cerr("%s: error sending read command!\n", __func__); ++ return ret; ++ } ++ addr += chunk; ++ } ++ ++ return 0; ++} ++ ++/* Legacy continuous read, used where spi_read_at45db() is not available. ++ * The first 4 (dummy) bytes read need to be discarded. */ ++int spi_read_at45db_e8(struct flashctx *flash, uint8_t *buf, unsigned int addr, unsigned int len) ++{ ++ const unsigned int page_size = flash->chip->page_size; ++ const unsigned int total_size = flash->chip->total_size * 1024; ++ if ((addr + len) > total_size) { ++ msg_cerr("%s: tried to read beyond flash boundary: addr=%u, len=%u, size=%u\n", ++ __func__, addr, len, total_size); ++ return 1; ++ } ++ ++ /* We have to split this up into chunks to fit within the programmer's read size limit, but those ++ * chunks can cross page boundaries. */ ++ const unsigned int max_data_read = flash->pgm->spi.max_data_read; ++ const unsigned int max_chunk = (max_data_read > 0) ? max_data_read : page_size; ++ while (addr < len) { ++ const unsigned int addr_at45 = at45db_convert_addr(addr, page_size); ++ const unsigned char cmd[] = { ++ AT45DB_READ_ARRAY, ++ (addr_at45 >> 16) & 0xff, ++ (addr_at45 >> 8) & 0xff, ++ (addr_at45 >> 0) & 0xff ++ }; ++ /* We need to leave place for 4 dummy bytes and handle them explicitly. */ ++ unsigned int chunk = min(max_chunk, len + 4); ++ uint8_t tmp[chunk]; ++ int ret = spi_send_command(flash, sizeof(cmd), chunk, cmd, tmp); ++ if (ret) { ++ msg_cerr("%s: error sending read command!\n", __func__); ++ return ret; ++ } ++ /* Copy result without dummy bytes into buf and advance address counter respectively. */ ++ memcpy(buf + addr, tmp + 4, chunk - 4); ++ addr += chunk - 4; ++ } ++ return 0; ++} ++ ++/* Returns 0 when ready, 1 on errors and timeouts. */ ++static int at45db_wait_ready (struct flashctx *flash, unsigned int us, unsigned int retries) ++{ ++ while (true) { ++ uint8_t status; ++ int ret = at45db_read_status_register(flash, &status); ++ if ((status & AT45DB_READY) == AT45DB_READY) ++ return 0; ++ if (ret != 0 || retries-- == 0) ++ return 1; ++ programmer_delay(us); ++ } ++} ++ ++static int at45db_erase(struct flashctx *flash, uint8_t opcode, unsigned int at45db_addr, unsigned int stepsize, unsigned int retries) ++{ ++ const uint8_t cmd[] = { ++ opcode, ++ (at45db_addr >> 16) & 0xff, ++ (at45db_addr >> 8) & 0xff, ++ (at45db_addr >> 0) & 0xff ++ }; ++ ++ /* Send erase command. */ ++ int ret = spi_send_command(flash, sizeof(cmd), 0, cmd, NULL); ++ if (ret != 0) { ++ msg_cerr("%s: error sending erase command!\n", __func__); ++ return ret; ++ } ++ ++ /* Wait for completion. */ ++ ret = at45db_wait_ready(flash, stepsize, retries); ++ if (ret != 0) ++ msg_cerr("%s: chip did not became ready again after sending the erase command!\n", __func__); ++ ++ return ret; ++} ++ ++int spi_erase_at45db_page(struct flashctx *flash, unsigned int addr, unsigned int blocklen) ++{ ++ const unsigned int page_size = flash->chip->page_size; ++ const unsigned int total_size = flash->chip->total_size * 1024; ++ ++ if ((addr % page_size) != 0 || (blocklen % page_size) != 0) { ++ msg_cerr("%s: cannot erase partial pages: addr=%u, blocklen=%u\n", __func__, addr, blocklen); ++ return 1; ++ } ++ ++ if ((addr + blocklen) > total_size) { ++ msg_cerr("%s: tried to erase a block beyond flash boundary: addr=%u, blocklen=%u, size=%u\n", ++ __func__, addr, blocklen, total_size); ++ return 1; ++ } ++ ++ /* Needs typically about 35 ms for completion, so let's wait 100 ms in 500 us steps. */ ++ return at45db_erase(flash, AT45DB_PAGE_ERASE, at45db_convert_addr(addr, page_size), 500, 200); ++} ++ ++int spi_erase_at45db_block(struct flashctx *flash, unsigned int addr, unsigned int blocklen) ++{ ++ const unsigned int page_size = flash->chip->page_size; ++ const unsigned int total_size = flash->chip->total_size * 1024; ++ ++ if ((addr % page_size) != 0 || (blocklen % page_size) != 0) { // FIXME: should check blocks not pages ++ msg_cerr("%s: cannot erase partial pages: addr=%u, blocklen=%u\n", __func__, addr, blocklen); ++ return 1; ++ } ++ ++ if ((addr + blocklen) > total_size) { ++ msg_cerr("%s: tried to erase a block beyond flash boundary: addr=%u, blocklen=%u, size=%u\n", ++ __func__, addr, blocklen, total_size); ++ return 1; ++ } ++ ++ /* Needs typically between 20 and 100 ms for completion, so let's wait 300 ms in 1 ms steps. */ ++ return at45db_erase(flash, AT45DB_BLOCK_ERASE, at45db_convert_addr(addr, page_size), 1000, 300); ++} ++ ++int spi_erase_at45db_sector(struct flashctx *flash, unsigned int addr, unsigned int blocklen) ++{ ++ const unsigned int page_size = flash->chip->page_size; ++ const unsigned int total_size = flash->chip->total_size * 1024; ++ ++ if ((addr % page_size) != 0 || (blocklen % page_size) != 0) { // FIXME: should check sectors not pages ++ msg_cerr("%s: cannot erase partial pages: addr=%u, blocklen=%u\n", __func__, addr, blocklen); ++ return 1; ++ } ++ ++ if ((addr + blocklen) > total_size) { ++ msg_cerr("%s: tried to erase a sector beyond flash boundary: addr=%u, blocklen=%u, size=%u\n", ++ __func__, addr, blocklen, total_size); ++ return 1; ++ } ++ ++ /* Needs typically about 5 s for completion, so let's wait 20 seconds in 200 ms steps. */ ++ return at45db_erase(flash, AT45DB_SECTOR_ERASE, at45db_convert_addr(addr, page_size), 200000, 100); ++} ++ ++int spi_erase_at45db_chip(struct flashctx *flash, unsigned int addr, unsigned int blocklen) ++{ ++ const unsigned int total_size = flash->chip->total_size * 1024; ++ ++ if ((addr + blocklen) > total_size) { ++ msg_cerr("%s: tried to erase beyond flash boundary: addr=%u, blocklen=%u, size=%u\n", ++ __func__, addr, blocklen, total_size); ++ return 1; ++ } ++ ++ /* Needs typically from about 5 to over 60 s for completion, so let's wait 100 s in 500 ms steps. ++ * NB: the address is not a real address but a magic number. This hack allows to share code. */ ++ return at45db_erase(flash, AT45DB_CHIP_ERASE, AT45DB_CHIP_ERASE_ADDR, 500000, 200); ++} ++ ++/* This one is really special and works only for AT45CS1282. It uses two different opcodes depending on the ++ * address and has an asymmetric layout. */ ++int spi_erase_at45cs_sector(struct flashctx *flash, unsigned int addr, unsigned int blocklen) ++{ ++ const unsigned int page_size = flash->chip->page_size; ++ const unsigned int total_size = flash->chip->total_size * 1024; ++ const struct block_eraser be = flash->chip->block_erasers[0]; ++ const unsigned int sec_0a_top = be.eraseblocks[0].size; ++ const unsigned int sec_0b_top = be.eraseblocks[0].size + be.eraseblocks[1].size; ++ ++ if ((addr + blocklen) > total_size) { ++ msg_cerr("%s: tried to erase a sector beyond flash boundary: addr=%u, blocklen=%u, size=%u\n", ++ __func__, addr, blocklen, total_size); ++ return 1; ++ } ++ ++ bool partial_range = false; ++ uint8_t opcode = 0x7C; /* Used for all but sector 0a. */ ++ if (addr < sec_0a_top) { ++ opcode = 0x50; ++ /* One single sector of 8 pages at address 0. */ ++ if (addr != 0 || blocklen != (8 * page_size)) ++ partial_range = true; ++ } else if (addr < sec_0b_top) { ++ /* One single sector of 248 pages adjacent to the first. */ ++ if (addr != sec_0a_top || blocklen != (248 * page_size)) ++ partial_range = true; ++ } else { ++ /* The rest is filled by 63 aligned sectors of 256 pages. */ ++ if ((addr % (256 * page_size)) != 0 || (blocklen % (256 * page_size)) != 0) ++ partial_range = true; ++ } ++ if (partial_range) { ++ msg_cerr("%s: cannot erase partial sectors: addr=%u, blocklen=%u\n", __func__, addr, blocklen); ++ return 1; ++ } ++ ++ /* Needs up to 4 s for completion, so let's wait 20 seconds in 200 ms steps. */ ++ return at45db_erase(flash, opcode, at45db_convert_addr(addr, page_size), 200000, 100); ++} ++ ++static int at45db_fill_buffer1(struct flashctx *flash, uint8_t *bytes, unsigned int off, unsigned int len) ++{ ++ const unsigned int page_size = flash->chip->page_size; ++ if ((off + len) > page_size) { ++ msg_cerr("Tried to write %u bytes at offset %u into a buffer of only %u B.\n", ++ len, off, page_size); ++ return 1; ++ } ++ ++ /* Create a suitable buffer to store opcode, address and data chunks for buffer1. */ ++ const unsigned int max_data_write = flash->pgm->spi.max_data_write; ++ const unsigned int max_chunk = (max_data_write > 0 && max_data_write <= page_size) ? ++ max_data_write : page_size; ++ uint8_t buf[4 + max_chunk]; ++ ++ buf[0] = AT45DB_BUFFER1_WRITE; ++ while (off < page_size) { ++ unsigned int cur_chunk = min(max_chunk, page_size - off); ++ buf[1] = (off >> 16) & 0xff; ++ buf[2] = (off >> 8) & 0xff; ++ buf[3] = (off >> 0) & 0xff; ++ memcpy(&buf[4], bytes + off, cur_chunk); ++ int ret = spi_send_command(flash, 4 + cur_chunk, 0, buf, NULL); ++ if (ret != 0) { ++ msg_cerr("%s: error sending buffer write!\n", __func__); ++ return ret; ++ } ++ off += cur_chunk; ++ } ++ return 0; ++} ++ ++static int at45db_commit_buffer1(struct flashctx *flash, unsigned int at45db_addr) ++{ ++ const uint8_t cmd[] = { ++ AT45DB_BUFFER1_PAGE_PROGRAM, ++ (at45db_addr >> 16) & 0xff, ++ (at45db_addr >> 8) & 0xff, ++ (at45db_addr >> 0) & 0xff ++ }; ++ ++ /* Send buffer to device. */ ++ int ret = spi_send_command(flash, sizeof(cmd), 0, cmd, NULL); ++ if (ret != 0) { ++ msg_cerr("%s: error sending buffer to main memory command!\n", __func__); ++ return ret; ++ } ++ ++ /* Wait for completion (typically a few ms). */ ++ ret = at45db_wait_ready(flash, 250, 200); // 50 ms ++ if (ret != 0) { ++ msg_cerr("%s: chip did not became ready again!\n", __func__); ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static int at45db_program_page(struct flashctx *flash, uint8_t *buf, unsigned int at45db_addr) ++{ ++ int ret = at45db_fill_buffer1(flash, buf, 0, flash->chip->page_size); ++ if (ret != 0) { ++ msg_cerr("%s: filling the buffer failed!\n", __func__); ++ return ret; ++ } ++ ++ ret = at45db_commit_buffer1(flash, at45db_addr); ++ if (ret != 0) { ++ msg_cerr("%s: committing page failed!\n", __func__); ++ return ret; ++ } ++ ++ return 0; ++} ++ ++int spi_write_at45db(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len) ++{ ++ const unsigned int page_size = flash->chip->page_size; ++ const unsigned int total_size = flash->chip->total_size; ++ ++ if ((start % page_size) != 0 || (len % page_size) != 0) { ++ msg_cerr("%s: cannot write partial pages: start=%u, len=%u\n", __func__, start, len); ++ return 1; ++ } ++ ++ if ((start + len) > (total_size * 1024)) { ++ msg_cerr("%s: tried to write beyond flash boundary: start=%u, len=%u, size=%u\n", ++ __func__, start, len, total_size); ++ return 1; ++ } ++ ++ unsigned int i; ++ for (i = 0; i < len; i += page_size) { ++ if (at45db_program_page(flash, buf + i, at45db_convert_addr(start + i, page_size)) != 0) { ++ msg_cerr("Writing page %u failed!\n", i); ++ return 1; ++ } ++ } ++ return 0; ++} +diff --git a/atahpt.c b/atahpt.c +index f8be8c4..242e14a 100644 +--- a/atahpt.c ++++ b/atahpt.c +@@ -69,6 +69,8 @@ int atahpt_init(void) + return 1; + + io_base_addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_4); ++ if (!io_base_addr) ++ return 1; + + /* Enable flash access. */ + reg32 = pci_read_long(dev, REG_FLASH_ACCESS); +diff --git a/board_enable.c b/board_enable.c +index 074cabb..e2a5fe2 100644 +--- a/board_enable.c ++++ b/board_enable.c +@@ -1488,6 +1488,7 @@ static int intel_ich_gpio_set(int gpio, int raise) + {0x24D0, 0x58, 0x1BFF0000, 0x00030305, 0}, /* 82801EB/ER (ICH5/ICH5R) */ + {0x2640, 0x48, 0x1BFF0000, 0x00030307, 0}, /* 82801FB/FR (ICH6/ICH6R) */ + {0x2641, 0x48, 0x1BFF0000, 0x00030307, 0}, /* 82801FBM (ICH6M) */ ++ {0x27B0, 0x48, 0xFFFFFFFF, 0x000300FF, 0}, /* 82801GDH (ICH7 DH) */ + {0x27B8, 0x48, 0xFFFFFFFF, 0x000300FF, 0}, /* 82801GB/GR (ICH7 Family) */ + {0x27B9, 0x48, 0xFFEBFFFE, 0x000300FE, 0}, /* 82801GBM (ICH7-M) */ + {0x27BD, 0x48, 0xFFEBFFFE, 0x000300FE, 0}, /* 82801GHM (ICH7-M DH) */ +@@ -1665,6 +1666,7 @@ static int intel_ich_gpio_set(int gpio, int raise) + * - abit IP35 Pro: Intel P35 + ICH9R + * - ASUS P5LD2 + * - ASUS P5LD2-VM ++ * - ASUS P5LD2-VM DH + */ + static int intel_ich_gpio16_raise(void) + { +@@ -2266,13 +2268,13 @@ static int p2_whitelist_laptop(void) + * NOTE: Please add boards that _don't_ need such enables or don't work yet + * to the respective tables in print.c. Thanks! + * +- * We use 2 sets of IDs here, you're free to choose which is which. This ++ * We use 2 sets of PCI IDs here, you're free to choose which is which. This + * is to provide a very high degree of certainty when matching a board on + * the basis of subsystem/card IDs. As not every vendor handles + * subsystem/card IDs in a sane manner. + * + * Keep the second set NULLed if it should be ignored. Keep the subsystem IDs +- * NULLed if they don't identify the board fully and if you can't use DMI. ++ * and the dmi identifier NULLed if they don't identify the board fully to disable autodetection. + * But please take care to provide an as complete set of pci ids as possible; + * autodetection is the preferred behaviour and we would like to make sure that + * matches are unique. +@@ -2306,6 +2308,7 @@ const struct board_match board_matches[] = { + #if defined(__i386__) || defined(__x86_64__) + {0x10DE, 0x0547, 0x147B, 0x1C2F, 0x10DE, 0x0548, 0x147B, 0x1C2F, NULL, NULL, NULL, P3, "abit", "AN-M2", 0, NT, nvidia_mcp_gpio2_raise}, + {0x1106, 0x0282, 0x147B, 0x1415, 0x1106, 0x3227, 0x147B, 0x1415, "^AV8 ", NULL, NULL, P3, "abit", "AV8", 0, OK, board_abit_av8}, ++ {0x8086, 0x7190, 0, 0, 0x8086, 0x7110, 0, 0, NULL /* "^I440BX-W977$" */, "abit", "bf6", P3, "abit", "BF6", 0, OK, intel_piix4_gpo26_lower}, + {0x8086, 0x7190, 0, 0, 0x8086, 0x7110, 0, 0, "^i440BX-W977 (BM6)$", NULL, NULL, P3, "abit", "BM6", 0, OK, intel_piix4_gpo26_lower}, + {0x8086, 0x24d3, 0x147b, 0x1014, 0x8086, 0x2578, 0x147b, 0x1014, NULL, NULL, NULL, P3, "abit", "IC7", 0, NT, intel_ich_gpio23_raise}, + {0x8086, 0x2930, 0x147b, 0x1084, 0x11ab, 0x4364, 0x147b, 0x1084, NULL, NULL, NULL, P3, "abit", "IP35", 0, OK, intel_ich_gpio16_raise}, +@@ -2330,6 +2333,7 @@ const struct board_match board_matches[] = { + {0x8086, 0x2570, 0x1849, 0x2570, 0x8086, 0x24d3, 0x1849, 0x24d0, NULL, NULL, NULL, P3, "ASRock", "775i65G", 0, OK, intel_ich_gpio23_raise}, + {0x10DE, 0x0060, 0x1043, 0x80AD, 0x10DE, 0x01E0, 0x1043, 0x80C0, NULL, NULL, NULL, P3, "ASUS", "A7N8X-VM/400", 0, OK, it8712f_gpio12_raise}, + {0x1106, 0x3189, 0x1043, 0x807F, 0x1106, 0x3065, 0x1043, 0x80ED, NULL, NULL, NULL, P3, "ASUS", "A7V600-X", 0, OK, it8712f_gpio31_raise}, ++ {0x1106, 0x3177, 0x1043, 0x80F9, 0x1106, 0x3205, 0x1043, 0x80F9, NULL, NULL, NULL, P3, "ASUS", "A7V8X-MX", 0, OK, w836xx_memw_enable_2e}, + {0x1106, 0x3177, 0x1043, 0x80A1, 0x1106, 0x3205, 0x1043, 0x8118, NULL, NULL, NULL, P3, "ASUS", "A7V8X-MX SE", 0, OK, w836xx_memw_enable_2e}, + {0x1106, 0x3189, 0x1043, 0x807F, 0x1106, 0x3177, 0x1043, 0x808C, NULL, NULL, NULL, P3, "ASUS", "A7V8X", 0, OK, it8703f_gpio51_raise}, + {0x1106, 0x3099, 0x1043, 0x807F, 0x1106, 0x3147, 0x1043, 0x808C, NULL, NULL, NULL, P3, "ASUS", "A7V333", 0, OK, it8703f_gpio51_raise}, +@@ -2372,12 +2376,14 @@ const struct board_match board_matches[] = { + {0x8086, 0x27b8, 0x1043, 0x2a22, 0x8086, 0x2770, 0x1043, 0x2a22, "^P5LP-LE$", NULL, NULL, P3, "ASUS", "P5LP-LE (Epson OEM)", 0, OK, intel_ich_gpio34_raise}, + {0x8086, 0x27da, 0x1043, 0x8179, 0x8086, 0x27b8, 0x1043, 0x8179, "^P5LD2$", NULL, NULL, P3, "ASUS", "P5LD2", 0, NT, intel_ich_gpio16_raise}, + {0x8086, 0x27da, 0x1043, 0x8179, 0x8086, 0x27b8, 0x1043, 0x8179, "^P5LD2-VM$", NULL, NULL, P3, "ASUS", "P5LD2-VM", 0, NT, intel_ich_gpio16_raise}, ++ {0x8086, 0x27b0, 0x1043, 0x8179, 0x8086, 0x2770, 0x1043, 0x817a, "^P5LD2-VM DH$", NULL, NULL, P3, "ASUS", "P5LD2-VM DH", 0, OK, intel_ich_gpio16_raise}, + {0x10DE, 0x0030, 0x1043, 0x818a, 0x8086, 0x100E, 0x1043, 0x80EE, NULL, NULL, NULL, P3, "ASUS", "P5ND2-SLI Deluxe", 0, OK, nvidia_mcp_gpio10_raise}, + {0x10DE, 0x0260, 0x1043, 0x81BC, 0x10DE, 0x026C, 0x1043, 0x829E, "^P5N-D$", NULL, NULL, P3, "ASUS", "P5N-D", 0, OK, it8718f_gpio63_raise}, + {0x10DE, 0x0260, 0x1043, 0x81BC, 0x10DE, 0x026C, 0x1043, 0x8249, "^P5N-E SLI$",NULL, NULL, P3, "ASUS", "P5N-E SLI", 0, NT, it8718f_gpio63_raise}, + {0x8086, 0x24dd, 0x1043, 0x80a6, 0x8086, 0x2570, 0x1043, 0x8157, NULL, NULL, NULL, P3, "ASUS", "P5PE-VM", 0, OK, intel_ich_gpio21_raise}, + {0x8086, 0x2443, 0x1043, 0x8027, 0x8086, 0x1130, 0x1043, 0x8027, "^CUSL2-C", NULL, NULL, P3, "ASUS", "CUSL2-C", 0, OK, intel_ich_gpio21_raise}, + {0x8086, 0x2443, 0x1043, 0x8027, 0x8086, 0x1130, 0x1043, 0x8027, "^TUSL2-C", NULL, NULL, P3, "ASUS", "TUSL2-C", 0, NT, intel_ich_gpio21_raise}, ++ {0x1106, 0x3059, 0x1106, 0x4161, 0x1106, 0x3065, 0x1106, 0x0102, NULL, NULL, NULL, P3, "Bcom/Clientron", "WinNET P680", 0, OK, w836xx_memw_enable_2e}, + {0x1106, 0x3177, 0x1106, 0x3177, 0x1106, 0x3116, 0x1106, 0x3116, "^KM266-8235$", "biostar", "m7viq", P3, "Biostar", "M7VIQ", 0, NT, w83697xx_memw_enable_2e}, + {0x10b7, 0x9055, 0x1028, 0x0082, 0x8086, 0x7190, 0, 0, NULL, NULL, NULL, P3, "Dell", "OptiPlex GX1", 0, OK, intel_piix4_gpo30_lower}, + {0x8086, 0x3590, 0x1028, 0x016c, 0x1000, 0x0030, 0x1028, 0x016c, NULL, NULL, NULL, P3, "Dell", "PowerEdge 1850", 0, OK, intel_ich_gpio23_raise}, +@@ -2452,6 +2458,12 @@ const struct board_match board_matches[] = { + {0x1106, 0x0259, 0x1106, 0xAA07, 0x1106, 0x3227, 0x1106, 0xAA07, NULL, NULL, NULL, P3, "VIA", "EPIA EK", 0, NT, via_vt823x_gpio9_raise}, + {0x1106, 0x3177, 0x1106, 0xAA01, 0x1106, 0x3123, 0x1106, 0xAA01, NULL, NULL, NULL, P3, "VIA", "EPIA M/MII/...", 0, OK, via_vt823x_gpio15_raise}, + {0x1106, 0x0259, 0x1106, 0x3227, 0x1106, 0x3065, 0x1106, 0x3149, NULL, NULL, NULL, P3, "VIA", "EPIA-N/NL", 0, OK, via_vt823x_gpio9_raise}, ++#ifdef DELL_AVOTON_SUPPORT ++ {0x8086, 0x1f38, 0x8086, 0x7270, 0, 0, 0, 0, NULL, NULL, NULL, P2, "DELL", "AVOTON", 0, OK, p2_not_a_laptop}, ++#endif ++#if DELL_DENVERTON_SUPPORT == 1 ++ {0x8086, 0x19dc, 0x8086, 0x7270, 0, 0, 0, 0, NULL, NULL, NULL, P2, "DELL", "DENVERTON", 0, OK, p2_not_a_laptop}, ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + #endif + { 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, P3, NULL, NULL, 0, NT, NULL}, /* end marker */ + }; +@@ -2559,6 +2571,7 @@ const static struct board_match *board_match_pci_ids(enum board_match_phase phas + } + } + ++#if defined(__i386__) || defined(__x86_64__) + if (board->dmi_pattern) { + if (!has_dmi_support) { + msg_pwarn("Warning: Can't autodetect %s %s, DMI info unavailable.\n", +@@ -2571,7 +2584,7 @@ const static struct board_match *board_match_pci_ids(enum board_match_phase phas + continue; + } + } +- ++#endif // defined(__i386__) || defined(__x86_64__) + return board; + } + +diff --git a/buspirate_spi.c b/buspirate_spi.c +index 9d229f4..f0e84bc 100644 +--- a/buspirate_spi.c ++++ b/buspirate_spi.c +@@ -250,6 +250,7 @@ int buspirate_spi_init(void) + if (!bp_commbuf) { + bp_commbufsize = 0; + msg_perr("Out of memory!\n"); ++ free(dev); + return ERROR_OOM; + } + bp_commbufsize = DEFAULT_BUFSIZE; +@@ -263,8 +264,12 @@ int buspirate_spi_init(void) + return ret; + } + +- if (register_shutdown(buspirate_spi_shutdown, NULL)) ++ if (register_shutdown(buspirate_spi_shutdown, NULL) != 0) { ++ bp_commbufsize = 0; ++ free(bp_commbuf); ++ bp_commbuf = NULL; + return 1; ++ } + + /* This is the brute force version, but it should work. + * It is likely to fail if a previous flashrom run was aborted during a write with the new SPI commands +diff --git a/cbtable.c b/cbtable.c +index e262a84..c100bbb 100644 +--- a/cbtable.c ++++ b/cbtable.c +@@ -261,7 +261,7 @@ int cb_parse_table(const char **vendor, const char **model) + #else + start = 0x0; + #endif +- table_area = physmap_try_ro("low megabyte", start, BYTES_TO_MAP - start); ++ table_area = physmap_ro_unaligned("low megabyte", start, BYTES_TO_MAP - start); + if (ERROR_PTR == table_area) { + msg_perr("Failed getting access to coreboot low tables.\n"); + return -1; +@@ -276,8 +276,9 @@ int cb_parse_table(const char **vendor, const char **model) + if (forward->tag == LB_TAG_FORWARD) { + start = forward->forward; + start &= ~(getpagesize() - 1); +- physunmap(table_area, BYTES_TO_MAP); +- table_area = physmap_try_ro("high tables", start, BYTES_TO_MAP); ++ physunmap_unaligned(table_area, BYTES_TO_MAP); ++ // FIXME: table_area is never unmapped below, nor is it unmapped above in the no-forward case ++ table_area = physmap_ro_unaligned("high tables", start, BYTES_TO_MAP); + if (ERROR_PTR == table_area) { + msg_perr("Failed getting access to coreboot high tables.\n"); + return -1; +diff --git a/chipdrivers.h b/chipdrivers.h +index 091d14c..851e90a 100644 +--- a/chipdrivers.h ++++ b/chipdrivers.h +@@ -64,6 +64,7 @@ int spi_write_chunked(struct flashctx *flash, uint8_t *buf, unsigned int start, + /* spi25_statusreg.c */ + uint8_t spi_read_status_register(struct flashctx *flash); + int spi_write_status_register(struct flashctx *flash, int status); ++void spi_prettyprint_status_register_bit(uint8_t status, int bit); + int spi_prettyprint_status_register_plain(struct flashctx *flash); + int spi_prettyprint_status_register_default_welwip(struct flashctx *flash); + int spi_prettyprint_status_register_default_bp1(struct flashctx *flash); +@@ -109,6 +110,19 @@ int read_opaque(struct flashctx *flash, uint8_t *buf, unsigned int start, unsign + int write_opaque(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); + int erase_opaque(struct flashctx *flash, unsigned int blockaddr, unsigned int blocklen); + ++/* at45db.c */ ++int probe_spi_at45db(struct flashctx *flash); ++int spi_prettyprint_status_register_at45db(struct flashctx *flash); ++int spi_disable_blockprotect_at45db(struct flashctx *flash); ++int spi_read_at45db(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); ++int spi_read_at45db_e8(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); ++int spi_write_at45db(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); ++int spi_erase_at45db_page(struct flashctx *flash, unsigned int addr, unsigned int blocklen); ++int spi_erase_at45db_block(struct flashctx *flash, unsigned int addr, unsigned int blocklen); ++int spi_erase_at45db_sector(struct flashctx *flash, unsigned int addr, unsigned int blocklen); ++int spi_erase_at45db_chip(struct flashctx *flash, unsigned int addr, unsigned int blocklen); ++int spi_erase_at45cs_sector(struct flashctx *flash, unsigned int addr, unsigned int blocklen); ++ + /* 82802ab.c */ + uint8_t wait_82802ab(struct flashctx *flash); + int probe_82802ab(struct flashctx *flash); +@@ -179,9 +193,10 @@ int printlock_at49f(struct flashctx *flash); + /* w29ee011.c */ + int probe_w29ee011(struct flashctx *flash); + +-/* stm50flw0x0x.c */ +-int erase_sector_stm50flw0x0x(struct flashctx *flash, unsigned int block, unsigned int blocksize); +-int unlock_stm50flw0x0x(struct flashctx *flash); ++/* stm50.c */ ++int erase_sector_stm50(struct flashctx *flash, unsigned int block, unsigned int blocksize); ++int unlock_stm50_uniform(struct flashctx *flash); ++int unlock_stm50_nonuniform(struct flashctx *flash); + + /* en29lv640b.c */ + int probe_en29lv640b(struct flashctx *flash); +diff --git a/chipset_enable.c b/chipset_enable.c +index a2df263..8a8ab66 100644 +--- a/chipset_enable.c ++++ b/chipset_enable.c +@@ -41,6 +41,17 @@ + + #if defined(__i386__) || defined(__x86_64__) + ++#if DELL_AVOTON_SUPPORT == 1 ++uint8_t is_avoton = 0; ++#endif /* DELL_AVOTON_SUPPORT == 1 */ ++ ++#if DELL_DENVERTON_SUPPORT == 1 ++uint8_t is_dnv = 0; ++uint32_t dnv_bios_region_start = 0x00; ++uint32_t dnv_bios_region_size = 0x00; ++uint32_t dnv_bios_region_limit = 0x00; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + static int enable_flash_ali_m1533(struct pci_dev *dev, const char *name) + { + uint8_t tmp; +@@ -260,20 +271,44 @@ static int enable_flash_piix4(struct pci_dev *dev, const char *name) + return 0; + } + +-/* +- * See ie. page 375 of "Intel I/O Controller Hub 7 (ICH7) Family Datasheet" +- * http://download.intel.com/design/chipsets/datashts/30701303.pdf +- */ +-static int enable_flash_ich(struct pci_dev *dev, const char *name, uint8_t bios_cntl) ++/* Note: the ICH0-ICH5 BIOS_CNTL register is actually 16 bit wide, in Poulsbo, Tunnel Creek and other Atom ++ * chipsets/SoCs it is even 32b, but just treating it as 8 bit wide seems to work fine in practice. */ ++static int enable_flash_ich_bios_cntl(struct pci_dev *dev, enum ich_chipset ich_generation, uint8_t bios_cntl) + { + uint8_t old, new, wanted; + +- /* +- * Note: the ICH0-ICH5 BIOS_CNTL register is actually 16 bit wide, in Tunnel Creek it is even 32b, but +- * just treating it as 8 bit wide seems to work fine in practice. +- */ +- wanted = old = pci_read_byte(dev, bios_cntl); ++ switch (ich_generation) { ++ case CHIPSET_ICH_UNKNOWN: ++ return ERROR_FATAL; ++ /* Non-SPI-capable */ ++ case CHIPSET_ICH: ++ case CHIPSET_ICH2345: ++ break; ++ /* Atom chipsets are special: The second byte of BIOS_CNTL (D9h) contains a prefetch bit similar to what ++ * other SPI-capable chipsets have at DCh. ++ * The Tunnel Creek datasheet contains a lot of details about the SPI controller, among other things it ++ * mentions that the prefetching and caching does only happen for direct memory reads. ++ * Therefore - at least for Tunnel Creek - it should not matter to flashrom because we use the ++ * programmed access only and not memory mapping. */ ++ case CHIPSET_TUNNEL_CREEK: ++ case CHIPSET_POULSBO: ++ case CHIPSET_CENTERTON: ++ old = pci_read_byte(dev, bios_cntl + 1); ++ msg_pdbg("BIOS Prefetch Enable: %sabled, ", (old & 1) ? "en" : "dis"); ++ break; ++ case CHIPSET_ICH7: ++ default: /* Future version might behave the same */ ++ old = (pci_read_byte(dev, bios_cntl) >> 2) & 0x3; ++ msg_pdbg("SPI Read Configuration: "); ++ if (old == 3) ++ msg_pdbg("invalid prefetching/caching settings, "); ++ else ++ msg_pdbg("prefetching %sabled, caching %sabled, ", ++ (old & 0x2) ? "en" : "dis", ++ (old & 0x1) ? "dis" : "en"); ++ } + ++ wanted = old = pci_read_byte(dev, bios_cntl); + /* + * Quote from the 6 Series datasheet (Document Number: 324645-004): + * "Bit 5: SMM BIOS Write Protect Disable (SMM_BWP) +@@ -283,11 +318,23 @@ static int enable_flash_ich(struct pci_dev *dev, const char *name, uint8_t bios_ + * + * Try to unset it in any case. + * It won't hurt and makes sense in some cases according to Stefan Reinauer. ++ * ++ * At least in Centerton aforementioned bit is located at bit 7. It is unspecified in all other Atom ++ * and Desktop chipsets before Ibex Peak/5 Series, but we reset bit 5 anyway. + */ +- wanted &= ~(1 << 5); ++ int smm_bwp_bit; ++ if (ich_generation == CHIPSET_CENTERTON) ++ smm_bwp_bit = 7; ++ else ++ smm_bwp_bit = 5; ++ wanted &= ~(1 << smm_bwp_bit); + +- /* Set BIOS Write Enable */ +- wanted |= (1 << 0); ++ /* Tunnel Creek has a cache disable at bit 2 of the lowest BIOS_CNTL byte. */ ++ if (ich_generation == CHIPSET_TUNNEL_CREEK) ++ wanted |= (1 << 2); ++ ++ wanted |= (1 << 0); /* Set BIOS Write Enable */ ++ wanted &= ~(1 << 1); /* Disable lock (futile) */ + + /* Only write the register if it's necessary */ + if (wanted != old) { +@@ -299,64 +346,79 @@ static int enable_flash_ich(struct pci_dev *dev, const char *name, uint8_t bios_ + msg_pdbg("\nBIOS_CNTL = 0x%02x: ", new); + msg_pdbg("BIOS Lock Enable: %sabled, ", (new & (1 << 1)) ? "en" : "dis"); + msg_pdbg("BIOS Write Enable: %sabled\n", (new & (1 << 0)) ? "en" : "dis"); +- if (new & (1 << 5)) ++ if (new & (1 << smm_bwp_bit)) + msg_pwarn("Warning: BIOS region SMM protection is enabled!\n"); + +- + if (new != wanted) +- msg_pwarn("Warning: Setting Bios Control at 0x%x from 0x%02x to 0x%02x on %s failed.\n" +- "New value is 0x%02x.\n", bios_cntl, old, wanted, name, new); ++ msg_pwarn("Warning: Setting Bios Control at 0x%x from 0x%02x to 0x%02x failed.\n" ++ "New value is 0x%02x.\n", bios_cntl, old, wanted, new); + +- /* Return an error if we could not set the write enable */ ++ /* Return an error if we could not set the write enable only. */ + if (!(new & (1 << 0))) + return -1; + + return 0; + } + +-static int enable_flash_ich_4e(struct pci_dev *dev, const char *name) ++static int enable_flash_ich_fwh_decode(struct pci_dev *dev, enum ich_chipset ich_generation) + { +- /* +- * Note: ICH5 has registers similar to FWH_SEL1, FWH_SEL2 and +- * FWH_DEC_EN1, but they are called FB_SEL1, FB_SEL2, FB_DEC_EN1 and +- * FB_DEC_EN2. +- */ +- internal_buses_supported = BUS_FWH; +- return enable_flash_ich(dev, name, 0x4e); +-} +- +-static int enable_flash_ich_dc(struct pci_dev *dev, const char *name) +-{ +- uint32_t fwh_conf; +- int i, tmp; +- char *idsel = NULL; +- int max_decode_fwh_idsel = 0, max_decode_fwh_decode = 0; +- int contiguous = 1; ++ uint8_t fwh_sel1 = 0, fwh_sel2 = 0, fwh_dec_en_lo = 0, fwh_dec_en_hi = 0; /* silence compilers */ ++ bool implemented = 0; ++ switch (ich_generation) { ++ case CHIPSET_ICH: ++ /* FIXME: Unlike later chipsets, ICH and ICH-0 do only support mapping of the top-most 4MB ++ * and therefore do only feature FWH_DEC_EN (E3h, different default too) and FWH_SEL (E8h). */ ++ break; ++ case CHIPSET_ICH2345: ++ fwh_sel1 = 0xe8; ++ fwh_sel2 = 0xee; ++ fwh_dec_en_lo = 0xf0; ++ fwh_dec_en_hi = 0xe3; ++ implemented = 1; ++ break; ++ case CHIPSET_POULSBO: ++ case CHIPSET_TUNNEL_CREEK: ++ /* FIXME: Similar to ICH and ICH-0, Tunnel Creek and Poulsbo do only feature one register each, ++ * FWH_DEC_EN (D7h) and FWH_SEL (D0h). */ ++ break; ++ case CHIPSET_CENTERTON: ++ /* FIXME: Similar to above FWH_DEC_EN (D4h) and FWH_SEL (D0h). */ ++ break; ++ case CHIPSET_ICH6: ++ case CHIPSET_ICH7: ++ default: /* Future version might behave the same */ ++ fwh_sel1 = 0xd0; ++ fwh_sel2 = 0xd4; ++ fwh_dec_en_lo = 0xd8; ++ fwh_dec_en_hi = 0xd9; ++ implemented = 1; ++ break; ++ } + +- idsel = extract_programmer_param("fwh_idsel"); ++ char *idsel = extract_programmer_param("fwh_idsel"); + if (idsel && strlen(idsel)) { +- uint64_t fwh_idsel_old, fwh_idsel; ++ if (!implemented) { ++ msg_perr("Error: fwh_idsel= specified, but (yet) unsupported on this chipset.\n"); ++ goto idsel_garbage_out; ++ } + errno = 0; + /* Base 16, nothing else makes sense. */ +- fwh_idsel = (uint64_t)strtoull(idsel, NULL, 16); ++ uint64_t fwh_idsel = (uint64_t)strtoull(idsel, NULL, 16); + if (errno) { +- msg_perr("Error: fwh_idsel= specified, but value could " +- "not be converted.\n"); ++ msg_perr("Error: fwh_idsel= specified, but value could not be converted.\n"); + goto idsel_garbage_out; + } + if (fwh_idsel & 0xffff000000000000ULL) { +- msg_perr("Error: fwh_idsel= specified, but value had " +- "unused bits set.\n"); ++ msg_perr("Error: fwh_idsel= specified, but value had unused bits set.\n"); + goto idsel_garbage_out; + } +- fwh_idsel_old = pci_read_long(dev, 0xd0); ++ uint64_t fwh_idsel_old = pci_read_long(dev, fwh_sel1); + fwh_idsel_old <<= 16; +- fwh_idsel_old |= pci_read_word(dev, 0xd4); +- msg_pdbg("\nSetting IDSEL from 0x%012" PRIx64 " to " +- "0x%012" PRIx64 " for top 16 MB.", fwh_idsel_old, +- fwh_idsel); +- rpci_write_long(dev, 0xd0, (fwh_idsel >> 16) & 0xffffffff); +- rpci_write_word(dev, 0xd4, fwh_idsel & 0xffff); ++ fwh_idsel_old |= pci_read_word(dev, fwh_sel2); ++ msg_pdbg("\nSetting IDSEL from 0x%012" PRIx64 " to 0x%012" PRIx64 " for top 16 MB.", ++ fwh_idsel_old, fwh_idsel); ++ rpci_write_long(dev, fwh_sel1, (fwh_idsel >> 16) & 0xffffffff); ++ rpci_write_word(dev, fwh_sel2, fwh_idsel & 0xffff); + /* FIXME: Decode settings are not changed. */ + } else if (idsel) { + msg_perr("Error: fwh_idsel= specified, but no value given.\n"); +@@ -366,15 +428,23 @@ idsel_garbage_out: + } + free(idsel); + ++ if (!implemented) { ++ msg_pdbg2("FWH IDSEL handling is not implemented on this chipset."); ++ return 0; ++ } ++ + /* Ignore all legacy ranges below 1 MB. + * We currently only support flashing the chip which responds to + * IDSEL=0. To support IDSEL!=0, flashbase and decode size calculations + * have to be adjusted. + */ ++ int max_decode_fwh_idsel = 0, max_decode_fwh_decode = 0; ++ bool contiguous = 1; ++ uint32_t fwh_conf = pci_read_long(dev, fwh_sel1); ++ int i; + /* FWH_SEL1 */ +- fwh_conf = pci_read_long(dev, 0xd0); + for (i = 7; i >= 0; i--) { +- tmp = (fwh_conf >> (i * 4)) & 0xf; ++ int tmp = (fwh_conf >> (i * 4)) & 0xf; + msg_pdbg("\n0x%08x/0x%08x FWH IDSEL: 0x%x", + (0x1ff8 + i) * 0x80000, + (0x1ff0 + i) * 0x80000, +@@ -386,9 +456,9 @@ idsel_garbage_out: + } + } + /* FWH_SEL2 */ +- fwh_conf = pci_read_word(dev, 0xd4); ++ fwh_conf = pci_read_word(dev, fwh_sel2); + for (i = 3; i >= 0; i--) { +- tmp = (fwh_conf >> (i * 4)) & 0xf; ++ int tmp = (fwh_conf >> (i * 4)) & 0xf; + msg_pdbg("\n0x%08x/0x%08x FWH IDSEL: 0x%x", + (0xff4 + i) * 0x100000, + (0xff0 + i) * 0x100000, +@@ -401,9 +471,11 @@ idsel_garbage_out: + } + contiguous = 1; + /* FWH_DEC_EN1 */ +- fwh_conf = pci_read_word(dev, 0xd8); ++ fwh_conf = pci_read_byte(dev, fwh_dec_en_hi); ++ fwh_conf <<= 8; ++ fwh_conf |= pci_read_byte(dev, fwh_dec_en_lo); + for (i = 7; i >= 0; i--) { +- tmp = (fwh_conf >> (i + 0x8)) & 0x1; ++ int tmp = (fwh_conf >> (i + 0x8)) & 0x1; + msg_pdbg("\n0x%08x/0x%08x FWH decode %sabled", + (0x1ff8 + i) * 0x80000, + (0x1ff0 + i) * 0x80000, +@@ -415,7 +487,7 @@ idsel_garbage_out: + } + } + for (i = 3; i >= 0; i--) { +- tmp = (fwh_conf >> i) & 0x1; ++ int tmp = (fwh_conf >> i) & 0x1; + msg_pdbg("\n0x%08x/0x%08x FWH decode %sabled", + (0xff4 + i) * 0x100000, + (0xff0 + i) * 0x100000, +@@ -429,99 +501,66 @@ idsel_garbage_out: + max_rom_decode.fwh = min(max_decode_fwh_idsel, max_decode_fwh_decode); + msg_pdbg("\nMaximum FWH chip size: 0x%x bytes", max_rom_decode.fwh); + +- /* If we're called by enable_flash_ich_dc_spi, it will override +- * internal_buses_supported anyway. +- */ +- internal_buses_supported = BUS_FWH; +- return enable_flash_ich(dev, name, 0xdc); ++ return 0; + } + +-static int enable_flash_poulsbo(struct pci_dev *dev, const char *name) ++static int enable_flash_ich_fwh(struct pci_dev *dev, enum ich_chipset ich_generation, uint8_t bios_cntl) + { +- uint16_t old, new; + int err; + +- if ((err = enable_flash_ich(dev, name, 0xd8)) != 0) ++ /* Configure FWH IDSEL decoder maps. */ ++ if ((err = enable_flash_ich_fwh_decode(dev, ich_generation)) != 0) + return err; + +- old = pci_read_byte(dev, 0xd9); +- msg_pdbg("BIOS Prefetch Enable: %sabled, ", +- (old & 1) ? "en" : "dis"); +- new = old & ~1; +- +- if (new != old) +- rpci_write_byte(dev, 0xd9, new); +- + internal_buses_supported = BUS_FWH; +- return 0; ++ return enable_flash_ich_bios_cntl(dev, ich_generation, bios_cntl); + } + +-static int enable_flash_tunnelcreek(struct pci_dev *dev, const char *name) ++static int enable_flash_ich0(struct pci_dev *dev, const char *name) + { +- uint16_t old, new; +- uint32_t tmp, bnt; +- void *rcrb; +- int ret; +- +- /* Enable Flash Writes */ +- ret = enable_flash_ich(dev, name, 0xd8); +- if (ret == ERROR_FATAL) +- return ret; +- +- /* Make sure BIOS prefetch mechanism is disabled */ +- old = pci_read_byte(dev, 0xd9); +- msg_pdbg("BIOS Prefetch Enable: %sabled, ", (old & 1) ? "en" : "dis"); +- new = old & ~1; +- if (new != old) +- rpci_write_byte(dev, 0xd9, new); +- +- /* Get physical address of Root Complex Register Block */ +- tmp = pci_read_long(dev, 0xf0) & 0xffffc000; +- msg_pdbg("\nRoot Complex Register Block address = 0x%x\n", tmp); +- +- /* Map RCBA to virtual memory */ +- rcrb = physmap("ICH RCRB", tmp, 0x4000); +- +- /* Test Boot BIOS Strap Status */ +- bnt = mmio_readl(rcrb + 0x3410); +- if (bnt & 0x02) { +- /* If strapped to LPC, no SPI initialization is required */ +- internal_buses_supported = BUS_FWH; +- return 0; +- } ++ return enable_flash_ich_fwh(dev, CHIPSET_ICH, 0x4e); ++} + +- /* This adds BUS_SPI */ +- if (ich_init_spi(dev, tmp, rcrb, 7) != 0) { +- if (!ret) +- ret = ERROR_NONFATAL; +- } ++static int enable_flash_ich2345(struct pci_dev *dev, const char *name) ++{ ++ return enable_flash_ich_fwh(dev, CHIPSET_ICH2345, 0x4e); ++} + +- return ret; ++static int enable_flash_ich6(struct pci_dev *dev, const char *name) ++{ ++ return enable_flash_ich_fwh(dev, CHIPSET_ICH6, 0xdc); + } + +-static int enable_flash_ich_dc_spi(struct pci_dev *dev, const char *name, +- enum ich_chipset ich_generation) ++static int enable_flash_poulsbo(struct pci_dev *dev, const char *name) + { +- int ret, ret_spi; +- uint8_t bbs, buc; +- uint32_t tmp, gcs; +- void *rcrb; +- const char *const *straps_names; ++ return enable_flash_ich_fwh(dev, CHIPSET_POULSBO, 0xd8); ++} + ++static int enable_flash_ich_spi(struct pci_dev *dev, enum ich_chipset ich_generation, uint8_t bios_cntl) ++{ + static const char *const straps_names_EP80579[] = { "SPI", "reserved", "reserved", "LPC" }; + static const char *const straps_names_ich7_nm10[] = { "reserved", "SPI", "PCI", "LPC" }; ++ static const char *const straps_names_tunnel_creek[] = { "SPI", "LPC" }; + static const char *const straps_names_ich8910[] = { "SPI", "SPI", "PCI", "LPC" }; + static const char *const straps_names_pch567[] = { "LPC", "reserved", "PCI", "SPI" }; + static const char *const straps_names_pch8[] = { "LPC", "reserved", "reserved", "SPI" }; +- static const char *const straps_names_pch8_lp[] = { "SPI", "LPC", "unknown", "unknown" }; ++ static const char *const straps_names_pch8_lp[] = { "SPI", "LPC" }; + static const char *const straps_names_unknown[] = { "unknown", "unknown", "unknown", "unknown" }; ++#ifdef DELL_AVOTON_SUPPORT ++ static const char *const straps_names_avoton[] = { "LPC", "reserved", "reserved", "SPI" }; ++ uint32_t tmp; ++ int ret_fwh = 0; ++ uint32_t new, old; ++ void *spibar; ++#endif + ++ const char *const *straps_names; + switch (ich_generation) { + case CHIPSET_ICH7: + /* EP80579 may need further changes, but this is the least + * intrusive way to get correct BOOT Strap printing without + * changing the rest of its code path). */ +- if (strcmp(name, "EP80579") == 0) ++ if (dev->device_id == 0x5031) + straps_names = straps_names_EP80579; + else + straps_names = straps_names_ich7_nm10; +@@ -531,6 +570,9 @@ static int enable_flash_ich_dc_spi(struct pci_dev *dev, const char *name, + case CHIPSET_ICH10: + straps_names = straps_names_ich8910; + break; ++ case CHIPSET_TUNNEL_CREEK: ++ straps_names = straps_names_tunnel_creek; ++ break; + case CHIPSET_5_SERIES_IBEX_PEAK: + case CHIPSET_6_SERIES_COUGAR_POINT: + case CHIPSET_7_SERIES_PANTHER_POINT: +@@ -543,33 +585,41 @@ static int enable_flash_ich_dc_spi(struct pci_dev *dev, const char *name, + straps_names = straps_names_pch8_lp; + break; + case CHIPSET_8_SERIES_WELLSBURG: // FIXME: check datasheet ++ case CHIPSET_CENTERTON: // FIXME: Datasheet does not mention GCS at all + straps_names = straps_names_unknown; + break; ++#ifdef DELL_AVOTON_SUPPORT ++ case CHIPSET_AVOTON: ++ straps_names = straps_names_avoton; ++ break; ++#endif + default: +- msg_gerr("%s: unknown ICH generation. Please report!\n", +- __func__); ++ msg_gerr("%s: unknown ICH generation. Please report!\n", __func__); + straps_names = straps_names_unknown; + break; + } + +- /* Enable Flash Writes */ +- ret = enable_flash_ich_dc(dev, name); +- if (ret == ERROR_FATAL) +- return ret; +- + /* Get physical address of Root Complex Register Block */ +- tmp = pci_read_long(dev, 0xf0) & 0xffffc000; +- msg_pdbg("Root Complex Register Block address = 0x%x\n", tmp); ++ uint32_t rcra = pci_read_long(dev, 0xf0) & 0xffffc000; ++ msg_pdbg("Root Complex Register Block address = 0x%x\n", rcra); + + /* Map RCBA to virtual memory */ +- rcrb = physmap("ICH RCRB", tmp, 0x4000); ++ void *rcrb = rphysmap("ICH RCRB", rcra, 0x4000); ++ if (rcrb == ERROR_PTR) ++ return ERROR_FATAL; + +- gcs = mmio_readl(rcrb + 0x3410); ++#ifdef DELL_AVOTON_SUPPORT ++ if (ich_generation != CHIPSET_AVOTON) { ++#endif ++ uint32_t gcs = mmio_readl(rcrb + 0x3410); + msg_pdbg("GCS = 0x%x: ", gcs); +- msg_pdbg("BIOS Interface Lock-Down: %sabled, ", +- (gcs & 0x1) ? "en" : "dis"); ++ msg_pdbg("BIOS Interface Lock-Down: %sabled, ", (gcs & 0x1) ? "en" : "dis"); + ++ uint8_t bbs; + switch (ich_generation) { ++ case CHIPSET_TUNNEL_CREEK: ++ bbs = (gcs >> 1) & 0x1; ++ break; + case CHIPSET_8_SERIES_LYNX_POINT_LP: + case CHIPSET_8_SERIES_WELLSBURG: // FIXME: check datasheet + /* Lynx Point LP uses a single bit for GCS */ +@@ -582,91 +632,187 @@ static int enable_flash_ich_dc_spi(struct pci_dev *dev, const char *name, + } + msg_pdbg("Boot BIOS Straps: 0x%x (%s)\n", bbs, straps_names[bbs]); + +- buc = mmio_readb(rcrb + 0x3414); +- msg_pdbg("Top Swap : %s\n", +- (buc & 1) ? "enabled (A16 inverted)" : "not enabled"); ++ if (ich_generation != CHIPSET_TUNNEL_CREEK && ich_generation != CHIPSET_CENTERTON) { ++ uint8_t buc = mmio_readb(rcrb + 0x3414); ++ msg_pdbg("Top Swap : %s\n", (buc & 1) ? "enabled (A16(+) inverted)" : "not enabled"); ++ } + +- /* It seems the ICH7 does not support SPI and LPC chips at the same +- * time. At least not with our current code. So we prevent searching +- * on ICH7 when the southbridge is strapped to LPC +- */ +- internal_buses_supported = BUS_FWH; +- if (ich_generation == CHIPSET_ICH7) { +- if (bbs == 0x03) { +- /* If strapped to LPC, no further SPI initialization is +- * required. */ +- return ret; +- } else { +- /* Disable LPC/FWH if strapped to PCI or SPI */ +- internal_buses_supported = BUS_NONE; +- } ++ /* Handle FWH-related parameters and initialization */ ++#ifdef DELL_AVOTON_SUPPORT ++ ret_fwh = enable_flash_ich_fwh(dev, ich_generation, bios_cntl); ++#else ++ int ret_fwh = enable_flash_ich_fwh(dev, ich_generation, bios_cntl); ++#endif ++ if (ret_fwh == ERROR_FATAL) ++ return ret_fwh; ++ ++ /* SPIBAR is at RCRB+0x3020 for ICH[78], Tunnel Creek and Centerton, and RCRB+0x3800 for ICH9. */ ++ uint16_t spibar_offset; ++ switch (ich_generation) { ++ case CHIPSET_ICH_UNKNOWN: ++ return ERROR_FATAL; ++ case CHIPSET_ICH7: ++ case CHIPSET_ICH8: ++ case CHIPSET_TUNNEL_CREEK: ++ case CHIPSET_CENTERTON: ++ spibar_offset = 0x3020; ++ break; ++ case CHIPSET_ICH9: ++ default: /* Future version might behave the same */ ++ spibar_offset = 0x3800; ++ break; + } ++ msg_pdbg("SPIBAR = 0x%0*" PRIxPTR " + 0x%04x\n", PRIxPTR_WIDTH, (uintptr_t)rcrb, spibar_offset); ++#ifndef DELL_AVOTON_SUPPORT ++ void *spibar = rcrb + spibar_offset; ++#else ++ spibar = rcrb + spibar_offset; ++ } else { ++ tmp = pci_read_long(dev, 0x54) & 0xFFFFFE00; ++ spibar = rphysmap("ICH SPIBAR", tmp, 0x4000); ++ msg_pdbg("SPIBAR = 0x%x\n", tmp); ++ ++ /* BIOS Control Register */ ++ tmp = mmio_readl(spibar + bios_cntl); ++ msg_pdbg("0xFC: 0x%08x (BIOS_CONTROL_REGISTER_BIOS : BCR)\n", tmp); ++ msg_pdbg("BIOS Write Protect Disable : %sabled, \n", ++ (tmp & (1 << 0)) ? "en" : "dis"); ++ msg_pdbg("\nBIOS Lock Enable: %sabled, \n", ++ (tmp & (1 << 1)) ? "en" : "dis"); ++ if (tmp != 1) { ++ mmio_writel(0x1, (spibar + bios_cntl)); ++ } ++ tmp = mmio_readl(spibar + bios_cntl); ++ msg_pdbg("0xFC: 0x%08x (BIOS_CONTROL_REGISTER_BIOS : BCR)\n", tmp); ++ msg_pdbg("BIOS Write Protect Disable : %sabled, \n", ++ (tmp & (1 << 0)) ? "en" : "dis"); ++ if (tmp != 1) { ++ msg_perr("Reboot and change BIOS-> IntelRCSetup -> Relax Security Config -> Disabled to Enabled\n"); ++ return ERROR_FATAL; /* Signal error */ ++ } ++ old = mmio_readb(spibar + 0xFC); ++ msg_pdbg("SPI Read Configuration: \n"); ++ new = (old >> 2) & 0x3; ++ switch (new) { ++ case 0: ++ case 1: ++ case 2: ++ msg_pdbg("prefetching %sabled, caching %sabled, \n", ++ (new & 0x2) ? "en" : "dis", ++ (new & 0x1) ? "dis" : "en"); ++ break; ++ default: ++ msg_pdbg("invalid prefetching/caching settings, \n"); ++ break; ++ } ++ } ++#endif ++ + + /* This adds BUS_SPI */ +- ret_spi = ich_init_spi(dev, tmp, rcrb, ich_generation); ++ int ret_spi = ich_init_spi(dev, spibar, ich_generation); + if (ret_spi == ERROR_FATAL) + return ret_spi; + +- if (ret || ret_spi) +- ret = ERROR_NONFATAL; ++ if (ret_fwh || ret_spi) ++ return ERROR_NONFATAL; + +- return ret; ++ return 0; ++} ++ ++static int enable_flash_tunnelcreek(struct pci_dev *dev, const char *name) ++{ ++ return enable_flash_ich_spi(dev, CHIPSET_TUNNEL_CREEK, 0xd8); ++} ++ ++static int enable_flash_s12x0(struct pci_dev *dev, const char *name) ++{ ++ return enable_flash_ich_spi(dev, CHIPSET_CENTERTON, 0xd8); + } + + static int enable_flash_ich7(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_ICH7); ++ return enable_flash_ich_spi(dev, CHIPSET_ICH7, 0xdc); + } + + static int enable_flash_ich8(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_ICH8); ++ return enable_flash_ich_spi(dev, CHIPSET_ICH8, 0xdc); + } + + static int enable_flash_ich9(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_ICH9); ++ return enable_flash_ich_spi(dev, CHIPSET_ICH9, 0xdc); + } + + static int enable_flash_ich10(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_ICH10); ++ return enable_flash_ich_spi(dev, CHIPSET_ICH10, 0xdc); + } + ++#ifdef DELL_AVOTON_SUPPORT ++static int enable_flash_c2000(struct pci_dev *dev, const char *name) ++{ ++ is_avoton = 1; ++ return enable_flash_ich_spi(dev, CHIPSET_AVOTON, 0xfc); ++} ++#endif ++ ++#if DELL_DENVERTON_SUPPORT == 1 ++static int enable_flash_denverton(struct pci_dev *dev, const char *name) ++{ ++ void *spibar; ++ int32_t ret_spi; ++ uint32_t sbase; ++ enum ich_chipset ich_generation = CHIPSET_DENVERTON; ++ ++ is_dnv = 1; ++ internal_buses_supported = BUS_FWH; ++ ++ /* GET physical address of SPI Base Address and map it */ ++ sbase = pci_read_long(dev, 0x10) & 0xfffffe00; ++ msg_pdbg("SPI_BASE_ADDRESS = 0x%x\n", sbase); ++ spibar = rphysmap("DENVERTON SBASE", sbase, 512); ++ enable_flash_ich_bios_cntl(dev, ich_generation, 0xdc); ++ ret_spi = ich_init_spi(dev, spibar, ich_generation); ++ return ret_spi; ++} ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + /* Ibex Peak aka. 5 series & 3400 series */ + static int enable_flash_pch5(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_5_SERIES_IBEX_PEAK); ++ return enable_flash_ich_spi(dev, CHIPSET_5_SERIES_IBEX_PEAK, 0xdc); + } + + /* Cougar Point aka. 6 series & c200 series */ + static int enable_flash_pch6(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_6_SERIES_COUGAR_POINT); ++ return enable_flash_ich_spi(dev, CHIPSET_6_SERIES_COUGAR_POINT, 0xdc); + } + + /* Panther Point aka. 7 series */ + static int enable_flash_pch7(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_7_SERIES_PANTHER_POINT); ++ return enable_flash_ich_spi(dev, CHIPSET_7_SERIES_PANTHER_POINT, 0xdc); + } + + /* Lynx Point aka. 8 series */ + static int enable_flash_pch8(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_8_SERIES_LYNX_POINT); ++ return enable_flash_ich_spi(dev, CHIPSET_8_SERIES_LYNX_POINT, 0xdc); + } + +-/* Lynx Point aka. 8 series low-power */ ++/* Lynx Point LP aka. 8 series low-power */ + static int enable_flash_pch8_lp(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_8_SERIES_LYNX_POINT_LP); ++ return enable_flash_ich_spi(dev, CHIPSET_8_SERIES_LYNX_POINT_LP, 0xdc); + } + + /* Wellsburg (for Haswell-EP Xeons) */ + static int enable_flash_pch8_wb(struct pci_dev *dev, const char *name) + { +- return enable_flash_ich_dc_spi(dev, name, CHIPSET_8_SERIES_WELLSBURG); ++ return enable_flash_ich_spi(dev, CHIPSET_8_SERIES_WELLSBURG, 0xdc); + } + + static int via_no_byte_merge(struct pci_dev *dev, const char *name) +@@ -737,10 +883,8 @@ static int enable_flash_vt_vx(struct pci_dev *dev, const char *name) + case 0x8410: /* VX900 */ + mmio_base = pci_read_long(dev, 0xbc) << 8; + mmio_base_physmapped = physmap("VIA VX MMIO register", mmio_base, SPI_CNTL_LEN); +- if (mmio_base_physmapped == ERROR_PTR) { +- physunmap(mmio_base_physmapped, SPI_CNTL_LEN); ++ if (mmio_base_physmapped == ERROR_PTR) + return ERROR_FATAL; +- } + + /* Offset 0 - Bit 0 holds SPI Bus0 Enable Bit. */ + spi_cntl = mmio_readl(mmio_base_physmapped) + 0x00; +@@ -882,22 +1026,29 @@ static int enable_flash_sc1100(struct pci_dev *dev, const char *name) + return 0; + } + +-/* Works for AMD-8111, VIA VT82C586A/B, VIA VT82C686A/B. */ +-static int enable_flash_amd8111(struct pci_dev *dev, const char *name) ++/* Works for AMD-768, AMD-8111, VIA VT82C586A/B, VIA VT82C596, VIA VT82C686A/B. ++ * ++ * ROM decode control register matrix ++ * AMD-768 AMD-8111 VT82C586A/B VT82C596 VT82C686A/B ++ * 7 FFC0_0000h–FFFF_FFFFh <- FFFE0000h-FFFEFFFFh <- <- ++ * 6 FFB0_0000h–FFBF_FFFFh <- FFF80000h-FFFDFFFFh <- <- ++ * 5 00E8... <- <- FFF00000h-FFF7FFFFh <- ++ */ ++static int enable_flash_amd_via(struct pci_dev *dev, const char *name, uint8_t decode_val) + { + #define AMD_MAPREG 0x43 + #define AMD_ENREG 0x40 + uint8_t old, new; + +- /* Enable decoding at 0xffb00000 to 0xffffffff. */ + old = pci_read_byte(dev, AMD_MAPREG); +- new = old | 0xC0; ++ new = old | decode_val; + if (new != old) { + rpci_write_byte(dev, AMD_MAPREG, new); + if (pci_read_byte(dev, AMD_MAPREG) != new) { +- msg_pinfo("Setting register 0x%x to 0x%02x on %s failed (WARNING ONLY).\n", ++ msg_pwarn("Setting register 0x%x to 0x%02x on %s failed (WARNING ONLY).\n", + AMD_MAPREG, new, name); +- } ++ } else ++ msg_pdbg("Changed ROM decode range to 0x%02x successfully.\n", new); + } + + /* Enable 'ROM write' bit. */ +@@ -908,14 +1059,37 @@ static int enable_flash_amd8111(struct pci_dev *dev, const char *name) + rpci_write_byte(dev, AMD_ENREG, new); + + if (pci_read_byte(dev, AMD_ENREG) != new) { +- msg_pinfo("Setting register 0x%x to 0x%02x on %s failed (WARNING ONLY).\n", ++ msg_pwarn("Setting register 0x%x to 0x%02x on %s failed (WARNING ONLY).\n", + AMD_ENREG, new, name); +- return -1; ++ return ERROR_NONFATAL; + } ++ msg_pdbg2("Set ROM enable bit successfully.\n"); + + return 0; + } + ++static int enable_flash_amd_768_8111(struct pci_dev *dev, const char *name) ++{ ++ /* Enable decoding of 0xFFB00000 to 0xFFFFFFFF (5 MB). */ ++ max_rom_decode.lpc = 5 * 1024 * 1024; ++ return enable_flash_amd_via(dev, name, 0xC0); ++} ++ ++static int enable_flash_vt82c586(struct pci_dev *dev, const char *name) ++{ ++ /* Enable decoding of 0xFFF80000 to 0xFFFFFFFF. (512 kB) */ ++ max_rom_decode.parallel = 512 * 1024; ++ return enable_flash_amd_via(dev, name, 0xC0); ++} ++ ++/* Works for VT82C686A/B too. */ ++static int enable_flash_vt82c596(struct pci_dev *dev, const char *name) ++{ ++ /* Enable decoding of 0xFFF80000 to 0xFFFFFFFF. (1 MB) */ ++ max_rom_decode.parallel = 1024 * 1024; ++ return enable_flash_amd_via(dev, name, 0xE0); ++} ++ + static int enable_flash_sb600(struct pci_dev *dev, const char *name) + { + uint32_t prot; +@@ -1257,6 +1431,8 @@ static int get_flashbase_sc520(struct pci_dev *dev, const char *name) + + /* 1. Map MMCR */ + mmcr = physmap("Elan SC520 MMCR", 0xfffef000, getpagesize()); ++ if (mmcr == ERROR_PTR) ++ return ERROR_FATAL; + + /* 2. Scan PAR0 (0x88) - PAR15 (0xc4) for + * BOOTCS region (PARx[31:29] = 100b)e +@@ -1302,8 +1478,8 @@ const struct penable chipset_enables[] = { + {0x1022, 0x2080, OK, "AMD", "CS5536", enable_flash_cs5536}, + {0x1022, 0x2090, OK, "AMD", "CS5536", enable_flash_cs5536}, + {0x1022, 0x3000, OK, "AMD", "Elan SC520", get_flashbase_sc520}, +- {0x1022, 0x7440, OK, "AMD", "AMD-768", enable_flash_amd8111}, +- {0x1022, 0x7468, OK, "AMD", "AMD8111", enable_flash_amd8111}, ++ {0x1022, 0x7440, OK, "AMD", "AMD-768", enable_flash_amd_768_8111}, ++ {0x1022, 0x7468, OK, "AMD", "AMD-8111", enable_flash_amd_768_8111}, + {0x1022, 0x780e, OK, "AMD", "FCH", enable_flash_sb600}, + {0x1039, 0x0406, NT, "SiS", "501/5101/5501", enable_flash_sis501}, + {0x1039, 0x0496, NT, "SiS", "85C496+497", enable_flash_sis85c496}, +@@ -1388,9 +1564,9 @@ const struct penable chipset_enables[] = { + {0x1106, 0x0691, OK, "VIA", "VT82C69x", via_no_byte_merge}, + {0x1106, 0x8601, NT, "VIA", "VT8601T", via_no_byte_merge}, + /* VIA southbridges */ +- {0x1106, 0x0586, OK, "VIA", "VT82C586A/B", enable_flash_amd8111}, +- {0x1106, 0x0596, OK, "VIA", "VT82C596", enable_flash_amd8111}, +- {0x1106, 0x0686, OK, "VIA", "VT82C686A/B", enable_flash_amd8111}, ++ {0x1106, 0x0586, OK, "VIA", "VT82C586A/B", enable_flash_vt82c586}, ++ {0x1106, 0x0596, OK, "VIA", "VT82C596", enable_flash_vt82c596}, ++ {0x1106, 0x0686, OK, "VIA", "VT82C686A/B", enable_flash_vt82c596}, + {0x1106, 0x3074, OK, "VIA", "VT8233", enable_flash_vt823x}, + {0x1106, 0x3147, OK, "VIA", "VT8233A", enable_flash_vt823x}, + {0x1106, 0x3177, OK, "VIA", "VT8235", enable_flash_vt823x}, +@@ -1405,6 +1581,7 @@ const struct penable chipset_enables[] = { + {0x1166, 0x0200, OK, "Broadcom", "OSB4", enable_flash_osb4}, + {0x1166, 0x0205, OK, "Broadcom", "HT-1000", enable_flash_ht1000}, + {0x17f3, 0x6030, OK, "RDC", "R8610/R3210", enable_flash_rdc_r8610}, ++ {0x8086, 0x0c60, NT, "Intel", "S12x0", enable_flash_s12x0}, + {0x8086, 0x122e, OK, "Intel", "PIIX", enable_flash_piix4}, + {0x8086, 0x1234, NT, "Intel", "MPIIX", enable_flash_piix4}, + {0x8086, 0x1c44, OK, "Intel", "Z68", enable_flash_pch6}, +@@ -1441,21 +1618,21 @@ const struct penable chipset_enables[] = { + {0x8086, 0x1e5f, NT, "Intel", "NM70", enable_flash_pch7}, + {0x8086, 0x2310, NT, "Intel", "DH89xxCC", enable_flash_pch7}, + {0x8086, 0x2390, NT, "Intel", "Coleto Creek", enable_flash_pch7}, +- {0x8086, 0x2410, OK, "Intel", "ICH", enable_flash_ich_4e}, +- {0x8086, 0x2420, OK, "Intel", "ICH0", enable_flash_ich_4e}, +- {0x8086, 0x2440, OK, "Intel", "ICH2", enable_flash_ich_4e}, +- {0x8086, 0x244c, OK, "Intel", "ICH2-M", enable_flash_ich_4e}, +- {0x8086, 0x2450, NT, "Intel", "C-ICH", enable_flash_ich_4e}, +- {0x8086, 0x2480, OK, "Intel", "ICH3-S", enable_flash_ich_4e}, +- {0x8086, 0x248c, OK, "Intel", "ICH3-M", enable_flash_ich_4e}, +- {0x8086, 0x24c0, OK, "Intel", "ICH4/ICH4-L", enable_flash_ich_4e}, +- {0x8086, 0x24cc, OK, "Intel", "ICH4-M", enable_flash_ich_4e}, +- {0x8086, 0x24d0, OK, "Intel", "ICH5/ICH5R", enable_flash_ich_4e}, +- {0x8086, 0x25a1, OK, "Intel", "6300ESB", enable_flash_ich_4e}, +- {0x8086, 0x2640, OK, "Intel", "ICH6/ICH6R", enable_flash_ich_dc}, +- {0x8086, 0x2641, OK, "Intel", "ICH6-M", enable_flash_ich_dc}, +- {0x8086, 0x2642, NT, "Intel", "ICH6W/ICH6RW", enable_flash_ich_dc}, +- {0x8086, 0x2670, OK, "Intel", "631xESB/632xESB/3100", enable_flash_ich_dc}, ++ {0x8086, 0x2410, OK, "Intel", "ICH", enable_flash_ich0}, ++ {0x8086, 0x2420, OK, "Intel", "ICH0", enable_flash_ich0}, ++ {0x8086, 0x2440, OK, "Intel", "ICH2", enable_flash_ich2345}, ++ {0x8086, 0x244c, OK, "Intel", "ICH2-M", enable_flash_ich2345}, ++ {0x8086, 0x2450, NT, "Intel", "C-ICH", enable_flash_ich2345}, ++ {0x8086, 0x2480, OK, "Intel", "ICH3-S", enable_flash_ich2345}, ++ {0x8086, 0x248c, OK, "Intel", "ICH3-M", enable_flash_ich2345}, ++ {0x8086, 0x24c0, OK, "Intel", "ICH4/ICH4-L", enable_flash_ich2345}, ++ {0x8086, 0x24cc, OK, "Intel", "ICH4-M", enable_flash_ich2345}, ++ {0x8086, 0x24d0, OK, "Intel", "ICH5/ICH5R", enable_flash_ich2345}, ++ {0x8086, 0x25a1, OK, "Intel", "6300ESB", enable_flash_ich2345}, ++ {0x8086, 0x2640, OK, "Intel", "ICH6/ICH6R", enable_flash_ich6}, ++ {0x8086, 0x2641, OK, "Intel", "ICH6-M", enable_flash_ich6}, ++ {0x8086, 0x2642, NT, "Intel", "ICH6W/ICH6RW", enable_flash_ich6}, ++ {0x8086, 0x2670, OK, "Intel", "631xESB/632xESB/3100", enable_flash_ich6}, + {0x8086, 0x27b0, OK, "Intel", "ICH7DH", enable_flash_ich7}, + {0x8086, 0x27b8, OK, "Intel", "ICH7/ICH7R", enable_flash_ich7}, + {0x8086, 0x27b9, OK, "Intel", "ICH7M", enable_flash_ich7}, +@@ -1570,6 +1747,12 @@ const struct penable chipset_enables[] = { + {0x8086, 0x8d5d, NT, "Intel", "Wellsburg", enable_flash_pch8_wb}, + {0x8086, 0x8d5e, NT, "Intel", "Wellsburg", enable_flash_pch8_wb}, + {0x8086, 0x8d5f, NT, "Intel", "Wellsburg", enable_flash_pch8_wb}, ++#ifdef DELL_AVOTON_SUPPORT ++ {0x8086, 0x1f38, OK, "Intel", "C2000", enable_flash_c2000}, ++#endif ++#if DELL_DENVERTON_SUPPORT == 1 ++ {0x8086, 0x19e0, OK, "Intel", "Denverton", enable_flash_denverton}, ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + #endif + {0}, + }; +@@ -1597,14 +1780,23 @@ int chipset_flash_enable(void) + chipset_enables[i].device_name); + continue; + } ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("Found chipset \"%s %s\"", ++ chipset_enables[i].vendor_name, ++ chipset_enables[i].device_name); ++#else + msg_pinfo("Found chipset \"%s %s\"", + chipset_enables[i].vendor_name, + chipset_enables[i].device_name); ++#endif + msg_pdbg(" with PCI ID %04x:%04x", + chipset_enables[i].vendor_id, + chipset_enables[i].device_id); ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg(". "); ++#else + msg_pinfo(". "); +- ++#endif + if (chipset_enables[i].status == NT) { + msg_pinfo("\nThis chipset is marked as untested. If " + "you are using an up-to-date version\nof " +@@ -1614,20 +1806,44 @@ int chipset_flash_enable(void) + "flashrom@flashrom.org including a verbose " + "(-V) log.\nThank you!\n"); + } ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("Enabling flash write... "); ++#else + msg_pinfo("Enabling flash write... "); ++#endif + ret = chipset_enables[i].doit(dev, + chipset_enables[i].device_name); + if (ret == NOT_DONE_YET) { + ret = -2; ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("OK - searching further chips.\n"); ++#else + msg_pinfo("OK - searching further chips.\n"); ++#endif + } else if (ret < 0) ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("FAILED!\n"); ++#else + msg_pinfo("FAILED!\n"); ++#endif + else if (ret == 0) ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("OK.\n"); ++#else + msg_pinfo("OK.\n"); ++#endif + else if (ret == ERROR_NONFATAL) ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("PROBLEMS, continuing anyway\n"); ++#else + msg_pinfo("PROBLEMS, continuing anyway\n"); ++#endif + if (ret == ERROR_FATAL) { ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("FATAL ERROR!\n"); ++#else + msg_perr("FATAL ERROR!\n"); ++#endif + return ret; + } + } +diff --git a/cli_classic.c b/cli_classic.c +index 4c71d07..09565f4 100644 +--- a/cli_classic.c ++++ b/cli_classic.c +@@ -31,6 +31,10 @@ + #include "flashchips.h" + #include "programmer.h" + ++#if DELL_DENVERTON_SUPPORT == 1 ++extern int8_t is_dnv; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + static void cli_classic_usage(const char *name) + { + printf("Please note that the command line interface for flashrom has changed between\n" +@@ -136,9 +140,10 @@ int main(int argc, char *argv[]) + char *tempstr = NULL; + char *pparam = NULL; + ++#ifndef FORCE10_SPI_CHANGE + print_version(); + print_banner(); +- ++#endif + if (selfcheck()) + exit(1); + +@@ -221,8 +226,6 @@ int main(int argc, char *argv[]) + free(tempstr); + cli_classic_abort_usage(); + } +- /* FIXME: A pointer to the image name is saved in a static array (of size MAX_ROMLAYOUT) +- * by register_include_arg() and needs to be freed after processing them. */ + break; + case 'L': + if (++operation_specified > 1) { +@@ -295,6 +298,9 @@ int main(int argc, char *argv[]) + "specified. Aborting.\n"); + cli_classic_abort_usage(); + } ++#ifdef FORCE10_SPI_CHANGE ++ print_version(); ++#endif + exit(0); + break; + case 'h': +@@ -372,6 +378,12 @@ int main(int argc, char *argv[]) + ret = 1; + goto out; + } ++ if (layoutfile != NULL && !write_it) { ++ msg_gerr("Layout files are currently supported for write operations only.\n"); ++ ret = 1; ++ goto out; ++ } ++ + if (process_include_args()) { + ret = 1; + goto out; +@@ -393,8 +405,13 @@ int main(int argc, char *argv[]) + if (prog == PROGRAMMER_INVALID) { + if (CONFIG_DEFAULT_PROGRAMMER != PROGRAMMER_INVALID) { + prog = CONFIG_DEFAULT_PROGRAMMER; ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("Using default programmer \"%s\".\n", ++ programmer_table[CONFIG_DEFAULT_PROGRAMMER].name); ++#else + msg_pinfo("Using default programmer \"%s\".\n", + programmer_table[CONFIG_DEFAULT_PROGRAMMER].name); ++#endif + } else { + msg_perr("Please select a programmer with the --programmer parameter.\n" + "Previously this was not necessary because there was a default set.\n" +@@ -489,6 +506,10 @@ int main(int argc, char *argv[]) + tempstr = flashbuses_to_text(flashes[0].chip->bustype); + msg_gdbg("Found %s flash chip \"%s\" (%d kB, %s).\n", + flashes[0].chip->vendor, flashes[0].chip->name, flashes[0].chip->total_size, tempstr); ++ if ((flashes[0].chip->total_size > flashes[0].bios_size) && (flashes[0].bios_size != 0)) { ++ msg_gdbg("BIOS Size in flash chip: %d kB\n", flashes[0].bios_size); ++ flashes[0].chip->total_size = flashes[0].bios_size; ++ } + free(tempstr); + } + +@@ -517,7 +538,19 @@ int main(int argc, char *argv[]) + * Give the chip time to settle. + */ + programmer_delay(100000); ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) { ++ dnv_smi_open_res(); ++ dnv_smi_doit(0, NULL, SMI_ENABLE_SPI); ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + ret |= doit(fill_flash, force, filename, read_it, write_it, erase_it, verify_it); ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) { ++ dnv_smi_doit(0, NULL, SMI_DISABLE_SPI); ++ dnv_smi_release_res(); ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + /* Note: doit() already calls programmer_shutdown(). */ + goto out; + +@@ -527,6 +560,7 @@ out: + for (i = 0; i < chipcount; i++) + free(flashes[i].chip); + ++ layout_cleanup(); + free(filename); + free(layoutfile); + free(pparam); +diff --git a/dmi.c b/dmi.c +index 242889f..25ddd93 100644 +--- a/dmi.c ++++ b/dmi.c +@@ -1,7 +1,10 @@ + /* + * This file is part of the flashrom project. + * ++ * Copyright (C) 2000-2002 Alan Cox ++ * Copyright (C) 2002-2010 Jean Delvare + * Copyright (C) 2009,2010 Michael Karcher ++ * Copyright (C) 2011-2013 Stefan Tauner + * + * 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 +@@ -26,33 +29,28 @@ + #include "flash.h" + #include "programmer.h" + +-int has_dmi_support = 0; +- +-#if STANDALONE ++#if defined(__i386__) || defined(__x86_64__) + +-/* Stub to indicate missing DMI functionality. +- * has_dmi_support is 0 by default, so nothing to do here. +- * Because dmidecode is not available on all systems, the goal is to implement +- * the DMI subset we need directly in this file. +- */ +-void dmi_init(void) +-{ +-} ++/* Enable SMBIOS decoding. Currently legacy DMI decoding is enough. */ ++#define SM_SUPPORT 0 + +-int dmi_match(const char *pattern) +-{ +- return 0; +-} ++/* Strings longer than 4096 in DMI are just insane. */ ++#define DMI_MAX_ANSWER_LEN 4096 + +-#else /* STANDALONE */ ++int has_dmi_support = 0; + +-static const char *dmidecode_names[] = { +- "system-manufacturer", +- "system-product-name", +- "system-version", +- "baseboard-manufacturer", +- "baseboard-product-name", +- "baseboard-version", ++static struct { ++ const char *const keyword; ++ const uint8_t type; ++ const uint8_t offset; ++ char *value; ++} dmi_strings[] = { ++ { "system-manufacturer", 1, 0x04, NULL }, ++ { "system-product-name", 1, 0x05, NULL }, ++ { "system-version", 1, 0x06, NULL }, ++ { "baseboard-manufacturer", 2, 0x04, NULL }, ++ { "baseboard-product-name", 2, 0x05, NULL }, ++ { "baseboard-version", 2, 0x06, NULL }, + }; + + /* This list is used to identify supposed laptops. The is_laptop field has the +@@ -66,9 +64,9 @@ static const char *dmidecode_names[] = { + * The types below are the most common ones. + */ + static const struct { +- unsigned char type; +- unsigned char is_laptop; +- const char *name; ++ uint8_t type; ++ uint8_t is_laptop; ++ char *name; + } dmi_chassis_types[] = { + {0x01, 2, "Other"}, + {0x02, 2, "Unknown"}, +@@ -86,20 +84,206 @@ static const struct { + {0x18, 0, "Sealed-case PC"}, /* used by Supermicro (X8SIE) */ + }; + +-#define DMI_COMMAND_LEN_MAX 260 +-static const char *dmidecode_command = "dmidecode"; ++#if CONFIG_INTERNAL_DMI == 1 ++#if defined(__DJGPP__) || defined(FORCE10_SPI_CHANGE) /* There is no strnlen in DJGPP. FIXME: Move this to a common utility file. */ ++size_t strnlen(const char *str, size_t n) ++{ ++ size_t i; ++ for (i = 0; i < n && str[i] != '\0'; i++) ++ ; ++ return i; ++} ++#endif + +-static char *dmistrings[ARRAY_SIZE(dmidecode_names)]; ++static bool dmi_checksum(const uint8_t * const buf, size_t len) ++{ ++ uint8_t sum = 0; ++ size_t a; + +-/* Strings longer than 4096 in DMI are just insane. */ +-#define DMI_MAX_ANSWER_LEN 4096 ++ for (a = 0; a < len; a++) ++ sum += buf[a]; ++ return (sum == 0); ++} ++ ++static char *dmi_string(uint8_t *buf, uint8_t string_id, uint8_t *limit) ++{ ++ size_t i, len; ++ ++ if (string_id == 0) ++ return "Not Specified"; ++ ++ while (string_id > 1 && string_id--) { ++ if (buf > limit) { ++ msg_perr("DMI table is broken (string portion out of bounds)!\n"); ++ return ""; ++ } ++ buf += strnlen((char *)buf, limit - buf) + 1; ++ } ++ ++ if (!*buf) /* as long as the current byte we're on isn't null */ ++ return ""; ++ ++ len = strnlen((char *)buf, limit - buf); ++ if (len > DMI_MAX_ANSWER_LEN) ++ len = DMI_MAX_ANSWER_LEN; ++ ++ /* fix junk bytes in the string */ ++ for (i = 0; i < len && buf[i] != '\0'; i++) ++ if (buf[i] < 32 || buf[i] >= 127) ++ buf[i] = ' '; ++ ++ return (char *)buf; ++} ++ ++static void dmi_chassis_type(uint8_t code) ++{ ++ int i; ++ code &= 0x7f; /* bits 6:0 are chassis type, 7th bit is the lock bit */ ++ is_laptop = 2; ++ for (i = 0; i < ARRAY_SIZE(dmi_chassis_types); i++) { ++ if (code == dmi_chassis_types[i].type) { ++ msg_pdbg("DMI string chassis-type: \"%s\"\n", dmi_chassis_types[i].name); ++ is_laptop = dmi_chassis_types[i].is_laptop; ++ break; ++ } ++ } ++} ++ ++static void dmi_table(uint32_t base, uint16_t len, uint16_t num) ++{ ++ int i = 0, j = 0; ++ ++ uint8_t *dmi_table_mem = physmap_ro("DMI Table", base, len); ++ if (dmi_table_mem == NULL) { ++ msg_perr("Unable to access DMI Table\n"); ++ return; ++ } ++ ++ uint8_t *data = dmi_table_mem; ++ uint8_t *limit = dmi_table_mem + len; ++ ++ /* SMBIOS structure header is always 4 B long and contains: ++ * - uint8_t type; // see dmi_chassis_types's type ++ * - uint8_t length; // data section w/ header w/o strings ++ * - uint16_t handle; ++ */ ++ while (i < num && data + 4 <= limit) { ++ /* - If a short entry is found (less than 4 bytes), not only it ++ * is invalid, but we cannot reliably locate the next entry. ++ * - If the length value indicates that this structure spreads ++ * accross the table border, something is fishy too. ++ * Better stop at this point, and let the user know his/her ++ * table is broken. ++ */ ++ if (data[1] < 4 || data + data[1] > limit) { ++ msg_perr("DMI table is broken (bogus header)!\n"); ++ break; ++ } ++ ++ if(data[0] == 3) { ++ if (data + 5 <= limit) ++ dmi_chassis_type(data[5]); ++ /* else the table is broken, but laptop detection is optional, hence continue. */ ++ } else ++ for (j = 0; j < ARRAY_SIZE(dmi_strings); j++) { ++ uint8_t offset = dmi_strings[j].offset; ++ uint8_t type = dmi_strings[j].type; ++ ++ if (data[0] != type) ++ continue; ++ ++ if (data[1] <= offset || data+offset > limit) { ++ msg_perr("DMI table is broken (offset out of bounds)!\n"); ++ goto out; ++ } ++ ++ /* Table will be unmapped, hence fill the struct with duplicated strings. */ ++ dmi_strings[j].value = strdup(dmi_string(data + data[1], data[offset], limit)); ++ } ++ /* Find next structure by skipping data and string sections */ ++ data += data[1]; ++ while (data + 1 <= limit) { ++ if (data[0] == 0 && data[1] == 0) ++ break; ++ data++; ++ } ++ data += 2; ++ i++; ++ } ++out: ++ physunmap(dmi_table_mem, len); ++} ++ ++#if SM_SUPPORT ++static int smbios_decode(uint8_t *buf) ++{ ++ /* TODO: other checks mentioned in the conformance guidelines? */ ++ if (!dmi_checksum(buf, buf[0x05]) || ++ (memcmp(buf + 0x10, "_DMI_", 5) != 0) || ++ !dmi_checksum(buf + 0x10, 0x0F)) ++ return 0; ++ ++ dmi_table(mmio_readl(buf + 0x18), mmio_readw(buf + 0x16), mmio_readw(buf + 0x1C)); ++ ++ return 1; ++} ++#endif ++ ++static int legacy_decode(uint8_t *buf) ++{ ++ if (!dmi_checksum(buf, 0x0F)) ++ return 1; ++ ++ dmi_table(mmio_readl(buf + 0x08), mmio_readw(buf + 0x06), mmio_readw(buf + 0x0C)); ++ ++ return 0; ++} ++ ++int dmi_fill(void) ++{ ++ size_t fp; ++ uint8_t *dmi_mem; ++ int ret = 1; ++ ++ msg_pdbg("Using Internal DMI decoder.\n"); ++ /* There are two ways specified to gain access to the SMBIOS table: ++ * - EFI's configuration table contains a pointer to the SMBIOS table. On linux it can be obtained from ++ * sysfs. EFI's SMBIOS GUID is: {0xeb9d2d31,0x2d88,0x11d3,0x9a,0x16,0x0,0x90,0x27,0x3f,0xc1,0x4d} ++ * - Scanning physical memory address range 0x000F0000h to 0x000FFFFF for the anchor-string(s). */ ++ dmi_mem = physmap_ro("DMI", 0xF0000, 0x10000); ++ if (dmi_mem == ERROR_PTR) ++ return ret; ++ ++ for (fp = 0; fp <= 0xFFF0; fp += 16) { ++#if SM_SUPPORT ++ if (memcmp(dmi_mem + fp, "_SM_", 4) == 0 && fp <= 0xFFE0) { ++ if (smbios_decode(dmi_mem + fp)) // FIXME: length check ++ goto out; ++ } else ++#endif ++ if (memcmp(dmi_mem + fp, "_DMI_", 5) == 0) ++ if (legacy_decode(dmi_mem + fp) == 0) { ++ ret = 0; ++ goto out; ++ } ++ } ++ msg_pinfo("No DMI table found.\n"); ++out: ++ physunmap(dmi_mem, 0x10000); ++ return ret; ++} ++ ++#else /* CONFIG_INTERNAL_DMI */ ++ ++#define DMI_COMMAND_LEN_MAX 300 ++static const char *dmidecode_command = "dmidecode"; + + static char *get_dmi_string(const char *string_name) + { + FILE *dmidecode_pipe; + char *result; +- char answerbuf[DMI_MAX_ANSWER_LEN]; +- char commandline[DMI_COMMAND_LEN_MAX + 40]; ++ char answerbuf[DMI_MAX_ANSWER_LEN + 1] = {'\0'}; ++ char commandline[DMI_COMMAND_LEN_MAX + 1] = {'\0'}; + + snprintf(commandline, sizeof(commandline), + "%s -s %s", dmidecode_command, string_name); +@@ -138,46 +322,31 @@ static char *get_dmi_string(const char *string_name) + /* Chomp trailing newline. */ + if (answerbuf[0] != 0 && answerbuf[strlen(answerbuf) - 1] == '\n') + answerbuf[strlen(answerbuf) - 1] = 0; +- msg_pdbg("DMI string %s: \"%s\"\n", string_name, answerbuf); + + result = strdup(answerbuf); +- if (!result) ++ if (result == NULL) + msg_pwarn("Warning: Out of memory - DMI support fails"); + + return result; + } + +-static int dmi_shutdown(void *data) +-{ +- int i; +- for (i = 0; i < ARRAY_SIZE(dmistrings); i++) { +- free(dmistrings[i]); +- dmistrings[i] = NULL; +- } +- return 0; +-} +- +-void dmi_init(void) ++int dmi_fill(void) + { + int i; + char *chassis_type; + +- if (register_shutdown(dmi_shutdown, NULL)) +- return; +- +- has_dmi_support = 1; +- for (i = 0; i < ARRAY_SIZE(dmidecode_names); i++) { +- dmistrings[i] = get_dmi_string(dmidecode_names[i]); +- if (!dmistrings[i]) { +- has_dmi_support = 0; +- return; +- } ++ msg_pdbg("Using External DMI decoder.\n"); ++ for (i = 0; i < ARRAY_SIZE(dmi_strings); i++) { ++ dmi_strings[i].value = get_dmi_string(dmi_strings[i].keyword); ++ if (dmi_strings[i].value == NULL) ++ return 1; + } + + chassis_type = get_dmi_string("chassis-type"); + if (chassis_type == NULL) +- return; ++ return 0; /* chassis-type handling is optional anyway */ + ++ msg_pdbg("DMI string chassis-type: \"%s\"\n", chassis_type); + is_laptop = 2; + for (i = 0; i < ARRAY_SIZE(dmi_chassis_types); i++) { + if (strcasecmp(chassis_type, dmi_chassis_types[i].name) == 0) { +@@ -185,6 +354,33 @@ void dmi_init(void) + break; + } + } ++ free(chassis_type); ++ return 0; ++} ++ ++#endif /* CONFIG_INTERNAL_DMI */ ++ ++static int dmi_shutdown(void *data) ++{ ++ int i; ++ for (i = 0; i < ARRAY_SIZE(dmi_strings); i++) { ++ free(dmi_strings[i].value); ++ dmi_strings[i].value = NULL; ++ } ++ return 0; ++} ++ ++void dmi_init(void) ++{ ++ /* Register shutdown function before we allocate anything. */ ++ if (register_shutdown(dmi_shutdown, NULL)) { ++ msg_pwarn("Warning: Could not register DMI shutdown function - continuing without DMI info.\n"); ++ return; ++ } ++ ++ /* dmi_fill fills the dmi_strings array, and if possible sets the global is_laptop variable. */ ++ if (dmi_fill() != 0) ++ return; + + switch (is_laptop) { + case 1: +@@ -194,7 +390,13 @@ void dmi_init(void) + msg_pdbg("DMI chassis-type is not specific enough.\n"); + break; + } +- free(chassis_type); ++ ++ has_dmi_support = 1; ++ int i; ++ for (i = 0; i < ARRAY_SIZE(dmi_strings); i++) { ++ msg_pdbg("DMI string %s: \"%s\"\n", dmi_strings[i].keyword, ++ (dmi_strings[i].value == NULL) ? "" : dmi_strings[i].value); ++ } + } + + /** +@@ -204,8 +406,8 @@ void dmi_init(void) + * at the beginning and '$' at the end. So you can look for "^prefix", + * "suffix$", "substring" or "^complete string$". + * +- * @param value The string to check. +- * @param pattern The pattern. ++ * @param value The non-NULL string to check. ++ * @param pattern The non-NULL pattern. + * @return Nonzero if pattern matches. + */ + static int dmi_compare(const char *value, const char *pattern) +@@ -252,11 +454,15 @@ int dmi_match(const char *pattern) + if (!has_dmi_support) + return 0; + +- for (i = 0; i < ARRAY_SIZE(dmidecode_names); i++) +- if (dmi_compare(dmistrings[i], pattern)) ++ for (i = 0; i < ARRAY_SIZE(dmi_strings); i++) { ++ if (dmi_strings[i].value == NULL) ++ continue; ++ ++ if (dmi_compare(dmi_strings[i].value, pattern)) + return 1; ++ } + + return 0; + } + +-#endif /* STANDALONE */ ++#endif // defined(__i386__) || defined(__x86_64__) +diff --git a/dnv_smi_spi.c b/dnv_smi_spi.c +new file mode 100644 +index 0000000..0317cc7 +--- /dev/null ++++ b/dnv_smi_spi.c +@@ -0,0 +1,185 @@ ++ ++/************************************************************************ ++* LEGALESE: "Copyright (c) 2018, Dell Inc. All rights reserved." ++* ++* This source code is confidential, proprietary, and contains trade ++* secrets that are the sole property of Dell Inc. ++* Copy and/or distribution of this source code or disassembly or reverse ++* engineering of the resultant object code are strictly forbidden without ++* the written consent of Dell Inc. ++* ++************************************************************************/ ++#if DELL_DENVERTON_SUPPORT == 1 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "flash.h" ++ ++#define MEM_MODULE "/dev/mem" ++ ++DELL_SPI_MAILBOX *mailbox; ++uint64_t phy_addr; ++ ++/** ++* @brief unmap a pagesize of physical memory into virtual memory. ++* @param[in] addr - virtual memory address that is unmaped. ++*/ ++static void free_virt_mapping(void *addr) ++{ ++ munmap(addr, getpagesize()); ++} ++ ++/** ++* @brief map a pagesize of physical memory into virtual memory. ++* @param[in] addr - physical memory address. ++* @param[out] buf - pointer to buffer which storages data. ++* @return = 0 for success, otherwise for error. ++*/ ++static uint32_t getData_phy_to_virt(uint32_t addr, void** buf) ++{ ++ uint8_t *tmp; ++ uint32_t pagesize, offset, index, fd; ++ ++ pagesize = getpagesize(); ++ if ( (fd = open(MEM_MODULE, O_RDWR)) < 0 ) { ++ printf("open() %s error\n", MEM_MODULE); ++ return 1; ++ } ++ ++ offset = addr & ~(pagesize - 1); ++ index = addr & (pagesize - 1); ++ if ( (tmp = mmap(0, pagesize*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset)) == MAP_FAILED ) { ++ printf("mmap() error\n"); ++ close(fd); ++ return 1; ++ } ++ *buf = tmp + index; ++ close(fd); ++ return 0; ++} ++ ++/** ++* @brief send "get communication buffer" requirement to SMM ++*/ ++uint32_t dnv_smi_open_res() ++{ ++ uint32_t mailboxAddress; ++ ++ ioperm(0xB2, 3, 1); ++ __asm__ __volatile__ ("push %%rcx" : :); ++ outb(0x27, 0xB2); ++ __asm__ __volatile__ ("movl %%ecx, %0" : "=r" (mailboxAddress)); ++ __asm__ __volatile__ ("pop %%rcx" : :); ++ ioperm(0xB2, 3, 0); ++ ++ getData_phy_to_virt(mailboxAddress, (void **)&mailbox); ++ phy_addr = mailboxAddress; ++ return 0; ++} ++ ++/** ++* @brief send "release communication buffer" requirement to SMM ++*/ ++void dnv_smi_release_res() ++{ ++ free_virt_mapping((void *)mailbox); ++} ++ ++/** ++* @brief disable SPI write protection. ++*/ ++static void dnv_trigger_smi_spi_unlock() ++{ ++ ioperm(0xB2, 3, 1); ++ __asm__ __volatile__ ("push %%rcx" : :); ++ __asm__ __volatile__ ("push %%rbx" : :); ++ __asm__ __volatile__ ("movl %0, %%ecx" : : "a" ((uint32_t)0)); ++ __asm__ __volatile__ ("movl %0, %%ebx" : : "a" ((uint32_t)phy_addr)); ++ outb(0x20, 0xB2); ++ __asm__ __volatile__ ("pop %%rbx" : :); ++ __asm__ __volatile__ ("pop %%rcx" : :); ++ ioperm(0xB2, 3, 0); ++} ++ ++/** ++* @brief enable SPI write protection. ++*/ ++static void dnv_trigger_smi_spi_lock() ++{ ++ ioperm(0xB2, 3, 1); ++ __asm__ __volatile__ ("push %%rcx" : :); ++ __asm__ __volatile__ ("push %%rbx" : :); ++ __asm__ __volatile__ ("movl %0, %%ecx" : : "a" ((uint32_t)0)); ++ __asm__ __volatile__ ("movl %0, %%ebx" : : "a" ((uint32_t)phy_addr)); ++ outb(0x24, 0xB2); ++ __asm__ __volatile__ ("pop %%rbx" : :); ++ __asm__ __volatile__ ("pop %%rcx" : :); ++ ioperm(0xB2, 3, 0); ++} ++ ++/** ++* @brief trigger smi ++*/ ++void run() ++{ ++ ioperm(0xB2, 3, 1); ++ outb(0x28, 0xB2); ++ ioperm(0xB2, 3, 0); ++} ++ ++/** ++* @brief This function is used to read/write and erase BIOS. ++* trigger SMI and send information to SMM(like requirement, address,and data) ++* @param[in] bios_offset - offset of bios region [0~size of bios region] ++* @param[in] buf - pointer to write data if cmd is "SMI_READ_SPI" ++* @param[in] cmd - enum SPI_SMI_CMD ++* @param[out] buf - pointer to read data if cmd is "SMI_WRITE_SPI" ++* @returns ret. This ret is returned from SMM. ++*/ ++int32_t dnv_smi_doit(uint32_t bios_offset, uint8_t *buf, SPI_SMI_CMD cmd) ++{ ++ ++ if (cmd == SMI_READ_SPI) { ++ mailbox->cmd = 0x1; ++ mailbox->offset = bios_offset; ++ mailbox->dlen = DELL_DENVERTON_BLOCK_SIZE; ++ run(); ++ memcpy (buf, mailbox->data, DELL_DENVERTON_BLOCK_SIZE); ++ return mailbox->ret; ++ } else if (cmd == SMI_ERASE_SPI) { ++ mailbox->cmd = 0x2; ++ mailbox->offset = bios_offset; ++ mailbox->dlen = DELL_DENVERTON_BLOCK_SIZE; ++ run(); ++ return mailbox->ret; ++ } else if (cmd == SMI_WRITE_SPI) { ++ memcpy (mailbox->data, buf, DELL_DENVERTON_BLOCK_SIZE); ++ mailbox->cmd = 0x3; ++ mailbox->offset = bios_offset; ++ mailbox->dlen = DELL_DENVERTON_BLOCK_SIZE; ++ run(); ++ return mailbox->ret; ++ } ++ ++ switch (cmd) ++ { ++ case SMI_ENABLE_SPI: ++ dnv_trigger_smi_spi_unlock(); ++ break; ++ case SMI_DISABLE_SPI: ++ dnv_trigger_smi_spi_lock(); ++ break; ++ default: ++ return -1; ++ } ++ ++ return 0; ++} ++ ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ +diff --git a/drkaiser.c b/drkaiser.c +index b94d6dd..0cf1fdb 100644 +--- a/drkaiser.c ++++ b/drkaiser.c +@@ -56,12 +56,6 @@ static const struct par_programmer par_programmer_drkaiser = { + .chip_writen = fallback_chip_writen, + }; + +-static int drkaiser_shutdown(void *data) +-{ +- physunmap(drkaiser_bar, DRKAISER_MEMMAP_SIZE); +- return 0; +-} +- + int drkaiser_init(void) + { + struct pci_dev *dev = NULL; +@@ -75,15 +69,15 @@ int drkaiser_init(void) + return 1; + + addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_2); ++ if (!addr) ++ return 1; + + /* Write magic register to enable flash write. */ + rpci_write_word(dev, PCI_MAGIC_DRKAISER_ADDR, PCI_MAGIC_DRKAISER_VALUE); + + /* Map 128kB flash memory window. */ +- drkaiser_bar = physmap("Dr. Kaiser PC-Waechter flash memory", +- addr, DRKAISER_MEMMAP_SIZE); +- +- if (register_shutdown(drkaiser_shutdown, NULL)) ++ drkaiser_bar = rphysmap("Dr. Kaiser PC-Waechter flash memory", addr, DRKAISER_MEMMAP_SIZE); ++ if (drkaiser_bar == ERROR_PTR) + return 1; + + max_rom_decode.parallel = 128 * 1024; +diff --git a/flash.h b/flash.h +index 63701ed..79fe8f4 100644 +--- a/flash.h ++++ b/flash.h +@@ -45,6 +45,14 @@ + typedef uintptr_t chipaddr; + #define PRIxPTR_WIDTH ((int)(sizeof(uintptr_t)*2)) + ++/* Types and macros regarding the maximum flash space size supported by generic code. */ ++typedef uint32_t chipoff_t; /* Able to store any addressable offset within a supported flash memory. */ ++typedef uint32_t chipsize_t; /* Able to store the number of bytes of any supported flash memory. */ ++#define FL_MAX_CHIPADDR_BITS (24) ++#define FL_MAX_CHIPADDR ((chipoff_t)(1ULL< 0) ++ programmer_table[programmer].delay(usecs); + } + + void map_flash_registers(struct flashctx *flash) +@@ -619,12 +629,29 @@ static unsigned int count_usable_erasers(const struct flashctx *flash) + return usable_erasefunctions; + } + ++#if DELL_DENVERTON_SUPPORT == 1 ++int8_t is_erase = 0; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + int compare_range(uint8_t *wantbuf, uint8_t *havebuf, unsigned int start, unsigned int len) + { + int ret = 0, failcount = 0; + unsigned int i; + for (i = 0; i < len; i++) { + if (wantbuf[i] != havebuf[i]) { ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv && is_erase) { ++ // _FVH ++ // At offset 0x28~0x2b of NVRAM, Main Bios and Boot Bios ++ // We can't read correct data after "erasing". ++ // But, We verified bios through SF100. The erase feature is work. ++ if (i == _FVH_OFFSET && ++ memcmp(&havebuf[i], _FVH_SIGNATURE, sizeof(_FVH_SIGNATURE) - 1) == 0) { ++ i += sizeof(_FVH_SIGNATURE) - 1; ++ continue; ++ } ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + /* Only print the first failure. */ + if (!failcount++) + msg_cerr("FAILED at 0x%08x! Expected=0x%02x, Found=0x%02x,", +@@ -651,7 +678,15 @@ int check_erased_range(struct flashctx *flash, unsigned int start, + exit(1); + } + memset(cmpbuf, 0xff, len); ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) ++ is_erase = 1; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + ret = verify_range(flash, cmpbuf, start, len); ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) ++ is_erase = 0; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + free(cmpbuf); + return ret; + } +@@ -695,6 +730,22 @@ int verify_range(struct flashctx *flash, uint8_t *cmpbuf, unsigned int start, un + return ret; + } + ++#if DELL_DENVERTON_SUPPORT == 1 ++ // NVRAM will be recovery even if use afulnx. ++ // skip NVRAM region. ++ if (is_dnv) { ++ // Do not hard-code the NVRAM region start address. It is located at different addresses for 16MB and 32MB BIOS image. ++ // For Denverton platform, NVRAM region start address is always located at dnv_bios_region_start. ++ // NVRAM backup region is located at (dnv_bios_region_start + DELL_DENVERTON_MAIN_NVRAM_LENGTH). ++ if ((start >= dnv_bios_region_start && ++ start < (dnv_bios_region_start + DELL_DENVERTON_MAIN_NVRAM_LENGTH)) || ++ (start >= (dnv_bios_region_start + DELL_DENVERTON_MAIN_NVRAM_LENGTH) && ++ start < ((dnv_bios_region_start + DELL_DENVERTON_MAIN_NVRAM_LENGTH) + DELL_DENVERTON_BACKUP_NVRAM_LENGTH))) { ++ return ret; ++ } ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + ret = compare_range(cmpbuf, readbuf, start, len); + out_free: + free(readbuf); +@@ -770,6 +821,11 @@ int need_erase(uint8_t *have, uint8_t *want, unsigned int len, enum write_granul + case write_gran_1056bytes: + result = need_erase_gran_bytes(have, want, len, 1056); + break; ++#if DELL_DENVERTON_SUPPORT == 1 ++ case write_gran_4096bytes: ++ result = need_erase_gran_bytes(have, want, len, 4096); ++ break; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + default: + msg_cerr("%s: Unsupported granularity! Please report a bug at " + "flashrom@flashrom.org\n", __func__); +@@ -831,6 +887,11 @@ static unsigned int get_next_write(uint8_t *have, uint8_t *want, unsigned int le + case write_gran_1056bytes: + stride = 1056; + break; ++#if DELL_DENVERTON_SUPPORT == 1 ++ case write_gran_4096bytes: ++ stride = 4096; ++ break; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + default: + msg_cerr("%s: Unsupported granularity! Please report a bug at " + "flashrom@flashrom.org\n", __func__); +@@ -1140,6 +1201,12 @@ notfound: + if (!flash->chip) + return -1; + ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) { ++ flash->chip->gran = write_gran_4096bytes; ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + #if CONFIG_INTERNAL == 1 + if (programmer_table[programmer].map_flash_region == physmap) + snprintf(location, sizeof(location), "at physical address 0x%lx", base); +@@ -1148,8 +1215,13 @@ notfound: + snprintf(location, sizeof(location), "on %s", programmer_table[programmer].name); + + tmp = flashbuses_to_text(flash->chip->bustype); ++#ifdef FORCE10_SPI_CHANGE ++ msg_cdbg("%s %s flash chip \"%s\" (%d kB, %s) %s.\n", force ? "Assuming" : "Found", ++ flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp, location); ++#else + msg_cinfo("%s %s flash chip \"%s\" (%d kB, %s) %s.\n", force ? "Assuming" : "Found", + flash->chip->vendor, flash->chip->name, flash->chip->total_size, tmp, location); ++#endif + free(tmp); + + /* Flash registers will not be mapped if the chip was forced. Lock info +@@ -1166,6 +1238,10 @@ notfound: + int read_buf_from_file(unsigned char *buf, unsigned long size, + const char *filename) + { ++#ifdef __LIBPAYLOAD__ ++ msg_gerr("Error: No file I/O support in libpayload\n"); ++ return 1; ++#else + unsigned long numbytes; + FILE *image; + struct stat image_stat; +@@ -1196,11 +1272,16 @@ int read_buf_from_file(unsigned char *buf, unsigned long size, + return 1; + } + return 0; ++#endif + } + + int write_buf_to_file(unsigned char *buf, unsigned long size, + const char *filename) + { ++#ifdef __LIBPAYLOAD__ ++ msg_gerr("Error: No file I/O support in libpayload\n"); ++ return 1; ++#else + unsigned long numbytes; + FILE *image; + +@@ -1221,6 +1302,7 @@ int write_buf_to_file(unsigned char *buf, unsigned long size, + return 1; + } + return 0; ++#endif + } + + int read_flash_to_file(struct flashctx *flash, const char *filename) +@@ -1229,6 +1311,16 @@ int read_flash_to_file(struct flashctx *flash, const char *filename) + unsigned char *buf = calloc(size, sizeof(char)); + int ret = 0; + ++#if DELL_DENVERTON_SUPPORT == 1 ++ uint64_t bios_start = 0; ++ uint64_t bios_size = size; ++ ++ if (is_dnv) { ++ bios_size = dnv_bios_region_size; ++ bios_start = dnv_bios_region_start; ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + msg_cinfo("Reading flash... "); + if (!buf) { + msg_gerr("Memory allocation failed!\n"); +@@ -1240,7 +1332,11 @@ int read_flash_to_file(struct flashctx *flash, const char *filename) + ret = 1; + goto out_free; + } ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (flash->chip->read(flash, (buf + bios_start), bios_start, bios_size)) { ++#else + if (flash->chip->read(flash, buf, 0, size)) { ++#endif /* #if DELL_DENVERTON__SUPPORT == 1 */ + msg_cerr("Read operation failed!\n"); + ret = 1; + goto out_free; +@@ -1388,6 +1484,11 @@ static int walk_eraseregions(struct flashctx *flash, int erasefunction, + { + int i, j; + unsigned int start = 0; ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) { ++ start = dnv_bios_region_start; ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + unsigned int len; + struct block_eraser eraser = flash->chip->block_erasers[erasefunction]; + +@@ -1897,6 +1998,10 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, + uint8_t *newcontents; + int ret = 0; + unsigned long size = flash->chip->total_size * 1024; ++#if DELL_DENVERTON_SUPPORT == 1 ++ uint32_t bios_size = size; ++ uint32_t bios_start = 0; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + + if (chip_safety_check(flash, force, read_it, write_it, erase_it, verify_it)) { + msg_cerr("Aborting.\n"); +@@ -1904,6 +2009,12 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, + goto out_nofree; + } + ++ if (normalize_romentries(flash)) { ++ msg_cerr("Requested regions can not be handled. Aborting.\n"); ++ ret = 1; ++ goto out_nofree; ++ } ++ + /* Given the existence of read locks, we want to unlock for read, + * erase and write. + */ +@@ -1936,6 +2047,13 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, + */ + + if (erase_it) { ++ ++#if 0 // Since we dont have a layout, why set newcontents to 0?? ++#ifdef FORCE10_SPI_CHANGE ++ /* Build a new image taking the given layout into account. */ ++ build_new_image(flash, oldcontents, newcontents); ++#endif ++#endif + /* FIXME: Do we really want the scary warning if erase failed? + * After all, after erase the chip is either blank or partially + * blank or it has the old contents. A blank chip won't boot, +@@ -1975,25 +2093,47 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, + * preserved, but in that case we might perform unneeded erase which + * takes time as well. + */ ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) { ++ bios_size = dnv_bios_region_size; ++ bios_start = dnv_bios_region_start; ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++#ifdef FORCE10_SPI_CHANGE ++ msg_cdbg("Reading old flash chip contents... "); ++#else + msg_cinfo("Reading old flash chip contents... "); ++#endif ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (flash->chip->read(flash, oldcontents + bios_start, bios_start, bios_size)) { ++#else + if (flash->chip->read(flash, oldcontents, 0, size)) { ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + ret = 1; + msg_cinfo("FAILED.\n"); + goto out; + } ++#ifdef FORCE10_SPI_CHANGE ++ msg_cdbg("done.\n"); ++#else + msg_cinfo("done.\n"); ++#endif + +- // This should be moved into each flash part's code to do it +- // cleanly. This does the job. +- handle_romentries(flash, oldcontents, newcontents); +- ++#if 0 ++ /* Build a new image taking the given layout into account. */ ++ build_new_image(flash, oldcontents, newcontents); ++#endif + // //////////////////////////////////////////////////////////// + + if (write_it) { + if (erase_and_write_flash(flash, oldcontents, newcontents)) { + msg_cerr("Uh oh. Erase/write failed. Checking if " + "anything changed.\n"); ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (!flash->chip->read(flash, newcontents, bios_start, bios_size)) { ++#else + if (!flash->chip->read(flash, newcontents, 0, size)) { ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + if (!memcmp(oldcontents, newcontents, size)) { + msg_cinfo("Good. It seems nothing was changed.\n"); + nonfatal_help_message(); +@@ -2014,14 +2154,22 @@ int doit(struct flashctx *flash, int force, const char *filename, int read_it, + if (write_it) { + /* Work around chips which need some time to calm down. */ + programmer_delay(1000*1000); ++#if DELL_DENVERTON_SUPPORT == 1 ++ ret = verify_range(flash, newcontents + bios_start, bios_start, bios_size); ++#else + ret = verify_range(flash, newcontents, 0, size); ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + /* If we tried to write, and verification now fails, we + * might have an emergency situation. + */ + if (ret) + emergency_help_message(); + } else { ++#if DELL_DENVERTON_SUPPORT == 1 ++ ret = compare_range(newcontents + bios_start, oldcontents + bios_start, bios_start, bios_size); ++#else + ret = compare_range(newcontents, oldcontents, 0, size); ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + } + if (!ret) + msg_cinfo("VERIFIED.\n"); +diff --git a/ft2232_spi.c b/ft2232_spi.c +index 81be051..44354fd 100644 +--- a/ft2232_spi.c ++++ b/ft2232_spi.c +@@ -43,6 +43,7 @@ + #define FTDI_FT4232H_PID 0x6011 + #define FTDI_FT232H_PID 0x6014 + #define TIAO_TUMPA_PID 0x8a98 ++#define TIAO_TUMPA_LITE_PID 0x8a99 + #define AMONTEC_JTAGKEY_PID 0xCFF8 + + #define GOEPEL_VID 0x096C +@@ -62,6 +63,7 @@ const struct dev_entry devs_ft2232spi[] = { + {FTDI_VID, FTDI_FT4232H_PID, OK, "FTDI", "FT4232H"}, + {FTDI_VID, FTDI_FT232H_PID, OK, "FTDI", "FT232H"}, + {FTDI_VID, TIAO_TUMPA_PID, OK, "TIAO", "USB Multi-Protocol Adapter"}, ++ {FTDI_VID, TIAO_TUMPA_LITE_PID, OK, "TIAO", "USB Multi-Protocol Adapter Lite"}, + {FTDI_VID, AMONTEC_JTAGKEY_PID, OK, "Amontec", "JTAGkey"}, + {GOEPEL_VID, GOEPEL_PICOTAP_PID, OK, "GOEPEL", "PicoTAP"}, + {FIC_VID, OPENMOKO_DBGBOARD_PID, OK, "FIC", "OpenMoko Neo1973 Debug board (V2+)"}, +@@ -208,6 +210,10 @@ int ft2232_spi_init(void) + /* Interface A is SPI1, B is SPI2. */ + ft2232_type = TIAO_TUMPA_PID; + channel_count = 2; ++ } else if (!strcasecmp(arg, "tumpalite")) { ++ /* Only one channel is used on lite edition */ ++ ft2232_type = TIAO_TUMPA_LITE_PID; ++ channel_count = 1; + } else if (!strcasecmp(arg, "busblaster")) { + /* In its default configuration it is a jtagkey clone */ + ft2232_type = FTDI_FT2232H_PID; +diff --git a/gfxnvidia.c b/gfxnvidia.c +index d0a9feb..d3ee14e 100644 +--- a/gfxnvidia.c ++++ b/gfxnvidia.c +@@ -77,12 +77,6 @@ static const struct par_programmer par_programmer_gfxnvidia = { + .chip_writen = fallback_chip_writen, + }; + +-static int gfxnvidia_shutdown(void *data) +-{ +- physunmap(nvidia_bar, GFXNVIDIA_MEMMAP_SIZE); +- return 0; +-} +- + int gfxnvidia_init(void) + { + struct pci_dev *dev = NULL; +@@ -96,12 +90,14 @@ int gfxnvidia_init(void) + return 1; + + io_base_addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); ++ if (!io_base_addr) ++ return 1; ++ + io_base_addr += 0x300000; + msg_pinfo("Detected NVIDIA I/O base address: 0x%x.\n", io_base_addr); + +- nvidia_bar = physmap("NVIDIA", io_base_addr, GFXNVIDIA_MEMMAP_SIZE); +- +- if (register_shutdown(gfxnvidia_shutdown, NULL)) ++ nvidia_bar = rphysmap("NVIDIA", io_base_addr, GFXNVIDIA_MEMMAP_SIZE); ++ if (nvidia_bar == ERROR_PTR) + return 1; + + /* Allow access to flash interface (will disable screen). */ +diff --git a/hwaccess.h b/hwaccess.h +index fd6eb12..83f349e 100644 +--- a/hwaccess.h ++++ b/hwaccess.h +@@ -37,7 +37,13 @@ + * or as builtin. + */ + #define index shadow_workaround_index ++ ++#if !defined (__NetBSD__) && !defined (__DragonFly__) + #include ++#else ++#include ++#endif ++ + #undef index + #endif + +diff --git a/ich_descriptors.c b/ich_descriptors.c +index 528717b..c007867 100644 +--- a/ich_descriptors.c ++++ b/ich_descriptors.c +@@ -45,6 +45,11 @@ + #define min(a, b) (a < b) ? a : b + #endif + ++#if DELL_DENVERTON_SUPPORT == 1 ++#define DELL_DENVERTON_MAX_DENSITY 7 ++extern int8_t is_dnv; // if 1 chipset is denverton serial, 0 otherwise ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + void prettyprint_ich_reg_vscc(uint32_t reg_val, int verbosity) + { + print(verbosity, "BES=0x%x, ", (reg_val & VSCC_BES) >> VSCC_BES_OFF); +@@ -100,6 +105,36 @@ void prettyprint_ich_descriptor_content(const struct ich_desc_content *cont) + + void prettyprint_ich_descriptor_component(const struct ich_descriptors *desc) + { ++#if DELL_DENVERTON_SUPPORT == 1 ++ static const char * const dnv_freq_str[8] = { ++ "reserved", /* 000 */ ++ "reserved", /* 001 */ ++ "48 MHz", /* 010 */ ++ "reserved", /* 011 */ ++ "30MHz", /* 100 */ ++ "reserved", /* 101 */ ++ "17 MHz", /* 110 */ ++ "reserved", /* 111 */ ++ }; ++ static const char * const dnv_size_str[16] = { ++ "512 kB", /* 0000 */ ++ " 1 MB", /* 0001 */ ++ " 2 MB", /* 0010 */ ++ " 4 MB", /* 0011 */ ++ " 8 MB", /* 0100 */ ++ " 16 MB", /* 0101 */ ++ " 32 MB", /* 0110 */ ++ " 64 MB", /* 0111 */ ++ "reserved", /* 1000 */ ++ "reserved", /* 1001 */ ++ "reserved", /* 1010 */ ++ "reserved", /* 1011 */ ++ "reserved", /* 1100 */ ++ "reserved", /* 1101 */ ++ "reserved", /* 1110 */ ++ "reserved", /* 1111 */ ++ }; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + static const char * const freq_str[8] = { + "20 MHz", /* 000 */ + "33 MHz", /* 001 */ +@@ -121,6 +156,47 @@ void prettyprint_ich_descriptor_component(const struct ich_descriptors *desc) + "reserved", /* 111 */ + }; + ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) { ++ msg_pdbg2("=== Component Section ===\n"); ++ msg_pdbg2("FLCOMP 0x%08x\n", desc->component.FLCOMP); ++ msg_pdbg2("FLILL 0x%08x\n", desc->component.FLILL ); ++ msg_pdbg2("\n"); ++ ++ msg_pdbg2("--- Details ---\n"); ++ msg_pdbg2("Component 1 density: %s\n", ++ dnv_size_str[desc->component.dnv_comp1_density]); ++ if (desc->content.NC) ++ msg_pdbg2("Component 2 density: %s\n", ++ dnv_size_str[desc->component.dnv_comp2_density]); ++ else ++ msg_pdbg2("Component 2 is not used.\n"); ++ msg_pdbg2("Read Clock Frequency: %s\n", ++ dnv_freq_str[desc->component.dnv_freq_read]); ++ msg_pdbg2("Read ID and Status Clock Freq.: %s\n", ++ dnv_freq_str[desc->component.dnv_freq_read_id]); ++ msg_pdbg2("Write and Erase Clock Freq.: %s\n", ++ dnv_freq_str[desc->component.dnv_freq_write]); ++ msg_pdbg2("Fast Read is %ssupported.\n", ++ desc->component.dnv_fastread ? "" : "not "); ++ if (desc->component.dnv_fastread) ++ msg_pdbg2("Fast Read Clock Frequency: %s\n", ++ dnv_freq_str[desc->component.dnv_freq_fastread]); ++ if (desc->component.FLILL == 0) ++ msg_pdbg2("No forbidden opcodes.\n"); ++ else { ++ msg_pdbg2("Invalid instruction 0: 0x%02x\n", ++ desc->component.invalid_instr0); ++ msg_pdbg2("Invalid instruction 1: 0x%02x\n", ++ desc->component.invalid_instr1); ++ msg_pdbg2("Invalid instruction 2: 0x%02x\n", ++ desc->component.invalid_instr2); ++ msg_pdbg2("Invalid instruction 3: 0x%02x\n", ++ desc->component.invalid_instr3); ++ } ++ } else { ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + msg_pdbg2("=== Component Section ===\n"); + msg_pdbg2("FLCOMP 0x%08x\n", desc->component.FLCOMP); + msg_pdbg2("FLILL 0x%08x\n", desc->component.FLILL ); +@@ -157,6 +233,9 @@ void prettyprint_ich_descriptor_component(const struct ich_descriptors *desc) + msg_pdbg2("Invalid instruction 3: 0x%02x\n", + desc->component.invalid_instr3); + } ++#if DELL_DENVERTON_SUPPORT == 1 ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + msg_pdbg2("\n"); + } + +@@ -171,6 +250,12 @@ static void pprint_freg(const struct ich_desc_region *reg, uint32_t i) + } + uint32_t base = ICH_FREG_BASE(reg->FLREGs[i]); + uint32_t limit = ICH_FREG_LIMIT(reg->FLREGs[i]); ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) { ++ base = DELL_DENVERTON_FREG_BASE(reg->FLREGs[i]); ++ limit = DELL_DENVERTON_FREG_LIMIT(reg->FLREGs[i]); ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + msg_pdbg2("Region %d (%-6s) ", i, region_names[i]); + if (base > limit) + msg_pdbg2("is unused.\n"); +@@ -741,17 +826,36 @@ int getFCBA_component_density(const struct ich_descriptors *desc, uint8_t idx) + msg_perr("Only ICH SPI component index 0 or 1 are supported yet.\n"); + return 0; + } ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) { ++ if (size_enc > DELL_DENVERTON_MAX_DENSITY) { ++ msg_perr("Density of ICH SPI component with index %d is invalid. Encoded density is 0x%x.\n", idx, size_enc); ++ return 0; ++ } ++ } else { ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + if (size_enc > 5) { + msg_perr("Density of ICH SPI component with index %d is invalid. Encoded density is 0x%x.\n", + idx, size_enc); + return 0; + } ++#if DELL_DENVERTON_SUPPORT == 1 ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + return (1 << (19 + size_enc)); + } + + static uint32_t read_descriptor_reg(uint8_t section, uint16_t offset, void *spibar) + { + uint32_t control = 0; ++#if DELL_DENVERTON_SUPPORT == 1 ++ if (is_dnv) { ++ control |= (section << DENVERTON_FDOC_FDSS_OFF) & DENVERTON_FDOC_FDSS; ++ control |= (offset << DENVERTON_FDOC_FDSI_OFF) & DENVERTON_FDOC_FDSI; ++ mmio_le_writel(control, spibar + DENVERTON_REG_FDOC); ++ return mmio_le_readl(spibar + DENVERTON_REG_FDOD); ++ } ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + control |= (section << FDOC_FDSS_OFF) & FDOC_FDSS; + control |= (offset << FDOC_FDSI_OFF) & FDOC_FDSI; + mmio_le_writel(control, spibar + ICH9_REG_FDOC); +diff --git a/ich_descriptors.h b/ich_descriptors.h +index 3a44740..914a3cd 100644 +--- a/ich_descriptors.h ++++ b/ich_descriptors.h +@@ -64,6 +64,19 @@ + #define ICH_FREG_BASE(flreg) (((flreg) << 12) & 0x01fff000) + #define ICH_FREG_LIMIT(flreg) (((flreg) >> 4) & 0x01fff000) + ++#if DELL_DENVERTON_SUPPORT == 1 ++#define DENVERTON_REG_FDOC 0xB4 ++#define DENVERTON_FDOC_FDSI_OFF 2 ++#define DENVERTON_FDOC_FDSI (0x3ff << DENVERTON_FDOC_FDSI_OFF) ++#define DENVERTON_FDOC_FDSS_OFF 12 ++#define DENVERTON_FDOC_FDSS (0x3 << DENVERTON_FDOC_FDSS_OFF) ++ ++#define DENVERTON_REG_FDOD 0xB8 ++ ++#define DELL_DENVERTON_FREG_BASE(flreg) (((flreg) << 12) & 0x03fff000) ++#define DELL_DENVERTON_FREG_LIMIT(flreg) (((flreg) >> 4) & 0x03fff000) ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + void prettyprint_ich_reg_vscc(uint32_t reg_val, int verbosity); + + struct ich_desc_content { +@@ -78,6 +91,15 @@ struct ich_desc_content { + NR :3, /* Number Of Regions */ + :5; + }; ++#if DELL_DENVERTON_SUPPORT == 1 ++ struct { ++ int32_t dnv_FCBA :8, /* Flash Component Base Address */ ++ dnv_NC :2, /* Number Of Components */ ++ :6, ++ dnv_FRBA :8, /* Flash Region Base Address */ ++ :8; ++ }; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + }; + union { /* 0x08 */ + uint32_t FLMAP1; +@@ -113,6 +135,20 @@ struct ich_desc_component { + freq_read_id :3, + :2; + }; ++#if DELL_DENVERTON_SUPPORT == 1 ++ struct { ++ uint32_t dnv_comp1_density :4, ++ dnv_comp2_density :4, ++ :9, ++ dnv_freq_read :3, ++ dnv_fastread :1, ++ dnv_freq_fastread :3, ++ dnv_freq_write :3, ++ dnv_freq_read_id :3, ++ dnv_dualfastread :1, ++ :1; ++ }; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + }; + union { /* 0x04 */ + uint32_t FLILL; /* Flash Invalid Instructions Register */ +@@ -129,6 +165,15 @@ struct ich_desc_component { + uint32_t FPBA :13, /* Flash Partition Boundary Addr */ + :19; + }; ++#if DELL_DENVERTON_SUPPORT == 1 ++ uint32_t FLILL1; /* Flash Partition Boundary Register for dnv */ ++ struct { ++ uint32_t invalid_instr4 :8, ++ invalid_instr5 :8, ++ invalid_instr6 :8, ++ invalid_instr7 :8; ++ }; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + }; + }; + +@@ -167,6 +212,65 @@ struct ich_desc_region { + :3; + }; + }; ++#if DELL_DENVERTON_SUPPORT == 1 ++ struct { /* FLREG0 Flash Descriptor */ ++ uint32_t dnv_reg0_base :15, ++ :1, ++ dnv_reg0_limit :15, ++ :1; ++ }; ++ struct { /* FLREG1 BIOS */ ++ uint32_t dnv_reg1_base :15, ++ :1, ++ dnv_reg1_limit :15, ++ :1; ++ }; ++ struct { /* FLREG2 ME */ ++ uint32_t dnv_reg2_base :15, ++ :1, ++ dnv_reg2_limit :15, ++ :1; ++ }; ++ ++ /* FLREG3 - Reserved */ ++ ++ struct { /* FLREG4 Platform */ ++ uint32_t dnv_reg4_base :15, ++ :1, ++ dnv_reg4_limit :15, ++ :1; ++ }; ++ ++ /* FLREG5 - Reserved */ ++ /* FLREG6 - Reserved */ ++ /* FLREG7 - Reserved */ ++ /* FLREG8 - Reserved */ ++ /* FLREG9 - Reserved */ ++ ++ struct { /* FLREG10 IE */ ++ uint32_t dnv_reg10_base :15, ++ :1, ++ dnv_reg10_limit :15, ++ :1; ++ }; ++ struct { /* FLREG11 LAN CTRL0 */ ++ uint32_t dnv_reg11_base :15, ++ :1, ++ dnv_reg11_limit :15, ++ :1; ++ }; ++ struct { /* FLREG12 LAN CTRL1 */ ++ uint32_t dnv_reg12_base :15, ++ :1, ++ dnv_reg12_limit :15, ++ :1; ++ }; ++ ++ /* FLREG13 - Reserved */ ++ /* FLREG14 - Reserved */ ++ /* FLREG15 - Reserved */ ++ ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + }; + }; + +diff --git a/ichspi.c b/ichspi.c +index 6d1bd1a..742d424 100644 +--- a/ichspi.c ++++ b/ichspi.c +@@ -170,6 +170,52 @@ + #define ICH7_REG_OPTYPE 0x56 /* 16 Bits */ + #define ICH7_REG_OPMENU 0x58 /* 64 Bits */ + ++/* denverton controller register definition */ ++#if DELL_DENVERTON_SUPPORT == 1 ++#define DENVERTON_REG_BFPREG 0x00 /* 32 Bits SPI BIOS MMIO PRI */ ++#define DENVERTON_BFPREG_PRB_OFF 0 /* 0-14: BIOS Flash Promary Region Base */ ++#define DENVERTON_BFPREG_PRB (0x7FFF << DENVERTON_BFPREG_PRB_OFF) ++#define DENVERTON_BFPREG_PRL_OFF 16 /* 16-30: BIOS Flash Primary Region Limit */ ++#define DENVERTON_BFPREG_PRL (0xFFFF << DENVERTON_BFPREG_PRL_OFF) ++#define DENVERTON_REG_HSFS 0x04 /* 16 Bits Hardware Sequencing Flash Status */ ++#define DENVERTON_HSFS_FDONE_OFF 0 /* 0: Flash Cycle Done */ ++#define DENVERTON_HSFS_FDONE (0x1 << DENVERTON_HSFS_FDONE_OFF) ++#define DENVERTON_HSFS_FCERR_OFF 1 /* 1: Flash Cycle Error */ ++#define DENVERTON_HSFS_FCERR (0x1 << DENVERTON_HSFS_FCERR_OFF) ++#define DENVERTON_HSFS_FDOPSS_OFF 13 /* 13: Flash Descriptor Override Pin-Strap Status */ ++#define DENVERTON_HSFS_FDOPSS (0x1 << DENVERTON_HSFS_FDOPSS_OFF) ++#define DENVERTON_HSFS_FDV_OFF 14 /* 14: Flash Descriptor Valid */ ++#define DENVERTON_HSFS_FDV (0x1 << DENVERTON_HSFS_FDV_OFF) ++#define DENVERTON_HSFS_FLOCKDN_OFF 15 /* 15: Flash Configuration Lock-Down */ ++#define DENVERTON_HSFS_FLOCKDN (0x1 << DENVERTON_HSFS_FLOCKDN_OFF) ++#define DENVERTON_REG_HSFC 0x06 /* 16 Bits Hardware Sequencing Flash Control */ ++#define DENVERTON_HSFC_FGO_OFF 0 /* 0: Flash Cycle Go */ ++#define DENVERTON_HSFC_FGO (0x1 << DENVERTON_HSFC_FGO_OFF) ++#define DENVERTON_HSFC_FCYCLE_OFF 1 /* 1- 4: FLASH Cycle */ ++#define DENVERTON_HSFC_FCYCLE (0xF << DENVERTON_HSFC_FCYCLE_OFF) ++#define DENVERTON_HSFC_FDBC_OFF 8 /* 8-13: Flash Data Byte Count */ ++#define DENVERTON_HSFC_FDBC (0x3F << DENVERTON_HSFC_FDBC_OFF) ++#define DENVERTON_REG_FADDR 0x08 /* 32 Bits */ ++#define DENVERTON_REG_FDATA0 0x10 /* 32 Bits */ ++#define DENVERTON_REG_FRAP 0x50 /* 32 Bytes Flash Region Access Permissions */ ++#define DENVERTON_REG_FREG0 0x54 /* 32 Bytes Flash Region 0 */ ++#define DENVERTON_REG_PR0 0x84 /* 32 Bytes Protected Range 0 */ ++#define DENVERTON_PR_WP_OFF 31 /* 31: write protection enable */ ++#define DENVERTON_PR_RP_OFF 15 /* 15: read protection enable */ ++#define DENVERTON_REG_VSCC0 0xC4 /* 32 Bits Host Vendor Specific Component Capabilities for Component 0 */ ++#define DENVERTON_REG_VSCC1 0xC8 /* 32 Bits Host Vendor Specific Component Capabilities for Component 1 */ ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ ++#ifdef DELL_AVOTON_SUPPORT ++extern int8_t is_avoton; ++#endif /* DELL_AVOTON_SUPPORT */ ++ ++#if DELL_DENVERTON_SUPPORT == 1 ++extern uint32_t dnv_bios_region_start; ++extern uint32_t dnv_bios_region_size; ++extern uint32_t dnv_bios_region_limit; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + /* ICH SPI configuration lock-down. May be set during chipset enabling. */ + static int ichspi_lock = 0; + +@@ -466,6 +512,8 @@ static int generate_opcodes(OPCODES * op) + + switch (ich_generation) { + case CHIPSET_ICH7: ++ case CHIPSET_TUNNEL_CREEK: ++ case CHIPSET_CENTERTON: + preop = REGREAD16(ICH7_REG_PREOP); + optype = REGREAD16(ICH7_REG_OPTYPE); + opmenu[0] = REGREAD32(ICH7_REG_OPMENU); +@@ -529,7 +577,7 @@ static int program_opcodes(OPCODES *op, int enable_undo) + opmenu[0] |= ((uint32_t) op->opcode[a].opcode) << (a * 8); + } + +- /*Program Allowable Opcodes 4 - 7 */ ++ /* Program Allowable Opcodes 4 - 7 */ + opmenu[1] = 0; + for (a = 4; a < 8; a++) { + opmenu[1] |= ((uint32_t) op->opcode[a].opcode) << ((a - 4) * 8); +@@ -538,6 +586,8 @@ static int program_opcodes(OPCODES *op, int enable_undo) + msg_pdbg2("\n%s: preop=%04x optype=%04x opmenu=%08x%08x\n", __func__, preop, optype, opmenu[0], opmenu[1]); + switch (ich_generation) { + case CHIPSET_ICH7: ++ case CHIPSET_TUNNEL_CREEK: ++ case CHIPSET_CENTERTON: + /* Register undo only for enable_undo=1, i.e. first call. */ + if (enable_undo) { + rmmio_valw(ich_spibar + ICH7_REG_PREOP); +@@ -603,10 +653,19 @@ static void ich_set_bbar(uint32_t min_addr) + int bbar_off; + switch (ich_generation) { + case CHIPSET_ICH7: ++ case CHIPSET_TUNNEL_CREEK: ++ case CHIPSET_CENTERTON: + bbar_off = 0x50; + break; + case CHIPSET_ICH8: ++#ifdef DELL_AVOTON_SUPPORT ++ case CHIPSET_AVOTON: ++#endif ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("BBAR offset is unknown on ICH8!\n"); ++#else + msg_perr("BBAR offset is unknown on ICH8!\n"); ++#endif + return; + case CHIPSET_ICH9: + default: /* Future version might behave the same */ +@@ -817,11 +876,17 @@ static int ich7_run_opcode(OPCODE op, uint32_t offset, + /* FIXME: make sure we do not needlessly cause transaction errors. */ + temp16 = REGREAD16(ICH7_REG_SPIS); + if (temp16 & SPIS_FCERR) { ++#ifndef FORCE10_SPI_CHANGE + msg_perr("Transaction error!\n"); ++#endif + /* keep reserved bits */ + temp16 &= SPIS_RESERVED_MASK; + REGWRITE16(ICH7_REG_SPIS, temp16 | SPIS_FCERR); ++#ifndef FORCE10_SPI_CHANGE + return 1; ++#else ++ return 0; ++#endif + } + + if ((!write_cmd) && (datalength != 0)) +@@ -838,6 +903,22 @@ static int ich9_run_opcode(OPCODE op, uint32_t offset, + uint32_t temp32; + uint64_t opmenu; + int opcode_index; ++/* skip unused region for Rangeley */ ++ if (offset >= 0x10000 && offset <= 0x9fffff) { ++ uint32_t i = 0; ++ for (i = 0; i < datalength; i++) ++ *(data + i) = 0xff; ++ return 0; ++ } ++#ifdef DELL_AVOTON_SUPPORT ++ /* skip unused region for Rangeley */ ++ if (is_avoton && offset >= 0x10000 && offset <= 0x9fffff) { ++ uint32_t i = 0; ++ for (i = 0; i < datalength; i++) ++ *(data + i) = 0xff; ++ return 0; ++ } ++#endif /* AVOTON */ + + /* Is it a write command? */ + if ((op.spi_type == SPI_OPCODE_TYPE_WRITE_NO_ADDRESS) +@@ -939,14 +1020,20 @@ static int ich9_run_opcode(OPCODE op, uint32_t offset, + /* FIXME make sure we do not needlessly cause transaction errors. */ + temp32 = REGREAD32(ICH9_REG_SSFS); + if (temp32 & SSFS_FCERR) { ++#ifndef FORCE10_SPI_CHANGE + msg_perr("Transaction error!\n"); ++#endif + prettyprint_ich9_reg_ssfs(temp32); + prettyprint_ich9_reg_ssfc(temp32); + /* keep reserved bits */ + temp32 &= SSFS_RESERVED_MASK | SSFC_RESERVED_MASK; + /* Clear the transaction error. */ + REGWRITE32(ICH9_REG_SSFS, temp32 | SSFS_FCERR); ++#ifndef FORCE10_SPI_CHANGE + return 1; ++#else ++ return 0; ++#endif + } + + if ((!write_cmd) && (datalength != 0)) +@@ -975,6 +1062,8 @@ static int run_opcode(const struct flashctx *flash, OPCODE op, uint32_t offset, + + switch (ich_generation) { + case CHIPSET_ICH7: ++ case CHIPSET_TUNNEL_CREEK: ++ case CHIPSET_CENTERTON: + return ich7_run_opcode(op, offset, datalength, data, maxlength); + case CHIPSET_ICH8: + default: /* Future version might behave the same */ +@@ -1418,6 +1507,191 @@ static int ich_spi_send_multicommand(struct flashctx *flash, + return ret; + } + ++#if DELL_DENVERTON_SUPPORT == 1 ++/* Sets FLA in FADDR to (addr & 0x01FFFFFF) without touching other bits. */ ++static void dnv_hwseq_set_addr(uint32_t addr) ++{ ++ uint32_t addr_old = REGREAD32(DENVERTON_REG_FADDR) & ~0x01FFFFFF; ++ REGWRITE32(DENVERTON_REG_FADDR, (addr & 0x01FFFFFF) | addr_old); ++} ++ ++/* Polls for Cycle Done Status, Flash Cycle Error or timeout in 8 us intervals. ++ Resets all error flags in HSFS. ++ Returns 0 if the cycle completes successfully without errors within ++ timeout us, 1 on errors. */ ++static int dnv_hwseq_wait_for_cycle_complete(uint32_t timeout, ++ uint32_t len) ++{ ++ uint16_t hsfs; ++ uint32_t addr; ++ ++ timeout /= 8; /* scale timeout duration to counter */ ++ while ((((hsfs = REGREAD16(DENVERTON_REG_HSFS)) & ++ (DENVERTON_HSFS_FDONE | DENVERTON_HSFS_FCERR)) == 0) && ++ --timeout) { ++ programmer_delay(8); ++ } ++ REGWRITE16(DENVERTON_REG_HSFS, REGREAD16(DENVERTON_REG_HSFS)); ++ if (!timeout) { ++ addr = REGREAD32(DENVERTON_REG_FADDR) & 0x01FFFFFF; ++ msg_perr("Timeout error between offset 0x%08x and " ++ "0x%08x (= 0x%08x + %d)!\n", ++ addr, addr + len - 1, addr, len - 1); ++ return 1; ++ } ++ ++ if (hsfs & DENVERTON_HSFS_FCERR) { ++ addr = REGREAD32(DENVERTON_REG_FADDR) & 0x01FFFFFF; ++ msg_perr("Transaction error between offset 0x%08x and " ++ "0x%08x (= 0x%08x + %d)!\n", ++ addr, addr + len - 1, addr, len - 1); ++ return 1; ++ } ++ return 0; ++} ++ ++int dnv_read_JEDEC_ID(uint8_t *buf) ++{ ++ uint16_t hsfc; ++ uint16_t timeout = 100 * 60; ++ uint8_t len = 3; ++ ++ /* clear FDONE, FCERR, AEL by writing 1 to them (if they are set) */ ++ REGWRITE16(DENVERTON_REG_HSFS, REGREAD16(DENVERTON_REG_HSFS)); ++ ++ dnv_hwseq_set_addr(0); ++ hsfc = REGREAD16(DENVERTON_REG_HSFC); ++ hsfc &= ~DENVERTON_HSFC_FCYCLE; /* clear operation */ ++ hsfc |= (0x6 << DENVERTON_HSFC_FCYCLE_OFF); /* set read JEDEC ID operation */ ++ hsfc &= ~DENVERTON_HSFC_FDBC; /* clear byte count */ ++ /* set byte count */ ++ hsfc |= (((len - 1) << DENVERTON_HSFC_FDBC_OFF) & DENVERTON_HSFC_FDBC); ++ hsfc |= DENVERTON_HSFC_FGO; /* start */ ++ REGWRITE16(DENVERTON_REG_HSFC, hsfc); ++ ++ if (dnv_hwseq_wait_for_cycle_complete(timeout, len)) ++ return 1; ++ ich_read_data(buf, len, DENVERTON_REG_FDATA0); ++ return 0; ++} ++ ++static int dnv_hwseq_probe(struct flashctx *flash) ++{ ++ uint8_t jedec_id[3]; ++ uint32_t tmp, manufacture_id, model_id; ++ struct block_eraser *eraser; ++ const struct flashchip *chip; ++ ++ msg_gdbg("Using HW Sequency to read JEDEC ID and find SPI flash.\n"); ++ if (dnv_read_JEDEC_ID(jedec_id)) { ++ msg_cerr("Can't get JEDEC ID through HW Sequency\n"); ++ return -1; ++ } ++ ++ manufacture_id = (uint32_t)jedec_id[0]; ++ model_id = (uint32_t)(jedec_id[1] << 8 | jedec_id[2]); ++ ++ for (chip = flashchips; chip && chip->name; chip++) { ++ if (chip->manufacture_id == manufacture_id && chip->model_id == model_id) { ++ break; ++ } ++ } ++ ++ flash->bios_size = (hwseq_data.size_comp0 + hwseq_data.size_comp1) / 1024; ++ ++ /* We only replace base information. The functions still use hw sequency, like read and write */ ++ flash->chip->vendor = chip->vendor; ++ flash->chip->name = chip->name; ++ flash->chip->manufacture_id = chip->manufacture_id; ++ flash->chip->model_id = chip->model_id; ++ flash->chip->total_size = chip->total_size; ++ flash->chip->page_size = chip->page_size; ++ ++ msg_cdbg("Hardware sequencing reports %d attached SPI flash chip", ++ (hwseq_data.size_comp1 != 0) ? 2 : 1); ++ if (hwseq_data.size_comp1 != 0) ++ msg_cdbg("s with a combined"); ++ else ++ msg_cdbg(" with a"); ++ msg_cdbg(" density of %d kB.\n", flash->chip->total_size); ++ ++ eraser = &(flash->chip->block_erasers[0]); ++ tmp = mmio_readl(ich_spibar + DENVERTON_REG_BFPREG); ++ dnv_bios_region_start = ((tmp & DENVERTON_BFPREG_PRB) >> DENVERTON_BFPREG_PRB_OFF) << 12; ++ dnv_bios_region_limit = ((tmp & DENVERTON_BFPREG_PRL) >> ++ DENVERTON_BFPREG_PRL_OFF) << 12 | ((1 << 12) -1); ++ dnv_bios_region_size = dnv_bios_region_limit - dnv_bios_region_start + 1; ++ eraser->eraseblocks[0].size = 4 * 1024; // 4K ++ eraser->eraseblocks[0].count = dnv_bios_region_size / ++ eraser->eraseblocks[0].size; ++ ++ flash->chip->tested = TEST_OK_PREW; ++ return 1; ++} ++ ++static int dnv_block_check(struct flashctx *flash, uint32_t addr, uint32_t len, SPI_SMI_CMD cmd) ++{ ++ char msg[3][4][32] = { ++ {"Read", "read", "", "Reading"}, ++ {"Erase", "erase", "Not erasing anthing.", "Erasing"}, ++ {"Write", "write", "", "Writing"}}; ++ ++ /* Although the hardware supports this (it would erase the whole block ++ * containing the address) we play safe here. */ ++ if (addr % DELL_DENVERTON_BLOCK_SIZE != 0) { ++ msg_cerr("%s address 0x%06x is not aligned to the %s " ++ "block boundary (any multiple of %d). %s\n", ++ msg[cmd][0], addr, msg[cmd][1], DELL_DENVERTON_BLOCK_SIZE, msg[cmd][2]); ++ return -1; ++ } ++ ++ if (addr + len > flash->chip->total_size * 1024) { ++ msg_perr("Request to %s some inaccessible memory address(es)" ++ " (addr=0x%x, len=%d). %s\n", msg[cmd][1], ++ addr, len, msg[cmd][2]); ++ return -1; ++ } ++ ++ msg_pdbg("%s %d bytes starting at 0x%06x.\n", msg[cmd][3], len, addr); ++ return 0; ++} ++ ++static int dnv_smi_spi(struct flashctx *flash, uint8_t *buf, uint32_t addr, ++ uint32_t len, SPI_SMI_CMD cmd) ++{ ++ int32_t ret = 0; ++ uint32_t block_index = 0; ++ ++ ret = dnv_block_check(flash, addr, len, cmd); ++ if (ret == 0) { ++ for (block_index = 0; block_index * DELL_DENVERTON_BLOCK_SIZE < len; block_index++ ) { ++ if ((ret = dnv_smi_doit(addr - dnv_bios_region_start, buf, cmd)) != 0) { ++ break; ++ } ++ buf += DELL_DENVERTON_BLOCK_SIZE; ++ addr += DELL_DENVERTON_BLOCK_SIZE; ++ } ++ } ++ return ret; ++} ++ ++static int dnv_smi_erase_spi(struct flashctx *flash, uint32_t addr, uint32_t len) ++{ ++ return dnv_smi_spi(flash, NULL, addr, len, SMI_ERASE_SPI); ++} ++ ++static int dnv_smi_read_spi(struct flashctx *flash, uint8_t *buf, uint32_t addr, uint32_t len) ++{ ++ return dnv_smi_spi(flash, buf, addr, len, SMI_READ_SPI); ++} ++ ++static int dnv_smi_write_spi(struct flashctx *flash, uint8_t *buf, uint32_t addr, uint32_t len) ++{ ++ return dnv_smi_spi(flash, buf, addr, len, SMI_WRITE_SPI); ++} ++ ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + #define ICH_BMWAG(x) ((x >> 24) & 0xff) + #define ICH_BMRAG(x) ((x >> 16) & 0xff) + #define ICH_BRWA(x) ((x >> 8) & 0xff) +@@ -1452,6 +1726,9 @@ static int ich9_handle_frap(uint32_t frap, int i) + msg_pdbg("FREG%i: %s region (0x%08x-0x%08x) is %s.\n", i, + region_names[i], base, (limit | 0x0fff), + access_names[rwperms]); ++#ifdef FORCE10_SPI_CHANGE ++ add_romentry(base, (limit | 0x0fff), region_names[i]); ++#endif + return 0; + } + +@@ -1514,6 +1791,90 @@ static void ich9_set_pr(int i, int read_prot, int write_prot) + msg_gspew("resulted in 0x%08x.\n", mmio_readl(addr)); + } + ++#if DELL_DENVERTON_SUPPORT == 1 ++/* returns 0 if region is unused or r/w */ ++static int dnv_handle_frap(uint32_t frap, int32_t i) ++{ ++ static const char *const access_names[4] = { ++ "locked", "read-only", "write-only", "read-write" ++ }; ++ static const char *const region_names[5] = { ++ "Flash Descriptor", "BIOS", "Management Engine", ++ "Gigabit Ethernet", "Platform Data" ++ }; ++ uint32_t base, limit; ++ int32_t rwperms = (((ICH_BRWA(frap) >> i) & 1) << 1) | ++ (((ICH_BRRA(frap) >> i) & 1) << 0); ++ int32_t offset = DENVERTON_REG_FREG0 + i * 4; ++ uint32_t freg = mmio_readl(ich_spibar + offset); ++ ++ base = ICH_FREG_BASE(freg); ++ limit = ICH_FREG_LIMIT(freg); ++ if (base > limit || (freg == 0 && i > 0)) { ++ /* this FREG is disabled */ ++ msg_pdbg2("0x%02X: 0x%08x FREG%i: %s region is unused.\n", ++ offset, freg, i, region_names[i]); ++ return 0; ++ } ++ msg_pdbg("0x%02X: 0x%08x ", offset, freg); ++ if (rwperms == 0x3) { ++ msg_pdbg("FREG%i: %s region (0x%08x-0x%08x) is %s.\n", i, ++ region_names[i], base, (limit | 0x0fff), ++ access_names[rwperms]); ++ return 0; ++ } ++ ++ msg_pwarn("FREG%i: Warning: %s region (0x%08x-0x%08x) is %s.\n", i, ++ region_names[i], base, (limit | 0x0fff), ++ access_names[rwperms]); ++ return 1; ++} ++ ++/* returns 0 if range is unused (i.e. r/w) */ ++static int dnv_handle_pr(int32_t i) ++{ ++ static const char *const access_names[3] = { ++ "locked", "read-only", "write-only" ++ }; ++ uint8_t off = DENVERTON_REG_PR0 + (i * 4); ++ uint32_t pr = mmio_readl(ich_spibar + off); ++ uint32_t rwperms = ICH_PR_PERMS(pr); ++ ++ if (rwperms == 0x3) { ++ msg_pdbg2("0x%02X: 0x%08x (PR%u is unused)\n", off, pr, i); ++ return 0; ++ } ++ ++ msg_pdbg("0x%02X: 0x%08x ", off, pr); ++ msg_pwarn("PR%u: Warning: 0x%08x-0x%08x is %s.\n", i, ICH_FREG_BASE(pr), ++ ICH_FREG_LIMIT(pr) | 0x0fff, access_names[rwperms]); ++ return 1; ++} ++ ++/* Set/Clear the read and write protection enable bits of PR register @i ++ * according to @read_prot and @write_prot. */ ++static void dnv_set_pr(int32_t i, int32_t read_prot, int32_t write_prot) ++{ ++ void *addr = ich_spibar + DENVERTON_REG_PR0 + (i * 4); ++ uint32_t old = mmio_readl(addr); ++ uint32_t new; ++ ++ msg_gspew("PR%u is 0x%08x", i, old); ++ new = old & ~((1 << DENVERTON_PR_RP_OFF) | (1 << DENVERTON_PR_WP_OFF)); ++ if (read_prot) ++ new |= (1 << DENVERTON_PR_RP_OFF); ++ if (write_prot) ++ new |= (1 << DENVERTON_PR_WP_OFF); ++ if (old == new) { ++ msg_gspew(" already.\n"); ++ return; ++ } ++ msg_gspew(", trying to set it to 0x%08x ", new); ++ rmmio_writel(new, addr); ++ msg_gspew("resulted in 0x%08x.\n", mmio_readl(addr)); ++} ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ + static const struct spi_programmer spi_programmer_ich7 = { + .type = SPI_CONTROLLER_ICH7, + .max_data_read = 64, +@@ -1545,12 +1906,21 @@ static const struct opaque_programmer opaque_programmer_ich_hwseq = { + .erase = ich_hwseq_block_erase, + }; + +-int ich_init_spi(struct pci_dev *dev, uint32_t base, void *rcrb, +- enum ich_chipset ich_gen) ++#if DELL_DENVERTON_SUPPORT == 1 ++static const struct opaque_programmer opaque_master_dnv_hwseq = { ++ .max_data_read = 64, ++ .max_data_write = 64, ++ .probe = dnv_hwseq_probe, ++ .read = dnv_smi_read_spi, ++ .write = dnv_smi_write_spi, ++ .erase = dnv_smi_erase_spi, ++}; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ ++ ++int ich_init_spi(struct pci_dev *dev, void *spibar, enum ich_chipset ich_gen) + { + int i; +- uint8_t old, new; +- uint16_t spibar_offset, tmp2; ++ uint16_t tmp2; + uint32_t tmp; + char *arg; + int ich_spi_force = 0; +@@ -1564,42 +1934,18 @@ int ich_init_spi(struct pci_dev *dev, uint32_t base, void *rcrb, + } ich_spi_mode = ich_auto; + + ich_generation = ich_gen; +- +- switch (ich_generation) { +- case CHIPSET_ICH_UNKNOWN: +- return ERROR_FATAL; +- case CHIPSET_ICH7: +- case CHIPSET_ICH8: +- spibar_offset = 0x3020; +- break; +- case CHIPSET_ICH9: +- default: /* Future version might behave the same */ +- spibar_offset = 0x3800; +- break; +- } +- +- /* SPIBAR is at RCRB+0x3020 for ICH[78] and RCRB+0x3800 for ICH9. */ +- msg_pdbg("SPIBAR = 0x%x + 0x%04x\n", base, spibar_offset); +- +- /* Assign Virtual Address */ +- ich_spibar = rcrb + spibar_offset; ++ ich_spibar = spibar; + + switch (ich_generation) { + case CHIPSET_ICH7: ++ case CHIPSET_TUNNEL_CREEK: ++ case CHIPSET_CENTERTON: + msg_pdbg("0x00: 0x%04x (SPIS)\n", + mmio_readw(ich_spibar + 0)); + msg_pdbg("0x02: 0x%04x (SPIC)\n", + mmio_readw(ich_spibar + 2)); + msg_pdbg("0x04: 0x%08x (SPIA)\n", + mmio_readl(ich_spibar + 4)); +- for (i = 0; i < 8; i++) { +- int offs; +- offs = 8 + (i * 8); +- msg_pdbg("0x%02x: 0x%08x (SPID%d)\n", offs, +- mmio_readl(ich_spibar + offs), i); +- msg_pdbg("0x%02x: 0x%08x (SPID%d+4)\n", offs + 4, +- mmio_readl(ich_spibar + offs + 4), i); +- } + ichspi_bbar = mmio_readl(ich_spibar + 0x50); + msg_pdbg("0x50: 0x%08x (BBAR)\n", + ichspi_bbar); +@@ -1625,7 +1971,123 @@ int ich_init_spi(struct pci_dev *dev, uint32_t base, void *rcrb, + ich_set_bbar(0); + register_spi_programmer(&spi_programmer_ich7); + break; ++#if DELL_DENVERTON_SUPPORT == 1 ++ case CHIPSET_DENVERTON: ++ ++ tmp2 = mmio_readw(ich_spibar + DENVERTON_REG_HSFS); ++ msg_pdbg("0x04: 0x%04x (HSFS)\n", tmp2); ++ if (tmp2 & DENVERTON_HSFS_FLOCKDN) { ++ msg_pwarn("Warning: SPI Configuration Lockdown activated.\n"); ++ ichspi_lock = 1; ++ } ++ if (tmp2 & DENVERTON_HSFS_FDV) ++ desc_valid = 1; ++ if (!(tmp2 & DENVERTON_HSFS_FDOPSS) && desc_valid) ++ msg_pinfo("The Flash Descriptor Override Strap-Pin is set. " ++ "Restrictions implied by\n" ++ "the Master Section of the flash descriptor are " ++ "NOT in effect. Please note\n" ++ "that Protected Range (PR) restrictions still apply.\n"); ++ if (desc_valid) { ++ tmp2 = mmio_readw(ich_spibar + DENVERTON_REG_HSFC); ++ msg_pdbg("0x06: 0x%04x (HSFC)\n", tmp2); ++ } ++ ++ tmp = mmio_readl(ich_spibar + DENVERTON_REG_FADDR); ++ msg_pdbg2("0x08: 0x%08x (FADDR)\n", tmp); ++ ++ if (desc_valid) { ++ tmp = mmio_readl(ich_spibar + DENVERTON_REG_FRAP); ++ msg_pdbg("0x50: 0x%08x (FRAP)", tmp); ++ ++ /* Handle FREGx and FRAP registers */ ++ for (i=0; i < 5; i++) ++ ich_spi_rw_restricted |= dnv_handle_frap(tmp, i); ++ if (ich_spi_rw_restricted) ++ msg_pwarn("Not all flash regions are freely accessible " ++ "by flashrom. This is most likely\n" ++ "due to an active ME. " ++ "Please see http://flashrom.org/ME for details.\n"); ++ } ++ ++ /* Handle PR registers */ ++ for (i = 0; i < 5; i++) { ++ if (!ichspi_lock) ++ dnv_set_pr(i, 0, 0); ++ ich_spi_rw_restricted |= dnv_handle_pr(i); ++ } ++ ++ if (ich_spi_force) ++ msg_pinfo("Continuing with write support because " ++ "the user forced us to!\n"); ++ ++ if (desc_valid) { ++ tmp = mmio_readl(ich_spibar + DENVERTON_REG_VSCC0); ++ msg_pdbg("0xC4: 0x%08x (VSCC0)\n", tmp); ++ ++ tmp = mmio_readl(ich_spibar + DENVERTON_REG_VSCC1); ++ msg_pdbg("0xC8: 0x%08x (VSCC1)\n", tmp); ++ ++ if (read_ich_descriptors_via_fdo(ich_spibar, &desc) == ICH_RET_OK) ++ prettyprint_ich_descriptors(ich_gen, &desc); ++ ++ /* If the descriptor is valid and indicates multiple ++ * flash devices we need to use hwseq to be able to ++ * access the second flash device. ++ */ ++ if (ich_spi_mode == ich_auto && desc.content.NC != 0) { ++ msg_pinfo("Enabling hardware sequencing due to " ++ "multiple flash chips detected.\n"); ++ ich_spi_mode = ich_hwseq; ++ } ++ } ++ ++ if (ich_spi_mode == ich_auto && ichspi_lock) { ++ msg_pinfo("Enabling hardware sequencing because " ++ "some important opcode is locked.\n"); ++ ich_spi_mode = ich_hwseq; ++ } ++ ++ if (ich_spi_mode == ich_auto && ichspi_lock) { ++ msg_pinfo("Enabling hardware sequencing because " ++ "some important opcode is locked.\n"); ++ ich_spi_mode = ich_hwseq; ++ } ++ ++ if (ich_spi_mode == ich_hwseq) { ++ if (!desc_valid) { ++ msg_perr("Hardware sequencing was requested " ++ "but the flash descriptor is not valid. Aborting.\n"); ++ return ERROR_FATAL; ++ } ++ ++ uint32_t tmpi = getFCBA_component_density(&desc, 0); ++ if (tmpi < 0) { ++ msg_perr("Could not determine density of " ++ "flash component %d.\n", 0); ++ return ERROR_FATAL; ++ } ++ hwseq_data.size_comp0 = tmpi; ++ ++ tmpi = getFCBA_component_density(&desc, 1); ++ if (tmpi < 0) { ++ msg_perr("Could not determine density of flash component %d.\n", 1); ++ return ERROR_FATAL; ++ } ++ hwseq_data.size_comp1 = tmpi; ++ ++ register_opaque_programmer(&opaque_master_dnv_hwseq); ++ } else { ++ msg_perr("[%s:%d] Error!!!\n", __func__, __LINE__); ++ return -1; ++ } ++ ++ break; ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + case CHIPSET_ICH8: ++#ifdef DELL_AVOTON_SUPPORT ++ case CHIPSET_AVOTON: ++#endif + default: /* Future version might behave the same */ + arg = extract_programmer_param("ich_spi_mode"); + if (arg && !strcmp(arg, "hwseq")) { +@@ -1669,7 +2131,11 @@ int ich_init_spi(struct pci_dev *dev, uint32_t base, void *rcrb, + msg_pdbg("0x04: 0x%04x (HSFS)\n", tmp2); + prettyprint_ich9_reg_hsfs(tmp2); + if (tmp2 & HSFS_FLOCKDN) { ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("Warning: SPI Configuration Lockdown activated.\n"); ++#else + msg_pwarn("Warning: SPI Configuration Lockdown activated.\n"); ++#endif + ichspi_lock = 1; + } + if (tmp2 & HSFS_FDV) +@@ -1690,6 +2156,7 @@ int ich_init_spi(struct pci_dev *dev, uint32_t base, void *rcrb, + msg_pdbg2("0x08: 0x%08x (FADDR)\n", tmp); + + if (desc_valid) { ++ + tmp = mmio_readl(ich_spibar + ICH9_REG_FRAP); + msg_pdbg("0x50: 0x%08x (FRAP)\n", tmp); + msg_pdbg("BMWAG 0x%02x, ", ICH_BMWAG(tmp)); +@@ -1750,10 +2217,15 @@ int ich_init_spi(struct pci_dev *dev, uint32_t base, void *rcrb, + msg_pdbg("VSCC: "); + prettyprint_ich_reg_vscc(tmp, MSG_DEBUG); + } else { ++#ifdef DELL_AVOTON_SUPPORT ++ if (ich_generation != CHIPSET_AVOTON) { ++#endif + ichspi_bbar = mmio_readl(ich_spibar + ICH9_REG_BBAR); + msg_pdbg("0xA0: 0x%08x (BBAR)\n", + ichspi_bbar); +- ++#ifdef DELL_AVOTON_SUPPORT ++ } ++#endif + if (desc_valid) { + tmp = mmio_readl(ich_spibar + ICH9_REG_LVSCC); + msg_pdbg("0xC4: 0x%08x (LVSCC)\n", tmp); +@@ -1811,21 +2283,6 @@ int ich_init_spi(struct pci_dev *dev, uint32_t base, void *rcrb, + break; + } + +- old = pci_read_byte(dev, 0xdc); +- msg_pdbg("SPI Read Configuration: "); +- new = (old >> 2) & 0x3; +- switch (new) { +- case 0: +- case 1: +- case 2: +- msg_pdbg("prefetching %sabled, caching %sabled, ", +- (new & 0x2) ? "en" : "dis", +- (new & 0x1) ? "dis" : "en"); +- break; +- default: +- msg_pdbg("invalid prefetching/caching settings, "); +- break; +- } + return 0; + } + +@@ -1844,7 +2301,9 @@ int via_init_spi(struct pci_dev *dev, uint32_t mmio_base) + { + int i; + +- ich_spibar = physmap("VIA SPI MMIO registers", mmio_base, 0x70); ++ ich_spibar = rphysmap("VIA SPI MMIO registers", mmio_base, 0x70); ++ if (ich_spibar == ERROR_PTR) ++ return ERROR_FATAL; + /* Do we really need no write enable? Like the LPC one at D17F0 0x40 */ + + /* Not sure if it speaks all these bus protocols. */ +diff --git a/internal.c b/internal.c +index ab3c81f..30b184f 100644 +--- a/internal.c ++++ b/internal.c +@@ -331,9 +331,8 @@ int internal_init(void) + return ret; + + #if defined(__i386__) || defined(__x86_64__) +- /* Probe unconditionally for IT87* LPC->SPI translation and for +- * IT87* Parallel write enable. +- */ ++ /* Probe unconditionally for ITE Super I/O chips. This enables LPC->SPI translation on IT87* and ++ * parallel writes on IT8705F. Also, this handles the manual chip select for Gigabyte's DualBIOS. */ + init_superio_ite(); + #endif + +diff --git a/it85spi.c b/it85spi.c +index 0b074eb..7efc680 100644 +--- a/it85spi.c ++++ b/it85spi.c +@@ -262,6 +262,9 @@ static int it85xx_spi_common_init(struct superio s) + * Major TODO here, and it will be a lot of work. + */ + base = (chipaddr)physmap("it85 communication", 0xFFFFF000, 0x1000); ++ if (base == (chipaddr)ERROR_PTR) ++ return 1; ++ + msg_pdbg("%s():%d base=0x%08x\n", __func__, __LINE__, + (unsigned int)base); + ce_high = (unsigned char *)(base + 0xE00); /* 0xFFFFFE00 */ +diff --git a/it87spi.c b/it87spi.c +index 8e4e0ad..be7f234 100644 +--- a/it87spi.c ++++ b/it87spi.c +@@ -27,6 +27,7 @@ + + #include + #include ++#include + #include "flash.h" + #include "chipdrivers.h" + #include "programmer.h" +@@ -36,7 +37,7 @@ + #define ITE_SUPERIO_PORT1 0x2e + #define ITE_SUPERIO_PORT2 0x4e + +-uint16_t it8716f_flashport = 0; ++static uint16_t it8716f_flashport = 0; + /* use fast 33MHz SPI (<>0) or slow 16MHz (0) */ + static int fast_spi = 1; + +@@ -124,10 +125,40 @@ static const struct spi_programmer spi_programmer_it87xx = { + static uint16_t it87spi_probe(uint16_t port) + { + uint8_t tmp = 0; +- char *portpos = NULL; + uint16_t flashport = 0; + + enter_conf_mode_ite(port); ++ ++ char *param = extract_programmer_param("dualbiosindex"); ++ if (param != NULL) { ++ sio_write(port, 0x07, 0x07); /* Select GPIO LDN */ ++ tmp = sio_read(port, 0xEF); ++ if (*param == '\0') { /* Print current setting only. */ ++ free(param); ++ } else { ++ char *dualbiosindex_suffix; ++ errno = 0; ++ long chip_index = strtol(param, &dualbiosindex_suffix, 0); ++ free(param); ++ if (errno != 0 || *dualbiosindex_suffix != '\0' || chip_index < 0 || chip_index > 1) { ++ msg_perr("DualBIOS: Invalid chip index requested - choose 0 or 1.\n"); ++ exit_conf_mode_ite(port); ++ return 1; ++ } ++ if (chip_index != (tmp & 1)) { ++ msg_pdbg("DualBIOS: Previous chip index: %d\n", tmp & 1); ++ sio_write(port, 0xEF, (tmp & 0xFE) | chip_index); ++ tmp = sio_read(port, 0xEF); ++ if ((tmp & 1) != chip_index) { ++ msg_perr("DualBIOS: Chip selection failed.\n"); ++ exit_conf_mode_ite(port); ++ return 1; ++ } ++ } ++ } ++ msg_pinfo("DualBIOS: Selected chip: %d\n", tmp & 1); ++ } ++ + /* NOLDN, reg 0x24, mask out lowest bit (suspend) */ + tmp = sio_read(port, 0x24) & 0xFE; + /* Check if LPC->SPI translation is active. */ +@@ -163,11 +194,11 @@ static uint16_t it87spi_probe(uint16_t port) + flashport |= sio_read(port, 0x65); + msg_pdbg("Serial flash port 0x%04x\n", flashport); + /* Non-default port requested? */ +- portpos = extract_programmer_param("it87spiport"); +- if (portpos) { ++ param = extract_programmer_param("it87spiport"); ++ if (param) { + char *endptr = NULL; + unsigned long forced_flashport; +- forced_flashport = strtoul(portpos, &endptr, 0); ++ forced_flashport = strtoul(param, &endptr, 0); + /* Port 0, port >0x1000, unaligned ports and garbage strings + * are rejected. + */ +@@ -180,7 +211,8 @@ static uint16_t it87spi_probe(uint16_t port) + msg_perr("Error: it87spiport specified, but no valid " + "port specified.\nPort must be a multiple of " + "0x8 and lie between 0x100 and 0xff8.\n"); +- free(portpos); ++ exit_conf_mode_ite(port); ++ free(param); + return 1; + } else { + flashport = (uint16_t)forced_flashport; +@@ -190,7 +222,7 @@ static uint16_t it87spi_probe(uint16_t port) + sio_write(port, 0x65, (flashport & 0xff)); + } + } +- free(portpos); ++ free(param); + exit_conf_mode_ite(port); + it8716f_flashport = flashport; + if (internal_buses_supported & BUS_SPI) +@@ -228,6 +260,7 @@ int init_superio_ite(void) + case 0x8716: + case 0x8718: + case 0x8720: ++ case 0x8728: + ret |= it87spi_probe(superios[i].port); + break; + default: +diff --git a/layout.c b/layout.c +index 1bd3152..d00c16c 100644 +--- a/layout.c ++++ b/layout.c +@@ -3,6 +3,7 @@ + * + * Copyright (C) 2005-2008 coresystems GmbH + * (Written by Stefan Reinauer for coresystems GmbH) ++ * Copyright (C) 2011-2013 Stefan Tauner + * + * 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 +@@ -25,24 +26,23 @@ + #include "flash.h" + #include "programmer.h" + +-static int romimages = 0; +- + #define MAX_ROMLAYOUT 32 + + typedef struct { +- unsigned int start; +- unsigned int end; ++ chipoff_t start; ++ chipoff_t end; + unsigned int included; + char name[256]; +-} romlayout_t; ++} romentry_t; + +-/* include_args lists arguments specified at the command line with -i. They +- * must be processed at some point so that desired regions are marked as +- * "included" in the rom_entries list. +- */ ++/* rom_entries store the entries specified in a layout file and associated run-time data */ ++static romentry_t rom_entries[MAX_ROMLAYOUT]; ++static int num_rom_entries = 0; /* the number of successfully parsed rom_entries */ ++ ++/* include_args holds the arguments specified at the command line with -i. They must be processed at some point ++ * so that desired regions are marked as "included" in the rom_entries list. */ + static char *include_args[MAX_ROMLAYOUT]; +-static int num_include_args = 0; /* the number of valid entries. */ +-static romlayout_t rom_entries[MAX_ROMLAYOUT]; ++static int num_include_args = 0; /* the number of valid include_args. */ + + #ifndef __LIBPAYLOAD__ + int read_romlayout(char *name) +@@ -62,12 +62,13 @@ int read_romlayout(char *name) + while (!feof(romlayout)) { + char *tstr1, *tstr2; + +- if (romimages >= MAX_ROMLAYOUT) { ++ if (num_rom_entries >= MAX_ROMLAYOUT) { + msg_gerr("Maximum number of ROM images (%i) in layout " + "file reached.\n", MAX_ROMLAYOUT); ++ fclose(romlayout); + return 1; + } +- if (2 != fscanf(romlayout, "%s %s\n", tempstr, rom_entries[romimages].name)) ++ if (2 != fscanf(romlayout, "%s %s\n", tempstr, rom_entries[num_rom_entries].name)) + continue; + #if 0 + // fscanf does not like arbitrary comments like that :( later +@@ -82,13 +83,13 @@ int read_romlayout(char *name) + fclose(romlayout); + return 1; + } +- rom_entries[romimages].start = strtol(tstr1, (char **)NULL, 16); +- rom_entries[romimages].end = strtol(tstr2, (char **)NULL, 16); +- rom_entries[romimages].included = 0; +- romimages++; ++ rom_entries[num_rom_entries].start = strtol(tstr1, (char **)NULL, 16); ++ rom_entries[num_rom_entries].end = strtol(tstr2, (char **)NULL, 16); ++ rom_entries[num_rom_entries].included = 0; ++ num_rom_entries++; + } + +- for (i = 0; i < romimages; i++) { ++ for (i = 0; i < num_rom_entries; i++) { + msg_gdbg("romlayout %08x - %08x named %s\n", + rom_entries[i].start, + rom_entries[i].end, rom_entries[i].name); +@@ -100,6 +101,33 @@ int read_romlayout(char *name) + } + #endif + ++ ++#ifdef FORCE10_SPI_CHANGE ++int add_romentry(chipoff_t start, chipoff_t end, const char *name) ++{ ++ int len = 0; ++ ++ if (num_rom_entries >= MAX_ROMLAYOUT) { ++ msg_gerr("Maximum number of ROM images (%i) in layout " ++ "file reached.\n", MAX_ROMLAYOUT); ++ return 1; ++ } ++ rom_entries[num_rom_entries].start = start; ++ rom_entries[num_rom_entries].end = end; ++ rom_entries[num_rom_entries].included = 1; ++ len = strlen(name); ++ if (len > 256) { ++ msg_gdbg("terminating rom entry name to 256 as it exceeds max length\n"); ++ len = 255; ++ } ++ strncpy(rom_entries[num_rom_entries].name, name, len); ++ msg_gdbg("Adding rom entry: %08x - %08x named %s\n", rom_entries[num_rom_entries].start, ++ rom_entries[num_rom_entries].end, rom_entries[num_rom_entries].name); ++ num_rom_entries++; ++ return 0; ++} ++#endif ++ + /* returns the index of the entry (or a negative value if it is not found) */ + int find_include_arg(const char *const name) + { +@@ -139,11 +167,11 @@ static int find_romentry(char *name) + { + int i; + +- if (!romimages) ++ if (num_rom_entries == 0) + return -1; + + msg_gspew("Looking for region \"%s\"... ", name); +- for (i = 0; i < romimages; i++) { ++ for (i = 0; i < num_rom_entries; i++) { + if (!strcmp(rom_entries[i].name, name)) { + rom_entries[i].included = 1; + msg_gspew("found.\n"); +@@ -166,7 +194,7 @@ int process_include_args(void) + return 0; + + /* User has specified an area, but no layout file is loaded. */ +- if (!romimages) { ++ if (num_rom_entries == 0) { + msg_gerr("Region requested (with -i \"%s\"), " + "but no layout data is available.\n", + include_args[0]); +@@ -190,15 +218,30 @@ int process_include_args(void) + return 0; + } + +-romlayout_t *get_next_included_romentry(unsigned int start) ++void layout_cleanup(void) ++{ ++ int i; ++ for (i = 0; i < num_include_args; i++) { ++ free(include_args[i]); ++ include_args[i] = NULL; ++ } ++ num_include_args = 0; ++ ++ for (i = 0; i < num_rom_entries; i++) { ++ rom_entries[i].included = 0; ++ } ++ num_rom_entries = 0; ++} ++ ++romentry_t *get_next_included_romentry(unsigned int start) + { + int i; + unsigned int best_start = UINT_MAX; +- romlayout_t *best_entry = NULL; +- romlayout_t *cur; ++ romentry_t *best_entry = NULL; ++ romentry_t *cur; + + /* First come, first serve for overlapping regions. */ +- for (i = 0; i < romimages; i++) { ++ for (i = 0; i < num_rom_entries; i++) { + cur = &rom_entries[i]; + if (!cur->included) + continue; +@@ -217,18 +260,43 @@ romlayout_t *get_next_included_romentry(unsigned int start) + return best_entry; + } + +-int handle_romentries(const struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents) ++/* Validate and - if needed - normalize layout entries. */ ++int normalize_romentries(const struct flashctx *flash) ++{ ++ chipsize_t total_size = flash->chip->total_size * 1024; ++ int ret = 0; ++ ++ int i; ++ for (i = 0; i < num_rom_entries; i++) { ++ if (rom_entries[i].start >= total_size || rom_entries[i].end >= total_size) { ++ msg_gwarn("Warning: Address range of region \"%s\" exceeds the current chip's " ++ "address space.\n", rom_entries[i].name); ++ if (rom_entries[i].included) ++ ret = 1; ++ } ++ if (rom_entries[i].start > rom_entries[i].end) { ++ msg_gerr("Error: Size of the address range of region \"%s\" is not positive.\n", ++ rom_entries[i].name); ++ ret = 1; ++ } ++ } ++ ++ return ret; ++} ++ ++int build_new_image(const struct flashctx *flash, uint8_t *oldcontents, uint8_t *newcontents) + { + unsigned int start = 0; +- romlayout_t *entry; ++ romentry_t *entry; + unsigned int size = flash->chip->total_size * 1024; + + /* If no regions were specified for inclusion, assume + * that the user wants to write the complete new image. + */ ++#ifndef FORCE10_SPI_CHANGE + if (num_include_args == 0) + return 0; +- ++#endif + /* Non-included romentries are ignored. + * The union of all included romentries is used from the new image. + */ +@@ -239,7 +307,7 @@ int handle_romentries(const struct flashctx *flash, uint8_t *oldcontents, uint8_ + memcpy(newcontents + start, oldcontents + start, + size - start); + break; +- } ++ } + /* For non-included region, copy from old content. */ + if (entry->start > start) + memcpy(newcontents + start, oldcontents + start, +diff --git a/linux_spi.c b/linux_spi.c +index d12fceb..f0c6404 100644 +--- a/linux_spi.c ++++ b/linux_spi.c +@@ -60,7 +60,7 @@ static const struct spi_programmer spi_programmer_linux = { + int linux_spi_init(void) + { + char *p, *endp, *dev; +- uint32_t speed = 0; ++ uint32_t speed_hz = 0; + /* FIXME: make the following configurable by CLI options. */ + /* SPI mode 0 (beware this also includes: MSB first, CS active low and others */ + const uint8_t mode = SPI_MODE_0; +@@ -68,7 +68,7 @@ int linux_spi_init(void) + + p = extract_programmer_param("spispeed"); + if (p && strlen(p)) { +- speed = (uint32_t)strtoul(p, &endp, 10) * 1024; ++ speed_hz = (uint32_t)strtoul(p, &endp, 10) * 1000; + if (p == endp) { + msg_perr("%s: invalid clock: %s kHz\n", __func__, p); + free(p); +@@ -98,14 +98,14 @@ int linux_spi_init(void) + return 1; + /* We rely on the shutdown function for cleanup from here on. */ + +- if (speed > 0) { +- if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1) { ++ if (speed_hz > 0) { ++ if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed_hz) == -1) { + msg_perr("%s: failed to set speed to %d Hz: %s\n", +- __func__, speed, strerror(errno)); ++ __func__, speed_hz, strerror(errno)); + return 1; + } + +- msg_pdbg("Using %d kHz clock\n", speed); ++ msg_pdbg("Using %d kHz clock\n", speed_hz/1000); + } + + if (ioctl(fd, SPI_IOC_WR_MODE, &mode) == -1) { +diff --git a/mcp6x_spi.c b/mcp6x_spi.c +index ac40557..20e9bd8 100644 +--- a/mcp6x_spi.c ++++ b/mcp6x_spi.c +@@ -135,25 +135,20 @@ int mcp6x_spi_init(int want_spi) + + /* Accessing a NULL pointer BAR is evil. Don't do it. */ + if (!mcp6x_spibaraddr && want_spi) { +- msg_perr("Error: Chipset is strapped for SPI, but MCP SPI BAR " +- "is invalid.\n"); ++ msg_perr("Error: Chipset is strapped for SPI, but MCP SPI BAR is invalid.\n"); + return 1; + } else if (!mcp6x_spibaraddr && !want_spi) { + msg_pdbg("MCP SPI is not used.\n"); + return 0; + } else if (mcp6x_spibaraddr && !want_spi) { +- msg_pdbg("Strange. MCP SPI BAR is valid, but chipset apparently" +- " doesn't have SPI enabled.\n"); ++ msg_pdbg("Strange. MCP SPI BAR is valid, but chipset apparently doesn't have SPI enabled.\n"); + /* FIXME: Should we enable SPI anyway? */ + return 0; + } + /* Map the BAR. Bytewise/wordwise access at 0x530 and 0x540. */ +- mcp6x_spibar = physmap("NVIDIA MCP6x SPI", mcp6x_spibaraddr, 0x544); +- +-#if 0 +- /* FIXME: Run the physunmap in a shutdown function. */ +- physunmap(mcp6x_spibar, 0x544); +-#endif ++ mcp6x_spibar = rphysmap("NVIDIA MCP6x SPI", mcp6x_spibaraddr, 0x544); ++ if (mcp6x_spibar == ERROR_PTR) ++ return 1; + + status = mmio_readw(mcp6x_spibar + 0x530); + msg_pdbg("SPI control is 0x%04x, req=%i, gnt=%i\n", +diff --git a/nic3com.c b/nic3com.c +index 8d67b54..27e28c7 100644 +--- a/nic3com.c ++++ b/nic3com.c +@@ -96,6 +96,8 @@ int nic3com_init(void) + return 1; + + io_base_addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); ++ if (!io_base_addr) ++ return 1; + + id = dev->device_id; + +diff --git a/nicintel.c b/nicintel.c +index 56678e7..98ba29f 100644 +--- a/nicintel.c ++++ b/nicintel.c +@@ -59,13 +59,6 @@ static const struct par_programmer par_programmer_nicintel = { + .chip_writen = fallback_chip_writen, + }; + +-static int nicintel_shutdown(void *data) +-{ +- physunmap(nicintel_control_bar, NICINTEL_CONTROL_MEMMAP_SIZE); +- physunmap(nicintel_bar, NICINTEL_MEMMAP_SIZE); +- return 0; +-} +- + int nicintel_init(void) + { + struct pci_dev *dev = NULL; +@@ -83,18 +76,19 @@ int nicintel_init(void) + return 1; + + addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_2); +- nicintel_bar = physmap("Intel NIC flash", addr, NICINTEL_MEMMAP_SIZE); ++ if (!addr) ++ return 1; ++ ++ nicintel_bar = rphysmap("Intel NIC flash", addr, NICINTEL_MEMMAP_SIZE); + if (nicintel_bar == ERROR_PTR) +- goto error_out_unmap; ++ return 1; + + addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +- /* FIXME: This is not an aligned mapping. Use 4k? */ +- nicintel_control_bar = physmap("Intel NIC control/status reg", +- addr, NICINTEL_CONTROL_MEMMAP_SIZE); +- if (nicintel_control_bar == ERROR_PTR) +- goto error_out; ++ if (!addr) ++ return 1; + +- if (register_shutdown(nicintel_shutdown, NULL)) ++ nicintel_control_bar = rphysmap("Intel NIC control/status reg", addr, NICINTEL_CONTROL_MEMMAP_SIZE); ++ if (nicintel_control_bar == ERROR_PTR) + return 1; + + /* FIXME: This register is pretty undocumented in all publicly available +@@ -112,11 +106,6 @@ int nicintel_init(void) + register_par_programmer(&par_programmer_nicintel, BUS_PARALLEL); + + return 0; +- +-error_out_unmap: +- physunmap(nicintel_bar, NICINTEL_MEMMAP_SIZE); +-error_out: +- return 1; + } + + static void nicintel_chip_writeb(const struct flashctx *flash, uint8_t val, +diff --git a/nicintel_spi.c b/nicintel_spi.c +index 0045c09..1522c9b 100644 +--- a/nicintel_spi.c ++++ b/nicintel_spi.c +@@ -19,10 +19,16 @@ + */ + + /* +- * Datasheet: ++ * Datasheets: + * PCI/PCI-X Family of Gigabit Ethernet Controllers Software Developer's Manual + * 82540EP/EM, 82541xx, 82544GC/EI, 82545GM/EM, 82546GB/EB, and 82547xx +- * http://download.intel.com/design/network/manuals/8254x_GBe_SDM.pdf ++ * http://www.intel.com/content/www/us/en/ethernet-controllers/pci-pci-x-family-gbe-controllers-software-dev-manual.html ++ * ++ * PCIe GbE Controllers Open Source Software Developer's Manual ++ * http://www.intel.com/content/www/us/en/ethernet-controllers/pcie-gbe-controllers-open-source-manual.html ++ * ++ * Intel 82574 Gigabit Ethernet Controller Family Datasheet ++ * http://www.intel.com/content/www/us/en/ethernet-controllers/82574l-gbe-controller-datasheet.html + */ + + #include +@@ -72,6 +78,7 @@ const struct dev_entry nics_intel_spi[] = { + {PCI_VENDOR_ID_INTEL, 0x1076, OK, "Intel", "82541GI Gigabit Ethernet Controller"}, + {PCI_VENDOR_ID_INTEL, 0x107c, OK, "Intel", "82541PI Gigabit Ethernet Controller"}, + {PCI_VENDOR_ID_INTEL, 0x10b9, OK, "Intel", "82572EI Gigabit Ethernet Controller"}, ++ {PCI_VENDOR_ID_INTEL, 0x10d3, OK, "Intel", "82574L Gigabit Ethernet Controller"}, + + {0}, + }; +@@ -151,16 +158,12 @@ static int nicintel_spi_shutdown(void *data) + { + uint32_t tmp; + +- /* Disable writes manually. See the comment about EECD in +- * nicintel_spi_init() for details. +- */ ++ /* Disable writes manually. See the comment about EECD in nicintel_spi_init() for details. */ + tmp = pci_mmio_readl(nicintel_spibar + EECD); + tmp &= ~FLASH_WRITES_ENABLED; + tmp |= FLASH_WRITES_DISABLED; + pci_mmio_writel(tmp, nicintel_spibar + EECD); + +- physunmap(nicintel_spibar, MEMMAP_SIZE); +- + return 0; + } + +@@ -177,8 +180,13 @@ int nicintel_spi_init(void) + return 1; + + io_base_addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +- nicintel_spibar = physmap("Intel Gigabit NIC w/ SPI flash", +- io_base_addr, MEMMAP_SIZE); ++ if (!io_base_addr) ++ return 1; ++ ++ nicintel_spibar = rphysmap("Intel Gigabit NIC w/ SPI flash", io_base_addr, MEMMAP_SIZE); ++ if (nicintel_spibar == ERROR_PTR) ++ return 1; ++ + /* Automatic restore of EECD on shutdown is not possible because EECD + * does not only contain FLASH_WRITES_DISABLED|FLASH_WRITES_ENABLED, + * but other bits with side effects as well. Those other bits must be +diff --git a/nicnatsemi.c b/nicnatsemi.c +index d62a73f..cb8da6d 100644 +--- a/nicnatsemi.c ++++ b/nicnatsemi.c +@@ -64,6 +64,8 @@ int nicnatsemi_init(void) + return 1; + + io_base_addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); ++ if (!io_base_addr) ++ return 1; + + /* The datasheet shows address lines MA0-MA16 in one place and MA0-MA15 + * in another. My NIC has MA16 connected to A16 on the boot ROM socket +diff --git a/nicrealtek.c b/nicrealtek.c +index fb8e9e1..02fbd39 100644 +--- a/nicrealtek.c ++++ b/nicrealtek.c +@@ -69,6 +69,8 @@ int nicrealtek_init(void) + return 1; + + io_base_addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); ++ if (!io_base_addr) ++ return 1; + + /* Beware, this ignores the vendor ID! */ + switch (dev->device_id) { +diff --git a/ogp_spi.c b/ogp_spi.c +index 0c09d6a..23431d1 100644 +--- a/ogp_spi.c ++++ b/ogp_spi.c +@@ -97,12 +97,6 @@ static const struct bitbang_spi_master bitbang_spi_master_ogp = { + .half_period = 0, + }; + +-static int ogp_spi_shutdown(void *data) +-{ +- physunmap(ogp_spibar, 4096); +- return 0; +-} +- + int ogp_spi_init(void) + { + struct pci_dev *dev = NULL; +@@ -126,8 +120,10 @@ int ogp_spi_init(void) + ogp_reg_sck = OGA1_XP10_CPROM_SCK; + } else { + msg_perr("Invalid or missing rom= parameter.\n"); ++ free(type); + return 1; + } ++ free(type); + + if (rget_io_perms()) + return 1; +@@ -137,9 +133,11 @@ int ogp_spi_init(void) + return 1; + + io_base_addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +- ogp_spibar = physmap("OGP registers", io_base_addr, 4096); ++ if (!io_base_addr) ++ return 1; + +- if (register_shutdown(ogp_spi_shutdown, NULL)) ++ ogp_spibar = rphysmap("OGP registers", io_base_addr, 4096); ++ if (ogp_spibar == ERROR_PTR) + return 1; + + if (bitbang_spi_init(&bitbang_spi_master_ogp)) +diff --git a/pcidev.c b/pcidev.c +index c7e9d78..3a3f77c 100644 +--- a/pcidev.c ++++ b/pcidev.c +@@ -94,7 +94,7 @@ uintptr_t pcidev_readbar(struct pci_dev *dev, int bar) + + supported_cycles = pci_read_word(dev, PCI_COMMAND); + +- msg_pdbg("Requested BAR is "); ++ msg_pdbg("Requested BAR is of type "); + switch (bartype) { + case TYPE_MEMBAR: + msg_pdbg("MEM"); +diff --git a/physmap.c b/physmap.c +index 932fe75..150c44a 100644 +--- a/physmap.c ++++ b/physmap.c +@@ -21,11 +21,13 @@ + */ + + #include ++#include + #include + #include + #include + #include + #include "flash.h" ++#include "programmer.h" + #include "hwaccess.h" + + #if !defined(__DJGPP__) && !defined(__LIBPAYLOAD__) +@@ -88,7 +90,7 @@ static void *sys_physmap(uintptr_t phys_addr, size_t len) + #define sys_physmap_rw_uncached sys_physmap + #define sys_physmap_ro_cached sys_physmap + +-void physunmap(void *virt_addr, size_t len) ++void sys_physunmap_unaligned(void *virt_addr, size_t len) + { + __dpmi_meminfo mi; + +@@ -117,7 +119,7 @@ void *sys_physmap(uintptr_t phys_addr, size_t len) + #define sys_physmap_rw_uncached sys_physmap + #define sys_physmap_ro_cached sys_physmap + +-void physunmap(void *virt_addr, size_t len) ++void sys_physunmap_unaligned(void *virt_addr, size_t len) + { + } + #elif defined(__MACH__) && defined(__APPLE__) +@@ -138,7 +140,7 @@ static void *sys_physmap(uintptr_t phys_addr, size_t len) + #define sys_physmap_rw_uncached sys_physmap + #define sys_physmap_ro_cached sys_physmap + +-void physunmap(void *virt_addr, size_t len) ++void sys_physunmap_unaligned(void *virt_addr, size_t len) + { + unmap_physical(virt_addr, len); + } +@@ -164,12 +166,11 @@ static void *sys_physmap_rw_uncached(uintptr_t phys_addr, size_t len) + /* Open the memory device UNCACHED. Important for MMIO. */ + if (-1 == (fd_mem = open(MEM_DEV, O_RDWR | O_SYNC))) { + msg_perr("Critical error: open(" MEM_DEV "): %s\n", strerror(errno)); +- exit(2); ++ return ERROR_PTR; + } + } + +- virt_addr = mmap(NULL, len, PROT_WRITE | PROT_READ, MAP_SHARED, +- fd_mem, (off_t)phys_addr); ++ virt_addr = mmap(NULL, len, PROT_WRITE | PROT_READ, MAP_SHARED, fd_mem, (off_t)phys_addr); + return MAP_FAILED == virt_addr ? ERROR_PTR : virt_addr; + } + +@@ -184,50 +185,77 @@ static void *sys_physmap_ro_cached(uintptr_t phys_addr, size_t len) + /* Open the memory device CACHED. */ + if (-1 == (fd_mem_cached = open(MEM_DEV, O_RDWR))) { + msg_perr("Critical error: open(" MEM_DEV "): %s\n", strerror(errno)); +- exit(2); ++ return ERROR_PTR; + } + } + +- virt_addr = mmap(NULL, len, PROT_READ, MAP_SHARED, +- fd_mem_cached, (off_t)phys_addr); ++ virt_addr = mmap(NULL, len, PROT_READ, MAP_SHARED, fd_mem_cached, (off_t)phys_addr); + return MAP_FAILED == virt_addr ? ERROR_PTR : virt_addr; + } + +-void physunmap(void *virt_addr, size_t len) ++void sys_physunmap_unaligned(void *virt_addr, size_t len) + { +- if (len == 0) { +- msg_pspew("Not unmapping zero size at %p\n", virt_addr); +- return; +- } +- + munmap(virt_addr, len); + } + #endif + +-#define PHYSMAP_NOFAIL 0 +-#define PHYSMAP_MAYFAIL 1 +-#define PHYSMAP_RW 0 +-#define PHYSMAP_RO 1 ++#define PHYSM_RW 0 ++#define PHYSM_RO 1 ++#define PHYSM_NOCLEANUP 0 ++#define PHYSM_CLEANUP 1 ++#define PHYSM_EXACT 0 ++#define PHYSM_ROUND 1 ++ ++/* Round start to nearest page boundary below and set len so that the resulting address range ends at the lowest ++ * possible page boundary where the original address range is still entirely contained. It returns the ++ * difference between the rounded start address and the original start address. */ ++static uintptr_t round_to_page_boundaries(uintptr_t *start, size_t *len) ++{ ++ uintptr_t page_size = getpagesize(); ++ uintptr_t page_mask = ~(page_size-1); ++ uintptr_t end = *start + *len; ++ uintptr_t old_start = *start; ++ msg_gspew("page_size=%" PRIxPTR "\n", page_size); ++ msg_gspew("pre-rounding: start=0x%0*" PRIxPTR ", len=0x%zx, end=0x%0*" PRIxPTR "\n", ++ PRIxPTR_WIDTH, *start, *len, PRIxPTR_WIDTH, end); ++ *start = *start & page_mask; ++ end = (end + page_size - 1) & page_mask; ++ *len = end - *start; ++ msg_gspew("post-rounding: start=0x%0*" PRIxPTR ", len=0x%zx, end=0x%0*" PRIxPTR "\n", ++ PRIxPTR_WIDTH, *start, *len, PRIxPTR_WIDTH, *start + *len); ++ return old_start - *start; ++} ++ ++struct undo_physmap_data { ++ void *virt_addr; ++ size_t len; ++}; ++ ++static int undo_physmap(void *data) ++{ ++ if (data == NULL) { ++ msg_perr("%s: tried to physunmap without valid data!\n", __func__); ++ return 1; ++ } ++ struct undo_physmap_data *d = data; ++ physunmap_unaligned(d->virt_addr, d->len); ++ free(data); ++ return 0; ++} + +-static void *physmap_common(const char *descr, uintptr_t phys_addr, +- size_t len, int mayfail, int readonly) ++static void *physmap_common(const char *descr, uintptr_t phys_addr, size_t len, bool readonly, bool autocleanup, ++ bool round) + { + void *virt_addr; ++ uintptr_t offset = 0; + + if (len == 0) { + msg_pspew("Not mapping %s, zero size at 0x%0*" PRIxPTR ".\n", descr, PRIxPTR_WIDTH, phys_addr); + return ERROR_PTR; + } + +- if ((getpagesize() - 1) & len) { +- msg_perr("Mapping %s at 0x%0*" PRIxPTR ", unaligned size 0x%zx.\n", +- descr, PRIxPTR_WIDTH, phys_addr, len); +- } +- +- if ((getpagesize() - 1) & phys_addr) { +- msg_perr("Mapping %s, 0x%zx bytes at unaligned 0x%0*" PRIxPTR ".\n", +- descr, len, PRIxPTR_WIDTH, phys_addr); +- } ++ if (round) ++ offset = round_to_page_boundaries(&phys_addr, &len); + + if (readonly) + virt_addr = sys_physmap_ro_cached(phys_addr, len); +@@ -253,23 +281,89 @@ static void *physmap_common(const char *descr, uintptr_t phys_addr, + "and reboot, or reboot into\n" + "single user mode.\n"); + #endif +- if (!mayfail) +- exit(3); ++ return ERROR_PTR; + } + +- return virt_addr; ++ if (autocleanup) { ++ struct undo_physmap_data *d = malloc(sizeof(struct undo_physmap_data)); ++ if (d == NULL) { ++ msg_perr("%s: Out of memory!\n", __func__); ++ physunmap_unaligned(virt_addr, len); ++ return ERROR_PTR; ++ } ++ ++ d->virt_addr = virt_addr; ++ d->len = len; ++ if (register_shutdown(undo_physmap, d) != 0) { ++ msg_perr("%s: Could not register shutdown function!\n", __func__); ++ physunmap_unaligned(virt_addr, len); ++ return ERROR_PTR; ++ } ++ } ++ ++ return virt_addr + offset; ++} ++ ++void physunmap_unaligned(void *virt_addr, size_t len) ++{ ++ /* No need to check for zero size, such mappings would have yielded ERROR_PTR. */ ++ if (virt_addr == ERROR_PTR) { ++#ifndef FORCE10_SPI_CHANGE ++ msg_perr("Trying to unmap a nonexisting mapping!\n" ++ "Please report a bug at flashrom@flashrom.org\n"); ++#else ++ msg_pdbg("Trying to unmap a nonexisting mapping!\n" ++ "Please report a bug at flashrom@flashrom.org\n"); ++#endif ++ return; ++ } ++ ++ sys_physunmap_unaligned(virt_addr, len); ++} ++ ++void physunmap(void *virt_addr, size_t len) ++{ ++ uintptr_t tmp; ++ ++ /* No need to check for zero size, such mappings would have yielded ERROR_PTR. */ ++ if (virt_addr == ERROR_PTR) { ++#ifndef FORCE10_SPI_CHANGE ++ msg_perr("Trying to unmap a nonexisting mapping!\n" ++ "Please report a bug at flashrom@flashrom.org\n"); ++#else ++ msg_pdbg("Trying to unmap a nonexisting mapping!\n" ++ "Please report a bug at flashrom@flashrom.org\n"); ++#endif ++ return; ++ } ++ tmp = (uintptr_t)virt_addr; ++ /* We assume that the virtual address of a page-aligned physical address is page-aligned as well. By ++ * extension, rounding a virtual unaligned address as returned by physmap should yield the same offset ++ * between rounded and original virtual address as between rounded and original physical address. ++ */ ++ round_to_page_boundaries(&tmp, &len); ++ virt_addr = (void *)tmp; ++ physunmap_unaligned(virt_addr, len); + } + + void *physmap(const char *descr, uintptr_t phys_addr, size_t len) + { +- return physmap_common(descr, phys_addr, len, PHYSMAP_NOFAIL, +- PHYSMAP_RW); ++ return physmap_common(descr, phys_addr, len, PHYSM_RW, PHYSM_NOCLEANUP, PHYSM_ROUND); ++} ++ ++void *rphysmap(const char *descr, uintptr_t phys_addr, size_t len) ++{ ++ return physmap_common(descr, phys_addr, len, PHYSM_RW, PHYSM_CLEANUP, PHYSM_ROUND); ++} ++ ++void *physmap_ro(const char *descr, uintptr_t phys_addr, size_t len) ++{ ++ return physmap_common(descr, phys_addr, len, PHYSM_RO, PHYSM_NOCLEANUP, PHYSM_ROUND); + } + +-void *physmap_try_ro(const char *descr, uintptr_t phys_addr, size_t len) ++void *physmap_ro_unaligned(const char *descr, uintptr_t phys_addr, size_t len) + { +- return physmap_common(descr, phys_addr, len, PHYSMAP_MAYFAIL, +- PHYSMAP_RO); ++ return physmap_common(descr, phys_addr, len, PHYSM_RO, PHYSM_NOCLEANUP, PHYSM_EXACT); + } + + /* MSR abstraction implementations for Linux, OpenBSD, FreeBSD/Dragonfly, OSX, libpayload +diff --git a/pony_spi.c b/pony_spi.c +index 101751f..2a3666f 100644 +--- a/pony_spi.c ++++ b/pony_spi.c +@@ -140,6 +140,7 @@ int pony_spi_init(void) + } else if (arg && !strlen(arg)) { + msg_perr("Error: Missing argument for programmer type.\n"); + free(arg); ++ return 1; + } else if (arg){ + msg_perr("Error: Invalid programmer type specified.\n"); + free(arg); +diff --git a/print.c b/print.c +index 6766eeb..6d2921b 100644 +--- a/print.c ++++ b/print.c +@@ -436,12 +436,13 @@ static void print_supported_boards_helper(const struct board_info *boards, + msg_ginfo("%s", b->name); + for (i = 0; i < maxboardlen - strlen(b->name); i++) + msg_ginfo(" "); +- if (b->working == OK) +- msg_ginfo("OK "); +- else if (b->working == NT) +- msg_ginfo("NT "); +- else +- msg_ginfo("BAD "); ++ ++ if (b->working == OK) ++ msg_ginfo("OK "); ++ else if (b->working == NT) ++ msg_ginfo("NT "); ++ else ++ msg_ginfo("BAD "); + + for (e = board_matches; e->vendor_name != NULL; e++) { + if (strcmp(e->vendor_name, b->vendor) +@@ -530,6 +531,7 @@ const struct board_info boards_known[] = { + B("abit", "AN-M2", OK, NULL, NULL), + B("abit", "AV8", OK, NULL, NULL), + B("abit", "AX8", OK, NULL, NULL), ++ B("abit", "BF6", OK, NULL, NULL), + B("abit", "BM6", OK, NULL, NULL), + B("abit", "Fatal1ty F-I90HD", OK, NULL, NULL), + B("abit", "IC7", OK, NULL, NULL), +@@ -695,6 +697,7 @@ const struct board_info boards_known[] = { + B("ASUS", "P5L-VM 1394", OK, "http://www.asus.com/Motherboards/Intel_Socket_775/P5LVM_1394/", NULL), + B("ASUS", "P5LD2", NT, NULL, "Untested board enable."), + B("ASUS", "P5LD2-VM", NT, "http://www.asus.com/Motherboards/Intel_Socket_775/P5LD2VM/", "Untested board enable."), ++ B("ASUS", "P5LD2-VM DH", OK, "http://www.asus.com/Motherboards/Intel_Socket_775/P5LD2VM_DH/", NULL), + B("ASUS", "P5LP-LE (Lithium-UL8E)", OK, "http://h10025.www1.hp.com/ewfrf/wc/document?docname=c00379616&tmp_task=prodinfoCategory&cc=us&dlc=en&lc=en&product=1159887", "This is an OEM board from HP."), + B("ASUS", "P5LP-LE (Epson OEM)", OK, NULL, "This is an OEM board from Epson (e.g. Endeavor MT7700)."), + B("ASUS", "P5LP-LE", NT, NULL, "This designation is used for OEM boards from HP, Epson and maybe others. The HP names vary and not all of them have been tested yet. Please report any success or failure, thanks."), +diff --git a/programmer.h b/programmer.h +index 4db8d58..d3cc557 100644 +--- a/programmer.h ++++ b/programmer.h +@@ -276,8 +276,11 @@ int processor_flash_enable(void); + + /* physmap.c */ + void *physmap(const char *descr, uintptr_t phys_addr, size_t len); +-void *physmap_try_ro(const char *descr, uintptr_t phys_addr, size_t len); ++void *rphysmap(const char *descr, uintptr_t phys_addr, size_t len); ++void *physmap_ro(const char *descr, uintptr_t phys_addr, size_t len); ++void *physmap_ro_unaligned(const char *descr, uintptr_t phys_addr, size_t len); + void physunmap(void *virt_addr, size_t len); ++void physunmap_unaligned(void *virt_addr, size_t len); + #if CONFIG_INTERNAL == 1 + int setup_cpu_msr(int cpu); + void cleanup_cpu_msr(void); +@@ -287,9 +290,11 @@ int cb_parse_table(const char **vendor, const char **model); + int cb_check_image(uint8_t *bios, int size); + + /* dmi.c */ ++#if defined(__i386__) || defined(__x86_64__) + extern int has_dmi_support; + void dmi_init(void); + int dmi_match(const char *pattern); ++#endif // defined(__i386__) || defined(__x86_64__) + + /* internal.c */ + struct superio { +@@ -550,10 +555,19 @@ int default_spi_write_256(struct flashctx *flash, uint8_t *buf, unsigned int sta + int default_spi_write_aai(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len); + int register_spi_programmer(const struct spi_programmer *programmer); + +-/* The following enum is needed by ich_descriptor_tool and ich* code. */ ++/* The following enum is needed by ich_descriptor_tool and ich* code as well as in chipset_enable.c. */ + enum ich_chipset { + CHIPSET_ICH_UNKNOWN, +- CHIPSET_ICH7 = 7, ++#ifdef DELL_AVOTON_SUPPORT ++ CHIPSET_AVOTON, ++#endif ++ CHIPSET_ICH, ++ CHIPSET_ICH2345, ++ CHIPSET_ICH6, ++ CHIPSET_POULSBO, /* SCH U* */ ++ CHIPSET_TUNNEL_CREEK, /* Atom E6xx */ ++ CHIPSET_CENTERTON, /* Atom S1220 S1240 S1260 */ ++ CHIPSET_ICH7, + CHIPSET_ICH8, + CHIPSET_ICH9, + CHIPSET_ICH10, +@@ -563,13 +577,15 @@ enum ich_chipset { + CHIPSET_8_SERIES_LYNX_POINT, + CHIPSET_8_SERIES_LYNX_POINT_LP, + CHIPSET_8_SERIES_WELLSBURG, ++#if DELL_DENVERTON_SUPPORT == 1 ++ CHIPSET_DENVERTON, ++#endif /* #if DELL_DENVERTON_SUPPORT == 1 */ + }; + + /* ichspi.c */ + #if CONFIG_INTERNAL == 1 + extern uint32_t ichspi_bbar; +-int ich_init_spi(struct pci_dev *dev, uint32_t base, void *rcrb, +- enum ich_chipset ich_generation); ++int ich_init_spi(struct pci_dev *dev, void *spibar, enum ich_chipset ich_generation); + int via_init_spi(struct pci_dev *dev, uint32_t mmio_base); + + /* amd_imc.c */ +@@ -659,7 +675,7 @@ typedef int fdtype; + + void sp_flush_incoming(void); + fdtype sp_openserport(char *dev, unsigned int baud); +-void __attribute__((noreturn)) sp_die(char *msg); ++int serialport_config(fdtype fd, unsigned int baud); + extern fdtype sp_fd; + /* expose serialport_shutdown as it's currently used by buspirate */ + int serialport_shutdown(void *data); +diff --git a/rayer_spi.c b/rayer_spi.c +index b312610..189341a 100644 +--- a/rayer_spi.c ++++ b/rayer_spi.c +@@ -17,11 +17,9 @@ + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +-/* Driver for the SPIPGM hardware by "RayeR" Martin Rehak. +- * See http://rayer.ic.cz/elektro/spipgm.htm for schematics and instructions. +- */ +- +-/* This driver uses non-portable direct I/O port accesses which won't work on ++/* Driver for various LPT adapters. ++ * ++ * This driver uses non-portable direct I/O port accesses which won't work on + * any non-x86 platform, and even on x86 there is a high chance there will be + * collisions with any loaded parallel port drivers. + * The big advantage of direct port I/O is OS independence and speed because +@@ -37,21 +35,87 @@ + #include "programmer.h" + #include "hwaccess.h" + +-enum rayer_type { +- TYPE_RAYER, +- TYPE_XILINX_DLC5, +-}; +- + /* We have two sets of pins, out and in. The numbers for both sets are + * independent and are bitshift values, not real pin numbers. + * Default settings are for the RayeR hardware. + */ +-/* Pins for master->slave direction */ +-static int rayer_cs_bit = 5; +-static int rayer_sck_bit = 6; +-static int rayer_mosi_bit = 7; +-/* Pins for slave->master direction */ +-static int rayer_miso_bit = 6; ++ ++struct rayer_programmer { ++ const char *type; ++ const enum test_state status; ++ const char *description; ++ const void *dev_data; ++}; ++ ++struct rayer_pinout { ++ uint8_t cs_bit; ++ uint8_t sck_bit; ++ uint8_t mosi_bit; ++ uint8_t miso_bit; ++ void (*preinit)(const void *); ++ int (*shutdown)(void *); ++}; ++ ++static const struct rayer_pinout rayer_spipgm = { ++ .cs_bit = 5, ++ .sck_bit = 6, ++ .mosi_bit = 7, ++ .miso_bit = 6, ++}; ++ ++static void dlc5_preinit(const void *); ++static int dlc5_shutdown(void *); ++ ++static const struct rayer_pinout xilinx_dlc5 = { ++ .cs_bit = 2, ++ .sck_bit = 1, ++ .mosi_bit = 0, ++ .miso_bit = 4, ++ .preinit = dlc5_preinit, ++ .shutdown = dlc5_shutdown, ++}; ++ ++static void byteblaster_preinit(const void *); ++static int byteblaster_shutdown(void *); ++ ++static const struct rayer_pinout altera_byteblastermv = { ++ .cs_bit = 1, ++ .sck_bit = 0, ++ .mosi_bit = 6, ++ .miso_bit = 7, ++ .preinit = byteblaster_preinit, ++ .shutdown = byteblaster_shutdown, ++}; ++ ++static void stk200_preinit(const void *); ++static int stk200_shutdown(void *); ++ ++static const struct rayer_pinout atmel_stk200 = { ++ .cs_bit = 7, ++ .sck_bit = 4, ++ .mosi_bit = 5, ++ .miso_bit = 6, ++ .preinit = stk200_preinit, ++ .shutdown = stk200_shutdown, ++}; ++ ++static const struct rayer_pinout wiggler_lpt = { ++ .cs_bit = 1, ++ .sck_bit = 2, ++ .mosi_bit = 3, ++ .miso_bit = 7, ++}; ++ ++static const struct rayer_programmer rayer_spi_types[] = { ++ {"rayer", NT, "RayeR SPIPGM", &rayer_spipgm}, ++ {"xilinx", NT, "Xilinx Parallel Cable III (DLC 5)", &xilinx_dlc5}, ++ {"byteblastermv", OK, "Altera ByteBlasterMV", &altera_byteblastermv}, ++ {"stk200", NT, "Atmel STK200/300 adapter", &atmel_stk200}, ++ {"wiggler", OK, "Wiggler LPT", &wiggler_lpt}, ++ {0}, ++}; ++ ++static const struct rayer_pinout *pinout = NULL; + + static uint16_t lpt_iobase; + +@@ -60,22 +124,22 @@ static uint8_t lpt_outbyte; + + static void rayer_bitbang_set_cs(int val) + { +- lpt_outbyte &= ~(1 << rayer_cs_bit); +- lpt_outbyte |= (val << rayer_cs_bit); ++ lpt_outbyte &= ~(1 << pinout->cs_bit); ++ lpt_outbyte |= (val << pinout->cs_bit); + OUTB(lpt_outbyte, lpt_iobase); + } + + static void rayer_bitbang_set_sck(int val) + { +- lpt_outbyte &= ~(1 << rayer_sck_bit); +- lpt_outbyte |= (val << rayer_sck_bit); ++ lpt_outbyte &= ~(1 << pinout->sck_bit); ++ lpt_outbyte |= (val << pinout->sck_bit); + OUTB(lpt_outbyte, lpt_iobase); + } + + static void rayer_bitbang_set_mosi(int val) + { +- lpt_outbyte &= ~(1 << rayer_mosi_bit); +- lpt_outbyte |= (val << rayer_mosi_bit); ++ lpt_outbyte &= ~(1 << pinout->mosi_bit); ++ lpt_outbyte |= (val << pinout->mosi_bit); + OUTB(lpt_outbyte, lpt_iobase); + } + +@@ -83,8 +147,8 @@ static int rayer_bitbang_get_miso(void) + { + uint8_t tmp; + +- tmp = INB(lpt_iobase + 1); +- tmp = (tmp >> rayer_miso_bit) & 0x1; ++ tmp = INB(lpt_iobase + 1) ^ 0x80; // bit.7 inverted ++ tmp = (tmp >> pinout->miso_bit) & 0x1; + return tmp; + } + +@@ -99,8 +163,8 @@ static const struct bitbang_spi_master bitbang_spi_master_rayer = { + + int rayer_spi_init(void) + { ++ const struct rayer_programmer *prog = rayer_spi_types; + char *arg = NULL; +- enum rayer_type rayer_type = TYPE_RAYER; + + /* Non-default port requested? */ + arg = extract_programmer_param("iobase"); +@@ -138,36 +202,20 @@ int rayer_spi_init(void) + + arg = extract_programmer_param("type"); + if (arg) { +- if (!strcasecmp(arg, "rayer")) { +- rayer_type = TYPE_RAYER; +- } else if (!strcasecmp(arg, "xilinx")) { +- rayer_type = TYPE_XILINX_DLC5; +- } else { ++ for (; prog->type != NULL; prog++) { ++ if (strcasecmp(arg, prog->type) == 0) { ++ break; ++ } ++ } ++ if (prog->type == NULL) { + msg_perr("Error: Invalid device type specified.\n"); + free(arg); + return 1; + } ++ free(arg); + } +- free(arg); +- switch (rayer_type) { +- case TYPE_RAYER: +- msg_pdbg("Using RayeR SPIPGM pinout.\n"); +- /* Bits for master->slave direction */ +- rayer_cs_bit = 5; +- rayer_sck_bit = 6; +- rayer_mosi_bit = 7; +- /* Bits for slave->master direction */ +- rayer_miso_bit = 6; +- break; +- case TYPE_XILINX_DLC5: +- msg_pdbg("Using Xilinx Parallel Cable III (DLC 5) pinout.\n"); +- /* Bits for master->slave direction */ +- rayer_cs_bit = 2; +- rayer_sck_bit = 1; +- rayer_mosi_bit = 0; +- /* Bits for slave->master direction */ +- rayer_miso_bit = 4; +- } ++ msg_pinfo("Using %s pinout.\n", prog->description); ++ pinout = (struct rayer_pinout *)prog->dev_data; + + if (rget_io_perms()) + return 1; +@@ -175,12 +223,60 @@ int rayer_spi_init(void) + /* Get the initial value before writing to any line. */ + lpt_outbyte = INB(lpt_iobase); + ++ if (pinout->shutdown) ++ register_shutdown(pinout->shutdown, (void*)pinout); ++ if (pinout->preinit) ++ pinout->preinit(pinout); ++ + if (bitbang_spi_init(&bitbang_spi_master_rayer)) + return 1; + + return 0; + } + ++static void byteblaster_preinit(const void *data){ ++ msg_pdbg("byteblaster_preinit\n"); ++ /* Assert #EN signal. */ ++ OUTB(2, lpt_iobase + 2 ); ++} ++ ++static int byteblaster_shutdown(void *data){ ++ msg_pdbg("byteblaster_shutdown\n"); ++ /* De-Assert #EN signal. */ ++ OUTB(0, lpt_iobase + 2 ); ++ return 0; ++} ++ ++static void stk200_preinit(const void *data) { ++ msg_pdbg("stk200_init\n"); ++ /* Assert #EN signals, set LED signal. */ ++ lpt_outbyte = (1 << 6) ; ++ OUTB(lpt_outbyte, lpt_iobase); ++} ++ ++static int stk200_shutdown(void *data) { ++ msg_pdbg("stk200_shutdown\n"); ++ /* Assert #EN signals, clear LED signal. */ ++ lpt_outbyte = (1 << 2) | (1 << 3); ++ OUTB(lpt_outbyte, lpt_iobase); ++ return 0; ++} ++ ++static void dlc5_preinit(const void *data) { ++ msg_pdbg("dlc5_preinit\n"); ++ /* Assert pin 6 to receive MISO. */ ++ lpt_outbyte |= (1<<4); ++ OUTB(lpt_outbyte, lpt_iobase); ++} ++ ++static int dlc5_shutdown(void *data) { ++ msg_pdbg("dlc5_shutdown\n"); ++ /* De-assert pin 6 to force MISO low. */ ++ lpt_outbyte &= ~(1<<4); ++ OUTB(lpt_outbyte, lpt_iobase); ++ return 0; ++} ++ + #else + #error PCI port I/O access is not supported on this architecture yet. + #endif +diff --git a/satamv.c b/satamv.c +index c3f27e7..e03508e 100644 +--- a/satamv.c ++++ b/satamv.c +@@ -57,12 +57,6 @@ static const struct par_programmer par_programmer_satamv = { + .chip_writen = fallback_chip_writen, + }; + +-static int satamv_shutdown(void *data) +-{ +- physunmap(mv_bar, 0x20000); +- return 0; +-} +- + /* + * Random notes: + * FCE# Flash Chip Enable +@@ -94,11 +88,11 @@ int satamv_init(void) + return 1; + + addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); +- mv_bar = physmap("Marvell 88SX7042 registers", addr, 0x20000); +- if (mv_bar == ERROR_PTR) ++ if (!addr) + return 1; + +- if (register_shutdown(satamv_shutdown, NULL)) ++ mv_bar = rphysmap("Marvell 88SX7042 registers", addr, 0x20000); ++ if (mv_bar == ERROR_PTR) + return 1; + + tmp = pci_mmio_readl(mv_bar + FLASH_PARAM); +@@ -144,12 +138,15 @@ int satamv_init(void) + pci_rmmio_writel(tmp, mv_bar + GPIO_PORT_CONTROL); + + /* Get I/O BAR location. */ +- tmp = pcidev_readbar(dev, PCI_BASE_ADDRESS_2); ++ addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_2); ++ if (!addr) ++ return 1; ++ + /* Truncate to reachable range. + * FIXME: Check if the I/O BAR is actually reachable. + * This is an arch specific check. + */ +- mv_iobar = tmp & 0xffff; ++ mv_iobar = addr & 0xffff; + msg_pspew("Activating I/O BAR at 0x%04x\n", mv_iobar); + + /* 512 kByte with two 8-bit latches, and +diff --git a/satasii.c b/satasii.c +index 72e35e5..83dc62c 100644 +--- a/satasii.c ++++ b/satasii.c +@@ -54,12 +54,6 @@ static const struct par_programmer par_programmer_satasii = { + .chip_writen = fallback_chip_writen, + }; + +-static int satasii_shutdown(void *data) +-{ +- physunmap(sii_bar, SATASII_MEMMAP_SIZE); +- return 0; +-} +- + static uint32_t satasii_wait_done(void) + { + uint32_t ctrl_reg; +@@ -91,21 +85,25 @@ int satasii_init(void) + + if ((id == 0x3132) || (id == 0x3124)) { + addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_0); ++ if (!addr) ++ return 1; + reg_offset = 0x70; + } else { + addr = pcidev_readbar(dev, PCI_BASE_ADDRESS_5); ++ if (!addr) ++ return 1; + reg_offset = 0x50; + } + +- sii_bar = physmap("SATA SiI registers", addr, SATASII_MEMMAP_SIZE) + reg_offset; ++ sii_bar = rphysmap("SATA SiI registers", addr, SATASII_MEMMAP_SIZE); ++ if (sii_bar == ERROR_PTR) ++ return 1; ++ sii_bar += reg_offset; + + /* Check if ROM cycle are OK. */ + if ((id != 0x0680) && (!(pci_mmio_readl(sii_bar) & (1 << 26)))) + msg_pwarn("Warning: Flash seems unconnected.\n"); + +- if (register_shutdown(satasii_shutdown, NULL)) +- return 1; +- + register_par_programmer(&par_programmer_satasii, BUS_PARALLEL); + + return 0; +diff --git a/sb600spi.c b/sb600spi.c +index cb7c4ac..9523591 100644 +--- a/sb600spi.c ++++ b/sb600spi.c +@@ -57,7 +57,28 @@ static enum amd_chipset amd_gen = CHIPSET_AMD_UNKNOWN; + static void determine_generation(struct pci_dev *dev) + { + amd_gen = CHIPSET_AMD_UNKNOWN; +- if (dev->device_id == 0x780e) { ++ msg_pdbg2("Trying to determine the generation of the SPI interface... "); ++ if (dev->device_id == 0x438d) { ++ amd_gen = CHIPSET_SB6XX; ++ msg_pdbg("SB6xx detected.\n"); ++ } else if (dev->device_id == 0x439d) { ++ struct pci_dev *smbus_dev = pci_dev_find(0x1002, 0x4385); ++ if (smbus_dev == NULL) ++ return; ++ uint8_t rev = pci_read_byte(smbus_dev, PCI_REVISION_ID); ++ if (rev >= 0x39 && rev <= 0x3D) { ++ amd_gen = CHIPSET_SB7XX; ++ msg_pdbg("SB7xx/SP5100 detected.\n"); ++ } else if (rev >= 0x40 && rev <= 0x42) { ++ amd_gen = CHIPSET_SB89XX; ++ msg_pdbg("SB8xx/SB9xx/Hudson-1 detected.\n"); ++ } else { ++ msg_pwarn("SB device found but SMBus revision 0x%02x does not match known values.\n" ++ "Assuming SB8xx/SB9xx/Hudson-1. Please send a log to flashrom@flashrom.org\n", ++ rev); ++ amd_gen = CHIPSET_SB89XX; ++ } ++ } else if (dev->device_id == 0x780e) { + /* The PCI ID of the LPC bridge doesn't change between Hudson-2/3/4 and Yangtze (Kabini/Temash) + * although they use different SPI interfaces. */ + #ifdef USE_YANGTZE_HEURISTICS +@@ -94,7 +115,11 @@ static void determine_generation(struct pci_dev *dev) + "the output of lspci -nnvx, thanks!.\n", rev); + } + #endif +- } ++ } else ++ msg_pwarn("%s: Unknown LPC device %" PRIx16 ":%" PRIx16 ".\n" ++ "Please report this to flashrom@flashrom.org and include this log and\n" ++ "the output of lspci -nnvx, thanks!\n", ++ __func__, dev->vendor_id, dev->device_id); + } + + static void reset_internal_fifo_pointer(void) +@@ -247,10 +272,66 @@ static int sb600_spi_send_command(struct flashctx *flash, unsigned int writecnt, + return 0; + } + ++struct spispeed { ++ const char *const name; ++ const uint8_t speed; ++}; ++ ++static const struct spispeed spispeeds[] = { ++ { "66 MHz", 0x00 }, ++ { "33 MHz", 0x01 }, ++ { "22 MHz", 0x02 }, ++ { "16.5 MHz", 0x03 }, ++}; ++ ++static int set_speed(struct pci_dev *dev, const struct spispeed *spispeed) ++{ ++ bool success = false; ++ uint8_t speed = spispeed->speed; ++ ++ msg_pdbg("Setting SPI clock to %s (0x%x).\n", spispeed->name, speed); ++ if (amd_gen != CHIPSET_YANGTZE) { ++ rmmio_writeb((mmio_readb(sb600_spibar + 0xd) & ~(0x3 << 4)) | (speed << 4), sb600_spibar + 0xd); ++ success = (speed == ((mmio_readb(sb600_spibar + 0xd) >> 4) & 0x3)); ++ } ++ ++ if (!success) { ++ msg_perr("Setting SPI clock failed.\n"); ++ return 1; ++ } ++ return 0; ++} ++ ++static int handle_speed(struct pci_dev *dev) ++{ ++ uint32_t tmp; ++ int8_t spispeed_idx = 3; /* Default to 16.5 MHz */ ++ ++ /* See the chipset support matrix for SPI Base_Addr below for an explanation of the symbols used. ++ * bit 6xx 7xx/SP5100 8xx 9xx hudson1 hudson234 yangtze ++ * 18 rsvd <- fastReadEnable ? <- ? SpiReadMode[0] ++ * 29:30 rsvd <- <- ? <- ? SpiReadMode[2:1] ++ */ ++ if (amd_gen != CHIPSET_YANGTZE) { ++ if (amd_gen >= CHIPSET_SB89XX && amd_gen <= CHIPSET_HUDSON234) { ++ bool fast_read = (mmio_readl(sb600_spibar + 0x00) >> 18) & 0x1; ++ msg_pdbg("Fast Reads are %sabled\n", fast_read ? "en" : "dis"); ++ if (fast_read) { ++ msg_pdbg("Disabling them temporarily.\n"); ++ rmmio_writel(mmio_readl(sb600_spibar + 0x00) & ~(0x1 << 18), ++ sb600_spibar + 0x00); ++ } ++ } ++ tmp = (mmio_readb(sb600_spibar + 0xd) >> 4) & 0x3; ++ msg_pdbg("NormSpeed is %s\n", spispeeds[tmp].name); ++ } ++ return set_speed(dev, &spispeeds[spispeed_idx]); ++} ++ + static int sb600_handle_imc(struct pci_dev *dev, bool amd_imc_force) + { + /* Handle IMC everywhere but sb600 which does not have one. */ +- if (dev->device_id == 0x438d) ++ if (amd_gen == CHIPSET_SB6XX) + return 0; + + /* TODO: we should not only look at IntegratedImcPresent (LPC Dev 20, Func 3, 40h) but also at +@@ -297,9 +378,6 @@ int sb600_probe_spi(struct pci_dev *dev) + uint32_t tmp; + uint8_t reg; + bool amd_imc_force = false; +- static const char *const speed_names[4] = { +- "66/reserved", "33", "22", "16.5" +- }; + + char *arg = extract_programmer_param("amd_imc_force"); + if (arg && !strcmp(arg, "yes")) { +@@ -326,14 +404,20 @@ int sb600_probe_spi(struct pci_dev *dev) + return 0; + + /* Physical memory has to be mapped at page (4k) boundaries. */ +- sb600_spibar = physmap("SB600 SPI registers", tmp & 0xfffff000, +- 0x1000); ++ sb600_spibar = rphysmap("SB600 SPI registers", tmp & 0xfffff000, 0x1000); ++ if (sb600_spibar == ERROR_PTR) ++ return ERROR_FATAL; ++ + /* The low bits of the SPI base address are used as offset into + * the mapped page. + */ + sb600_spibar += tmp & 0xfff; + + determine_generation(dev); ++ if (amd_gen == CHIPSET_AMD_UNKNOWN) { ++ msg_perr("Could not determine chipset generation."); ++ return ERROR_NONFATAL; ++ } + + if (amd_gen == CHIPSET_YANGTZE) { + msg_perr("SPI on Kabini/Temash and newer chipsets are not yet supported.\n" +@@ -341,34 +425,87 @@ int sb600_probe_spi(struct pci_dev *dev) + return ERROR_NONFATAL; + } + +- tmp = pci_read_long(dev, 0xa0); +- msg_pdbg("AltSpiCSEnable=%i, SpiRomEnable=%i, " +- "AbortEnable=%i\n", tmp & 0x1, (tmp & 0x2) >> 1, +- (tmp & 0x4) >> 2); +- tmp = (pci_read_byte(dev, 0xba) & 0x4) >> 2; +- msg_pdbg("PrefetchEnSPIFromIMC=%i, ", tmp); +- +- tmp = pci_read_byte(dev, 0xbb); +- /* FIXME: Set bit 3,6,7 if not already set. +- * Set bit 5, otherwise SPI accesses are pointless in LPC mode. +- * See doc 42413 AMD SB700/710/750 RPR. ++ /* How to read the following table and similar ones in this file: ++ * "?" means we have no datasheet for this chipset generation or it doesn't have any relevant info. ++ * "<-" means the bit/register meaning is identical to the next non-"?" chipset to the left. "<-" thus ++ * never refers to another "?". ++ * If a "?" chipset is between two chipsets with identical meaning, we assume the meaning didn't change ++ * twice in between, i.e. the meaning is unchanged for the "?" chipset. Usually we assume that ++ * succeeding hardware supports the same functionality as its predecessor unless proven different by ++ * tests or documentation, hence "?" will often be implemented equally to "<-". ++ * ++ * Chipset support matrix for SPI Base_Addr (LPC PCI reg 0xa0) ++ * bit 6xx 7xx/SP5100 8xx 9xx hudson1 hudson2+ yangtze ++ * 3 rsvd <- <- ? <- ? RouteTpm2Spi ++ * 2 rsvd AbortEnable rsvd ? <- ? <- ++ * 1 rsvd SpiRomEnable <- ? <- ? <- ++ * 0 rsvd AltSpiCSEnable rsvd ? <- ? <- + */ +- msg_pdbg("PrefetchEnSPIFromHost=%i, SpiOpEnInLpcMode=%i\n", +- tmp & 0x1, (tmp & 0x20) >> 5); +- tmp = mmio_readl(sb600_spibar); +- /* FIXME: If SpiAccessMacRomEn or SpiHostAccessRomEn are zero on +- * SB700 or later, reads and writes will be corrupted. Abort in this +- * case. Make sure to avoid this check on SB600. ++ if (amd_gen >= CHIPSET_SB7XX) { ++ tmp = pci_read_long(dev, 0xa0); ++ msg_pdbg("SpiRomEnable=%i", (tmp >> 1) & 0x1); ++ if (amd_gen == CHIPSET_SB7XX) ++ msg_pdbg(", AltSpiCSEnable=%i, AbortEnable=%i", tmp & 0x1, (tmp >> 2) & 0x1); ++ ++ tmp = pci_read_byte(dev, 0xba); ++ msg_pdbg(", PrefetchEnSPIFromIMC=%i", (tmp & 0x4) >> 2); ++ ++ tmp = pci_read_byte(dev, 0xbb); ++ /* FIXME: Set bit 3,6,7 if not already set. ++ * Set bit 5, otherwise SPI accesses are pointless in LPC mode. ++ * See doc 42413 AMD SB700/710/750 RPR. ++ */ ++ if (amd_gen == CHIPSET_SB7XX) ++ msg_pdbg(", SpiOpEnInLpcMode=%i", (tmp >> 5) & 0x1); ++ msg_pdbg(", PrefetchEnSPIFromHost=%i\n", tmp & 0x1); ++ } ++ ++ /* Chipset support matrix for SPI_Cntrl0 (spibar + 0x0) ++ * See the chipset support matrix for SPI Base_Addr above for an explanation of the symbols used. ++ * bit 6xx 7xx/SP5100 8xx 9xx hudson1 hudson2+ yangtze ++ * 17 rsvd <- <- ? <- ? <- ++ * 18 rsvd <- fastReadEnable<1> ? <- ? SpiReadMode[0]<1> ++ * 19 SpiArbEnable <- <- ? <- ? <- ++ * 20 (FifoPtrClr) <- <- ? <- ? <- ++ * 21 (FifoPtrInc) <- <- ? <- ? IllegalAccess ++ * 22 SpiAccessMacRomEn <- <- ? <- ? <- ++ * 23 SpiHostAccessRomEn <- <- ? <- ? <- ++ * 24:26 ArbWaitCount <- <- ? <- ? <- ++ * 27 SpiBridgeDisable <- <- ? <- ? rsvd ++ * 28 rsvd DropOneClkOnRd = SPIClkGate ? <- ? <- ++ * 29:30 rsvd <- <- ? <- ? SpiReadMode[2:1]<1> ++ * 31 rsvd <- SpiBusy ? <- ? <- ++ * ++ * <1> see handle_speed + */ +- msg_pdbg("(0x%08" PRIx32 ") fastReadEnable=%u, SpiArbEnable=%i, SpiAccessMacRomEn=%i, " +- "SpiHostAccessRomEn=%i, ArbWaitCount=%i, " +- "SpiBridgeDisable=%i, DropOneClkOnRd=%i\n", +- tmp, (tmp >> 18) & 0x1, +- (tmp >> 19) & 0x1, (tmp >> 22) & 0x1, +- (tmp >> 23) & 0x1, (tmp >> 24) & 0x7, +- (tmp >> 27) & 0x1, (tmp >> 28) & 0x1); +- tmp = (mmio_readb(sb600_spibar + 0xd) >> 4) & 0x3; +- msg_pdbg("NormSpeed is %s MHz\n", speed_names[tmp]); ++ tmp = mmio_readl(sb600_spibar + 0x00); ++ msg_pdbg("(0x%08" PRIx32 ") SpiArbEnable=%i", tmp, (tmp >> 19) & 0x1); ++ ++ msg_pdbg(", SpiAccessMacRomEn=%i, SpiHostAccessRomEn=%i, ArbWaitCount=%i", ++ (tmp >> 22) & 0x1, (tmp >> 23) & 0x1, (tmp >> 24) & 0x7); ++ ++ if (amd_gen != CHIPSET_YANGTZE) ++ msg_pdbg(", SpiBridgeDisable=%i", (tmp >> 27) & 0x1); ++ ++ switch (amd_gen) { ++ case CHIPSET_SB7XX: ++ msg_pdbg(", DropOneClkOnRd/SpiClkGate=%i", (tmp >> 28) & 0x1); ++ case CHIPSET_SB89XX: ++ case CHIPSET_HUDSON234: ++ msg_pdbg(", SpiBusy=%i", (tmp >> 31) & 0x1); ++ default: break; ++ } ++ msg_pdbg("\n"); ++ ++ if (((tmp >> 22) & 0x1) == 0 || ((tmp >> 23) & 0x1) == 0) { ++ msg_perr("ERROR: State of SpiAccessMacRomEn or SpiHostAccessRomEn prohibits full access.\n"); ++ return ERROR_NONFATAL; ++ } ++ ++ if (amd_gen >= CHIPSET_SB89XX) { ++ tmp = mmio_readb(sb600_spibar + 0x1D); ++ msg_pdbg("Using SPI_CS%d\n", tmp & 0x3); ++ } + + /* Look for the SMBus device. */ + smbus_dev = pci_dev_find(0x1002, 0x4385); +@@ -409,6 +546,9 @@ int sb600_probe_spi(struct pci_dev *dev) + return 0; + } + ++ if (handle_speed(dev) != 0) ++ return ERROR_FATAL; ++ + if (sb600_handle_imc(dev, amd_imc_force) != 0) + return ERROR_FATAL; + +diff --git a/serial.c b/serial.c +index 1b394cd..126079a 100644 +--- a/serial.c ++++ b/serial.c +@@ -41,12 +41,6 @@ + + fdtype sp_fd = SER_INV_FD; + +-void __attribute__((noreturn)) sp_die(char *msg) +-{ +- perror(msg); +- exit(1); +-} +- + #ifdef _WIN32 + struct baudentry { + DWORD flag; +@@ -158,35 +152,18 @@ static void msg_perr_strerror(const char *msg) + #endif + } + +-fdtype sp_openserport(char *dev, unsigned int baud) ++int serialport_config(fdtype fd, unsigned int baud) + { +-#ifdef _WIN32 +- HANDLE fd; +- char *dev2 = dev; +- if ((strlen(dev) > 3) && +- (tolower((unsigned char)dev[0]) == 'c') && +- (tolower((unsigned char)dev[1]) == 'o') && +- (tolower((unsigned char)dev[2]) == 'm')) { +- dev2 = malloc(strlen(dev) + 5); +- if (!dev2) { +- msg_perr_strerror("Out of memory: "); +- return SER_INV_FD; +- } +- strcpy(dev2, "\\\\.\\"); +- strcpy(dev2 + 4, dev); +- } +- fd = CreateFile(dev2, GENERIC_READ | GENERIC_WRITE, 0, NULL, +- OPEN_EXISTING, 0, NULL); +- if (dev2 != dev) +- free(dev2); +- if (fd == INVALID_HANDLE_VALUE) { +- msg_perr_strerror("Cannot open serial port: "); +- return SER_INV_FD; ++ if (fd == SER_INV_FD) { ++ msg_perr("%s: File descriptor is invalid.\n", __func__); ++ return 1; + } ++ ++#ifdef _WIN32 + DCB dcb; + if (!GetCommState(fd, &dcb)) { + msg_perr_strerror("Could not fetch original serial port configuration: "); +- goto out_close; ++ return 1; + } + const struct baudentry *entry = round_baud(baud); + dcb.BaudRate = entry->flag; +@@ -195,35 +172,25 @@ fdtype sp_openserport(char *dev, unsigned int baud) + dcb.StopBits = ONESTOPBIT; + if (!SetCommState(fd, &dcb)) { + msg_perr_strerror("Could not change serial port configuration: "); +- goto out_close; ++ return 1; + } + if (!GetCommState(fd, &dcb)) { + msg_perr_strerror("Could not fetch new serial port configuration: "); +- goto out_close; ++ return 1; + } + msg_pdbg("Baud rate is %ld.\n", dcb.BaudRate); +- return fd; +-out_close: +- CloseHandle(sp_fd); +- return SER_INV_FD; + #else + struct termios wanted, observed; +- int fd; +- fd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY); +- if (fd < 0) { +- msg_perr_strerror("Cannot open serial port: "); +- return SER_INV_FD; +- } + fcntl(fd, F_SETFL, 0); + if (tcgetattr(fd, &observed) != 0) { + msg_perr_strerror("Could not fetch original serial port configuration: "); +- goto out_close; ++ return 1; + } + wanted = observed; + const struct baudentry *entry = round_baud(baud); + if (cfsetispeed(&wanted, entry->flag) != 0 || cfsetospeed(&wanted, entry->flag) != 0) { + msg_perr_strerror("Could not set serial baud rate: "); +- goto out_close; ++ return 1; + } + wanted.c_cflag &= ~(PARENB | CSTOPB | CSIZE | CRTSCTS); + wanted.c_cflag |= (CS8 | CLOCAL | CREAD); +@@ -232,11 +199,11 @@ out_close: + wanted.c_oflag &= ~OPOST; + if (tcsetattr(fd, TCSANOW, &wanted) != 0) { + msg_perr_strerror("Could not change serial port configuration: "); +- goto out_close; ++ return 1; + } + if (tcgetattr(fd, &observed) != 0) { + msg_perr_strerror("Could not fetch new serial port configuration: "); +- goto out_close; ++ return 1; + } + if (observed.c_cflag != wanted.c_cflag || + observed.c_lflag != wanted.c_lflag || +@@ -244,14 +211,54 @@ out_close: + observed.c_oflag != wanted.c_oflag || + cfgetispeed(&observed) != cfgetispeed(&wanted)) { + msg_perr("%s: Some requested options did not stick.\n", __func__); +- goto out_close; ++ return 1; + } +- msg_pdbg("Baud rate is %d.\n", entry->baud); +- return fd; ++ msg_pdbg("Baud rate is %d now.\n", entry->baud); ++#endif ++ return 0; ++} + +-out_close: +- close(sp_fd); +- return SER_INV_FD; ++fdtype sp_openserport(char *dev, unsigned int baud) ++{ ++ fdtype fd; ++#ifdef _WIN32 ++ char *dev2 = dev; ++ if ((strlen(dev) > 3) && ++ (tolower((unsigned char)dev[0]) == 'c') && ++ (tolower((unsigned char)dev[1]) == 'o') && ++ (tolower((unsigned char)dev[2]) == 'm')) { ++ dev2 = malloc(strlen(dev) + 5); ++ if (!dev2) { ++ msg_perr_strerror("Out of memory: "); ++ return SER_INV_FD; ++ } ++ strcpy(dev2, "\\\\.\\"); ++ strcpy(dev2 + 4, dev); ++ } ++ fd = CreateFile(dev2, GENERIC_READ | GENERIC_WRITE, 0, NULL, ++ OPEN_EXISTING, 0, NULL); ++ if (dev2 != dev) ++ free(dev2); ++ if (fd == INVALID_HANDLE_VALUE) { ++ msg_perr_strerror("Cannot open serial port: "); ++ return SER_INV_FD; ++ } ++ if (serialport_config(fd, baud) != 0) { ++ CloseHandle(fd); ++ return SER_INV_FD; ++ } ++ return fd; ++#else ++ fd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY); ++ if (fd < 0) { ++ msg_perr_strerror("Cannot open serial port: "); ++ return SER_INV_FD; ++ } ++ if (serialport_config(fd, baud) != 0) { ++ close(fd); ++ return SER_INV_FD; ++ } ++ return fd; + #endif + } + +@@ -350,7 +357,7 @@ int serialport_write(unsigned char *buf, unsigned int writecnt) + if (!tmp) { + msg_pdbg2("Empty write\n"); + empty_writes--; +- programmer_delay(500); ++ internal_delay(500); + if (empty_writes == 0) { + msg_perr("Serial port is unresponsive!\n"); + return 1; +diff --git a/serprog.c b/serprog.c +index 3476315..35c4f32 100644 +--- a/serprog.c ++++ b/serprog.c +@@ -100,6 +100,7 @@ static int sp_opensocket(char *ip, unsigned int port) + if (NULL == hostPtr) { + hostPtr = gethostbyaddr(ip, strlen(ip), AF_INET); + if (NULL == hostPtr) { ++ close(sock); + msg_perr("Error: cannot resolve %s\n", ip); + return -1; + } +@@ -114,7 +115,11 @@ static int sp_opensocket(char *ip, unsigned int port) + } + /* We are latency limited, and sometimes do write-write-read * + * (write-n) - so enable TCP_NODELAY. */ +- setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int)); ++ if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int))) { ++ close(sock); ++ msg_perr("Error: serprog cannot set socket options: %s\n", strerror(errno)); ++ return -1; ++ } + return sock; + } + #endif +@@ -237,43 +242,58 @@ static int sp_docommand(uint8_t command, uint32_t parmlen, + return 0; + } + +-static void sp_flush_stream(void) ++static int sp_flush_stream(void) + { + if (sp_streamed_transmit_ops) + do { + unsigned char c; + if (serialport_read(&c, 1) != 0) { +- sp_die("Error: cannot read from device (flushing stream)"); ++ msg_perr("Error: cannot read from device (flushing stream)"); ++ return 1; + } + if (c == S_NAK) { + msg_perr("Error: NAK to a stream buffer operation\n"); +- exit(1); ++ return 1; + } + if (c != S_ACK) { + msg_perr("Error: Invalid reply 0x%02X from device\n", c); +- exit(1); ++ return 1; + } + } while (--sp_streamed_transmit_ops); + sp_streamed_transmit_ops = 0; + sp_streamed_transmit_bytes = 0; ++ return 0; + } + +-static int sp_stream_buffer_op(uint8_t cmd, uint32_t parmlen, uint8_t * parms) ++static int sp_stream_buffer_op(uint8_t cmd, uint32_t parmlen, uint8_t *parms) + { + uint8_t *sp; + if (sp_automatic_cmdcheck(cmd)) + return 1; ++ + sp = malloc(1 + parmlen); +- if (!sp) sp_die("Error: cannot malloc command buffer"); ++ if (!sp) { ++ msg_perr("Error: cannot malloc command buffer\n"); ++ return 1; ++ } + sp[0] = cmd; + memcpy(&(sp[1]), parms, parmlen); +- if (sp_streamed_transmit_bytes >= (1 + parmlen + sp_device_serbuf_size)) +- sp_flush_stream(); +- if (serialport_write(sp, 1 + parmlen) != 0) +- sp_die("Error: cannot write command"); +- free(sp); ++ ++ if (sp_streamed_transmit_bytes >= (1 + parmlen + sp_device_serbuf_size)) { ++ if (sp_flush_stream() != 0) { ++ free(sp); ++ return 1; ++ } ++ } ++ if (serialport_write(sp, 1 + parmlen) != 0) { ++ msg_perr("Error: cannot write command\n"); ++ free(sp); ++ return 1; ++ } + sp_streamed_transmit_ops += 1; + sp_streamed_transmit_bytes += 1 + parmlen; ++ ++ free(sp); + return 0; + } + +@@ -656,16 +676,16 @@ int serprog_init(void) + return 0; + } + +-/* Move an in flashrom buffer existing write-n operation to * +- * the on-device operation buffer. */ +-static void sp_pass_writen(void) ++/* Move an in flashrom buffer existing write-n operation to the on-device operation buffer. */ ++static int sp_pass_writen(void) + { + unsigned char header[7]; +- msg_pspew(MSGHEADER "Passing write-n bytes=%d addr=0x%x\n", +- sp_write_n_bytes, sp_write_n_addr); +- if (sp_streamed_transmit_bytes >= +- (7 + sp_write_n_bytes + sp_device_serbuf_size)) +- sp_flush_stream(); ++ msg_pspew(MSGHEADER "Passing write-n bytes=%d addr=0x%x\n", sp_write_n_bytes, sp_write_n_addr); ++ if (sp_streamed_transmit_bytes >= (7 + sp_write_n_bytes + sp_device_serbuf_size)) { ++ if (sp_flush_stream() != 0) { ++ return 1; ++ } ++ } + /* In case it's just a single byte send it as a single write. */ + if (sp_write_n_bytes == 1) { + sp_write_n_bytes = 0; +@@ -673,9 +693,10 @@ static void sp_pass_writen(void) + header[1] = (sp_write_n_addr >> 8) & 0xFF; + header[2] = (sp_write_n_addr >> 16) & 0xFF; + header[3] = sp_write_n_buf[0]; +- sp_stream_buffer_op(S_CMD_O_WRITEB, 4, header); ++ if (sp_stream_buffer_op(S_CMD_O_WRITEB, 4, header) != 0) ++ return 1; + sp_opbuf_usage += 5; +- return; ++ return 0; + } + header[0] = S_CMD_O_WRITEN; + header[1] = (sp_write_n_bytes >> 0) & 0xFF; +@@ -684,39 +705,55 @@ static void sp_pass_writen(void) + header[4] = (sp_write_n_addr >> 0) & 0xFF; + header[5] = (sp_write_n_addr >> 8) & 0xFF; + header[6] = (sp_write_n_addr >> 16) & 0xFF; +- if (serialport_write(header, 7) != 0) +- sp_die("Error: cannot write write-n command\n"); +- if (serialport_write(sp_write_n_buf, sp_write_n_bytes) != 0) +- sp_die("Error: cannot write write-n data"); ++ if (serialport_write(header, 7) != 0) { ++ msg_perr(MSGHEADER "Error: cannot write write-n command\n"); ++ return 1; ++ } ++ if (serialport_write(sp_write_n_buf, sp_write_n_bytes) != 0) { ++ msg_perr(MSGHEADER "Error: cannot write write-n data"); ++ return 1; ++ } + sp_streamed_transmit_bytes += 7 + sp_write_n_bytes; + sp_streamed_transmit_ops += 1; + sp_opbuf_usage += 7 + sp_write_n_bytes; + sp_write_n_bytes = 0; + sp_prev_was_write = 0; ++ return 0; + } + +-static void sp_execute_opbuf_noflush(void) ++static int sp_execute_opbuf_noflush(void) + { +- if ((sp_max_write_n) && (sp_write_n_bytes)) +- sp_pass_writen(); +- sp_stream_buffer_op(S_CMD_O_EXEC, 0, NULL); +- msg_pspew(MSGHEADER "Executed operation buffer of %d bytes\n", +- sp_opbuf_usage); ++ if ((sp_max_write_n) && (sp_write_n_bytes)) { ++ if (sp_pass_writen() != 0) { ++ msg_perr("Error: could not transfer write buffer\n"); ++ return 1; ++ } ++ } ++ if (sp_stream_buffer_op(S_CMD_O_EXEC, 0, NULL) != 0) { ++ msg_perr("Error: could not execute command buffer\n"); ++ return 1; ++ } ++ msg_pspew(MSGHEADER "Executed operation buffer of %d bytes\n", sp_opbuf_usage); + sp_opbuf_usage = 0; + sp_prev_was_write = 0; +- return; ++ return 0; + } + +-static void sp_execute_opbuf(void) ++static int sp_execute_opbuf(void) + { +- sp_execute_opbuf_noflush(); +- sp_flush_stream(); ++ if (sp_execute_opbuf_noflush() != 0) ++ return 1; ++ if (sp_flush_stream() != 0) ++ return 1; ++ ++ return 0; + } + + static int serprog_shutdown(void *data) + { + if ((sp_opbuf_usage) || (sp_max_write_n && sp_write_n_bytes)) +- sp_execute_opbuf(); ++ if (sp_execute_opbuf() != 0) ++ msg_pwarn("Could not flush command buffer.\n"); + if (sp_check_commandavail(S_CMD_S_PIN_STATE)) { + uint8_t dis = 0; + if (sp_docommand(S_CMD_S_PIN_STATE, 1, &dis, 0, NULL) == 0) +@@ -731,14 +768,15 @@ static int serprog_shutdown(void *data) + return 0; + } + +-static void sp_check_opbuf_usage(int bytes_to_be_added) ++static int sp_check_opbuf_usage(int bytes_to_be_added) + { + if (sp_device_opbuf_size <= (sp_opbuf_usage + bytes_to_be_added)) { +- sp_execute_opbuf(); +- /* If this happens in the mid of an page load the page load * +- * will probably fail. */ +- msg_pdbg(MSGHEADER "Warning: executed operation buffer due to size reasons\n"); ++ /* If this happens in the middle of a page load the page load will probably fail. */ ++ msg_pwarn(MSGHEADER "Warning: executed operation buffer due to size reasons\n"); ++ if (sp_execute_opbuf() != 0) ++ return 1; + } ++ return 0; + } + + static void serprog_chip_writeb(const struct flashctx *flash, uint8_t val, +@@ -768,7 +806,7 @@ static void serprog_chip_writeb(const struct flashctx *flash, uint8_t val, + writeb_parm[1] = (addr >> 8) & 0xFF; + writeb_parm[2] = (addr >> 16) & 0xFF; + writeb_parm[3] = val; +- sp_stream_buffer_op(S_CMD_O_WRITEB, 4, writeb_parm); ++ sp_stream_buffer_op(S_CMD_O_WRITEB, 4, writeb_parm); // FIXME: return error + sp_opbuf_usage += 5; + } + } +@@ -785,16 +823,16 @@ static uint8_t serprog_chip_readb(const struct flashctx *flash, + buf[0] = ((addr >> 0) & 0xFF); + buf[1] = ((addr >> 8) & 0xFF); + buf[2] = ((addr >> 16) & 0xFF); +- sp_stream_buffer_op(S_CMD_R_BYTE, 3, buf); +- sp_flush_stream(); ++ sp_stream_buffer_op(S_CMD_R_BYTE, 3, buf); // FIXME: return error ++ sp_flush_stream(); // FIXME: return error + if (serialport_read(&c, 1) != 0) +- sp_die("readb byteread"); ++ msg_perr(MSGHEADER "readb byteread"); // FIXME: return error + msg_pspew("%s addr=0x%" PRIxPTR " returning 0x%02X\n", __func__, addr, c); + return c; + } + + /* Local version that really does the job, doesn't care of max_read_n. */ +-static void sp_do_read_n(uint8_t * buf, const chipaddr addr, size_t len) ++static int sp_do_read_n(uint8_t * buf, const chipaddr addr, size_t len) + { + unsigned char sbuf[6]; + msg_pspew("%s: addr=0x%" PRIxPTR " len=%zu\n", __func__, addr, len); +@@ -808,10 +846,13 @@ static void sp_do_read_n(uint8_t * buf, const chipaddr addr, size_t len) + sbuf[4] = ((len >> 8) & 0xFF); + sbuf[5] = ((len >> 16) & 0xFF); + sp_stream_buffer_op(S_CMD_R_NBYTES, 6, sbuf); +- sp_flush_stream(); +- if (serialport_read(buf, len) != 0) +- sp_die("Error: cannot read read-n data"); +- return; ++ if (sp_flush_stream() != 0) ++ return 1; ++ if (serialport_read(buf, len) != 0) { ++ msg_perr(MSGHEADER "Error: cannot read read-n data"); ++ return 1; ++ } ++ return 0; + } + + /* The externally called version that makes sure that max_read_n is obeyed. */ +@@ -821,12 +862,12 @@ static void serprog_chip_readn(const struct flashctx *flash, uint8_t * buf, + size_t lenm = len; + chipaddr addrm = addr; + while ((sp_max_read_n != 0) && (lenm > sp_max_read_n)) { +- sp_do_read_n(&(buf[addrm-addr]), addrm, sp_max_read_n); ++ sp_do_read_n(&(buf[addrm-addr]), addrm, sp_max_read_n); // FIXME: return error + addrm += sp_max_read_n; + lenm -= sp_max_read_n; + } + if (lenm) +- sp_do_read_n(&(buf[addrm-addr]), addrm, lenm); ++ sp_do_read_n(&(buf[addrm-addr]), addrm, lenm); // FIXME: return error + } + + void serprog_delay(int usecs) +@@ -858,11 +899,18 @@ static int serprog_spi_send_command(struct flashctx *flash, + unsigned char *parmbuf; + int ret; + msg_pspew("%s, writecnt=%i, readcnt=%i\n", __func__, writecnt, readcnt); +- if ((sp_opbuf_usage) || (sp_max_write_n && sp_write_n_bytes)) +- sp_execute_opbuf(); ++ if ((sp_opbuf_usage) || (sp_max_write_n && sp_write_n_bytes)) { ++ if (sp_execute_opbuf() != 0) { ++ msg_perr("Error: could not execute command buffer before sending SPI commands.\n"); ++ return 1; ++ } ++ } ++ + parmbuf = malloc(writecnt + 6); +- if (!parmbuf) +- sp_die("Error: cannot malloc SPI send param buffer"); ++ if (!parmbuf) { ++ msg_perr("Error: could not allocate SPI send param buffer.\n"); ++ return 1; ++ } + parmbuf[0] = (writecnt >> 0) & 0xFF; + parmbuf[1] = (writecnt >> 8) & 0xFF; + parmbuf[2] = (writecnt >> 16) & 0xFF; +@@ -879,8 +927,7 @@ static int serprog_spi_send_command(struct flashctx *flash, + /* FIXME: This function is optimized so that it does not split each transaction + * into chip page_size long blocks unnecessarily like spi_read_chunked. This has + * the advantage that it is much faster for most chips, but breaks those with +- * non-contiguous address space (like AT45DB161D). When spi_read_chunked is +- * fixed this method can be removed. */ ++ * non-continuous reads. When spi_read_chunked is fixed this method can be removed. */ + static int serprog_spi_read(struct flashctx *flash, uint8_t *buf, + unsigned int start, unsigned int len) + { +diff --git a/spi25.c b/spi25.c +index e001196..862a865 100644 +--- a/spi25.c ++++ b/spi25.c +@@ -679,7 +679,7 @@ int spi_block_erase_20(struct flashctx *flash, unsigned int addr, + + result = spi_send_multicommand(flash, cmds); + if (result) { +- msg_cerr("%s failed during command execution at address 0x%x\n", ++ msg_pdbg("%s failed during command execution at address 0x%x\n", + __func__, addr); + return result; + } +@@ -1128,13 +1128,9 @@ int default_spi_write_aai(struct flashctx *flash, uint8_t *buf, unsigned int sta + + + result = spi_send_multicommand(flash, cmds); +- if (result) { +- msg_cerr("%s failed during start command execution\n", +- __func__); +- /* FIXME: Should we send WRDI here as well to make sure the chip +- * is not in AAI mode? +- */ +- return result; ++ if (result != 0) { ++ msg_cerr("%s failed during start command execution: %d\n", __func__, result); ++ goto bailout; + } + while (spi_read_status_register(flash) & SPI_SR_WIP) + programmer_delay(10); +@@ -1146,16 +1142,21 @@ int default_spi_write_aai(struct flashctx *flash, uint8_t *buf, unsigned int sta + while (pos < start + len - 1) { + cmd[1] = buf[pos++ - start]; + cmd[2] = buf[pos++ - start]; +- spi_send_command(flash, JEDEC_AAI_WORD_PROGRAM_CONT_OUTSIZE, 0, +- cmd, NULL); ++ result = spi_send_command(flash, JEDEC_AAI_WORD_PROGRAM_CONT_OUTSIZE, 0, cmd, NULL); ++ if (result != 0) { ++ msg_cerr("%s failed during followup AAI command execution: %d\n", __func__, result); ++ goto bailout; ++ } + while (spi_read_status_register(flash) & SPI_SR_WIP) + programmer_delay(10); + } + +- /* Use WRDI to exit AAI mode. This needs to be done before issuing any +- * other non-AAI command. +- */ +- spi_write_disable(flash); ++ /* Use WRDI to exit AAI mode. This needs to be done before issuing any other non-AAI command. */ ++ result = spi_write_disable(flash); ++ if (result != 0) { ++ msg_cerr("%s failed to disable AAI mode.\n", __func__); ++ return SPI_GENERIC_ERROR; ++ } + + /* Write remaining byte (if any). */ + if (pos < start + len) { +@@ -1165,4 +1166,10 @@ int default_spi_write_aai(struct flashctx *flash, uint8_t *buf, unsigned int sta + } + + return 0; ++ ++bailout: ++ result = spi_write_disable(flash); ++ if (result != 0) ++ msg_cerr("%s failed to disable AAI mode.\n", __func__); ++ return SPI_GENERIC_ERROR; + } +diff --git a/spi25_statusreg.c b/spi25_statusreg.c +index 8fb7f2d..48fceb0 100644 +--- a/spi25_statusreg.c ++++ b/spi25_statusreg.c +@@ -270,7 +270,7 @@ static void spi_prettyprint_status_register_bp(uint8_t status, int bp) + } + + /* Unnamed bits. */ +-static void spi_prettyprint_status_register_bit(uint8_t status, int bit) ++void spi_prettyprint_status_register_bit(uint8_t status, int bit) + { + msg_cdbg("Chip status register: Bit %i is %sset\n", bit, (status & (1 << bit)) ? "" : "not "); + } +diff --git a/stm50.c b/stm50.c +new file mode 100644 +index 0000000..edcfdd2 +--- /dev/null ++++ b/stm50.c +@@ -0,0 +1,115 @@ ++/* ++ * This file is part of the flashrom project. ++ * ++ * Copyright (C) 2008 Claus Gindhart ++ * Copyright (C) 2009 Sean Nelson ++ * Copyright (C) 2013 Stefan Tauner ++ * ++ * 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 St, Fifth Floor, Boston, MA 02110-1301 USA ++ */ ++ ++/* ++ * All ST M50 chips are locked on startup. Most of them have a uniform 64 kB block layout, but some have ++ * a non-uniform block/sector segmentation which has to be handled with more care. Some of the non-uniform ++ * chips support erasing of the 4 kB sectors with another command. ++ */ ++ ++#include "flash.h" ++#include "flashchips.h" ++#include "chipdrivers.h" ++ ++static int stm50_unlock_address(struct flashctx *flash, int offset) ++{ ++ chipaddr wrprotect = flash->virtual_registers + 2; ++ static const uint8_t unlock_sector = 0x00; ++ msg_cdbg("unlocking at 0x%x\n", offset); ++ chip_writeb(flash, unlock_sector, wrprotect + offset); ++ if (chip_readb(flash, wrprotect + offset) != unlock_sector) { ++ msg_cerr("Cannot unlock address 0x%x\n", offset); ++ return -1; ++ } ++ return 0; ++} ++ ++/* Chips known to use a non-uniform block and sector layout for locking (as well as for erasing): ++ * Name Size Address range of lock registers ++ * M50FLW080A 1MB FFB00002 - FFBFF002 ++ * M50FLW080B 1MB FFB00002 - FFBFF002 ++ * M50FW002 256k FFBC0002 - FFBFC002 ++ * M50LPW116 2MB FFA00002 - FFBFC002 ++ */ ++int unlock_stm50_nonuniform(struct flashctx *flash) ++{ ++ int i; ++ struct eraseblock *eraseblocks = flash->chip->block_erasers[0].eraseblocks; ++ unsigned int done = 0; ++ for (i = 0; i < NUM_ERASEREGIONS && eraseblocks[i].count != 0; i++) { ++ unsigned int block_size = eraseblocks[i].size; ++ unsigned int block_count = eraseblocks[i].count; ++ ++ int j; ++ for (j = 0; j < block_count; j++) { ++ if (stm50_unlock_address(flash, done)) { ++ msg_cerr("UNLOCK FAILED!\n"); ++ return -1; ++ } ++ done += block_count * block_size; ++ } ++ } ++ return 0; ++} ++ ++/* Unlocking for uniform 64 kB blocks starting at offset 2 of the feature registers. */ ++int unlock_stm50_uniform(struct flashctx *flash) ++{ ++ int i; ++ for (i = 0; i < flash->chip->total_size * 1024; i+= 64 * 1024) { ++ if (stm50_unlock_address(flash, i)) { ++ msg_cerr("UNLOCK FAILED!\n"); ++ return -1; ++ } ++ } ++ return 0; ++} ++ ++static int stm50_erase_sector(struct flashctx *flash, unsigned int addr) ++{ ++ chipaddr bios = flash->virtual_memory + addr; ++ ++ // clear status register ++ chip_writeb(flash, 0x50, bios); ++ // now start it ++ chip_writeb(flash, 0x32, bios); ++ chip_writeb(flash, 0xd0, bios); ++ programmer_delay(10); ++ ++ uint8_t status = wait_82802ab(flash); ++ print_status_82802ab(status); ++ ++ return status == 0x80; ++} ++ ++/* Some ST M50* chips do support erasing of sectors. This function will derive the erase function to use from ++ * the length of the of the block. For calls that apparently do not address a sector (but a block) we just call ++ * the block erase function instead. FIXME: This duplicates the behavior of the remaining erasers for blocks and ++ * might be fixed when flashrom supports multiple functions per eraser or erasers that do erase parts of the ++ * chip only. */ ++int erase_sector_stm50(struct flashctx *flash, unsigned int addr, unsigned int len) ++{ ++ if (len == 4096) ++ return stm50_erase_sector(flash, addr); ++ else ++ return erase_block_82802ab(flash, addr, len); ++} +diff --git a/udelay.c b/udelay.c +index e3cf3e3..9d3bfc2 100644 +--- a/udelay.c ++++ b/udelay.c +@@ -90,7 +90,11 @@ void myusec_calibrate_delay(void) + unsigned long timeusec, resolution; + int i, tries = 0; + ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("Calibrating delay loop... "); ++#else + msg_pinfo("Calibrating delay loop... "); ++#endif + resolution = measure_os_delay_resolution(); + if (resolution) { + msg_pdbg("OS timer resolution is %lu usecs, ", resolution); +@@ -151,7 +155,7 @@ recalibrate: + } + } + } else { +- msg_perr("delay loop is unreliable, trying to continue "); ++ msg_pdbg("delay loop is unreliable, trying to continue "); + } + + /* We're interested in the actual precision. */ +@@ -166,7 +170,11 @@ recalibrate: + timeusec = measure_delay(resolution * 4); + msg_pdbg("%ld myus = %ld us, ", resolution * 4, timeusec); + ++#ifdef FORCE10_SPI_CHANGE ++ msg_pdbg("OK.\n"); ++#else + msg_pinfo("OK.\n"); ++#endif + } + + /* Not very precise sleep. */ +diff --git a/util/getrevision.sh b/util/getrevision.sh +new file mode 100755 +index 0000000..709e45f +--- /dev/null ++++ b/util/getrevision.sh +@@ -0,0 +1,311 @@ ++#!/bin/sh ++# ++# This file is part of the flashrom project. ++# ++# Copyright (C) 2005 coresystems GmbH ++# Copyright (C) 2009,2010 Carl-Daniel Hailfinger ++# Copyright (C) 2010 Chromium OS Authors ++# Copyright (C) 2013 Stefan Tauner ++# ++# 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 St, Fifth Floor, Boston, MA 02110-1301 USA ++# ++ ++EXIT_SUCCESS=0 ++EXIT_FAILURE=1 ++ ++# Make sure we don't get translated output ++export LC_ALL=C ++# nor local times or dates ++export TZ=UTC0 ++ ++# Helper functions ++# First argument is the path to inspect (usually optional; w/o it the whole repository will be considered) ++svn_has_local_changes() { ++ svn status "$1" | egrep '^ *[ADMR] *' >/dev/null ++} ++ ++git_has_local_changes() { ++ git update-index -q --refresh >/dev/null ++ ! git diff-index --quiet HEAD -- "$1" ++} ++ ++git_last_commit() { ++ git log --pretty=format:"%h" -1 -- "$1" ++} ++ ++svn_is_file_tracked() { ++ svn info "$1" >/dev/null 2>&1 ++} ++ ++git_is_file_tracked() { ++ git ls-files --error-unmatch -- "$1" >/dev/null 2>&1 ++} ++ ++is_file_tracked() { ++ svn_is_file_tracked "$1" || git_is_file_tracked "$1" ++} ++ ++# Tries to find a remote source for the changes committed locally. ++# This includes the URL of the remote repository including the last commit and a suitable branch name. ++# Takes one optional argument: the path to inspect ++git_url() { ++ last_commit=$(git_last_commit "$1") ++ # get all remote branches containing the last commit (excluding origin/HEAD and git-svn branches/tags) ++ branches=$(git branch -r --contains $last_commit | sed '/\//!d;/.*->.*/d;s/[\t ]*//') ++ if [ -z "$branches" ] ; then ++ echo "No remote branch contains a suitable commit">&2 ++ return ++ fi ++ ++ # find "nearest" branch ++ local mindiff=9000 ++ local target= ++ for branch in $branches ; do ++ curdiff=$(git rev-list --count $last_commit..$branch) ++ if [ $curdiff -ge $mindiff ] ; then ++ continue ++ fi ++ mindiff=$curdiff ++ target=$branch ++ done ++ ++ echo "$(git ls-remote --exit-code --get-url ${target%/*}) ${target#*/}" ++} ++ ++# Returns a string indicating where others can get the current source code (excluding uncommitted changes) ++# Takes one optional argument: the path to inspect ++scm_url() { ++ local url= ++ ++ # for a primitive VCS like subversion finding the URL is easy: there is only one upstream host ++ if svn_is_file_tracked "$1" ; then ++ url="$(svn info "$1" 2>/dev/null | ++ grep URL: | ++ sed 's/.*URL:[[:blank:]]*//;s/:\/\/.*@/:\/\//' | ++ grep ^.)" ++ elif git_is_file_tracked "$1" ; then ++ url="$(git_url "$1")" ++ else ++ return ${EXIT_FAILURE} ++ fi ++ ++ echo "${url}" ++} ++ ++# Retrieve timestamp since last modification. If the sources are pristine, ++# then the timestamp will match that of the SCM's most recent modification ++# date. ++timestamp() { ++ local t ++ ++ # date syntaxes are manifold: ++ # gnu date [-d input]... [+FORMAT] ++ # netbsd date [-ajnu] [-d date] [-r seconds] [+format] [[[[[[CC]yy]mm]dd]HH]MM[.SS]] ++ # freebsd date [-jnu] [-d dst] [-r seconds] [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] [...] ++ # dragonflybsd date [-jnu] [-d dst] [-r seconds] [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] [...] ++ # openbsd date [-aju] [-d dst] [-r seconds] [+format] [[[[[[cc]yy]mm]dd]HH]MM[.SS]] [...] ++ if svn_is_file_tracked "$2" ; then ++ if svn_has_local_changes "$2"; then ++ t=$(date -u "$1") ++ else ++ # No local changes, get date of the last log record. Subversion provides that in ++ # ISO 8601 format when using the --xml switch. The sed call extracts that ignoring any ++ # fractional parts started by a comma or a dot. ++ local last_commit_date="$(svn info --xml "$2"| \ ++ sed -n -e 's/\([^,\.]*\)\([\.,].*\)*Z<\/date>/\1Z/p')" ++ ++ case $(uname) in ++ # Most BSD dates do not support parsing date values from user input with -d but all of ++ # them support parsing the syntax with [[[[[[cc]yy]mm]dd]HH]MM[.ss]]. We have to ++ # transform the ISO8601 date first though. ++ NetBSD|OpenBSD|DragonFly|FreeBSD) ++ last_commit_date="$(echo ${last_commit_date} | \ ++ sed -n -e 's/\(....\)-\(..\)-\(..\)T\(..\):\(..\):\(..\)Z/\1\2\3\4\5\.\6/p')" ++ t=$(date -u -j "${last_commit_date}" "$1" 2>/dev/null);; ++ *) ++ t=$(date -u -d "${last_commit_date}" "$1" 2>/dev/null);; ++ esac ++ fi ++ elif git_is_file_tracked "$2" ; then ++ # are there local changes? ++ if git_has_local_changes "$2" ; then ++ t=$(date -u "${1}") ++ else ++ # No local changes, get date of the last commit ++ case $(uname) in ++ # Most BSD dates do not support parsing date values from user input with -d but all of ++ # them support parsing epoch seconds with -r. Thanks to git we can easily use that: ++ NetBSD|OpenBSD|DragonFly|FreeBSD) ++ t=$(date -u -r "$(git log --pretty=format:%ct -1 -- $2)" "$1" 2>/dev/null);; ++ *) ++ t=$(date -d "$(git log --pretty=format:%cD -1 -- $2)" -u "$1" 2>/dev/null);; ++ esac ++ fi ++ else ++ t=$(date -u "$1") ++ fi ++ ++ if [ -z "$t" ]; then ++ echo "Warning: Could not determine timestamp." 2>/dev/null ++ fi ++ echo "${t}" ++} ++ ++# Retrieve local SCM revision info. This is useful if we're working in a different SCM than upstream and/or ++# have local changes. ++local_revision() { ++ local r= ++ ++ if svn_is_file_tracked "$1" ; then ++ r=$(svn_has_local_changes "$1" && echo "dirty") ++ elif git_is_file_tracked "$1" ; then ++ r=$(git_last_commit "$1") ++ ++ local svn_base=$(git log --grep git-svn-id -1 --format='%h') ++ if [ "$svn_base" != "" ] ; then ++ local diff_to_svn=$(git rev-list --count ${svn_base}..${r}) ++ if [ "$diff_to_svn" -gt 0 ] ; then ++ r="$r-$diff_to_svn" ++ fi ++ fi ++ ++ if git_has_local_changes "$1" ; then ++ r="$r-dirty" ++ fi ++ else ++ return ${EXIT_FAILURE} ++ fi ++ ++ echo "${r}" ++} ++ ++# Get the upstream flashrom revision stored in SVN metadata. ++upstream_revision() { ++ local r= ++ ++ if svn_is_file_tracked "$1" ; then ++ r=$(svn info "$1" 2>/dev/null | \ ++ grep "Last Changed Rev:" | \ ++ sed -e "s/^Last Changed Rev: *//" -e "s/\([0-9]*\).*/r\1/" | \ ++ grep "r[0-9]") ++ elif git_is_file_tracked "$1" ; then ++ # If this is a "native" git-svn clone we could use git svn log: ++ # git svn log --oneline -1 | sed 's/^r//;s/[[:blank:]].*//' or even git svn find-rev ++ # but it is easier to just grep for the git-svn-id unconditionally ++ r=$(git log --grep git-svn-id -1 -- "$1" | \ ++ grep git-svn-id | \ ++ sed 's/.*@/r/;s/[[:blank:]].*//') ++ fi ++ ++ if [ -z "$r" ]; then ++ r="unknown" # default to unknown ++ fi ++ echo "${r}" ++} ++ ++show_help() { ++ echo "Usage: ++ ${0} [path] ++ ++Commands ++ -h or --help ++ this message ++ -l or --local ++ local revision information including an indicator for uncommitted changes ++ -u or --upstream ++ upstream revision ++ -U or --url ++ URL associated with the latest commit ++ -d or --date ++ date of most recent modification ++ -t or --timestamp ++ timestamp of most recent modification ++" ++ return ++} ++ ++check_action() { ++ if [ -n "$action" ]; then ++ echo "Error: Multiple actions given.">&2 ++ exit ${EXIT_FAILURE} ++ fi ++} ++ ++main() { ++ local query_path= ++ local action= ++ ++ # The is the main loop ++ while [ $# -gt 0 ]; ++ do ++ case ${1} in ++ -h|--help) ++ action=show_help; ++ shift;; ++ -l|--local) ++ check_action $1 ++ action=local_revision ++ shift;; ++ -u|--upstream) ++ check_action $1 ++ action=upstream_revision ++ shift;; ++ -U|--url) ++ check_action $1 ++ action=scm_url ++ shift;; ++ -d|--date) ++ check_action $1 ++ action="timestamp +%Y-%m-%d" # refrain from suffixing 'Z' to indicate it's UTC ++ shift;; ++ -t|--timestamp) ++ check_action $1 ++ action="timestamp +%Y-%m-%dT%H:%M:%SZ" # There is only one valid time format! ISO 8601 ++ shift;; ++ -*) ++ show_help; ++ echo "Error: Invalid option: ${1}" ++ exit ${EXIT_FAILURE};; ++ *) ++ if [ -z "$query_path" ] ; then ++ if [ ! -e "$1" ] ; then ++ echo "Error: Path \"${1}\" does not exist.">&2 ++ exit ${EXIT_FAILURE} ++ fi ++ query_path=$1 ++ else ++ echo "Warning: Ignoring over-abundant paramter: \"${1}\"">&2 ++ fi ++ shift;; ++ esac; ++ done ++ ++ # default to current directory (usually equals the whole repository) ++ if [ -z "$query_path" ] ; then ++ query_path=. ++ fi ++ if ! is_file_tracked "$query_path" ; then ++ echo "Warning: Path \"${query_path}\" is not under version control.">&2 ++ fi ++ if [ -z "$action" ] ; then ++ show_help ++ echo "Error: No actions specified" ++ exit ${EXIT_FAILURE} ++ fi ++ ++ $action "$query_path" ++} ++ ++main $@ +diff --git a/util/ich_descriptors_tool/ich_descriptors_tool.c b/util/ich_descriptors_tool/ich_descriptors_tool.c +index c359913..dd35860 100644 +--- a/util/ich_descriptors_tool/ich_descriptors_tool.c ++++ b/util/ich_descriptors_tool/ich_descriptors_tool.c +@@ -77,12 +77,13 @@ static void dump_file(const char *prefix, const uint32_t *dump, unsigned int len + printf("Dumping %u bytes of the %s region from 0x%08x-0x%08x to %s... ", + file_len, region_names[i], base, limit, fn); + int fh = open(fn, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); +- free(fn); + if (fh < 0) { + fprintf(stderr, + "ERROR: couldn't open(%s): %s\n", fn, strerror(errno)); ++ free(fn); + exit(1); + } ++ free(fn); + + ret = write(fh, &dump[base >> 2], file_len); + if (ret != file_len) { +@@ -120,6 +121,7 @@ static void usage(char *argv[], char *error) + "\t- \"5\" or \"ibex\" for Intel's 5 series chipsets,\n" + "\t- \"6\" or \"cougar\" for Intel's 6 series chipsets,\n" + "\t- \"7\" or \"panther\" for Intel's 7 series chipsets.\n" ++"\t- \"avoton\",\n" + "If '-d' is specified some regions such as the BIOS image as seen by the CPU or\n" + "the GbE blob that is required to initialize the GbE are also dumped to files.\n", + argv[0], argv[0]); +@@ -197,6 +199,10 @@ int main(int argc, char *argv[]) + else if ((strcmp(csn, "7") == 0) || + (strcmp(csn, "panther") == 0)) + cs = CHIPSET_7_SERIES_PANTHER_POINT; ++#ifdef DELL_AVOTON_SUPPORT ++ else if (strcmp(csn, "avoton") == 0) ++ cs = CHIPSET_AVOTON; ++#endif + } + + ret = read_ich_descriptors_from_dump(buf, len, &desc); +diff --git a/util/z60_flashrom.rules b/util/z60_flashrom.rules +index 8456a04..948563c 100644 +--- a/util/z60_flashrom.rules ++++ b/util/z60_flashrom.rules +@@ -80,4 +80,8 @@ ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev" + # http://www.diygadget.com/tiao-usb-multi-protocol-adapter-jtag-spi-i2c-serial.html + ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a98", MODE="664", GROUP="plugdev" + ++# TIAO/DIYGADGET USB Multi-Protocol Adapter (TUMPA) Lite ++# http://www.tiaowiki.com/w/TIAO_USB_Multi_Protocol_Adapter_Lite_User's_Manual ++ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8a99", MODE="664", GROUP="plugdev" ++ + LABEL="flashrom_rules_end" +-- +2.7.4 + diff --git a/platform/broadcom/sonic-platform-modules-dell/tools/flashrom.sh b/platform/broadcom/sonic-platform-modules-dell/tools/flashrom.sh new file mode 100755 index 000000000000..c3af65fd6d84 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-dell/tools/flashrom.sh @@ -0,0 +1,10 @@ +#!/bin/bash +export DELL_TOOLS_DIR="platform/broadcom/sonic-platform-modules-dell/tools" + +cd $DELL_TOOLS_DIR +rm -rf $DELL_TOOLS_DIR/flashrom +git clone https://github.com/flashrom/flashrom.git +cd flashrom +git checkout tags/0.9.7 +git apply ../0002-Flashrom-support-for-Intel-Rangeley-and-Denverton-CP.patch +make From d63d30682023040dd55980cbf73c8be399f9e975 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 23 Aug 2019 11:55:24 -0700 Subject: [PATCH 38/54] [device/arista] Update drivers submodules (#3378) - increase timeout for power supply driver initialization --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index 8c45a8e11153..7b39cf3400dd 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 8c45a8e111534f9d4337d3552eaf08881fb19d30 +Subproject commit 7b39cf3400dd728494b91810db9cc82542a22584 diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 8c45a8e11153..7b39cf3400dd 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 8c45a8e111534f9d4337d3552eaf08881fb19d30 +Subproject commit 7b39cf3400dd728494b91810db9cc82542a22584 From ba4566f3c9b49d65f5687b21bc53a9425e986b1c Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Sat, 24 Aug 2019 02:58:03 +0800 Subject: [PATCH 39/54] [mlnx_platform_api.thermal]align thermal sensor names with hw-management v2.0.0191 (#3371) temp_xxxx_module{} => module{}_temp_xxxx --- platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py index 5195d378a468..6614e368e547 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/thermal.py @@ -49,8 +49,8 @@ THERMAL_API_GET_HIGH_THRESHOLD:"cpu_pack_max" } thermal_api_handler_module = { - THERMAL_API_GET_TEMPERATURE:"temp_input_module{}", - THERMAL_API_GET_HIGH_THRESHOLD:"temp_crit_module{}" + THERMAL_API_GET_TEMPERATURE:"module{}_temp_input", + THERMAL_API_GET_HIGH_THRESHOLD:"module{}_temp_crit" } thermal_api_handler_psu = { THERMAL_API_GET_TEMPERATURE:"psu{}_temp", From dedd2cc2a450da44a11db5670afd108ef7de7aea Mon Sep 17 00:00:00 2001 From: Aravind Mani <53524901+aravindmani-1@users.noreply.github.com> Date: Sat, 24 Aug 2019 00:30:37 +0530 Subject: [PATCH 40/54] Z9264f-LED_changes (#3376) Updated z9264_platform.sh to change appropriate LED when HWSKU is changed. --- .../debian/platform-modules-z9264f.init | 2 +- .../z9264f/scripts/z9264f_platform.sh | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9264f.init b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9264f.init index cc83662e7746..fb0b68117972 100755 --- a/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9264f.init +++ b/platform/broadcom/sonic-platform-modules-dell/debian/platform-modules-z9264f.init @@ -22,7 +22,7 @@ start) ;; stop) - /usr/local/bin/z9100_platform.sh deinit + /usr/local/bin/z9264f_platform.sh deinit echo "done." ;; diff --git a/platform/broadcom/sonic-platform-modules-dell/z9264f/scripts/z9264f_platform.sh b/platform/broadcom/sonic-platform-modules-dell/z9264f/scripts/z9264f_platform.sh index 880ba98abb1f..9fd925f2b90d 100755 --- a/platform/broadcom/sonic-platform-modules-dell/z9264f/scripts/z9264f_platform.sh +++ b/platform/broadcom/sonic-platform-modules-dell/z9264f/scripts/z9264f_platform.sh @@ -85,6 +85,22 @@ switch_board_modsel() { python /usr/bin/pcisysfs.py --set --offset $hex --val 0x10 --res $resource > /dev/null 2>&1 done } + +# Copy led_proc_init.soc file according to the HWSKU +init_switch_port_led() { + device="/usr/share/sonic/device" + platform=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) + hwsku=$(cat /etc/sonic/config_db.json | grep "hwsku" | cut -d ":" -f2 | sed 's/"//g' | sed 's/,//g'| xargs ) + + led_proc_init="$device/$platform/$hwsku/led_proc_init.soc" + # Remove old HWSKU LED file.. + rm -rf $device/$platform/led_proc_init.soc + + if [ -e $led_proc_init ] && [ ! -e $device/$platform/led_proc_init.soc ]; then + cp $led_proc_init $device/$platform/ + fi +} + init_devnum if [ "$1" == "init" ]; then @@ -98,6 +114,7 @@ if [ "$1" == "init" ]; then switch_board_qsfp_mux "new_device" switch_board_qsfp "new_device" switch_board_modsel + init_switch_port_led python /usr/bin/qsfp_irq_enable.py elif [ "$1" == "deinit" ]; then From 89bc93e13bed5383906dfaf7709d879f532e5581 Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Sat, 24 Aug 2019 03:02:36 +0800 Subject: [PATCH 41/54] remove platform_wait script from mellanox simx platform (#3380) mellanox simx platform don't have QSFP sysfs created, this script will cause timeout issue on simx platform Signed-off-by: Kebo Liu --- device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_wait | 1 - device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_wait | 1 - 2 files changed, 2 deletions(-) delete mode 120000 device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_wait delete mode 120000 device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_wait diff --git a/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_wait b/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_wait deleted file mode 120000 index 4b30bd429854..000000000000 --- a/device/mellanox/x86_64-mlnx_msn2700_simx-r0/platform_wait +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn2700-r0/platform_wait \ No newline at end of file diff --git a/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_wait b/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_wait deleted file mode 120000 index 685dfb8437fc..000000000000 --- a/device/mellanox/x86_64-mlnx_msn3700_simx-r0/platform_wait +++ /dev/null @@ -1 +0,0 @@ -../x86_64-mlnx_msn3700-r0/platform_wait \ No newline at end of file From aaf76b3971f9088330bedd89b870359cad6d1aa0 Mon Sep 17 00:00:00 2001 From: "ruijie.com.cn" Date: Tue, 27 Aug 2019 01:35:41 +0800 Subject: [PATCH 42/54] [doc]: use docker without sudo (#3336) Users can install docker with sudo, and it requires sudo to issue docker command. This will cause few errors in Makefile.work which need use docker without sudo. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 9c486e412063..afa26457fe4f 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,11 @@ Install pip and jinja in host build machine, execute below commands if j2/j2cli sudo pip install --force-reinstall --upgrade jinja2>=2.10 sudo pip install j2cli +Configure your system to allow running the 'docker' command without 'sudo': + Add current user to the docker group + `sudo gpasswd -a ${USER} docker` + Log out and log back in so that your group membership is re-evaluated + ## SAI Version Please refer to [SONiC roadmap](https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning) on the SAI version for each SONiC release. From 8e95699bb28e89156f4075d61886dcdf4bb6e5f4 Mon Sep 17 00:00:00 2001 From: zzhiyuan Date: Wed, 28 Aug 2019 08:44:13 -0700 Subject: [PATCH 43/54] [devices]: Add serdes tuning for Arista 7060PX4 32x400G (#3382) --- .../th3-a7060px4-o32-32x400G.config.bcm | 34 +++++++++++++++++++ src/sonic-device-data/tests/config_checker | 2 +- src/sonic-device-data/tests/permitted_list | 1 + 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm index 5cb507321b02..d3a66dee635f 100644 --- a/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm +++ b/device/arista/x86_64-arista_7060px4_32/Arista-7060PX4-O32/th3-a7060px4-o32-32x400G.config.bcm @@ -815,3 +815,37 @@ serdes_core_tx_polarity_flip_physical{233}=0x36 serdes_core_tx_polarity_flip_physical{241}=0xc6 serdes_core_tx_polarity_flip_physical{249}=0xc3 serdes_core_tx_polarity_flip_physical{257}=0x0 +serdes_tx_taps_cd0=pam4:-28:124:-12:4:0:0 +serdes_tx_taps_cd1=pam4:-28:124:-12:4:0:0 +serdes_tx_taps_cd2=pam4:-28:124:-12:4:0:0 +serdes_tx_taps_cd3=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd4=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd5=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd6=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd7=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd8=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd9=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd10=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd11=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd12=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd13=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd14=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd15=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd16=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd17=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd18=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd19=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd20=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd21=pam4:-28:124:0:4:0:0 +serdes_tx_taps_cd22=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd23=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd24=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd25=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd26=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd27=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd28=pam4:-28:120:-4:4:0:0 +serdes_tx_taps_cd29=pam4:-28:124:-12:4:0:0 +serdes_tx_taps_cd30=pam4:-28:124:-12:4:0:0 +serdes_tx_taps_cd31=pam4:-28:124:-12:4:0:0 +serdes_tx_taps_cd32=pam4:1:34:9:0:0:0 +serdes_tx_taps_cd33=pam4:1:34:9:0:0:0 diff --git a/src/sonic-device-data/tests/config_checker b/src/sonic-device-data/tests/config_checker index 29f1ba3cd74b..a0e3b0cbd45c 100755 --- a/src/sonic-device-data/tests/config_checker +++ b/src/sonic-device-data/tests/config_checker @@ -33,7 +33,7 @@ def check_file(file_name): # Remove trailing unit ".$" p = re.sub(r"\.[0-9]+$", '', p) # Remove trailing port name - p = re.sub(r"_[cxg]e(\d+)?$", '', p) + p = re.sub(r"_[cxg][de](\d+)?$", '', p) # Remove trailing port id "{id/number}" p = re.sub(r"\{.*\}", '', p) # Remove trailing port name example diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 6e5a066fff65..47eea9fa9dba 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -132,6 +132,7 @@ serdes_pre_driver_current serdes_preemphasis serdes_rx_los serdes_sgmii_m +serdes_tx_taps skip_L2_USER_ENTRY sram_scan_enable stable_size From 98fdea91dc760a5571a59e33d9455a5dd7c52604 Mon Sep 17 00:00:00 2001 From: Renuka Manavalan <47282725+renukamanavalan@users.noreply.github.com> Date: Wed, 28 Aug 2019 09:29:48 -0700 Subject: [PATCH 44/54] Create the src archive in target/ when INSTALL_DEBUG_TOOLS=y (#3323) * Create the src archive in target/ when INSTALL_DEBUG_TOOLS=y * Dropped -v (verbose flag) from tar command --- build_debian.sh | 5 +---- scripts/dbg_files.sh | 11 +++++++---- slave.mk | 7 ++++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/build_debian.sh b/build_debian.sh index 126a8ee329eb..58abc0154c92 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -488,10 +488,7 @@ then sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo '/debug is mounted in each docker' >> /etc/motd" sudo mkdir -p $FILESYSTEM_ROOT/src - pushd src - ../scripts/dbg_files.sh | sudo tar -cvzf ../$FILESYSTEM_ROOT/src/sonic_src.tar.gz -T - - popd - + sudo cp $DEBUG_SRC_ARCHIVE_FILE $FILESYSTEM_ROOT/src/ sudo mkdir -p $FILESYSTEM_ROOT/debug fi diff --git a/scripts/dbg_files.sh b/scripts/dbg_files.sh index 1515639bc9d7..6624fca83f34 100755 --- a/scripts/dbg_files.sh +++ b/scripts/dbg_files.sh @@ -2,8 +2,11 @@ # Provide file paths to archive for debug image as relative to src subdir # -for i in $debug_src_archive -do - find $i/ -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" -type f -done +if [ "$DEBUG_IMG" == "y" ] +then + for i in $DEBUG_SRC_ARCHIVE_DIRS + do + find src/$i/ -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" -type f + done | tar -czf $DEBUG_SRC_ARCHIVE_FILE -T - +fi diff --git a/slave.mk b/slave.mk index c85ce2289603..0cb618e21cd7 100644 --- a/slave.mk +++ b/slave.mk @@ -37,6 +37,7 @@ PROJECT_ROOT = $(shell pwd) STRETCH_DEBS_PATH = $(TARGET_PATH)/debs/stretch STRETCH_FILES_PATH = $(TARGET_PATH)/files/stretch DBG_IMAGE_MARK = dbg +DBG_SRC_ARCHIVE_FILE = $(TARGET_PATH)/sonic_src.tar.gz CONFIGURED_PLATFORM := $(shell [ -f .platform ] && cat .platform || echo generic) PLATFORM_PATH = platform/$(CONFIGURED_PLATFORM) @@ -668,9 +669,13 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ chmod +x sonic_debian_extension.sh, ) - export debug_src_archive="$(DBG_SRC_ARCHIVE)" + DEBUG_IMG="$(INSTALL_DEBUG_TOOLS)" \ + DEBUG_SRC_ARCHIVE_DIRS="$(DBG_SRC_ARCHIVE)" \ + DEBUG_SRC_ARCHIVE_FILE="$(DBG_SRC_ARCHIVE_FILE)" \ + scripts/dbg_files.sh DEBUG_IMG="$(INSTALL_DEBUG_TOOLS)" \ + DEBUG_SRC_ARCHIVE_FILE="$(DBG_SRC_ARCHIVE_FILE)" \ USERNAME="$(USERNAME)" \ PASSWORD="$(PASSWORD)" \ ./build_debian.sh $(LOG) From 8f278515dc4643d36cec4a6eb20860cb00c2d98b Mon Sep 17 00:00:00 2001 From: "arheneus@marvell.com" <51254330+antony-rheneus@users.noreply.github.com> Date: Wed, 28 Aug 2019 22:03:03 +0530 Subject: [PATCH 45/54] [Makefile] Multiarch docker service cleanup at make reset (#3366) * [Makefile] make reset target changed to ONESHELL and multiarch docker stop has been added in reset Signed-off-by: Antony Rheneus --- Makefile.work | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/Makefile.work b/Makefile.work index 4198f3135f3c..7a3524a520b5 100644 --- a/Makefile.work +++ b/Makefile.work @@ -230,18 +230,24 @@ init : @git submodule update --init --recursive @git submodule foreach --recursive '[ -f .git ] && echo "gitdir: $$(realpath --relative-to=. $$(cut -d" " -f2 .git))" > .git' +.ONESHELL : reset reset : @echo && echo -n "Warning! All local changes will be lost. Proceed? [y/N]: " - @read ans && \ - if [ $$ans == y ]; then \ - echo "Resetting local repository. Please wait..."; \ - $(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) sudo rm -rf fsroot; \ - git clean -xfdf; \ - git reset --hard; \ - git submodule foreach --recursive git clean -xfdf; \ - git submodule foreach --recursive git reset --hard; \ - git submodule update --init --recursive; \ - echo "Reset complete!"; \ - else \ - echo "Reset aborted"; \ - fi + @read ans && ( + if [ $$ans == y ]; then + echo "Resetting local repository. Please wait..."; + $(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) sudo rm -rf fsroot; + if [[ "$(CONFIGURED_ARCH)" == "armhf" || "$(CONFIGURED_ARCH)" == "arm64" ]]; then + echo "Stopping march $(CONFIGURED_ARCH) docker" + sudo kill -9 `sudo cat /var/run/march/docker.pid` || true + sudo rm -f /var/run/march/docker.pid || true + fi + git clean -xfdf; + git reset --hard; + git submodule foreach --recursive git clean -xfdf; + git submodule foreach --recursive git reset --hard; + git submodule update --init --recursive; + echo "Reset complete!"; + else + echo "Reset aborted"; + fi ) From ccd51c20ec1667ffcb28f11d1d6b8b3d993bc74a Mon Sep 17 00:00:00 2001 From: Dong Zhang <41927498+dzhangalibaba@users.noreply.github.com> Date: Wed, 28 Aug 2019 11:15:10 -0700 Subject: [PATCH 46/54] create multiple Redis DB instances based on CONFIG at /etc/sonic/database_config.json (#2182) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit this is the first step to moving different databases tables into different database instances in this PR, only handle multiple database instances creation based on user configuration at /etc/sonic/database_config.json we keep current method to create single database instance if no extra/new DATABASE configuration exist in database_config.json file. if user try to configure more db instances at database_config.json , we create those new db instances along with the original db instance existing today. The configuration is as below, later we can add more db related information if needed: { ... "DATABASE": { "redis-db-01" : { "port" : "6380", "database": ["APPL_DB", "STATE_DB"] }, "redis-db-02" : { "port" : "6381", "database":["ASIC_DB"] }, } ... } The detail description is at design doc at Azure/SONiC#271 The main idea is : when database.sh started, we check the configuration and generate corresponding scripts. rc.local service handle old_config copy when loading new images, there is no dependency between rc.local and database service today, for safety and make sure the copy operation are done before database try to read it, we make database service run after rc.local Then database docker started, we check the configuration and generate corresponding scripts/.conf in database docker as well. based on those conf, we create databases instances as required. at last, we ping_pong check database are up and continue 
Signed-off-by: Dong Zhang d.zhang@alibaba-inc.com --- dockers/docker-database/Dockerfile.j2 | 7 ++- dockers/docker-database/database_config.json | 43 +++++++++++++++++++ .../docker-database/docker-database-init.sh | 14 ++++++ dockers/docker-database/ping_pong_db_insts | 40 +++++++++++++++++ dockers/docker-database/supervisord.conf | 21 --------- dockers/docker-database/supervisord.conf.j2 | 24 +++++++++++ files/build_templates/database.service.j2 | 1 + files/build_templates/docker_image_ctl.j2 | 10 +++-- 8 files changed, 133 insertions(+), 27 deletions(-) create mode 100644 dockers/docker-database/database_config.json create mode 100755 dockers/docker-database/docker-database-init.sh create mode 100755 dockers/docker-database/ping_pong_db_insts delete mode 100644 dockers/docker-database/supervisord.conf create mode 100644 dockers/docker-database/supervisord.conf.j2 diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index 9ec3926de6fb..acb5e013fb84 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -32,6 +32,9 @@ RUN apt-get clean -y && \ s/^client-output-buffer-limit pubsub [0-9]+mb [0-9]+mb [0-9]+/client-output-buffer-limit pubsub 0 0 0/ \ ' /etc/redis/redis.conf -COPY ["supervisord.conf", "/etc/supervisor/conf.d/"] +COPY ["supervisord.conf.j2", "/usr/share/sonic/templates/"] +COPY ["docker-database-init.sh", "/usr/local/bin/"] +COPY ["ping_pong_db_insts", "/usr/local/bin/"] +COPY ["database_config.json", "/etc/default/sonic-db/"] -ENTRYPOINT ["/usr/bin/supervisord"] +ENTRYPOINT ["/usr/local/bin/docker-database-init.sh"] diff --git a/dockers/docker-database/database_config.json b/dockers/docker-database/database_config.json new file mode 100644 index 000000000000..6725af38c5ea --- /dev/null +++ b/dockers/docker-database/database_config.json @@ -0,0 +1,43 @@ +{ + "INSTANCES": { + "redis":{ + "port": 6379, + "socket": "/var/run/redis/redis.sock" + } + }, + "DATABASES" : { + "APPL_DB" : { + "id" : 0, + "instance" : "redis" + }, + "ASIC_DB" : { + "id" : 1, + "instance" : "redis" + }, + "COUNTERS_DB" : { + "id" : 2, + "instance" : "redis" + }, + "LOGLEVEL_DB" : { + "id" : 3, + "instance" : "redis" + }, + "CONFIG_DB" : { + "id" : 4, + "instance" : "redis" + }, + "PFC_WD_DB" : { + "id" : 5, + "instance" : "redis" + }, + "FLEX_COUNTER_DB" : { + "id" : 5, + "instance" : "redis" + }, + "STATE_DB" : { + "id" : 6, + "instance" : "redis" + } + }, + "VERSION" : "1.0" +} diff --git a/dockers/docker-database/docker-database-init.sh b/dockers/docker-database/docker-database-init.sh new file mode 100755 index 000000000000..ebdcc6abb694 --- /dev/null +++ b/dockers/docker-database/docker-database-init.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +mkdir -p /var/run/redis/sonic-db +if [ -f /etc/sonic/database_config.json ]; then + cp /etc/sonic/database_config.json /var/run/redis/sonic-db +else + cp /etc/default/sonic-db/database_config.json /var/run/redis/sonic-db +fi + +mkdir -p /etc/supervisor/conf.d/ +# generate all redis server supervisord configuration file +sonic-cfggen -j /var/run/redis/sonic-db/database_config.json -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf + +exec /usr/bin/supervisord diff --git a/dockers/docker-database/ping_pong_db_insts b/dockers/docker-database/ping_pong_db_insts new file mode 100755 index 000000000000..484d4da0cfb0 --- /dev/null +++ b/dockers/docker-database/ping_pong_db_insts @@ -0,0 +1,40 @@ +#!/usr/bin/python +import json +import os +import subprocess +import time +import syslog + +def ping_redis(cmd): + output = '' + while True: + try: + output = subprocess.check_output(cmd, shell=True) + except subprocess.CalledProcessError as e: + syslog.syslog(syslog.LOG_ERR, 'ping redis failed, cmd : {}'.format(cmd)) + + if 'PONG' in output: + break + syslog.syslog(syslog.LOG_ERR, 'ping response : {}'.format(output)) + time.sleep(1) + +database_config_file = "/var/run/redis/sonic-db/database_config.json" + +data = {} +while True: + if os.path.isfile(database_config_file): + with open(database_config_file, "r") as read_file: + data = json.load(read_file) + break + time.sleep(1) + syslog.syslog(syslog.LOG_ERR, 'config file {} does not exist right now'.format(database_config_file)) + +while True: + if 'INSTANCES' in data: + for inst in data["INSTANCES"]: + port = data["INSTANCES"][inst]["port"] + cmd = "redis-cli -p " + str(port) + " ping" + ping_redis(cmd) + break + time.sleep(1) + syslog.syslog(syslog.LOG_ERR, 'config file {} does not have INSTANCES'.format(database_config_file)) diff --git a/dockers/docker-database/supervisord.conf b/dockers/docker-database/supervisord.conf deleted file mode 100644 index 798fedd0c895..000000000000 --- a/dockers/docker-database/supervisord.conf +++ /dev/null @@ -1,21 +0,0 @@ -[supervisord] -logfile_maxbytes=1MB -logfile_backups=2 -nodaemon=true - -[program:rsyslogd] -command=/bin/bash -c "rm -f /var/run/rsyslogd.pid && /usr/sbin/rsyslogd -n" -priority=1 -autostart=true -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - -[program:redis-server] -command=/bin/bash -c "{ [[ -s /var/lib/redis/dump.rdb ]] || rm -f /var/lib/redis/dump.rdb; } && exec /usr/bin/redis-server /etc/redis/redis.conf" -priority=2 -autostart=true -autorestart=false -stdout_logfile=syslog -stderr_logfile=syslog - diff --git a/dockers/docker-database/supervisord.conf.j2 b/dockers/docker-database/supervisord.conf.j2 new file mode 100644 index 000000000000..9e4a42d6b3a4 --- /dev/null +++ b/dockers/docker-database/supervisord.conf.j2 @@ -0,0 +1,24 @@ +[supervisord] +logfile_maxbytes=1MB +logfile_backups=2 +nodaemon=true + +[program:rsyslogd] +command=/bin/bash -c "rm -f /var/run/rsyslogd.pid && /usr/sbin/rsyslogd -n" +priority=1 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog + +{% if INSTANCES %} +{% for redis_inst, redis_items in INSTANCES.iteritems() %} +[program: {{ redis_inst }}] +command=/bin/bash -c "{ [[ -s /var/lib/{{ redis_inst }}/dump.rdb ]] || rm -f /var/lib/{{ redis_inst }}/dump.rdb; } && mkdir -p /var/lib/{{ redis_inst }} && exec /usr/bin/redis-server /etc/redis/redis.conf --port {{ redis_items['port'] }} --unixsocket {{ redis_items['socket'] }} --pidfile /var/run/redis/{{ redis_inst }}.pid --dir /var/lib/{{ redis_inst }}" +priority=2 +autostart=true +autorestart=false +stdout_logfile=syslog +stderr_logfile=syslog +{% endfor %} +{% endif %} diff --git a/files/build_templates/database.service.j2 b/files/build_templates/database.service.j2 index efa98b168beb..472b9d328b7d 100644 --- a/files/build_templates/database.service.j2 +++ b/files/build_templates/database.service.j2 @@ -2,6 +2,7 @@ Description=Database container Requires=docker.service After=docker.service +After=rc-local.service [Service] User=root diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index 9966728988bd..756ce16a2bc0 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -71,10 +71,7 @@ function postStartAction() { {%- if docker_container_name == "database" %} # Wait until redis starts - REDIS_SOCK="/var/run/redis/redis.sock" - until [[ $(/usr/bin/docker exec database redis-cli -s $REDIS_SOCK ping | grep -c PONG) -gt 0 ]]; do - sleep 1; - done + /usr/bin/docker exec database ping_pong_db_insts if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast") && -f $WARM_DIR/dump.rdb ]]; then rm -f $WARM_DIR/dump.rdb else @@ -163,6 +160,11 @@ start() { {%- if docker_container_name == "database" %} echo "Creating new {{docker_container_name}} container" + # if database_config exists in old_config, use it; otherwise use the default one in new image + if [ -f /etc/sonic/old_config/database_config.json ]; then + echo "Use database_config.json from old system..." + mv /etc/sonic/old_config/database_config.json /etc/sonic/ + fi {%- else %} echo "Creating new {{docker_container_name}} container with HWSKU $HWSKU" {%- endif %} From ce07586659a568844d68f9501a809ba7814ad267 Mon Sep 17 00:00:00 2001 From: Wirut Getbamrung Date: Thu, 29 Aug 2019 01:19:34 +0700 Subject: [PATCH 47/54] [platform/cel]: Add new API installer to pmon and base image (#3379) * [platform/cel]: Add new api installer * [device/celestica]: Update APIs to support both pmon and base image * [device/e1031]: update hwmon name --- .../x86_64-cel_e1031-r0/fancontrol-B2F | 2 +- .../sonic_platform/__init__.py | 2 + .../sonic_platform/chassis.py | 19 ++++-- .../x86_64-cel_e1031-r0/sonic_platform/fan.py | 1 + .../x86_64-cel_e1031-r0/sonic_platform/sfp.py | 48 ++++++--------- .../sonic_platform/thermal.py | 8 +-- .../sonic_platform/__init__.py | 2 + .../sonic_platform/chassis.py | 34 +++++++++-- .../sonic_platform/fan.py | 1 - .../sonic_platform/sfp.py | 61 +++++++++---------- .../sonic_platform/thermal.py | 16 +++-- .../debian/platform-modules-dx010.init | 2 + .../debian/platform-modules-dx010.install | 2 + .../debian/platform-modules-dx010.postinst | 3 + .../debian/platform-modules-haliburton.init | 2 + .../platform-modules-haliburton.install | 2 + .../platform-modules-haliburton.postinst | 4 +- .../sonic-platform-modules-cel/debian/rules | 3 + .../sonic-platform-modules-cel/dx010/setup.py | 34 +++++++++++ .../haliburton/setup.py | 34 +++++++++++ .../platform_api/platform_api_mgnt.sh | 41 +++++++++++++ 21 files changed, 230 insertions(+), 91 deletions(-) create mode 100644 platform/broadcom/sonic-platform-modules-cel/dx010/setup.py create mode 100644 platform/broadcom/sonic-platform-modules-cel/haliburton/setup.py create mode 100755 platform/broadcom/sonic-platform-modules-cel/services/platform_api/platform_api_mgnt.sh diff --git a/device/celestica/x86_64-cel_e1031-r0/fancontrol-B2F b/device/celestica/x86_64-cel_e1031-r0/fancontrol-B2F index cab392995bb5..883f3c0c899d 100644 --- a/device/celestica/x86_64-cel_e1031-r0/fancontrol-B2F +++ b/device/celestica/x86_64-cel_e1031-r0/fancontrol-B2F @@ -1,7 +1,7 @@ # Configuration file generated by pwmconfig, changes will be lost INTERVAL=2 DEVPATH=hwmon3=devices/pci0000:00/0000:00:13.0/i2c-0/i2c-8/i2c-23/23-004d hwmon2=devices/pci0000:00/0000:00:13.0/i2c-0/i2c-8/i2c-11/11-001a -DEVNAME=hwmon3=emc2305 hwmon2=max6697 +DEVNAME=hwmon3=emc2305 hwmon2=max6699 FCTEMPS=hwmon3/device/pwm1=hwmon2/temp1_input hwmon3/device/pwm2=hwmon2/temp1_input hwmon3/device/pwm4=hwmon2/temp1_input FCFANS=hwmon3/device/pwm1=hwmon3/device/fan1_input hwmon3/device/pwm2=hwmon3/device/fan2_input hwmon3/device/pwm4=hwmon3/device/fan4_input MINTEMP=hwmon3/device/pwm1=27 hwmon3/device/pwm2=27 hwmon3/device/pwm4=27 diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/__init__.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/__init__.py index e69de29bb2d1..d82f3749319c 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/__init__.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ["platform", "chassis"] +from sonic_platform import * diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/chassis.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/chassis.py index a611be9d47dc..fde9afaa6f46 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/chassis.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/chassis.py @@ -31,8 +31,10 @@ NUM_THERMAL = 7 NUM_SFP = 52 RESET_REGISTER = "0x112" -REBOOT_CAUSE_PATH = "/host/reboot-cause/previous-reboot-cause.txt" +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/previous-reboot-cause.txt" +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/previous-reboot-cause.txt" COMPONENT_NAME_LIST = ["SMC_CPLD", "MMC_CPLD", "BIOS"] +HOST_CHK_CMD = "docker > /dev/null 2>&1" class Chassis(ChassisBase): @@ -53,17 +55,23 @@ def __init__(self): sfp = Sfp(index) self._sfp_list.append(sfp) ChassisBase.__init__(self) + self._reboot_cause_path = HOST_REBOOT_CAUSE_PATH if self.__is_host( + ) else PMON_REBOOT_CAUSE_PATH self._component_name_list = COMPONENT_NAME_LIST self._watchdog = Watchdog() self._eeprom = Tlv() + def __is_host(self): + return os.system(HOST_CHK_CMD) == 0 + def __read_txt_file(self, file_path): try: with open(file_path, 'r') as fd: data = fd.read() return data.strip() except IOError: - raise IOError("Unable to open %s file !" % file_path) + pass + return None def get_base_mac(self): """ @@ -137,14 +145,15 @@ def get_reboot_cause(self): description = 'None' reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER hw_reboot_cause = self.component.get_register_value(RESET_REGISTER) - sw_reboot_cause = self.__read_txt_file(REBOOT_CAUSE_PATH) + sw_reboot_cause = self.__read_txt_file( + self._reboot_cause_path) or "Unknown" - if sw_reboot_cause != "Unexpected reboot": + if hw_reboot_cause == "0x55": reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE description = sw_reboot_cause elif hw_reboot_cause == "0x11": reboot_cause = self.REBOOT_CAUSE_POWER_LOSS - elif hw_reboot_cause == "0x33" or hw_reboot_cause == "0x55": + elif hw_reboot_cause == "0x33": reboot_cause = self.REBOOT_CAUSE_WATCHDOG else: reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/fan.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/fan.py index ad993ce24182..88e21b3e5ee9 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/fan.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/fan.py @@ -34,6 +34,7 @@ def __init__(self, fan_index): self.index = fan_index self.config_data = {} self.fan_speed = 0 + FanBase.__init__(self) # e1031 fan attributes # Single emc2305 chip located at i2c-23-4d diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py index 8379299569f5..c67e487e4cd4 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/sfp.py @@ -35,6 +35,7 @@ class Sfp(SfpBase, SfpUtilBase): } PRS_PATH = "/sys/devices/platform/e1031.smc/SFP/sfp_modabs" PLATFORM_ROOT_PATH = '/usr/share/sonic/device' + PMON_HWSKU_PATH = '/usr/share/sonic/hwsku' SFP_STATUS_CONTROL_OFFSET = 110 SFP_STATUS_CONTROL_WIDTH = 1 @@ -61,6 +62,9 @@ class Sfp(SfpBase, SfpUtilBase): SFP_EEPROM_TX_PWR_KEY = "TXPower" SFP_EEPROM_TX_BS_KEY = "TXBias" SFP_EEPROM_STATUS_CON_KEY = "StatusControl" + PLATFORM = "x86_64-cel_e1031-r0" + HWSKU = "Celestica-E1031-T48S4" + HOST_CHK_CMD = "docker > /dev/null 2>&1" @property def port_start(self): @@ -122,6 +126,9 @@ def __init__(self, sfp_index): self.index = sfp_index self.port_num = self.index + 1 + def __is_host(self): + return os.system(self.HOST_CHK_CMD) == 0 + def __get_sysfsfile_eeprom(self): sysfsfile_eeprom = None sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_mapping[self.port_num] @@ -129,33 +136,14 @@ def __get_sysfsfile_eeprom(self): sysfsfile_eeprom = open( sysfs_sfp_i2c_client_eeprom_path, mode="r+b", buffering=0) except IOError: - print("Error: reading sysfs file %s" % - sysfs_sfp_i2c_client_eeprom_path) + pass return sysfsfile_eeprom def __get_path_to_port_config_file(self): - # Get platform and hwsku - machine_info = sonic_device_util.get_machine_info() - platform = sonic_device_util.get_platform_info(machine_info) - config_db = ConfigDBConnector() - config_db.connect() - data = config_db.get_table('DEVICE_METADATA') - try: - hwsku = data['localhost']['hwsku'] - except KeyError: - hwsku = "Unknown" - - # Load platform module from source - platform_path = "/".join([self.PLATFORM_ROOT_PATH, platform]) - hwsku_path = "/".join([platform_path, hwsku]) - - # First check for the presence of the new 'port_config.ini' file - port_config_file_path = "/".join([hwsku_path, "port_config.ini"]) - if not os.path.isfile(port_config_file_path): - # port_config.ini doesn't exist. Try loading the legacy 'portmap.ini' file - port_config_file_path = "/".join([hwsku_path, "portmap.ini"]) - - return port_config_file_path + platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM]) + hwsku_path = "/".join([platform_path, self.HWSKU] + ) if self.__is_host() else self.PMON_HWSKU_PATH + return "/".join([hwsku_path, "port_config.ini"]) def get_transceiver_info(self): """ @@ -405,7 +393,7 @@ def get_tx_bias(self): """ transceiver_dom_info_dict = self.get_transceiver_bulk_status() tx1_bs = transceiver_dom_info_dict.get("tx1bias", "N/A") - return [tx1_bs, "N/A", "N/A", "N/A"] + return [tx1_bs, "N/A", "N/A", "N/A"] if transceiver_dom_info_dict else [] def get_rx_power(self): """ @@ -417,7 +405,7 @@ def get_rx_power(self): """ transceiver_dom_info_dict = self.get_transceiver_bulk_status() rx1_pw = transceiver_dom_info_dict.get("rx1power", "N/A") - return [rx1_pw, "N/A", "N/A", "N/A"] + return [rx1_pw, "N/A", "N/A", "N/A"] if transceiver_dom_info_dict else [] def get_tx_power(self): """ @@ -429,7 +417,7 @@ def get_tx_power(self): """ transceiver_dom_info_dict = self.get_transceiver_bulk_status() tx1_pw = transceiver_dom_info_dict.get("tx1power", "N/A") - return [tx1_pw, "N/A", "N/A", "N/A"] + return [tx1_pw, "N/A", "N/A", "N/A"] if transceiver_dom_info_dict else [] def reset(self): """ @@ -452,7 +440,7 @@ def tx_disable(self, tx_disable): sysfsfile_eeprom = self.__get_sysfsfile_eeprom() status_control_raw = self._read_eeprom_specific_bytes( - sysfsfile_eeprom, self.SFP_STATUS_CONTROL_OFFSET, self.SFP_STATUS_CONTROL_WIDTH) + sysfsfile_eeprom, self.SFP_STATUS_CONTROL_OFFSET, self.SFP_STATUS_CONTROL_WIDTH) if sysfsfile_eeprom else None if status_control_raw is not None: tx_disable_bit = 0x80 if tx_disable else 0x7f status_control = int(status_control_raw[0], 16) @@ -551,7 +539,7 @@ def get_model(self): Returns: string: Model/part number of device """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() + transceiver_dom_info_dict = self.get_transceiver_info() return transceiver_dom_info_dict.get("modelname", "N/A") def get_serial(self): @@ -560,5 +548,5 @@ def get_serial(self): Returns: string: Serial number of device """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() + transceiver_dom_info_dict = self.get_transceiver_info() return transceiver_dom_info_dict.get("serialnum", "N/A") diff --git a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/thermal.py b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/thermal.py index a6d45dc41c93..6c37f3b7ce88 100644 --- a/device/celestica/x86_64-cel_e1031-r0/sonic_platform/thermal.py +++ b/device/celestica/x86_64-cel_e1031-r0/sonic_platform/thermal.py @@ -22,8 +22,8 @@ class Thermal(ThermalBase): """Platform-specific Thermal class""" THERMAL_NAME_LIST = [] - MAINBOARD_SS_PATH = "/sys/class/i2c-adapter/i2c-11/11-001a/hwmon/" - CPUBOARD_SS_PATH = "/sys/class/i2c-adapter/i2c-3/3-001a/hwmon/" + MAINBOARD_SS_PATH = "/sys/class/i2c-adapter/i2c-11/11-001a/hwmon/hwmon2" + CPUBOARD_SS_PATH = "/sys/class/i2c-adapter/i2c-3/3-001a/hwmon/hwmon1" SS_CONFIG_PATH = "/usr/share/sonic/device/x86_64-cel_e1031-r0/sensors.conf" def __init__(self, thermal_index): @@ -41,10 +41,8 @@ def __init__(self, thermal_index): self.THERMAL_NAME_LIST.append("CPU board temperature sensor : 2") # Set hwmon path - self.ss_index, self.ss_path = self.__get_ss_info(self.index) + self.ss_index, self.hwmon_path = self.__get_ss_info(self.index) self.ss_key = self.THERMAL_NAME_LIST[self.index] - self.hwmon_name = os.listdir(self.ss_path)[0] - self.hwmon_path = os.path.join(self.ss_path, self.hwmon_name) def __get_ss_info(self, index): if self.index <= 4: diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/__init__.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/__init__.py index e69de29bb2d1..d82f3749319c 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/__init__.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ["platform", "chassis"] +from sonic_platform import * diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py index 5e98cb3d3db8..91db08f4a61e 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/chassis.py @@ -31,8 +31,12 @@ NUM_THERMAL = 5 NUM_SFP = 32 RESET_REGISTER = "0x103" -REBOOT_CAUSE_PATH = "/host/reboot-cause/previous-reboot-cause.txt" +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" COMPONENT_NAME_LIST = ["CPLD1", "CPLD2", "CPLD3", "CPLD4", "BIOS"] +HOST_CHK_CMD = "docker > /dev/null 2>&1" class Chassis(ChassisBase): @@ -53,17 +57,22 @@ def __init__(self): sfp = Sfp(index) self._sfp_list.append(sfp) ChassisBase.__init__(self) + self._component_name_list = COMPONENT_NAME_LIST self._watchdog = Watchdog() self._eeprom = Tlv() + def __is_host(self): + return os.system(HOST_CHK_CMD) == 0 + def __read_txt_file(self, file_path): try: with open(file_path, 'r') as fd: data = fd.read() return data.strip() except IOError: - raise IOError("Unable to open %s file !" % file_path) + pass + return None def get_base_mac(self): """ @@ -136,14 +145,27 @@ def get_reboot_cause(self): self.component = Component("CPLD1") description = 'None' reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER + + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) if self.__is_host( + ) else PMON_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE + prev_reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + PREV_REBOOT_CAUSE_FILE) if self.__is_host( + ) else PMON_REBOOT_CAUSE_PATH + PREV_REBOOT_CAUSE_FILE + hw_reboot_cause = self.component.get_register_value(RESET_REGISTER) - sw_reboot_cause = self.__read_txt_file(REBOOT_CAUSE_PATH) - if sw_reboot_cause != "Unexpected reboot": + sw_reboot_cause = self.__read_txt_file( + reboot_cause_path) or "Unknown" + prev_sw_reboot_cause = self.__read_txt_file( + prev_reboot_cause_path) or "Unknown" + + if sw_reboot_cause == "Unknown" and (prev_sw_reboot_cause == "Unknown" or prev_sw_reboot_cause == self.REBOOT_CAUSE_POWER_LOSS) and hw_reboot_cause == "0x11": + reboot_cause = self.REBOOT_CAUSE_POWER_LOSS + elif sw_reboot_cause != "Unknown" and hw_reboot_cause == "0x11": reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE description = sw_reboot_cause - elif hw_reboot_cause == "0x11": - reboot_cause = self.REBOOT_CAUSE_POWER_LOSS + elif prev_reboot_cause_path != "Unknown" and hw_reboot_cause == "0x11": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = prev_sw_reboot_cause elif hw_reboot_cause == "0x22": reboot_cause = self.REBOOT_CAUSE_WATCHDOG, else: diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/fan.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/fan.py index 99e86d0a6c64..86eda4cfbe11 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/fan.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/fan.py @@ -17,7 +17,6 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") -CONFIG_DB_PATH = "/etc/sonic/config_db.json" EMC2305_PATH = "/sys/bus/i2c/drivers/emc2305/" SYS_GPIO_DIR = "/sys/class/gpio" EMC2305_MAX_PWM = 255 diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py index 6d019d7854ec..9275776e0ea8 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/sfp.py @@ -18,7 +18,7 @@ from swsssdk import ConfigDBConnector from sonic_platform_base.sfp_base import SfpBase from sonic_platform_base.sonic_sfp.sfputilbase import SfpUtilBase - from sonic_platform_base.sonic_sfp.sfputilbase import sff8436Dom + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -61,7 +61,11 @@ class Sfp(SfpBase, SfpUtilBase): RESET_PATH = "/sys/devices/platform/dx010_cpld/qsfp_reset" LP_PATH = "/sys/devices/platform/dx010_cpld/qsfp_lpmode" PRS_PATH = "/sys/devices/platform/dx010_cpld/qsfp_modprs" - PLATFORM_ROOT_PATH = '/usr/share/sonic/device' + PLATFORM_ROOT_PATH = "/usr/share/sonic/device" + PMON_HWSKU_PATH = "/usr/share/sonic/hwsku" + PLATFORM = "x86_64-cel_seastone-r0" + HWSKU = "Seastone-DX010" + HOST_CHK_CMD = "docker > /dev/null 2>&1" _port_to_eeprom_mapping = {} @@ -170,37 +174,28 @@ def __init__(self, sfp_index): (x - 1) + 26) else: self._port_to_eeprom_mapping[x] = eeprom_path.format(x + 26) - self.read_porttab_mappings(self.__get_path_to_port_config_file()) + + self.__read_porttab() SfpUtilBase.__init__(self) # Init index self.index = sfp_index self.port_num = self.index + 1 - def __get_path_to_port_config_file(self): - # Get platform and hwsku - machine_info = sonic_device_util.get_machine_info() - platform = sonic_device_util.get_platform_info(machine_info) - config_db = ConfigDBConnector() - config_db.connect() - data = config_db.get_table('DEVICE_METADATA') - + def __read_porttab(self): try: - hwsku = data['localhost']['hwsku'] - except KeyError: - hwsku = "Unknown" - - # Load platform module from source - platform_path = "/".join([self.PLATFORM_ROOT_PATH, platform]) - hwsku_path = "/".join([platform_path, hwsku]) + self.read_porttab_mappings(self.__get_path_to_port_config_file()) + except: + pass - # First check for the presence of the new 'port_config.ini' file - port_config_file_path = "/".join([hwsku_path, "port_config.ini"]) - if not os.path.isfile(port_config_file_path): - # port_config.ini doesn't exist. Try loading the legacy 'portmap.ini' file - port_config_file_path = "/".join([hwsku_path, "portmap.ini"]) + def __is_host(self): + return os.system(self.HOST_CHK_CMD) == 0 - return port_config_file_path + def __get_path_to_port_config_file(self): + platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM]) + hwsku_path = "/".join([platform_path, self.HWSKU] + ) if self.__is_host() else self.PMON_HWSKU_PATH + return "/".join([hwsku_path, "port_config.ini"]) def __read_eeprom_specific_bytes(self, offset, num_bytes): sysfsfile_eeprom = None @@ -382,7 +377,7 @@ def get_rx_los(self): """ rx_los_list = [] dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - self.QSFP_CHANNL_RX_LOS_STATUS_OFFSET, self.QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + self.QSFP_CHANNL_RX_LOS_STATUS_OFFSET, self.QSFP_CHANNL_RX_LOS_STATUS_WIDTH) if self.get_presence() else None if dom_channel_monitor_raw is not None: rx_los_data = int(dom_channel_monitor_raw[0], 16) rx_los_list.append(rx_los_data & 0x01 != 0) @@ -400,7 +395,7 @@ def get_tx_fault(self): """ tx_fault_list = [] dom_channel_monitor_raw = self.__read_eeprom_specific_bytes( - self.QSFP_CHANNL_TX_FAULT_STATUS_OFFSET, self.QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + self.QSFP_CHANNL_TX_FAULT_STATUS_OFFSET, self.QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) if self.get_presence() else None if dom_channel_monitor_raw is not None: tx_fault_data = int(dom_channel_monitor_raw[0], 16) tx_fault_list.append(tx_fault_data & 0x01 != 0) @@ -422,7 +417,7 @@ def get_tx_disable(self): return False dom_control_raw = self.__read_eeprom_specific_bytes( - self.QSFP_CONTROL_OFFSET, self.QSFP_CONTROL_WIDTH) + self.QSFP_CONTROL_OFFSET, self.QSFP_CONTROL_WIDTH) if self.get_presence() else None if dom_control_raw is not None: dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) tx_disable_list.append( @@ -476,7 +471,7 @@ def get_power_override(self): return False dom_control_raw = self.__read_eeprom_specific_bytes( - self.QSFP_CONTROL_OFFSET, self.QSFP_CONTROL_WIDTH) + self.QSFP_CONTROL_OFFSET, self.QSFP_CONTROL_WIDTH) if self.get_presence() else None if dom_control_raw is not None: dom_control_data = sfpd_obj.parse_control_bytes(dom_control_raw, 0) power_override = ( @@ -515,7 +510,7 @@ def get_tx_bias(self): tx2_bs = transceiver_dom_info_dict.get("tx2bias", "N/A") tx3_bs = transceiver_dom_info_dict.get("tx3bias", "N/A") tx4_bs = transceiver_dom_info_dict.get("tx4bias", "N/A") - return [tx1_bs, tx2_bs, tx3_bs, tx4_bs] + return [tx1_bs, tx2_bs, tx3_bs, tx4_bs] if transceiver_dom_info_dict else [] def get_rx_power(self): """ @@ -530,7 +525,7 @@ def get_rx_power(self): rx2_pw = transceiver_dom_info_dict.get("rx2power", "N/A") rx3_pw = transceiver_dom_info_dict.get("rx3power", "N/A") rx4_pw = transceiver_dom_info_dict.get("rx4power", "N/A") - return [rx1_pw, rx2_pw, rx3_pw, rx4_pw] + return [rx1_pw, rx2_pw, rx3_pw, rx4_pw] if transceiver_dom_info_dict else [] def get_tx_power(self): """ @@ -545,7 +540,7 @@ def get_tx_power(self): tx2_pw = transceiver_dom_info_dict.get("tx2power", "N/A") tx3_pw = transceiver_dom_info_dict.get("tx3power", "N/A") tx4_pw = transceiver_dom_info_dict.get("tx4power", "N/A") - return [tx1_pw, tx2_pw, tx3_pw, tx4_pw] + return [tx1_pw, tx2_pw, tx3_pw, tx4_pw] if transceiver_dom_info_dict else [] def reset(self): """ @@ -754,7 +749,7 @@ def get_model(self): Returns: string: Model/part number of device """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() + transceiver_dom_info_dict = self.get_transceiver_info() return transceiver_dom_info_dict.get("modelname", "N/A") def get_serial(self): @@ -763,5 +758,5 @@ def get_serial(self): Returns: string: Serial number of device """ - transceiver_dom_info_dict = self.get_transceiver_bulk_status() + transceiver_dom_info_dict = self.get_transceiver_info() return transceiver_dom_info_dict.get("serialnum", "N/A") diff --git a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py index 43390dce8302..1e0a2c4b5645 100644 --- a/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py +++ b/device/celestica/x86_64-cel_seastone-r0/sonic_platform/thermal.py @@ -37,18 +37,16 @@ def __init__(self, thermal_index): # Set hwmon path i2c_path = { - 0: "i2c-5/5-0048", # u4 system-inlet - 1: "i2c-6/6-0049", # u2 system-inlet - 2: "i2c-7/7-004a", # u44 bmc56960-on-board - 3: "i2c-14/14-0048", # u9200 cpu-on-board - 4: "i2c-15/15-004e" # u9201 system-outlet + 0: "i2c-5/5-0048/hwmon/hwmon1", # u4 system-inlet + 1: "i2c-6/6-0049/hwmon/hwmon2", # u2 system-inlet + 2: "i2c-7/7-004a/hwmon/hwmon3", # u44 bmc56960-on-board + 3: "i2c-14/14-0048/hwmon/hwmon4", # u9200 cpu-on-board + 4: "i2c-15/15-004e/hwmon/hwmon5" # u9201 system-outlet }.get(self.index, None) - self.ss_path = "{}/{}/hwmon".format(self.I2C_ADAPTER_PATH, i2c_path) + self.hwmon_path = "{}/{}".format(self.I2C_ADAPTER_PATH, i2c_path) self.ss_key = self.THERMAL_NAME_LIST[self.index] self.ss_index = 1 - self.hwmon_name = os.listdir(self.ss_path)[0] - self.hwmon_path = os.path.join(self.ss_path, self.hwmon_name) def __read_txt_file(self, file_path): try: @@ -56,7 +54,7 @@ def __read_txt_file(self, file_path): data = fd.read() return data.strip() except IOError: - raise IOError("Unable to open %s file !" % file_path) + pass def __get_temp(self, temp_file): temp_file_path = os.path.join(self.hwmon_path, temp_file) diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init index 99d0aab3fd61..1e124565a41d 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.init @@ -141,6 +141,8 @@ start) sleep 0.1 done + /bin/sh /usr/local/bin/platform_api_mgnt.sh init + echo "done." ;; diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.install b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.install index b25d47022b08..8570fa1eae84 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.install +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.install @@ -1,3 +1,5 @@ dx010/scripts/dx010_check_qsfp.sh usr/local/bin dx010/cfg/dx010-modules.conf etc/modules-load.d dx010/systemd/platform-modules-dx010.service lib/systemd/system +dx010/modules/sonic_platform-1.0-py2-none-any.whl usr/share/sonic/device/x86_64-cel_seastone-r0 +services/platform_api/platform_api_mgnt.sh usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.postinst b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.postinst index baff704171c7..15243c935ca3 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.postinst +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-dx010.postinst @@ -1,3 +1,6 @@ depmod -a systemctl enable platform-modules-dx010.service systemctl start platform-modules-dx010.service + +/usr/local/bin/platform_api_mgnt.sh install + diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init index 6c2d4483ac9d..1dc0ea5cfeeb 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.init @@ -69,6 +69,8 @@ start) echo "both" > /sys/devices/platform/e1031.smc/SFP/modabs_trig echo 0 > /sys/devices/platform/e1031.smc/SFP/modabs_mask + /bin/sh /usr/local/bin/platform_api_mgnt.sh init + echo "done." ;; diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.install b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.install index 312e9c78a5e7..df78b7a34ea4 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.install +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.install @@ -3,3 +3,5 @@ haliburton/systemd/platform-modules-haliburton.service lib/systemd/system haliburton/script/fancontrol.sh etc/init.d services/fancontrol/fancontrol.service lib/systemd/system services/fancontrol/fancontrol usr/local/bin +haliburton/modules/sonic_platform-1.0-py2-none-any.whl usr/share/sonic/device/x86_64-cel_e1031-r0 +services/platform_api/platform_api_mgnt.sh usr/local/bin diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.postinst b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.postinst index ac05d40d702f..e62799bd591c 100644 --- a/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.postinst +++ b/platform/broadcom/sonic-platform-modules-cel/debian/platform-modules-haliburton.postinst @@ -3,4 +3,6 @@ systemctl enable platform-modules-haliburton.service systemctl enable fancontrol.service systemctl start platform-modules-haliburton.service -systemctl start fancontrol.service \ No newline at end of file +systemctl start fancontrol.service + +/usr/local/bin/platform_api_mgnt.sh install diff --git a/platform/broadcom/sonic-platform-modules-cel/debian/rules b/platform/broadcom/sonic-platform-modules-cel/debian/rules index 5086302b70b2..6f35290bce26 100755 --- a/platform/broadcom/sonic-platform-modules-cel/debian/rules +++ b/platform/broadcom/sonic-platform-modules-cel/debian/rules @@ -13,6 +13,9 @@ MODULE_DIRS:= dx010 haliburton override_dh_auto_build: (for mod in $(MODULE_DIRS); do \ make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + cd $(MOD_SRC_DIR)/$${mod}; \ + python2.7 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ + cd $(MOD_SRC_DIR); \ done) override_dh_auto_install: diff --git a/platform/broadcom/sonic-platform-modules-cel/dx010/setup.py b/platform/broadcom/sonic-platform-modules-cel/dx010/setup.py new file mode 100644 index 000000000000..8183788184a7 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/dx010/setup.py @@ -0,0 +1,34 @@ +from setuptools import setup + +DEVICE_NAME = 'celestica' +HW_SKU = 'x86_64-cel_seastone-r0' + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on Celestica Platforms', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + maintainer='Wirut Getbamrung', + maintainer_email='wgetbumr@celestica.com', + packages=[ + 'sonic_platform', + ], + package_dir={ + 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 2.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/broadcom/sonic-platform-modules-cel/haliburton/setup.py b/platform/broadcom/sonic-platform-modules-cel/haliburton/setup.py new file mode 100644 index 000000000000..17056855106e --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/haliburton/setup.py @@ -0,0 +1,34 @@ +from setuptools import setup + +DEVICE_NAME = 'celestica' +HW_SKU = 'x86_64-cel_e1031-r0' + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on Celestica Platforms', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + maintainer='Wirut Getbamrung', + maintainer_email='wgetbumr@celestica.com', + packages=[ + 'sonic_platform', + ], + package_dir={ + 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 2.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/broadcom/sonic-platform-modules-cel/services/platform_api/platform_api_mgnt.sh b/platform/broadcom/sonic-platform-modules-cel/services/platform_api/platform_api_mgnt.sh new file mode 100755 index 000000000000..e1d330357894 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-cel/services/platform_api/platform_api_mgnt.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +PREV_REBOOT_CAUSE="/host/reboot-cause/" +DEVICE="/usr/share/sonic/device" +PLATFORM=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) +FILES=$DEVICE/$PLATFORM/api_files + +install() { + # Install sonic-platform package + if [ -e $DEVICE/$PLATFORM/sonic_platform-1.0-py2-none-any.whl ]; then + pip install $DEVICE/$PLATFORM/sonic_platform-1.0-py2-none-any.whl + fi +} + +init() { + # mount needed files for sonic-platform package + mkdir -p $FILES + + mkdir -p $FILES/reboot-cause + mount -B $PREV_REBOOT_CAUSE $FILES/reboot-cause +} + +deinit() { + # deinit sonic-platform package + umount -f $PREV_REBOOT_CAUSE $FILES/reboot-cause >/dev/null 2>/dev/null +} + +uninstall() { + # Uninstall sonic-platform package + pip uninstall -y sonic-platform >/dev/null 2>/dev/null +} + +case "$1" in +install | uninstall | init | deinit) + $1 + ;; +*) + echo "Usage: $0 {install|uninstall|init|deinit}" + exit 1 + ;; +esac From 5196f134c1eefd30b8e1481e3df0b4e1fc2808e0 Mon Sep 17 00:00:00 2001 From: ChiouRung Haung Date: Thu, 29 Aug 2019 02:55:27 +0800 Subject: [PATCH 48/54] [syncd-rpc-brcm]: Fix syncd terminated in broadcom rpc image (#3391) Signed-off-by: chiourung_huang --- platform/broadcom/docker-syncd-brcm-rpc.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/broadcom/docker-syncd-brcm-rpc.mk b/platform/broadcom/docker-syncd-brcm-rpc.mk index bb31e82ef61d..ed7fc1b5265e 100644 --- a/platform/broadcom/docker-syncd-brcm-rpc.mk +++ b/platform/broadcom/docker-syncd-brcm-rpc.mk @@ -20,5 +20,6 @@ endif $(DOCKER_SYNCD_BRCM_RPC)_CONTAINER_NAME = syncd $(DOCKER_SYNCD_BRCM_RPC)_RUN_OPT += --net=host --privileged -t $(DOCKER_SYNCD_BRCM_RPC)_RUN_OPT += -v /host/machine.conf:/etc/machine.conf +$(DOCKER_SYNCD_BRCM_RPC)_RUN_OPT += -v /host/warmboot:/var/warmboot $(DOCKER_SYNCD_BRCM_RPC)_RUN_OPT += -v /var/run/docker-syncd:/var/run/sswsyncd $(DOCKER_SYNCD_BRCM_RPC)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro From 7b53d4392aa8b5e703f0d114734ff11c9a75a87a Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Thu, 29 Aug 2019 02:59:37 +0800 Subject: [PATCH 49/54] [Mellanox] optimize new platform api (#3289) optimize SFP module operations and fix issues. - split initialization of variant categories of devices and initialize each category of devices only when needed, so that unnecessary dependencies can be avoided. - update watchdog logic, only initializing watchdog when referenced. - support platform.py and enable to initialize variant devices on a host/docker basis - update init so that sonic_platform can be imported as a whole. --- .../sonic_platform/__init__.py | 2 + .../sonic_platform/chassis.py | 199 ++++++++++++---- .../sonic_platform/platform.py | 45 ++++ .../mlnx-platform-api/sonic_platform/sfp.py | 217 ++++++++---------- 4 files changed, 303 insertions(+), 160 deletions(-) create mode 100644 platform/mellanox/mlnx-platform-api/sonic_platform/platform.py diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/__init__.py b/platform/mellanox/mlnx-platform-api/sonic_platform/__init__.py index e69de29bb2d1..d94d4c9ec820 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/__init__.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ["platform", "chassis"] +from sonic_platform import * \ No newline at end of file diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index 41d237143d58..814c7aca8178 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -10,15 +10,7 @@ try: from sonic_platform_base.chassis_base import ChassisBase - from sonic_platform.psu import Psu - from sonic_platform.fan import Fan - from sonic_platform.fan import FAN_PATH - from sonic_platform.sfp import SFP - from sonic_platform.thermal import Thermal, initialize_thermals - from sonic_platform.watchdog import get_watchdog from sonic_daemon_base.daemon_base import Logger - from eeprom import Eeprom - from sfp_event import sfp_event from os import listdir from os.path import isfile, join import sys @@ -43,11 +35,6 @@ #reboot cause related definitions REBOOT_CAUSE_ROOT = HWMGMT_SYSTEM_ROOT -REBOOT_CAUSE_POWER_LOSS_FILE = 'reset_main_pwr_fail' -REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC_FILE = 'reset_asic_thermal' -REBOOT_CAUSE_WATCHDOG_FILE = 'reset_hotswap_or_wd' -REBOOT_CAUSE_MLNX_FIRMWARE_RESET = 'reset_fw_reset' - REBOOT_CAUSE_FILE_LENGTH = 1 #version retrieving related definitions @@ -84,14 +71,30 @@ def __init__(self): # Initialize SKU name self.sku_name = self._get_sku_name() + # move the initialization of each components to their dedicated initializer + # which will be called from platform + self.sfp_module_initialized = False + self.sfp_event_initialized = False + self.reboot_cause_initialized = False + logger.log_info("Chassis loaded successfully") + + def __del__(self): + if self.sfp_event_initialized: + self.sfp_event.deinitialize() + + def initialize_psu(self): + from sonic_platform.psu import Psu # Initialize PSU list + self.psu_module = Psu for index in range(MLNX_NUM_PSU): psu = Psu(index, self.sku_name) self._psu_list.append(psu) - # Initialize watchdog - self._watchdog = get_watchdog() - + def initialize_fan(self): + from sonic_platform.fan import Fan + from sonic_platform.fan import FAN_PATH + self.fan_module = Fan + self.fan_path = FAN_PATH # Initialize FAN list multi_rotor_in_drawer = False num_of_fan, num_of_drawer = self._extract_num_of_fans_and_fan_drawers() @@ -104,6 +107,11 @@ def __init__(self): fan = Fan(index, index) self._fan_list.append(fan) + def initialize_sfp(self): + from sonic_platform.sfp import SFP + + self.sfp_module = SFP + # Initialize SFP list port_position_tuple = self._get_port_position_tuple_by_sku_name() self.PORT_START = port_position_tuple[0] @@ -118,31 +126,82 @@ def __init__(self): sfp_module = SFP(index, 'SFP') self._sfp_list.append(sfp_module) + self.sfp_module_initialized = True + + def initialize_thermals(self): + from sonic_platform.thermal import initialize_thermals # Initialize thermals initialize_thermals(self.sku_name, self._thermal_list, self._psu_list) + def initialize_eeprom(self): + from eeprom import Eeprom # Initialize EEPROM - self.eeprom = Eeprom() + self._eeprom = Eeprom() + def initialize_components_list(self): # Initialize component list self._component_name_list.append(COMPONENT_BIOS) self._component_name_list.append(COMPONENT_FIRMWARE) self._component_name_list.append(COMPONENT_CPLD1) self._component_name_list.append(COMPONENT_CPLD2) - # Initialize sfp-change-listening stuff - self._init_sfp_change_event() + ############################################## + # SFP methods + ############################################## + def get_num_sfps(self): + """ + Retrieves the number of sfps available on this chassis + + Returns: + An integer, the number of sfps available on this chassis + """ + if not self.sfp_module_initialized: + self.initialize_sfp() + return len(self._sfp_list) + + def get_all_sfps(self): + """ + Retrieves all sfps available on this chassis + + Returns: + A list of objects derived from SfpBase representing all sfps + available on this chassis + """ + if not self.sfp_module_initialized: + self.initialize_sfp() + return self._sfp_list + + def get_sfp(self, index): + """ + Retrieves sfp represented by (0-based) index + + Args: + index: An integer, the index (0-based) of the sfp to retrieve. + The index should be the sequence of a physical port in a chassis, + starting from 0. + For example, 0 for Ethernet0, 1 for Ethernet4 and so on. + + Returns: + An object dervied from SfpBase representing the specified sfp + """ + if not self.sfp_module_initialized: + self.initialize_sfp() + + sfp = None + + try: + sfp = self._sfp_list[index] + except IndexError: + sys.stderr.write("SFP index {} out of range (0-{})\n".format( + index, len(self._sfp_list)-1)) - def _init_sfp_change_event(self): - self.sfp_event = sfp_event() - self.sfp_event.initialize() - self.MAX_SELECT_EVENT_RETURNED = self.PORT_END + return sfp def _extract_num_of_fans_and_fan_drawers(self): num_of_fan = 0 num_of_drawer = 0 - for f in listdir(FAN_PATH): - if isfile(join(FAN_PATH, f)): + for f in listdir(self.fan_path): + if isfile(join(self.fan_path, f)): match_obj = re.match('fan(\d+)_speed_get', f) if match_obj != None: if int(match_obj.group(1)) > num_of_fan: @@ -163,6 +222,30 @@ def _get_port_position_tuple_by_sku_name(self): position_tuple = port_position_tuple_list[hwsku_dict_port[self.sku_name]] return position_tuple + def get_watchdog(self): + """ + Retrieves hardware watchdog device on this chassis + + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + + Note: + We overload this method to ensure that watchdog is only initialized + when it is referenced. Currently, only one daemon can open the watchdog. + To initialize watchdog in the constructor causes multiple daemon + try opening watchdog when loading and constructing a chassis object + and fail. By doing so we can eliminate that risk. + """ + try: + if self._watchdog is None: + from sonic_platform.watchdog import get_watchdog + self._watchdog = get_watchdog() + except Exception as e: + logger.log_info("Fail to load watchdog due to {}".format(repr(e))) + + return self._watchdog + def get_base_mac(self): """ Retrieves the base MAC address for the chassis @@ -171,7 +254,7 @@ def get_base_mac(self): A string containing the MAC address in the format 'XX:XX:XX:XX:XX:XX' """ - return self.eeprom.get_base_mac() + return self._eeprom.get_base_mac() def get_serial_number(self): """ @@ -180,7 +263,7 @@ def get_serial_number(self): Returns: A string containing the hardware serial number for this chassis. """ - return self.eeprom.get_serial_number() + return self._eeprom.get_serial_number() def get_system_eeprom_info(self): """ @@ -191,7 +274,7 @@ def get_system_eeprom_info(self): OCP ONIE TlvInfo EEPROM format and values are their corresponding values. """ - return self.eeprom.get_system_eeprom_info() + return self._eeprom.get_system_eeprom_info() def _read_generic_file(self, filename, len): """ @@ -205,7 +288,7 @@ def _read_generic_file(self, filename, len): return result except Exception as e: logger.log_info("Fail to read file {} due to {}".format(filename, repr(e))) - return '' + return '0' def _verify_reboot_cause(self, filename): ''' @@ -215,6 +298,31 @@ def _verify_reboot_cause(self, filename): ''' return bool(int(self._read_generic_file(join(REBOOT_CAUSE_ROOT, filename), REBOOT_CAUSE_FILE_LENGTH).rstrip('\n'))) + def initialize_reboot_cause(self): + self.reboot_major_cause_dict = { + 'reset_main_pwr_fail' : self.REBOOT_CAUSE_POWER_LOSS, + 'reset_aux_pwr_or_ref' : self.REBOOT_CAUSE_POWER_LOSS, + 'reset_asic_thermal' : self.REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC, + 'reset_hotswap_or_wd' : self.REBOOT_CAUSE_WATCHDOG, + 'reset_swb_wd' : self.REBOOT_CAUSE_WATCHDOG, + 'reset_sff_wd' : self.REBOOT_CAUSE_WATCHDOG + } + self.reboot_minor_cause_dict = { + 'reset_fw_reset' : "Reset by ASIC firmware", + 'reset_long_pb' : "Reset by long press on power button", + 'reset_short_pb' : "Reset by short press on power button", + 'reset_comex_thermal' : "ComEx thermal shutdown", + 'reset_comex_pwr_fail' : "ComEx power fail", + 'reset_comex_wd' : "Reset requested from ComEx", + 'reset_from_asic' : "Reset requested from ASIC", + 'reset_reload_bios' : "Reset caused by BIOS reload", + 'reset_sw_reset' : "Software reset", + 'reset_hotswap_or_halt' : "Reset caused by hotswap or halt", + 'reset_from_comex' : "Reset from ComEx", + 'reset_voltmon_upgrade_fail': "Reset due to voltage monitor devices upgrade failure" + } + self.reboot_cause_initialized = True + def get_reboot_cause(self): """ Retrieves the cause of the previous reboot @@ -227,21 +335,18 @@ def get_reboot_cause(self): to pass a description of the reboot cause. """ #read reboot causes files in the following order - minor_cause = '' - if self._verify_reboot_cause(REBOOT_CAUSE_POWER_LOSS_FILE): - major_cause = self.REBOOT_CAUSE_POWER_LOSS - elif self._verify_reboot_cause(REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC_FILE): - major_cause = self.REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC - elif self._verify_reboot_cause(REBOOT_CAUSE_WATCHDOG_FILE): - major_cause = self.REBOOT_CAUSE_WATCHDOG - else: - major_cause = self.REBOOT_CAUSE_HARDWARE_OTHER - if self._verify_reboot_cause(REBOOT_CAUSE_MLNX_FIRMWARE_RESET): - minor_cause = "Reset by ASIC firmware" - else: - major_cause = self.REBOOT_CAUSE_NON_HARDWARE + if not self.reboot_cause_initialized: + self.initialize_reboot_cause() + + for reset_file, reset_cause in self.reboot_major_cause_dict.iteritems(): + if self._verify_reboot_cause(reset_file): + return reset_cause, '' - return major_cause, minor_cause + for reset_file, reset_cause in self.reboot_minor_cause_dict.iteritems(): + if self._verify_reboot_cause(reset_file): + return self.REBOOT_CAUSE_HARDWARE_OTHER, reset_cause + + return self.REBOOT_CAUSE_NON_HARDWARE, '' def _get_cpld_version(self, version_file): cpld_version = self._read_generic_file(join(CPLD_VERSION_ROOT, version_file), CPLD_VERSION_MAX_LENGTH) @@ -383,6 +488,14 @@ def get_change_event(self, timeout=0): indicates that fan 0 has been removed, fan 2 has been inserted and sfp 11 has been removed. """ + # Initialize SFP event first + if not self.sfp_event_initialized: + from sonic_platform.sfp_event import sfp_event + self.sfp_event = sfp_event() + self.sfp_event.initialize() + self.MAX_SELECT_EVENT_RETURNED = self.PORT_END + self.sfp_event_initialized = True + wait_for_ever = (timeout == 0) port_dict = {} if wait_for_ever: diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/platform.py b/platform/mellanox/mlnx-platform-api/sonic_platform/platform.py new file mode 100644 index 000000000000..fc555bc479a3 --- /dev/null +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/platform.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +############################################################################# +# Mellanox +# +# implementation of new platform api +############################################################################# + +try: + import subprocess + 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") + +class Platform(PlatformBase): + def __init__(self): + PlatformBase.__init__(self) + if self._is_host(): + self._chassis = Chassis() + else: + self._chassis = Chassis() + self._chassis.initialize_psu() + self._chassis.initialize_fan() + self._chassis.initialize_eeprom() + self._chassis.initialize_components_list() + + def _is_host(self): + """ + Test whether current process is running on the host or an docker + return True for host and False for docker + """ + is_host = False + try: + proc = subprocess.Popen("docker --version 2>/dev/null", stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + proc.wait() + result = stdout.rstrip('\n') + if result != '': + is_host = True + + except OSError, e: + pass + + return is_host diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index 9ea9c21899f5..be59451a8cb7 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -63,6 +63,24 @@ XCVR_VENDOR_DATE_WIDTH = 8 XCVR_DOM_CAPABILITY_OFFSET = 92 XCVR_DOM_CAPABILITY_WIDTH = 2 +# to improve performance we retrieve all eeprom data via a single ethtool command +# in function get_transceiver_info and get_transceiver_bulk_status +# XCVR_INTERFACE_DATA_SIZE stands for the max size to be read +# this variable is only used by get_transceiver_info. +# please be noted that each time some new value added to the function +# we should make sure that it falls into the area +# [XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE] or +# adjust XCVR_INTERFACE_MAX_SIZE to contain the new data +# It's same for [QSFP_DOM_BULK_DATA_START, QSFP_DOM_BULK_DATA_SIZE] and +# [SFP_DOM_BULK_DATA_START, SFP_DOM_BULK_DATA_SIZE] which are used by +# get_transceiver_bulk_status +XCVR_INTERFACE_DATA_START = 0 +XCVR_INTERFACE_DATA_SIZE = 92 + +QSFP_DOM_BULK_DATA_START = 22 +QSFP_DOM_BULK_DATA_SIZE = 36 +SFP_DOM_BULK_DATA_START = 96 +SFP_DOM_BULK_DATA_SIZE = 10 # definitions of the offset for values in OSFP info eeprom OSFP_TYPE_OFFSET = 0 @@ -229,7 +247,7 @@ def get_presence(self): bool: True if device is present, False if not """ presence = False - ethtool_cmd = "ethtool -m sfp{} 2>/dev/null".format(self.index) + ethtool_cmd = "ethtool -m sfp{} hex on offset 0 length 4 2>/dev/null".format(self.index) try: proc = subprocess.Popen(ethtool_cmd, stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT) stdout = proc.communicate()[0] @@ -261,6 +279,15 @@ def _read_eeprom_specific_bytes(self, offset, num_bytes): return eeprom_raw def _dom_capability_detect(self): + if not self.get_presence(): + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + return + if self.sfp_type == "QSFP": self.calibration = 1 sfpi_obj = sff8436InterfaceId() @@ -466,47 +493,37 @@ def get_transceiver_info(self): print("Error: sfp_object open failed") return None - sfp_interface_bulk_raw = self._read_eeprom_specific_bytes((offset + XCVR_INTFACE_BULK_OFFSET), interface_info_bulk_width) - if sfp_interface_bulk_raw is not None: - sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk(sfp_interface_bulk_raw, 0) - else: + sfp_interface_bulk_raw = self._read_eeprom_specific_bytes(offset + XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE) + if sfp_interface_bulk_raw is None: return None - sfp_vendor_name_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) - if sfp_vendor_name_raw is not None: - sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_vendor_name_raw, 0) - else: - return None + start = XCVR_INTFACE_BULK_OFFSET - XCVR_INTERFACE_DATA_START + end = start + interface_info_bulk_width + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk(sfp_interface_bulk_raw[start : end], 0) - sfp_vendor_pn_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) - if sfp_vendor_pn_raw is not None: - sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) - else: - return None + start = XCVR_VENDOR_NAME_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_NAME_WIDTH + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_interface_bulk_raw[start : end], 0) - sfp_vendor_rev_raw = self._read_eeprom_specific_bytes((offset + XCVR_HW_REV_OFFSET), vendor_rev_width) - if sfp_vendor_rev_raw is not None: - sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_vendor_rev_raw, 0) - else: - return None + start = XCVR_VENDOR_PN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_PN_WIDTH + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_interface_bulk_raw[start : end], 0) - sfp_vendor_sn_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) - if sfp_vendor_sn_raw is not None: - sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) - else: - return None + start = XCVR_HW_REV_OFFSET - XCVR_INTERFACE_DATA_START + end = start + vendor_rev_width + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_interface_bulk_raw[start : end], 0) - sfp_vendor_oui_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) - if sfp_vendor_oui_raw is not None: - sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_vendor_oui_raw, 0) - else: - return None + start = XCVR_VENDOR_SN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_SN_WIDTH + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_interface_bulk_raw[start : end], 0) - sfp_vendor_date_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_DATE_OFFSET), XCVR_VENDOR_DATE_WIDTH) - if sfp_vendor_date_raw is not None: - sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_vendor_date_raw, 0) - else: - return None + start = XCVR_VENDOR_OUI_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_OUI_WIDTH + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_DATE_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_DATE_WIDTH + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_interface_bulk_raw[start : end], 0) transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] transceiver_info_dict['manufacturename'] = sfp_vendor_name_data['data']['Vendor Name']['value'] @@ -578,84 +595,63 @@ def get_transceiver_bulk_status(self): """ transceiver_dom_info_dict = {} + dom_info_dict_keys = ['temperature', 'voltage', + 'rx1power', 'rx2power', + 'rx3power', 'rx4power', + 'tx1bias', 'tx2bias', + 'tx3bias', 'tx4bias', + 'tx1power', 'tx2power', + 'tx3power', 'tx4power' + ] + transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + if self.sfp_type == OSFP_TYPE: - transceiver_dom_info_dict['temperature'] = 'N/A' - transceiver_dom_info_dict['voltage'] = 'N/A' - transceiver_dom_info_dict['rx1power'] = 'N/A' - transceiver_dom_info_dict['rx2power'] = 'N/A' - transceiver_dom_info_dict['rx3power'] = 'N/A' - transceiver_dom_info_dict['rx4power'] = 'N/A' - transceiver_dom_info_dict['tx1bias'] = 'N/A' - transceiver_dom_info_dict['tx2bias'] = 'N/A' - transceiver_dom_info_dict['tx3bias'] = 'N/A' - transceiver_dom_info_dict['tx4bias'] = 'N/A' - transceiver_dom_info_dict['tx1power'] = 'N/A' - transceiver_dom_info_dict['tx2power'] = 'N/A' - transceiver_dom_info_dict['tx3power'] = 'N/A' - transceiver_dom_info_dict['tx4power'] = 'N/A' + pass elif self.sfp_type == QSFP_TYPE: if not self.dom_supported: - return None + return transceiver_dom_info_dict offset = 0 sfpd_obj = sff8436Dom() if sfpd_obj is None: - return None + return transceiver_dom_info_dict + + dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DOM_BULK_DATA_START), QSFP_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict if self.dom_temp_supported: - dom_temperature_raw = self._read_eeprom_specific_bytes((offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) - temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) - if temp is not None: - transceiver_dom_info_dict['temperature'] = temp - else: - transceiver_dom_info_dict['temperature'] = 'N/A' - else: - return None - else: - transceiver_dom_info_dict['temperature'] = 'N/A' + start = QSFP_TEMPE_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start : end], 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp if self.dom_volt_supported: - dom_voltage_raw = self._read_eeprom_specific_bytes((offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) - if volt is not None: - transceiver_dom_info_dict['voltage'] = volt - else: - transceiver_dom_info_dict['voltage'] = 'N/A' - else: - return None - else: - transceiver_dom_info_dict['voltage'] = 'N/A' + start = QSFP_VOLT_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start : end], 0) + volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + start = QSFP_CHANNL_MON_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_data_raw[start : end], 0) if self.dom_tx_power_supported: transceiver_dom_info_dict['tx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value']) transceiver_dom_info_dict['tx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value']) transceiver_dom_info_dict['tx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value']) transceiver_dom_info_dict['tx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value']) - else: - transceiver_dom_info_dict['tx1power'] = 'N/A' - transceiver_dom_info_dict['tx2power'] = 'N/A' - transceiver_dom_info_dict['tx3power'] = 'N/A' - transceiver_dom_info_dict['tx4power'] = 'N/A' if self.dom_rx_power_supported: transceiver_dom_info_dict['rx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value']) transceiver_dom_info_dict['rx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value']) transceiver_dom_info_dict['rx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value']) transceiver_dom_info_dict['rx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value']) - else: - transceiver_dom_info_dict['rx1power'] = 'N/A' - transceiver_dom_info_dict['rx2power'] = 'N/A' - transceiver_dom_info_dict['rx3power'] = 'N/A' - transceiver_dom_info_dict['rx4power'] = 'N/A' transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] @@ -664,46 +660,33 @@ def get_transceiver_bulk_status(self): else: if not self.dom_supported: - return None + return transceiver_dom_info_dict offset = 256 sfpd_obj = sff8472Dom() if sfpd_obj is None: - return None + return transceiver_dom_info_dict sfpd_obj._calibration_type = self.calibration - - dom_temperature_raw = self._read_eeprom_specific_bytes((offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH) - if dom_temperature_raw is not None: - dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) - else: - return None - dom_voltage_raw = self._read_eeprom_specific_bytes((offset + SFP_VOLT_OFFSET), SFP_VOLT_WIDTH) - if dom_voltage_raw is not None: - dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) - else: - return None + dom_data_raw = self._read_eeprom_specific_bytes((offset + SFP_DOM_BULK_DATA_START), SFP_DOM_BULK_DATA_SIZE) - dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) - if dom_channel_monitor_raw is not None: - dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0) - else: - return None + start = SFP_TEMPE_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start: end], 0) + + start = SFP_VOLT_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start: end], 0) + + start = SFP_CHANNL_MON_OFFSET - SFP_DOM_BULK_DATA_START + end = start + SFP_CHANNL_MON_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_data_raw[start: end], 0) transceiver_dom_info_dict['temperature'] = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) transceiver_dom_info_dict['voltage'] = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) transceiver_dom_info_dict['rx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RXPower']['value']) - transceiver_dom_info_dict['rx2power'] = 'N/A' - transceiver_dom_info_dict['rx3power'] = 'N/A' - transceiver_dom_info_dict['rx4power'] = 'N/A' transceiver_dom_info_dict['tx1bias'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TXBias']['value']) - transceiver_dom_info_dict['tx2bias'] = 'N/A' - transceiver_dom_info_dict['tx3bias'] = 'N/A' - transceiver_dom_info_dict['tx4bias'] = 'N/A' transceiver_dom_info_dict['tx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TXPower']['value']) - transceiver_dom_info_dict['tx2power'] = 'N/A' - transceiver_dom_info_dict['tx3power'] = 'N/A' - transceiver_dom_info_dict['tx4power'] = 'N/A' return transceiver_dom_info_dict @@ -1036,7 +1019,7 @@ def get_tx_bias(self): sfpd_obj = sff8472Dom() if sfpd_obj is None: return None - sfpd_obj._calibration_type = 1 + sfpd_obj._calibration_type = self.calibration if self.dom_supported: dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) @@ -1145,7 +1128,7 @@ def get_tx_power(self): return None if self.dom_supported: - sfpd_obj._calibration_type = 1 + sfpd_obj._calibration_type = self.calibration dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH) if dom_channel_monitor_raw is not None: From b99981bfd20ec0a7c426f0f9cf4546aa5527685f Mon Sep 17 00:00:00 2001 From: zhenggen-xu Date: Wed, 28 Aug 2019 15:46:48 -0700 Subject: [PATCH 50/54] [swss]: Add hash seed 15 for SpineRouter type (#3390) Signed-off-by: Zhenggen Xu --- dockers/docker-orchagent/switch.json.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockers/docker-orchagent/switch.json.j2 b/dockers/docker-orchagent/switch.json.j2 index a7dafd40f267..f8beffbc9ad7 100644 --- a/dockers/docker-orchagent/switch.json.j2 +++ b/dockers/docker-orchagent/switch.json.j2 @@ -6,6 +6,8 @@ {% set hash_seed = 0 %} {% elif DEVICE_METADATA.localhost.type == "LeafRouter" %} {% set hash_seed = 10 %} +{% elif DEVICE_METADATA.localhost.type == "SpineRouter" %} +{% set hash_seed = 15 %} {% endif %} {% endif %} [ From 52ef90060fba657d6c7381d6738c17227ec4ac85 Mon Sep 17 00:00:00 2001 From: Andriy Kokhan <43479230+akokhan@users.noreply.github.com> Date: Thu, 29 Aug 2019 04:37:16 +0300 Subject: [PATCH 51/54] [platform]: BFN platform modules update (#3389) * Fixed initial state for eeprom.py and sfputil.py when thrift server is down * Added transceiver plug-in/out event processing Signed-off-by: Andriy Kokhan --- .../plugins/eeprom.py | 38 +++++---- .../plugins/logging.conf | 17 ++++ .../plugins/sfputil.py | 80 +++++++++++++++++-- 3 files changed, 116 insertions(+), 19 deletions(-) create mode 100644 device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/logging.conf diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py index c06a1899fc3c..9c14441475d4 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py @@ -9,6 +9,9 @@ import sys import errno import datetime + import logging + import logging.config + import yaml sys.path.append(os.path.dirname(__file__)) import pltfm_mgr_rpc @@ -71,13 +74,17 @@ pltfm_mgr = None EEPROM_SYMLINK = "/var/run/platform/eeprom/syseeprom" - +EEPROM_STATUS = "/var/run/platform/eeprom/status" class board(eeprom_tlvinfo.TlvInfoDecoder): - RETRIES = 30 + RETRIES = 3 def __init__(self, name, path, cpld_root, ro): + with open(os.path.dirname(__file__) + "/logging.conf", 'r') as f: + config_dict = yaml.load(f) + logging.config.dictConfig(config_dict) + if not os.path.exists(os.path.dirname(EEPROM_SYMLINK)): try: os.makedirs(os.path.dirname(EEPROM_SYMLINK)) @@ -86,19 +93,17 @@ def __init__(self, name, path, cpld_root, ro): raise open(EEPROM_SYMLINK, 'a').close() + f = open(EEPROM_STATUS, 'w') + f.write("initializing..") + f.close() self.eeprom_path = EEPROM_SYMLINK - super(board, self).__init__(self.eeprom_path, 0, '', True) + super(board, self).__init__(self.eeprom_path, 0, EEPROM_STATUS, True) - for attempt in range(self.RETRIES + 1): - if not self.eeprom_init(): - time.sleep(1) - else: + for attempt in range(self.RETRIES): + if self.eeprom_init() or (attempt + 1 >= self.RETRIES): break - - if attempt == self.RETRIES: - raise RuntimeError("Could not initialize syseeprom") - + time.sleep(1) def thrift_setup(self): global thrift_server, transport, pltfm_mgr @@ -119,13 +124,18 @@ def thrift_teardown(self): def eeprom_init(self): global pltfm_mgr + try: - self.thrift_setup() - eeprom = pltfm_mgr.pltfm_mgr_sys_eeprom_get() - self.thrift_teardown() + self.thrift_setup() + eeprom = pltfm_mgr.pltfm_mgr_sys_eeprom_get() + self.thrift_teardown() except: return False + f = open(EEPROM_STATUS, 'w') + f.write("ok") + f.close() + eeprom_params = "" for attr, val in eeprom.__dict__.iteritems(): if val is None: diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/logging.conf b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/logging.conf new file mode 100644 index 000000000000..d7fd84773404 --- /dev/null +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/logging.conf @@ -0,0 +1,17 @@ +version: 1 +disable_existing_loggers: False + +formatters: + simple: + format: '%(asctime)s %(name)-30s %(levelname)-7s %(message)s' + +handlers: + file: + class: logging.handlers.RotatingFileHandler + formatter: simple + filename: /var/log/platform.log + +root: + level: ERROR + handlers: + - file diff --git a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py index c92bc4212123..5e75376baa27 100644 --- a/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py +++ b/device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py @@ -34,6 +34,7 @@ class SfpUtil(SfpUtilBase): QSFP_PORT_START = 1 QSFP_PORT_END = 0 EEPROM_OFFSET = 0 + QSFP_CHECK_INTERVAL = 4 @property def port_start(self): @@ -56,6 +57,11 @@ def port_to_eeprom_mapping(self): raise Exception() def __init__(self): + self.ready = False + self.phy_port_dict = {'-1': 'system_not_ready'} + self.phy_port_cur_state = {} + self.qsfp_interval = self.QSFP_CHECK_INTERVAL + if not os.path.exists(os.path.dirname(SFP_EEPROM_CACHE)): try: os.makedirs(os.path.dirname(SFP_EEPROM_CACHE)) @@ -142,12 +148,76 @@ def reset(self, port_num): self.thrift_teardown() return status + def check_transceiver_change(self): + if not self.ready: + return + + self.phy_port_dict = {} + + try: + self.thrift_setup() + except: + return + + # Get presence of each SFP + for port in range(self.port_start, self.port_end + 1): + try: + sfp_resent = pltfm_mgr.pltfm_mgr_qsfp_presence_get(port) + except: + sfp_resent = False + sfp_state = '1' if sfp_resent else '0' + + if port in self.phy_port_cur_state: + if self.phy_port_cur_state[port] != sfp_state: + self.phy_port_dict[port] = sfp_state + else: + self.phy_port_dict[port] = sfp_state + + # Update port current state + self.phy_port_cur_state[port] = sfp_state + + self.thrift_teardown() + def get_transceiver_change_event(self, timeout=0): - phy_port_dict = {} - status = True - # TODO: Process transceiver plug-in/out event - time.sleep(1) - return status, phy_port_dict + forever = False + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print "get_transceiver_change_event:Invalid timeout value", timeout + return False, {} + + while forever or timeout > 0: + if not self.ready: + try: + self.thrift_setup() + self.thrift_teardown() + except: + pass + else: + self.ready = True + self.phy_port_dict = {} + break + elif self.qsfp_interval == 0: + self.qsfp_interval = self.QSFP_CHECK_INTERVAL + + # Process transceiver plug-in/out event + self.check_transceiver_change() + + # Break if tranceiver state has changed + if bool(self.phy_port_dict): + break + + if timeout: + timeout -= 1 + + if self.qsfp_interval: + self.qsfp_interval -= 1 + + time.sleep(1) + + return self.ready, self.phy_port_dict def _get_port_eeprom_path(self, port_num, devid): eeprom_path = None From 65a179e8f265b58f8dd50aece79b98d6e946fccf Mon Sep 17 00:00:00 2001 From: "arheneus@marvell.com" <51254330+antony-rheneus@users.noreply.github.com> Date: Thu, 29 Aug 2019 07:08:21 +0530 Subject: [PATCH 52/54] [build_debian] docker version update for ARM arch (#3353) Docker version above 18 has inconsistent behaviour with qemu. Hence using the same version 18 used in sonic-slave Signed-off-by: Antony Rheneus --- build_debian.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build_debian.sh b/build_debian.sh index 58abc0154c92..3cb6beda30e3 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -31,7 +31,12 @@ set -x -e CONFIGURED_ARCH=$([ -f .arch ] && cat .arch || echo amd64) ## docker engine version (with platform) -DOCKER_VERSION=5:18.09.8~3-0~debian-stretch +if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then + # Version name differs between ARCH, copying same version as in sonic-slave docker + DOCKER_VERSION=18.06.3~ce~3-0~debian +else + DOCKER_VERSION=5:18.09.8~3-0~debian-stretch +fi LINUX_KERNEL_VERSION=4.9.0-9-2 ## Working directory to prepare the file system From f739f1c849d1351f679db6fcf248fa042db25f3a Mon Sep 17 00:00:00 2001 From: Polly Hsu Date: Thu, 29 Aug 2019 12:39:40 +0800 Subject: [PATCH 53/54] [device][accton]: ADD the Accton new device support, AS9716-32D (#3372) --- .../Accton-AS9716-32D/port_config.ini | 33 ++++ .../Accton-AS9716-32D/sai.profile | 1 + .../x86_64-accton_as9716_32d-r0/default_sku | 1 + .../installer.conf | 4 + .../plugins/eeprom.py | 21 +++ .../plugins/psuutil.py | 61 +++++++ .../plugins/sfputil.py | 150 ++++++++++++++++++ .../pmon_daemon_control.json | 4 + 8 files changed, 275 insertions(+) create mode 100644 device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/port_config.ini create mode 100644 device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/sai.profile create mode 100644 device/accton/x86_64-accton_as9716_32d-r0/default_sku create mode 100644 device/accton/x86_64-accton_as9716_32d-r0/installer.conf create mode 100644 device/accton/x86_64-accton_as9716_32d-r0/plugins/eeprom.py create mode 100644 device/accton/x86_64-accton_as9716_32d-r0/plugins/psuutil.py create mode 100644 device/accton/x86_64-accton_as9716_32d-r0/plugins/sfputil.py create mode 100644 device/accton/x86_64-accton_as9716_32d-r0/pmon_daemon_control.json diff --git a/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/port_config.ini b/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/port_config.ini new file mode 100644 index 000000000000..a13514fcd909 --- /dev/null +++ b/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias index speed +Ethernet0 73,74,75,76,77,78,79,80 fourHundredGigE1 0 400000 +Ethernet4 65,66,67,68,69,70,71,72 fourHundredGigE2 1 400000 +Ethernet8 81,82,83,84,85,86,87,88 fourHundredGigE3 2 400000 +Ethernet12 89,90,91,92,93,94,95,96 fourHundredGigE4 3 400000 +Ethernet16 97,98,99,100,101,102,103,104 fourHundredGigE5 4 400000 +Ethernet20 105,106,107,108,109,110,111,112 fourHundredGigE6 5 400000 +Ethernet24 113,114,115,116,117,118,119,120 fourHundredGigE7 6 400000 +Ethernet28 121,122,123,124,125,126,127,128 fourHundredGigE8 7 400000 +Ethernet32 41,42,43,44,45,46,47,48 fourHundredGigE9 8 400000 +Ethernet36 33,34,35,36,37,38,39,40 fourHundredGigE10 9 400000 +Ethernet40 49,50,51,52,53,54,55,56 fourHundredGigE11 10 400000 +Ethernet44 57,58,59,60,61,62,63,64 fourHundredGigE12 11 400000 +Ethernet48 129,130,131,132,133,134,135,136 fourHundredGigE13 12 400000 +Ethernet52 137,138,139,140,141,142,143,144 fourHundredGigE14 13 400000 +Ethernet56 145,146,147,148,149,150,151,152 fourHundredGigE15 14 400000 +Ethernet60 153,154,155,156,157,158,159,160 fourHundredGigE16 15 400000 +Ethernet64 169,170,171,172,173,174,175,176 fourHundredGigE17 16 400000 +Ethernet68 161,162,163,164,165,166,167,168 fourHundredGigE18 17 400000 +Ethernet72 177,178,179,180,181,182,183,184 fourHundredGigE19 18 400000 +Ethernet76 185,186,187,188,189,190,191,192 fourHundredGigE20 19 400000 +Ethernet80 1,2,3,4,5,6,7,8 fourHundredGigE21 20 400000 +Ethernet84 9,10,11,12,13,14,15,16 fourHundredGigE22 21 400000 +Ethernet88 17,18,19,20,21,22,23,24 fourHundredGigE23 22 400000 +Ethernet92 25,26,27,28,29,30,31,32 fourHundredGigE24 23 400000 +Ethernet96 201,202,203,204,205,206,207,208 fourHundredGigE25 24 400000 +Ethernet100 193,194,195,196,197,198,199,200 fourHundredGigE26 25 400000 +Ethernet104 217,218,219,220,221,222,223,224 fourHundredGigE27 26 400000 +Ethernet108 209,210,211,212,213,214,215,216 fourHundredGigE28 27 400000 +Ethernet112 233,234,235,236,237,238,239,240 fourHundredGigE29 28 400000 +Ethernet116 225,226,227,228,229,230,231,232 fourHundredGigE30 29 400000 +Ethernet120 249,250,251,252,253,254,255,256 fourHundredGigE31 30 400000 +Ethernet124 241,242,243,244,245,246,247,248 fourHundredGigE32 31 400000 diff --git a/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/sai.profile b/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/sai.profile new file mode 100644 index 000000000000..be39b1f961f2 --- /dev/null +++ b/device/accton/x86_64-accton_as9716_32d-r0/Accton-AS9716-32D/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/etc/bcm/th3-as9716-32x400G.config.bcm diff --git a/device/accton/x86_64-accton_as9716_32d-r0/default_sku b/device/accton/x86_64-accton_as9716_32d-r0/default_sku new file mode 100644 index 000000000000..ccebae89a34e --- /dev/null +++ b/device/accton/x86_64-accton_as9716_32d-r0/default_sku @@ -0,0 +1 @@ +Accton-AS9716-32D t1 diff --git a/device/accton/x86_64-accton_as9716_32d-r0/installer.conf b/device/accton/x86_64-accton_as9716_32d-r0/installer.conf new file mode 100644 index 000000000000..d5f9419d77ff --- /dev/null +++ b/device/accton/x86_64-accton_as9716_32d-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off" diff --git a/device/accton/x86_64-accton_as9716_32d-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as9716_32d-r0/plugins/eeprom.py new file mode 100644 index 000000000000..1e7d1046d93d --- /dev/null +++ b/device/accton/x86_64-accton_as9716_32d-r0/plugins/eeprom.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, 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): + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/accton/x86_64-accton_as9716_32d-r0/plugins/psuutil.py b/device/accton/x86_64-accton_as9716_32d-r0/plugins/psuutil.py new file mode 100644 index 000000000000..25eceb7428c7 --- /dev/null +++ b/device/accton/x86_64-accton_as9716_32d-r0/plugins/psuutil.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +############################################################################# +# Accton +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/" + self.psu_presence = "/psu_present" + self.psu_oper_status = "/psu_power_good" + self.psu_mapping = { + 2: "10-0051", + 1: "9-0050", + } + + def get_num_psus(self): + return len(self.psu_mapping) + + def get_psu_status(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status + try: + with open(node, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index] + self.psu_presence + try: + with open(node, 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/accton/x86_64-accton_as9716_32d-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as9716_32d-r0/plugins/sfputil.py new file mode 100644 index 000000000000..17799035963e --- /dev/null +++ b/device/accton/x86_64-accton_as9716_32d-r0/plugins/sfputil.py @@ -0,0 +1,150 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 33 + PORTS_IN_BLOCK = 34 + + BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/" + BASE_CPLD1_PATH = "/sys/bus/i2c/devices/20-0061/" + BASE_CPLD2_PATH = "/sys/bus/i2c/devices/21-0062/" + + _port_to_is_present = {} + _port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} + _port_to_i2c_mapping = { + 0: [1, 25], + 1: [2, 26], + 2: [3, 27], + 3: [4, 28], + 4: [5, 29], + 5: [6, 30], + 6: [7, 31], + 7: [8, 32], + 8: [9, 33], + 9: [10, 34], + 10: [11, 35], + 11: [12, 36], + 12: [13, 37], + 13: [14, 38], + 14: [15, 39], + 15: [16, 40], + 16: [17, 41], + 17: [18, 42], + 18: [19, 43], + 19: [20, 44], + 20: [21, 45], + 21: [22, 46], + 22: [23, 47], + 23: [24, 48], + 24: [25, 49], + 25: [26, 50], + 26: [27, 51], + 27: [28, 52], + 28: [29, 53], + 29: [30, 54], + 30: [31, 55], + 31: [32, 56], + 32: [33, 57], + 33: [34, 58], + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(self.PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = self.BASE_OOM_PATH + "eeprom" + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self._port_to_i2c_mapping[x][1] + ) + + SfpUtilBase.__init__(self) + + 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 + if port_num < 16 : + present_path = self.BASE_CPLD1_PATH + "module_present_" + str(port_num+1) + else: + present_path = self.BASE_CPLD2_PATH + "module_present_" + str(port_num+1) + self.__port_to_is_present = present_path + + try: + val_file = open(self.__port_to_is_present) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + val_file.close() + + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + raise NotImplementedError + + def reset(self, port_num): + if port_num < self.port_start or port_num > self.port_end: + return False + + if port_num < 16 : + mod_rst_path = self.BASE_CPLD1_PATH + "module_reset_" + str(port_num+1) + else: + mod_rst_path = self.BASE_CPLD2_PATH + "module_reset_" + str(port_num+1) + + self.__port_to_mod_rst = mod_rst_path + try: + reg_file = open(self.__port_to_mod_rst, 'r+') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = '1' + + reg_file.write(reg_value) + reg_file.close() + + return True + + 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 \ No newline at end of file diff --git a/device/accton/x86_64-accton_as9716_32d-r0/pmon_daemon_control.json b/device/accton/x86_64-accton_as9716_32d-r0/pmon_daemon_control.json new file mode 100644 index 000000000000..44bad6494229 --- /dev/null +++ b/device/accton/x86_64-accton_as9716_32d-r0/pmon_daemon_control.json @@ -0,0 +1,4 @@ +{ + "skip_ledd": true +} + From 2cef1efbe020ce70811acf88f46158740f940a3b Mon Sep 17 00:00:00 2001 From: Ze Gan Date: Fri, 30 Aug 2019 01:26:48 +0800 Subject: [PATCH 54/54] [docker-fpm-frr/bgpcfgd]: Update interface of bgpcfgd from swsssdk to swsscommon (#3264) Update interfaces of bgpcfd from swsssdk to swsscommon to unify a suit of interface with other component. Meanwhile, we can listen multiple tables at one thread under swsscommon interface. Signed-off-by: Ze Gan ganze718@gmail.com - What I did Move the interface of bgpcfgd from swsssdk to swsscommon. Because bgpcfgd need to listen more events in the future and we want to maintain one kind of APIs, swsscommon is more suitable than swsssdk. - How I did it Refactor the BGPConfigDaemon to two components, Daemon and BGPConfigManager. We can register new managers to the Daemon object if we want to listen more events. --- dockers/docker-fpm-frr/bgpcfgd | 153 +++++++++++++++++++++++---------- 1 file changed, 106 insertions(+), 47 deletions(-) diff --git a/dockers/docker-fpm-frr/bgpcfgd b/dockers/docker-fpm-frr/bgpcfgd index 012a766c20b9..f6d0b86385b5 100755 --- a/dockers/docker-fpm-frr/bgpcfgd +++ b/dockers/docker-fpm-frr/bgpcfgd @@ -1,65 +1,124 @@ #!/usr/bin/env python import sys +import copy +import Queue import redis import subprocess import syslog -from swsssdk import ConfigDBConnector +import os +from swsscommon import swsscommon -class BGPConfigDaemon: + +def run_command(command): + syslog.syslog(syslog.LOG_DEBUG, "execute command {}.".format(command)) + p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + stdout = p.communicate()[0] + p.wait() + if p.returncode != 0: + syslog.syslog(syslog.LOG_ERR, 'command execution returned {}. Command: "{}", stdout: "{}"'.format(p.returncode, command, stdout)) + + +class BGPConfigManager(object): + def __init__(self, daemon): + self.daemon = daemon + self.bgp_asn = None + self.bgp_message = Queue.Queue(0) + daemon.add_manager(swsscommon.CONFIG_DB, swsscommon.CFG_DEVICE_METADATA_TABLE_NAME, self.__metadata_handler) + daemon.add_manager(swsscommon.CONFIG_DB, swsscommon.CFG_BGP_NEIGHBOR_TABLE_NAME, self.__bgp_handler) + + def __metadata_handler(self, key, op, data): + if key != "localhost" \ + or "bgp_asn" not in data \ + or self.bgp_asn == data["bgp_asn"]: + return + + # TODO add ASN update commands + + self.bgp_asn = data["bgp_asn"] + self.__update_bgp() + + def __update_bgp(self): + while not self.bgp_message.empty(): + key, op, data = self.bgp_message.get() + syslog.syslog(syslog.LOG_INFO, 'value for {} changed to {}'.format(key, data)) + if op == swsscommon.SET_COMMAND: + command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c 'neighbor {} remote-as {}'".format(self.bgp_asn, key, data['asn']) + run_command(command) + if "name" in data: + command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c 'neighbor {} description {}'".format(self.bgp_asn, key, data['name']) + run_command(command) + if "admin_status" in data: + command_mod = "no " if data["admin_status"] == "up" else "" + command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c '{}neighbor {} shutdown'".format(self.bgp_asn, command_mod, key) + run_command(command) + elif op == swsscommon.DEL_COMMAND: + # Neighbor is deleted + command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c 'no neighbor {}'".format(self.bgp_asn, key) + run_command(command) + + def __bgp_handler(self, key, op, data): + self.bgp_message.put((key, op, data)) + # If ASN is not set, we just cache this message until the ASN is set. + if self.bgp_asn == None: + return + self.__update_bgp() + + +class Daemon(object): + + SELECT_TIMEOUT = 1000 + SUPPORT_DATABASE_LIST = (swsscommon.APPL_DB, swsscommon.CONFIG_DB) def __init__(self): - self.config_db = ConfigDBConnector() - self.config_db.connect() - self.bgp_asn = self.config_db.get_entry('DEVICE_METADATA', 'localhost')['bgp_asn'] - self.bgp_neighbor = self.config_db.get_table('BGP_NEIGHBOR') - - def __run_command(self, command): -# print command - p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) - stdout = p.communicate()[0] - p.wait() - if p.returncode != 0: - syslog.syslog(syslog.LOG_ERR, '[bgp cfgd] command execution returned {}. Command: "{}", stdout: "{}"'.format(p.returncode, command, stdout)) - - def metadata_handler(self, key, data): - if key == 'localhost' and data.has_key('bgp_asn'): - if data['bgp_asn'] != self.bgp_asn: - syslog.syslog(syslog.LOG_INFO, '[bgp cfgd] ASN changed to {} from {}, restart BGP...'.format(data['bgp_asn'], self.bgp_asn)) - self.__run_command("supervisorctl restart start.sh") - self.__run_command("service quagga restart") - self.bgp_asn = data['bgp_asn'] - - def bgp_handler(self, key, data): - syslog.syslog(syslog.LOG_INFO, '[bgp cfgd] value for {} changed to {}'.format(key, data)) - if not data: - # Neighbor is deleted - command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c 'no neighbor {}'".format(self.bgp_asn, key) - self.__run_command(command) - self.bgp_neighbor.pop(key) - else: - command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c 'neighbor {} remote-as {}'".format(self.bgp_asn, key, data['asn']) - self.__run_command(command) - if data.has_key('name'): - command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c 'neighbor {} description {}'".format(self.bgp_asn, key, data['name']) - self.__run_command(command) - if data.has_key('admin_status'): - command_mod = 'no ' if data['admin_status'] == 'up' else '' - command = "vtysh -c 'configure terminal' -c 'router bgp {}' -c '{}neighbor {} shutdown'".format(self.bgp_asn, command_mod, key) - self.__run_command(command) - self.bgp_neighbor[key] = data + self.appl_db = swsscommon.DBConnector(swsscommon.APPL_DB, swsscommon.DBConnector.DEFAULT_UNIXSOCKET, 0) + self.conf_db = swsscommon.DBConnector(swsscommon.CONFIG_DB, swsscommon.DBConnector.DEFAULT_UNIXSOCKET, 0) + self.selector = swsscommon.Select() + self.db_connectors = {} + self.callbacks = {} + self.subscribers = set() + + def get_db_connector(self, db): + if db not in Daemon.SUPPORT_DATABASE_LIST: + raise ValueError("database {} not Daemon support list {}.".format(db, SUPPORT_DATABASE_LIST)) + # if this database connector has been initialized + if db not in self.db_connectors: + self.db_connectors[db] = swsscommon.DBConnector(db, swsscommon.DBConnector.DEFAULT_UNIXSOCKET, 0) + return self.db_connectors[db] + + def add_manager(self, db, table_name, callback): + if db not in self.callbacks: + self.callbacks[db] = {} + if table_name not in self.callbacks[db]: + self.callbacks[db][table_name] = [] + conn = self.get_db_connector(db) + subscriber = swsscommon.SubscriberStateTable(conn, table_name) + self.subscribers.add(subscriber) + self.selector.addSelectable(subscriber) + self.callbacks[db][table_name].append(callback) def start(self): - self.config_db.subscribe('BGP_NEIGHBOR', - lambda table, key, data: self.bgp_handler(key, data)) - self.config_db.subscribe('DEVICE_METADATA', - lambda table, key, data: self.metadata_handler(key, data)) - self.config_db.listen() + while True: + state, selectable = self.selector.select(Daemon.SELECT_TIMEOUT) + if not selectable: + continue + for subscriber in self.subscribers: + key, op, fvs = subscriber.pop() + # if no new message + if not key: + continue + data = dict(fvs) + syslog.syslog(syslog.LOG_DEBUG, "Receive message : {}".format((key, op, fvs))) + for callback in self.callbacks[subscriber.getDbConnector().getDbId()][subscriber.getTableName()]: + callback(key, op, data) def main(): - daemon = BGPConfigDaemon() + syslog.openlog("bgpcfgd") + daemon = Daemon() + bgp_manager = BGPConfigManager(daemon) daemon.start() + syslog.closelog() if __name__ == "__main__": main()

cR%8V33(uHM4iA`1!5pakKcRPAzly)igC!{4rK7EmYOU)U)`R?V^g?n%H~7 zq%QI3z25o9i3G29=|%W1Um{R=tAAc@=n&lSLS=-9XT!2b zQ6Ps6C1^dGB<5?3D&LKCeaqXO$vV`_r@LoI@8;)|0nnl>b8*J}?-O_THYo^}34(R7 z0$dZ^6wIktHynCj{~46+8-Cy33B0f_2b>>Z*z7N5_h4JA+?qWpR#n3Rlo`a`;r+|k zog@8k9=oMy@^Sb1ODt;@nZZiN$=bylCHj5qXv_D$E*vg`3sXIHHZucr&J@9~k&1d}_e zZd$&zlxkYa)Tv+m)M@Y?__X#r!^%WVTBjM2=Skvct;Jz<=~*><#W13u>)yl4=W_RL zoz}Bh^ujbG=FyFr&!k)HgWcnX==fyrW$w{)8_Z^9P20Gbh9xB{{6;x@2Yh-wO?f0P zcGMVyiPvum8w#9RS!|x(O4^GQiKgsMy;9yLE>-^9wa4jbIj{6z?Hw9dLuOjcr@9Z? z%zKgtHm3K9R^0ZhuE+{7w-*vz+AQAb^P&!8Xg&pJK0P?m>alf9VWE}8B0_+sQJg?V z@rfeN?7Pw#QK2xMD2a3%gi_gg% zo`;ziBMSKwrX8Z3c+j8gjCs}~-rz4^MA*#vb}M0smEW^`_Wq{`ld*Oq&l0q`q!`V9 znq!~>N9d?ynwku}so#!wQX*A363%iA;79nu9IO3Oj`H9+f?+0b<`P_4Xp_tai>=RY zCr5`P*4z`Kaw#)6p4@<~i0gjh&4AIgaC^%Fh5`z%OjpkiCtB1G1x!(X(dQuCU~`^j z%qD|4Z=U5`+hVCakwg=&H zMCySBrM31k*`Ly|wwfVSVSn;(yY*1(jfB#f9tL!@xCUVyAcnNXlHX>rMG`XulLcE@ z;SB>sac_;W>pub!)O7^2ignJN=SH!@dvn#N@4A_`xZ;a2AIVi^>+J<%?bdRwQcQD@ z5l+J3)BoTx!=Vu69a6_+0N{uCQW6x`5r|HPH%?pZ8%(X{l%*N`- z*_{v4XRK>m|ED>0iqB+Ii+OJHk?X^T%j%uahT|uL>n`KU-3_mUE_D%zuT=qmsgkqE zf*9>AFYW4$-mwSXp)mjMNwex@uKWge z;G3s)wUdtK!1H=#5naX}>ywq^C+y6>ihB%mTx~byuP5}n2SZM*>h%u%CAlHC@R24a zVH3L~Q!^M_{P*5wAkn|TAFP04mkLIwrv3&p<-?^uY2(VrR8$t{77gxLOY}>p6*|kW z$PP*5W>i?J$MG}A8z&v-$&G#bl*#Rs=Uu>2phjFU+d_;=51H(|@kv2{eFrdg`y08J zO@QG*D|`0%gtT&JmpUpZRsUY#o`Fh7nHsiNcStCD+t)Gx#Rwh<=w5Z1Qo5BV70|$E zCYOuI9gvk!GrW#fFaHcn_WHcMa`xP(txOtGG89}6K)e@)@AEnjd2!&~sUz~bAs_aQ z0scXL70=#=N20g02{W-Mj17hQC-3h(Y#X+T$eGL}>`|wGeqbK%GX%coG|D@JipeZ| zN{J{NU;5V3kgG~ZeAI)JTd8__n|BVh0r>bXAcV~gUXHg+D8tVT*ude^q^zvJby~InOkErd1>-l^Y9)FapH6gUAK+a_v_J~R27X~pR6XR?=<|{W;RaykyxO3L zBR1YNhX$E7f{BIhKN{l1II)xt1jcK9QCgCh23Uo3zRdK~%p*Kvu7qb>Qw*!9Q6N5lsuJ^_JYgKo?kn1~5??>7$082KzaCf^VeDWR=j(t&bUH4TA!00U_o;VQTv8As^#xbG zy)xiR4zfy~V?8_g6_%O!@;xA1Ww0`-+n;7l)KVvXtun0oLMZl=Ed@Mv_=#&AK3nW_ zaR0sVx*MkDXH8z|9y6J%1X83bdoW@g~E#xifIq-gtNU}!nqmF^xy#stEd%s4#t zB=|&ZC875&LmU1Icy4`-?RFbad#dGP@5^MLJ4g=(*ej_szUd02jD1x{eC}In?bz5; zPP|?WNY0`rbYPE1-pM4@=y4nG*nv=#S~e&5sDhS7SJ-hNRkb$%9zPFWs!&=&vN_-E zKM1N2KNL8}Ood9i`XFi+9dd+bc3EXf<(osK;BA2({HH@|+hb_hs9heLq981Y^~bAs zEtcqIHzJ^m#=^KKF?AHIT-q3DeEGd*ga_9PKd?`&i%sg9hjIo@&M>{T<|Jt3Rq+umy zmjbuHzKM0FN)eQUfF%ne}r74%a1 zVyb3%F^eugyyt676$CH(2{t!27chOYankkQiI(Z8*tRTe*(!J?u_{=>-G)tcwD6r_ z`eM6BVMNq_0qcR(-JJ+NTk>Y3@-Kn7&V%P%s64`uM%?2~{X;%EFyd+KTWaE{p(CSb zTJeAuJb`2NS*uXEbGM-S~<*f@En` zz(BezL^uH7U?6=wibFFw-oU}k#3~;qA0#2^v=B4}C6eZkHm;8XfmN0;MX1B~Bx2HV z`x#+^!n0&n7cDgx?T5(9p+_*cI*nxeTGm<$&$6$6v)gzT_LA*h5C=gk4(E!5AbRBv zv%Zr<^$Q$Cip+QtW_MJf|3q?Sd|BH1#&a$pQNV*Bz>~KajajW~7+5vB86<7kSAa*5 z=0d59jRu-_O)==Rp{i>V^k42?50C8$R`=G{7a|Tthp*nXLqW6bd$ZO&V$4J&?O%$_ zVKA<*>2&C8#;6G2G+rXHZ>IL9%8uhxchI@M#mgDnHGw@5pHR_ho2_vryyuv7{wh!WMN+Dj7 zO4tTS*VH zeRtf)J0E6@hkBedM~$qkOv8ANi;c~y!)jV>df+INL*9u^Ut6dqNyCut{U*;SA&w?Y z?U-z&>rX0xZBD7%|V24IdH;1fChD} zHfMr@z_Oz5BC%MZy4wdk(hL*G3-yKfIepgTCv}VPe71Y`$B8A^;MTf#;Uq26Yz!Xr z`8T{oanBc<+0^9&s;T3lLEKelKzn#OE)Bf#q^Vg&by<0x!Q7A$O!4FR5ZdQH!`1G7 z!rw7B&A9vQUDp9S%8G|?CJe-Qz=4 zjLCZE%dl$&$@rVWWsBpP^N_qk0~<)@af1eq8>hG!NgL3Kb2^2C0D+>YZ8wOCSEs@g z)JF{~-~LEc`a~k{ETebmerR+hob92MUpGPh)0=)V$$>8gOM<4o%lKS0w1t>FuWOD> zJ@;J}v_wUzI-o|S-uWrn&1Y_MC)m{~*j20ACzV-)rB3IBUgSTZVwhgu4J>#@`~>nq zlshV>Eo|*v0oH~Nwz?7mfq5ii(#1BE_s0TQa*Ffq*aSdNMiR}NQ|C{ETtk#m#7s73 zZuJWcpq%?&dXy9o7_Jk>2qyF~0Tlz{vv`1`4qC&gSFV*Kt$yRHb+_(X*7xuWF|BW3}G{0EricMVj84^ z8cyy|>65NG5&Fqu3e|zv)gbjIA`;vX9-J!7X1&##UVrqpybGaRbK9n(^!61dnW^Pm zB0MZ{FkoTebbz~U@z5`a?vu~}_Dv}U>bY!K^M7!Ts4xS>E`~u-JLnk*_ROZ4!oURf z4%!zWcm%n(g1lu8Y-#YlO#N^)ZVI=En*C@QQDk|nPjsFB+ORN(4V}zSGn`8v8ZTKl z&@xR&7tpMOn)Sh-88SP1Z|6xa6$zHK6CzWB+^rljL8=h;NYYgz7+?UcQ+LCy^IFps zjw8>0`-pi+c|zoW!IgN>m+j-z5B26mq|D}Zu+{l~Y#_D2^8BW_jrb~XCk7X!LLGsC zg=~__(o;GaY8BZ@Fg{CWJx*5<=&22E8ez*!e{8@4-y((=ZDkF3tJ1SRNAA(A;2LzI zrbi?Br@*w&PZjD;O=Y321(VLvrM^WMya0`;kcN_S>{ah~Vlw5VNkKT)k^(rK7Kb%R zC*>U=W=9diu4^y&7Hhr6*E=HEUllPE5pD4Q5luBp@MH}XL!psM_(j7?0lq#|9!j}1 z7=Pk7=7Z%DOZ+_=X=c$Tm2V-zwE1{0OQE94`{|AAugJc$J?BSZI_ouZsB zc)Gm-N`(lbkw$k?*=4~QC7AF|!vPyPa3pEot0f8U6o5m-AM~5!T@bkr^e1u|A;+`3 zv>>#+GMtIBAavooy&|Cp-}ID(1Ncaq7!tR!*fa_ClX5vF{|hBXr|%DPrGMMtZ-Q-$ z^to?RCh9!;4balb8gm1gjpUgm)F z6iC4W0gBeZp0JH%db$Tj0wXF++d8V1b?#8^HIAvFeMlETg|2!!{)Y9hi-DB#ZXDgZ zcn^)a`U8lBr=##D8ZUUjWmWXPVnLv%WowQinN3ZXz=0Mhpi4CamcxNqr^`wOefZaY zi0cXk-68)6>o}^2!&=8QP~c6)0{sbYl%AZD4d$s~~{*V8X9tJi=%0U9le_s0nG zNg=Q_#JvL$eJp+eccuU3rxDzn=L#Vu%%5u+TuK#z&Oi2*?JQ;Uj+qZ21oUJd3^N zf1505_c#(YoF!VF^swA`2e{j`=wI@c22w(-ktGk28W;{`d{mRy5u38uQNbc zb=iv{bjb;<0odgp6kN%qwc;T(64T~p`-yb|iAO*k3>Q=)r?kW^_gGUj^h`pR!?(JS zTPrkz>P~C}P0%L>0ow%Z3huEmsV?ZiV!%rO@*q@YogQp%Chcg&J<_6tRtf;Q!3xVL zD+%Dz1(21u3QHGEe$?xpvmMr(sj&4JVR0NoC55~{63Jh+U(jfT3v$G5X0L&mYS^-m z`aRfDpgo=|07*Mff%3&aLL|nnBb6HIZtY^>GmN^6Kl*Z~*i#3D+(!0ZJ zZ9=6K^3K)khMYi#Ou3+?$xy2s-exOQl?s}pk}s_6;|iC&11{(Eu!F$PLTDf@*#ykR z@b{fMiqc&@A>7eLnD^#lHhCHT$ztVu4e@4;Bg91V3RGCyqrZ&*N{`pQusKe#LRZb8 ztnNF|G0#mNOPXd3%e!85-%*qC&t*|Of);fcr^Ttm(ci6XiLj_CE5EDY^mDieP+~r( zMJZojvH|z0n(}YZVPe}B$gorAfQFFTuP7@1TD3il3T*$qZ=*!^9Bw`1(&FgsJAA6s ze`4sLWPx;GHC#KFQ@a3*>{$@|Hv8~oWb@WqsqnlVI>~(V{AZ_y;f>s_sV8S-ubzL#)MperBbk3=Jp0)8r9AuWD%|;O?qe9( zJ;a4_Qdq$dT{mbk55XNdn_$(4E>Qw{H>rW zjT6wKo$HyY-0LSttm6xhZ^(&PtviRCNAJY+pXs_ICD|E;;cr>|Zm4 zR1zwa13%%;#w4ik!^&Aj?!{MFr1m5sBM8aDWXhR>aM76>AmByBA?oW{^ItyjN z^g*ORK96+|geP6u&g$1W8ZNLHWqAROGe$eTzL?o*noZ;?=N-aM?HnJuZ~x|zr3iSk;f+1d@EDr z#Ms`}(QM#{I{u0__5N z{aaaJVzS>EG zS_@GR1!Lf#Zr0utY6{4AAW&9{r`Ud4F-L{^C=Y0>-6eP%3Xc=i%N)aO`lDvaJXN@F zmxsO-LXe(h53n3sAp!aZbKZrbFFU*4!-n3GrvlpIy)+iDb(Q{x`wE@|q@sVDangQ$ zr;%j=-2VY{ImBV}D&V^KDPZL5a2Xhlul%0;9Zh4x{llv>OWi8L_!I3$cgF0xWY3g9 zBO$aAEfCR)I7Bbex(XJMed#WoR(fdw|j z2cs5xL5NQWm4YD{v$90O@ zh!lVIO)omII)RfUUQ|Bzak&~Z*2spE)8c8Z@#{qGvjcsYOFEE<`1YINnC05h0j-__ zx_ZRGf|`Sz)NwdqJLnJCAu4lBz8}1yAz1wK&k3gVo< zQLkP8H@7rrrjE0Wi`#ky(S)nGzGTbQ!*EXPl-tx&@JnC?MIJf&1c;+Pby5rY&qppK#UtPYexgp zRxM5FimJe6^BPN##{EF~mMl#p1A7f_b%II|bzH69^+P9y0Qe znLKSPAy1IUp{_=@gL(S7Us@GftrTU9C<%Dnds!Y2lhp(^Rp0@+<}ezEGxV+MNpUkI z{^jV5UT2D!V(Qknvg2&XiLrTnHIQ!7yeMP36cjb2mW`ed8wJdc4VZh?5UbOS-Ge#Z zN(ixP%DEHRt2B|u@7mdVw>e_B_G6Yyq%g#i&JyObUvu$-A>ubbkx0Lt4*4oYYxfc>Gyb&2g}#g4WeJeT|>jjHHsAM86*DAsR~I zxcVUfZ-|kKk*kCQgADQk(2i;^ZG(0E#IeI5Y`ST08-@P<=F_S`P<+}U+*9>k(k^w{ zntYKp53s?TF6L+_O0e|Isgi`ur2@5cuyQ7F9ash>HQ``cG@Lrk9-i9mp!3{nR8&T? zRPcu`@OP`r^iU2RN$}QMHqlgq%We&0D{-z? z@0X5_6+b$;`KPSa7P{R?PIh)|Vfz&?K)tV)trld7Q>F)hX5+XSF9fYySTCr%i~IBj zvtF01B{o?%s0*ExrAeizMSJJhUxP9yHB$9-wSX#7aZKovW~kU!yb4(go-n3%eKgy z5F&tkAZCzJKgQnI$L-x!?lSWmCCu~U^O3L1ni~mAE@X+4HN5bPIK<9iS?TWPVJkP zghH;#MLQ%?rH+GPnJuUw%Gb_9#|T}MzBt3uj|g2dzO3m1=Ly@aMH3)}OpGL3vvKth zTBUXnrGmelUQ*-}F;a;pMrI4dVCX+)!98g4CW&rmDzjDyYV+NA@QMY@bFK#CvI{tB zulP)I-n=o4q;wH=y*ZPVHxT&2WSj-%zM*qqD_n{gdw)#O))a965gb#I%;oHS_Q-8b z;{cT$P%p9o1U|S%i~RW&GUbu?b=*IG?ZcS&I3LO-xHiF9mq!RP<+{u@!sz6 zeWM=`73#Op(wO~<;M?HN%9bGb>XlOQ;IB=*LYFn-l1NFj8gF^*7kH}NK0+(pgjGcd zO|fkEKvMyKe8N+%ZjsYKBL!g13BtG@8nrjG{KSMe=!BCgf_Tb zl-($7AK^@4ESb=?fX|zLxTC`ai3Xvc|1pv91Sc7Z^DWET4CF)-F@oP*k8n&Q?Ip6V zv?(Ld5|!1C4%Bf1m@}vIxR$8^IJB2fF*yS%%8p?O<%BsNjM8HY!ifdKn%&WDPMq(6 z-}uZD&bFHU60b8bYrTBhY{{Zcrr(9HLsLP<>cf{wJb{PiyyC$k1%I`0`F z8@1C9YAq?uKF(%Zz=KS~7ncnry35ac;vJCQ%Eb9s`_Tza^O^|SFr>B$U5aF0gRt~! zgZM&lNhbKhBa^nggG*ikR-V?4Wu0BGGY5=|kJrs1*MoEO)fqZ7wVBfe`+&+Q14)GF ztru-VPv~1jea40cyaQ<3q7r%QA%HK_7{dOjcdesi^sN^@>4VcLnUenT*df-23PQg# z__|k>JQDF`S7=8VOTIS06^>|58MBV~S<57GYcy4)Yf$y6OzpFGSidc^Wdk=WnW4Wpdjj%*$JrJT06M5Oq>DtnJp!4p6(u1UgT*DNU9cjhKwhG$CfSL>?F>?dHdO6C_jcmXCe-6(9KA z7f`>C{BCHRWs2=EP=Lg$1?YztL;odzIZS&;&9ya_Ll3yiDFP76O=!XfClm-p94l|D z6<(=_N1f1(fU52%ACmPJ7=A+8I zV}1bCE@R`5)q0naM4n6pr7(@>tu%u+hHt(REXYGx$M2Q={p6GnqAS2*J2^!szPu5f zQ`Kg)UzewGzzA%jG3jki5Oy%3i><5r(G@I02wSYON71TD0TC-BPAH;ji1p$de;zpH z*D{lmu564kO;cD<*iyuefX`AebJgU$ehY2?_LX`po=njBLhyzHbaA;OdQgJJyC3L4 z4L|^M81>&Bdxb7xFp-bej`yU{lf6q-nj?DgmeD#mq4znq*2$gJ2f^v9xYee976h-$ ztXRZoFenUjQeb^NV3_laF(n%ihGSYyxpFN8m5P=Um8?kBrP4F!KHJ;n!skaNnD{B9$rpB2CXkdY$-n9^9gzn1k5p50#k_oKxLfW#TonmDOy0au#OYP5z))8a*SEVz{#E8`FrGcs2uLa`&bhuH*G9mr{4|}`)1a7q@9<2 z4PBz2q)ggmCKj2=iN_aTD*%z3A#GQcc>@&l2QB8p(Ns0rZF>~>fSjd3tVPL}$IHmc z>D!9wEJLH`$CvM$yX8iNTw$maZj}bqnmX^@_CT~2p_vG6R%PD}l`5zR(%`eW`0|4Lvm74%cFB=le$$0!&o7TeUCbyx}f-veRxi=RIK z;iuX!e*RYgS6g-bW|)3|*>GD$S6C}c#sWwq)oT>Z@4s46hYvI4w)3XepIQa^SF*)T z2JNm#Rt6*`P4wg*>A1~_35#k#k%-B(YE-R2HcrLpP~(WvW$;0@-4aWtN!IQ3ytoPm zviFj2e$sfw4us-lh^euC>x7=C+8TW&XE12ob1 z{Y$122O%M-vcSc>XyyRVcC`}xEV=6D)hU}JPSs7m(y*rb*-1n9GI-+tmWn3=1I6zu zzf}GC;!YeI9geaU=;-~E5UbBEE^l}4t-zUWQrCvmaSaMJmh$VI+V{xF=&m2jt)!1^ zo6p;V*;9nbuOh!%e3l@}hb~K-#+>V+l?N(Y%_V@+bkqmfo7-QD`~>pm+-{q`L$Ahc zZ3pSc(;m;HPFj>hlGr;nZj}6vD{oYQY`{owM80A-SNX$A9cq0toJ&O5DHY7#qbOd_U?El5;8pI(?vVM3{h+`W@>&5thO zx94K7IhjO$fU>SU6?32xspPdLjjWnT&#sW4Bvnaa^DD*;P?8r6!Ke(Fg_QKTw;Cm7 zHCXHeh<~A($`&hmZ5Rg$KR76;NGeDjyvu8f@Y+B7K|Tg~dF3!z0;NE)b=Kwe9nOkH zXn<}^&)s3RhFAG^aP_hov;ioKt zu*o6}N0~B~MMB|QJ{rs93CaEFKlNj)jQ%GXPv1a3Oyw#76jAE+mZqqDT!BwLM#n?C z;u7x9-W=+0fnVYACS39)xfHV$o9XeXkyo^Ks}lRT{f$le`h8I8^17YceANxb?7pf| zhE$tK$0D9bzch|~!0tpV&2z42C_`}+J$xuzg)Heo*6Bx`Yvl!o-Ce645ShJG%*R-z4y6ED((lV|wRaKEK6GhsU>bbUJ}nnbn# z@YvnKPK%uQA^vUj^U%kUpA$bTc7~Sy^FxVS7u>4erGwn6)uki!e|t5$c)&;^9WUVy zwdOw4Lp>)ZhxLwpO|-p?QRCCS1BH$$+5VL{@R6sCt;tu(e;=3I8~!7cr2N#_lG*5N z8QoPbarjL>E-W!MQ(nS1cVGU>*HU=KJHjV=X|f27BgdP!HX!Lm#k7FD;YT0U9ZF zdA1$EJNE*B)e8+!0}(9ydl)(KI4?a|)+ri_VjC(E9TuDSi+9ogf51D?U%Z?DjZOi4 z1O@>3uK-rF{KdPb?;nz_QY-7N@l$l*5NL#gVzN0Q5S+h56Yucq&N6J9Ce5(rmKeud zY}PUv#8Ye*tOlTb_NSzbzhb0Pc;TRlTaOv-vr53&|P)ANxPo{Q<^|XJEQm zLEP};8vwx!o>@Rl;`2MKLcu2eb*0>}<+EoBWl^^y6^D(RbvT|Bj8$zsxh@!H*-~h! zJaF@QGp17$(fp7D-x^X7w!wjQ!$_|SMicf|0ynISm2Il(-LE0AS<86I#axNXZzFJ8 zXlN#!_$ww6PfaZfs<~_spNN?XOo>uTK*`sjNFLr|0#Ka9GEiu>NJxb;pMTY+j1X|i z>&4~HtG|qwFHbyDRP@*|9O6P;6q}WbQ}k0Ah;j8^y!^v{nX?8fbRyuGvJL_4&W{_P z`wtMN0*w%!hDGaY_{m9BgDBBrq(tp|7URYNf_*Z8kqk603#ko8&8CKG$^jhKiG-6r z2j>K>JbVV_dAcN(v_dbeW?xgkgWPdTMz^2bRZYF0-20%sP8Bbfywv)S11m2~dkE`a zdFWa{<$%(o3bN)yx89J%`$QD6+p}%S<3IgLe-V?#*52#g-Ohmjk}}GXl=GAEv+K&! zhkej)Q|Ax)Tzxv8G}rh3H7es#NK`;ltHr0hFy~95JZU4|D;41Mhf_Qw>{_eE-?#YKIy-vRO#-s85>-z|=WK174e3l;W3C z#a#?}57;06dF;K@`Nv*AEROq%S7#|04Z#My#cPFkbmw~B_Ph7m#y@$r!XC!IgiYIT zJ&3TWs~y7ai~QJ8`ePYoV^OX1z4qU%Y2q2pULNfv-h5c(MpnkWC-^&Odc*%u4#B>; z8lHd9ub-1rmg$^x`AEP2p+_F*T7SZeCu#P0b~bCsuCtUOZRsUG+VC)V)A& zf^=_@yGis0Bynuobmma5JKiFGW@^TNZYnOMs4X5hKRMh*|1KsLPbC#Y=+I`do1!QM z9|O*_{_MX;GT_|26Kwsg=}*oksjPhGdGp{_A48~-r=?!4+hW7V)9 zLQ&Pox2?OzdG<#EJDhhQ=ya`-+sK#5ShJ{_`|~kE>Z%{ehpLZ#c(TUXzY>QQoJ}8n_i$On z#?;4EQdeR&O8Ra1_x({%V4q&FI+;qz0l5e!hT%|TRU!C_KraHl!lDh(B?+9T^A4QH z>vmr(xktA5+$X^mu|>JODk@{MgmEkw^oYw!Le?g6T;-~BUG7@=sfYSB6SH)V`^2t5 zOCdZAD_F1ZeVLnKWlrDuiX)^K*N3pjFO#v8NcXRTR2h{}=^QmvqP}eB`FQeCk}$}& zp0mrRNt<95!#63IA7Fg)Q)QSi)&-An=4qlr!DX-RD@il~^lRI)tUne?n6mJgk&oICNbe5w0AOkZ9)8>k#T~Y8DC#Pt4yVbSMu>gJFG}PDJ%EvgWOQ zqlSvUKT0o-4F1|7aTkvvaoHn8FuRty&a~q-0LoqtLz;_527p<1i)O%Bdf*|`;HmV$ zw$q@8ov@J{_)(V456{?M)r zqUcY<+aZ?Px&C(#tfw!41^Kd@NK2Iai zA`#m@61$bo*Am*N1U0Sfox(Asd(CarAzLignbq(M_R6S$n2p=pZr&|eDx-n{c$p$t zpAbnZf(o`9ds~eFE?+>*R@FJqdKK%_^-oF_XULIEa~<*f9LBK+vWHw&<@X0q(Q3hev1Y|v7Hhrf5?okJsLBwlzUe>FS4}!g(Onu)o{-1@=9+k|_x6v+w0;vf?C} zhyX;jJNJ9pNc8@3!}XS2kxUDKTKp5j+d45%vve+}_6q2Z1e>ZSEQ}lnEJFp*Tgwsv zV@)hZC39j72^Mrgbb!cfzTqY;tixhu&kN21#R>)C7Ysgo-}r-3@ZqY=nIUDi;;5{} z(b_$!qwff_AHYp_^LA)xXee#+@&`)_XLR1fXsPrVNfTRPY4Kl6E@g@Pv(N-i;y7gr zXA;@@nlLJTQnC6J0RuS|)Yv^a4dtDj2J#g-HNqObBeTB^M!^b1Rmg&Jb!KoKs0lKp zOk5jWy+JBy%$VD}9vTFn90+@W^+4_q#5>$ZC%4a*_jLfdgmb$v}i{1ZdUO9!<_N zA$A;e_)Z%$5F);sn^$iH>zf!}1XE$3^wk&RfMcp30D&9~u<>}Q$AJs+-W}+L`RIj3 z=!Jr}l=}|S;3a&Uu_q1@-aP~0~aCCm_?r z=b#^dqAcHvdh8vl^c|%yt901(^%0wjLnbbb*cxuvy%S$U*4i;OmT}5^cxVPHa|oE3 zh>_GceVRZ9O0w+#oajMqKdeK%RbR-zYsPYvH=1aa(3|Ce;VnWlf$jSufb3n!z!pnY z%}o`?T<#Nxz@a$2O{c^lsonjiZG#}2BC_Yg2jMt27)Tn}eekY?0a*7+bgn{Lg8^wX z`lYODn7dij_uo1ZFzN+#As8CF9s2mO^@V?dvGtKI(!QH*+>M~^s}JDXo)Y)Q9*`iv zPVEaw6^fhUNVHk|AlSH*!7~yVjph6JbmgdTFP>iF_6oYWsPQk9!Cohe&F!PvruQ{D zE+X8$h#%L3^A3pg_G7;XVr?_T53}d`Ez-teXmbKhAj5bD3uZgC)p^lyWakVc}tCH=DQaR865` zAI>?s#i+r4ZWAZ}@vRzk0I=UG+HJLz$Ny(LNDCm>*5IPUsVRFgD|Q;+$Ms{z9{RcZ zaB)~5>W7d?EPv)-y7=$bbi?i{o&52F$Xc1chMksaLCmLn?8x(|nM-^^OQ~BsJ00eB z_oTz^iqsmXs2V(-!XU5aP*l$Lo+Ujgf0a|b6m#qaIj>?VSD8N0;vNa-+TpbPdRj|< z_@qtknw_Ekc4A1RhfC7$a%6L>!axTihX0TY*WYp#^P_)KM92bB9aYZa++(#PLdK7fI4-EC ziasvh4M@mwS4Bl|HDA7+4&D(Z9lQl(I#`YcS3{Q#icn?{y2@l*G+XA5X zuwWOt+`gN)n+ILWB-?_oc&*n&G7~y3YrEjE!uGBkH5Y_T2xzx{Ey!z*lVIX+{%Lo2 z*ND(I+xbW|f1w$Ihe8ZVhJfEC7I)17-sd`G)Z{e19|kYTk-^6B=C|6TX&r!=Im-%v zLwGtz(w-r>C(BD0gaIy!n{kge0!LzQ_hASCBUHLA{JY{XY`PhKH{L8o`EJ_&c@#}| zcjazqL|*Y+(mPp;AO2_F4+{TI=qJNXbU*xE;7<|$Dh!{2?|4HHBv$3XwLP*&3M$+^ zP`XL~bhkEOY@QWS2Dv@H1^yt!pW*KgTZ<6g4JVlSt^O;- z_QKXggNV7g=hfI0%T>gCipjy7I+t+Xj$n~(p79lj)k0?YcL&$q>-;3&Xe@Ea!Dta9 zXL9W+IkH~76>B7idN@Sv3;`GX!TrqAP}2MDT|OdS7Y?#CeNq*j($bh#qo{Sz&-cVfDa%IJK8?0k ziNqFmCyazAb7vzE2!Eiu`Hnx?u^QAmzw&!QD`^M>0WpHVXH{!3!5J}JNWXW<2|&y~ z0fp-vg*7{mYS20SaDp1^Mg-EtoL~TDe;m7Uqxw<#iYN#Fc}tKLl+;bw&hlCU`=LT~ zBokEM%8pT2I%zB8t*Am-Xf;^Ov8^be=UZU5awMXhPHN4;k^QZdTy`MDl*JNqS-CGF zM^E1Q_LNt z%^7W~_-p~XX#rX|rQSsgmQA;BJlX69r>kQ`-JIs_2;5TH#dkPlp0{^PH4ku_$rGkx5c1h+9k86RTTmm;nSj)TPDpV#y>CZvTz+}!t_NaJaaeiMQ zRBtNtz*VxuZlqTIOwh|6%;XQp%x0G>4bq%#^kWr=u7)*k)k3m*+e7=FMFZ6j0G7zr z^-Ji^)FWM`M}~Z5-Pi77KMh3`N5Z^g%-mu=%={2kWhYYgKrgun<;;cW!lyCfmyO95 zMIwxZm_MPe%wM!?mZK4!hl0SB7weyd?Q%fovFt{fV( zcwsN=H|w`g;SnKCo7c(*;%y-QRc<>G zZ7|fL)mwgOByWT|u`zXh8hR$KE;}Z!?Tjsnd#8;ZJ(cRkYMNPx*k|;`g}1;H2W4_vc=WmDKJdFRFo<{ID|Dqc9ceZBu^^X3p0EPR1^)!#j zyL)0RHDlAq{0+P;9`zNcn<9`=Kj1upTgW? z-uaHgmOj#ZAU^9KfsgSQmH8-smXF*$^u5B~6u#YPFsOfvg%Y7zkt&K8`4%BGi+1kz zto-3&^EM%+tB`U`mo~4_<5-7GH7$i$1*vwa`-oS)IXu4nD&45$VBuIaCS zw&i%^PZZd&Ncr1$d1>?av)bjTLQamWL%s0MyJPE$Z%>joYs;?3CeEY{@BY9h4SBKp zw(ub6j!Zb{i!2E^@R^9|Z-`u$b-7C72_`3E7beh~6S%7W@qU`f;%IKsrf~=pk7U{I z8nGxGRnfajaDj0Vtzdq%n9LGX(cSiR^L|NlcHSOguCZnWs>zr!HSGD6unB!OOj2-W z2i97;=!&jt+{fVr`O(cFT9<~>n=pg>T%x{(i~$txE}^PLs%faq!w1>l9m(XTePu(o zn0I9=>Sfe**6@NdZ^sbNZZ-*K82`@cSGZ)xEx;Z(mk;8W{CD=wUOTtM_=IG_U@S`% zOA3Wsb75r))u?B{gzGbZ;DNlwoxD3Z|F3s=m{V5JaoD8Q6;D|-8g)Ja5uF%VELjm9 z?T9vk=14O)#U^vCdS@uJe>J5k_&}=BTU&Z57nL)6aKKBXdCRGLF6cV;p$w4R=|o8t z150@x-GgWlY=TFZ7|o-AdUr;GG+qdzN?u*YfcmFSIMC-)YU$mH6ql|dEX@u?r@($5 z!W?lH;jk>}|40Rtl9qFf<(RIw0?bT(awX66P8Z2J8Q^L(udpOSR3=m<&#!l=8hRJb zN4?eiyb8CQiPI8C824Em^2A|{GqqDyYpt_R^E0voReE57O6~H+v<;hh5_bi9>8uxQ zsjfHwN#?4IB0L3>Lh{=}j(`otFZFVD`Pyg;R}^x!%dNKsR$wlbsaj!bkOMd=mFnR% zf3SpYI+1q1EAR#K%!yPoGIK98v;p98+4W0|wI_(l%yU@I0GAAI>bsP3f-kM3S_;zA3mIAhPf=C^_}N)H=LD7 zjHkvxuV-moXq?=GOP*dhM7g)j5?AM_WI9Jq*B8Agv9+Qt`9;XNnvG_WBMRMvnpaY> zlq^A7Qa9p#bDwT%C?A-#tPKk7!@-CNIGZLH1mS=ZNzki+SG|x3tlZb z*AHv5xMvVj&%Q@Z?pYjhu{f2Qhje-or-m=)v1v#OuEg@0bwTaFo=zd`X;jJZ}De2 z82c9@JV-_4ED0Ow-f)SYapmKI9rG4CLmI(o4IE+51eI)JLSU9d?o=p|5Q|{;isIi5 zZL%H`wz=o9DFN&Qa0hlE_TT@RU-j0BQCfQEK#1}jTdMvOQGB1F_Yd>%64*ll;aS8d zxBnB!?LaY;Ues^KO#2`lypYnZXMxtXXA)W4+dE*UR&|Q%zXOLwOq!=Ms)K{&Mun6J z!L}sos@)e{N>#`OMaz_nXF$>8?e|DA3x=Mbo|_)Ko1R~HgNJ}3^c4K|K8vAZl+$w2 ze`sl_ArBq?&=fRr8NovTAAOOn!VofJfSzDZXV?~^9tVcpZ{MN81bEf^FNZ0`MEh@w zd7*T}7LHNw+<6!f;jCYEjNva4yz)OpFdHRdhzs1PU>+CM{U;9RK2T`o4EdzkB4P#y zKpZ)LpX~o}?*6|{*#Q6=F@E)+Y`^`h5aU-5`dgrohICy0k(~Z9Cy|+a8&6)bQIVDYYxD1VT~$e> zU~>#e65v-a1pH4x?b*1^8B-0H&w4-+$@Af6SbLtVX+uwCQ z<$iiV8asxaw>ux4!Q+ts}TQWM$rfE;Hwrp_hslFpnKzcmS3(rpwGT$poEWqS=r}ud)jGshuB$oI~#=ga^=D6 z4TP%Q6KRs>Z#DSV4r`3y!-%pnxm~^6f{2ONkee$%*S6vurF!B{wuIJvKGV9vjMx#UE8S0!k29<=8pR87IkI$86Tb=QDN}C!$qf!tM^8C z(}$N8K6-b;LvYu}3p!Sh6j)9F(}(9wB4jUxBuQD!c510L83^4;6KQG zj-Yecj20<(%GLe`=w8_gl)7p{rTZLffz*7w>t~=E~(v)@f#)3$Z0K>IQ8Wo0Ifv?~F~Xxk`?Ke9{nmT25&_KkNML zYab`Hh0}k0xkW!u#D5n~8~v6)Zv~&JRb?+;;W;77cOSX>|K7K4z>^;*W>SO&0#1d5 zB_FjD=o~hTM0Gc^#t1*E!}JuPZ>2_}$6SNx%c(EbUeQHZ~0$KPd>}8g}tHQ$`#xRI~x5Xbv74^CNf5#ZKE+xpL5<%=lwRX^#|5mYusZD><5-bFgp76% zu;``8V-;9)=J)5>e8?WjK?B&wT{(W|6MH=V`_1P-9F9~WUSq`F*@n+`Y}&CvtU-ea zuOSX{FEqhV=bfHL=APf*EN4X9MFjpP1~HvRfJ7}WZcRtu@AIWuq1S)rv$Ez1uNDi@ z0I(iHI7Gz~_5U;lM|N-%JilyJ!Sn0>M3g$WZ=+%)RXzuaou~Nu{HyQ$Orr+SFyWw9U z%(S2iR3Y5;X~p48iv$7%%}WY}MjztrEt>O*AJC1JQH~(mD-hEj-OFpne(t50?AqF* z`(4pp2KJhKm6mqcr8gcSb-A>!EW&SodzgxO2lP6PMZvM><3nE4qY~u#gC2SO{LMPo zowQYXymAG9CQs4*It6t(a#FCAla`V#BsKE7EYb#atZ=Yt2dJyDR-9^R5Yx8g5o*O8 zI-#FYM&6i?;vpK5K&RL-I!c+j@&ouqbm^^^Kur4j5x{@bQ0jL}$N)Z2_(bHgJ^Sw% zVmP{>4ttua3|5heHc~RXY{^_l?VxZDP7u_oyWgU0#_`o6rO(HDqLob|DbCG)df$eU z(&;h0G1V?Ev4)~3sk4qfX}P&Q*I|pVoOKnCI?CRv{OkG;jpG&d^3PSs=_) zuu&os$Dl=xV+Qc7`X#M}#(0ZHF=`{`eO=)ZmzaD72{u=S&WRL5J}r18BS(+zgv4IP z4e?t8YO(*xc|~fL-S!rgL=3J3O32r;VMMHGhXDKQ2lJgAJlV?u?k89T31*EfJUBn} z5}1EWtNkGK^bJCIzhA=0V_xx3M{7TB5S$E5vA|w)CuqB~>I!kJaJxVKj}L*rZH#3U z12BrG(P5Drdm3%z*CmP(o%<4F!0@a`7r6TS0J54B0;%$ZW4oTX|%=IWb1O*33YYY5*9{pM3!{cs|(0MX&XW% zOhkE0U!Li0>*0e}hVOrx_=WNt+9^6{LZE!EMFF068!#ouVLvxa#l-P%%+C;ca1bL4 z+;Ej~{E+FOMzC?ja;yjdwZbAL)2QtR?FDzmwSCQh+oCMWZ#ei-Il%liY^A!#;@_P3B1Sh^zj?De zzf*@w`Im}sAp>HQoj9mX0|_FeGu{gfG_h`@95JVuN;a0^B`>e&jJu`XHIw2 zo4d2L>k^FQ@v5=e)hnqaAxlrWV)T$fFvH&wl&nIJ7lUIwA$|TWA-CCbv%Spi1)(14 z;w&St&;GZ$zH5qa=DtGZ@a?R=S)V`#x|Pwh>En6P^TKaCxznY=OOii8pSJmGl8Vhj zIjlHKQMrb`{MJkftR9Ik_cwLQiGIFZ_O;)Wy@`nssc(~2`FWwX9Fi{Qi}vB0#$zlJ zrY!bpxBLTGTa*F3tStr_!mx^WyVQBYGtL5${o*Ytusj?kb7eGnfwU92FVyoI#7?j_ zlka*5)O7G9;UPkL?tTM$nU2hr4e!xU_29v_6|1>3_)&6K;vW~FKA#2KawLp`gq<-;`p3S2)-?F zvVY~sZ?cKqeV?H0Y;R^#a9h&$l_Q|_4YYJ@Gk}C=Rh{gGh!doU7PJP>vEN%y2XU20J z6qsyweCpeQQ1U*74S+K_@H>x8Q}Uf!+G$saP_CaT(sAu|0X!{h6o?|O) zRd0+DL)vb%u>8sV5$Y&)W~{tK5r^iK6Bq-F9nX%i&c*bTL(FPWgSX@A&$cd7RlXEe z9s%oa*Syvwt^KG0o3zcJ!tPa1uEnW4(z*l(d^ey-sOwgg7n#)e1fiU3d$7BD|KKX! zn_MkOGiM?~Y70&7HB zN>ve5Z~`CYS(TJb6GqC#1x*=8l$zfl=4+K^l5Z5hnaq9^7q4{uk`N{yyN2R7|Er|V zk-UY-zZmvXcpOSEN{D2%sM`nfUw!|EAZC9V;er08&yCG~AhLz@V^oegHLV{H3bXz> zq?5|aIyfTN^Or{@fon;JY2`RoOMZq%j#_CIA6h!A_d41NeYdTfc!+G3x`3G%y)j}H zlBdn$QVY|eo|F%FLh6zpF}n&9Zhj#oJB=?+N7^q5msXxMESFZiq<=QG3F|-2A%?Q& zIzosdF=|(ed4Z97QM%yI4J_qKPSYEC@O2Q_(MRTFuwuXk&Vw^7_ zCRdtmbyeUaN&JG>y(6usrqP`Zp^=c7sp@pnE-cR+G;4$~zH_~~gz!;%cx=3ypvDRO zIaAe!kZQ{n;2w9&Ec?_s{Yg^eIhtyBlcwv;Vf&_ipu1*x()acO%keWIm`zixO?$PU zdQ8#JY<%==IpDUM!HlfZOW`yF9M&F0XBk29eB2fxSQyM5%BBNV9f?v@F?M=kYKa_opDR8C-~EAFA}+N&Uu9OXm7n~1$%qg({%H4S z_NbitcQ=(^vWqkmzO8##xy82B0`kwA6eozkp&IbjBNkVO<10NFpQn{A=QF{Y%%;Jb zQ_>Be6rmw5&bmC?rXTcITYqCS_X0ZUI(QITd-SWulnuAyQheHVuhi zz^A2>=gsth$gzI$B9!y8^uA%J=Y4968z`oK$`5L(zGdVZp+jKYwovp6-6v=GUp{OO(y=RCaw>**NEn}4MM2%oUn2();$M00V(X&vto)-B zA*c~T>lGz!s`^yU`nWpe0_)`_Wt`QH)g$VWig``Kit`7^YkM&dQDUa!zm!sDs}owjmi;GM5oAYbu#@E3h2v^!BPC zumgwcMAZ0 z@_hG3xQ=Vg3n8Am351QQeWx#c_YPduBz=R3QEWW78Dc_gsGQ(uRO8g}p#d1JqtQL26 z$|s_-fRRxLE8<#y6;qijF9N^Vfs|E)Z~V<@7jBF2!F@#n_WR+$8*65nZ*9vMoHp*( zhHJJ zoo&+Srq*R3RL)@r8s|#72k_<~?-H7x|}nga}EdSq$G z!tP`JXqs z%s7bWAyu^IBd^v~u31*#E<$2a=u6D_iX%%4ufIE7);5uBOvnE+icz;7k>1> zdZ1Z&i^mwDjEJZCxUe*V1fP+xo=FHk&X0@tiB;;Oo%?yaG($Rc`Ti%lVX((kHukCWt-(*SURU30y{?M2b$lm*!tNp9WLy-$0wMNR2P~Cn}&}KaCfD`_bAu4^h{?X^KTl(1Ou|F13!6=A>2IPmoVTxH^ zO>+m4+1HcJ2ML72T4a3`jPI!_ufzmjp>Nx%#(dMf6S}3O>8C9XLXQ% zXTW+I%2ju@DB0oHRbc;n%s!7hH=1pf{=RuIFWBPlB=GH;ttm4_HtX+gjhMI9d1w*5 zMa@pu_v&NzrQC6DTP_q8`!(-3z9~C=eT$yD<+x!w23)lLkJuj?eKVjJBj>i#s_!D4 z_az7I#0pmiBX2+Sw=)yHHU%O|>xktyUoL!Q+TAi))4JWkmffV%`DT$&6Z0I2Hqf^~ zj5`A0a6Vw6*N6(-(ntMR%DF8D`nI34REf4HT+9gJCy{VTjm^F!ZQ_3Kj^ny<89t~X zpyGsonX+ph(9U$)BYn5Qh6p25w|g>ahZg)?EVORoiI*@)C~Fdi?@HFskstLq2UN^s z^3tm~_+2MRiUmSUbmlZjZXTYnz9CfDRzL8uFf>=H zO%QBSWQ!TJAM2<+WEaYoBzEOVB!~{a>Q94`{@3^&CAtGP4qqgE~nQba<;Wp1~Il4gPLeD2& zN0TOCmB1?{zUX7WyDAovehXws9Gtb!jliavT<@{AMc`!~i@PoNr`r{3=NewIn0)wb zqx(*d0vr3CXSd3WM4!^VTCfUy00%+Xt5FAY%#>?5Z}BSBovyA8nqof&6W7k1Xrc2} z^3s>x*2r)7KqrzG2iXbo8G5S;9mC#^Bj+wOqheRcr1+6&?NaSSe-0G=1{sCZ{C71B zszaRw+Qt6hxjEE}5A1S*fgOFlw>Y62a(1}Yl>6B+KKS|{;y;ouil&dAkNZn4VT~c> zgrdA=Pu^aC46km>`n>DL4=0n*Jg2!WIf79BJ;9RG+l~S0Wnat5XCipVAL=Xp{d)B4 z2C)&aKFE%KrJr&JW)n%JGEMtJIz956bay;Z$dzMPe|ihaX~yisp(bZ?8_kKwx@>oE zok6=ihWhmabcp}h$O}ff)m9BhnSZCX47ujjC$>x34VeXecFN&Eq(RIktZ9HgfYfD# zAoBxw-F9{^S+7*GEge>R>(hBtk38vGLM(d7ITiON2vQLK5PXPr$C~dQXqA3}kL4gq zLPDwxu-g)|yc!Ud1Ci2^i#?WF*WhGP5a;8rM-@IB1pJ5?yTd$*+a0l11j%ah+mZe& zZw0LBxkCxO%q}^nTR4OtgyVVhTwOtYj2i{B{@nM#tJu`F z;=6L&{(EnC=t`8`sAFyzWnRodk^|M!tD|f9%WUhZ(`$3HS5yxoDcQr%v-efCROZ z9`ds&+mt(1N%LydwZ1A7Kin0MSi6buOfOx6BKB&`-Jtlr{gRz&eXl}pgj@!T68Sre zDIe{rX41&b$}D?*0qI7(O;|qpSuS?wOu+IwS}0m&tksy0a!8Ua$1m-TYVS5AFVg!a z(~OnBO? zVKtBBz@||pH#JhI^!>qmGBp!8eT%%Qt!P`@i0sCWt*fv+-`BFUeam*`veC9Ze;Kj# zm}_&u(9+%{l#Ro4eA>|?7G3G9@Oak9pPoahxy=Cv159RJTxT@n*Y%XtrIa!;CrFIZqb!_D-HK`=+bV4iUc0F>n zM^_>}MF!oq_9-x(R+;7ZAGXh5Vl`D(drxVd46)k|)FgcoaA>3yknVL40o*Q=s~|#V z7tmrKersLTNCI|oJN>>oS>;-dvOR87) zwB@u0pmP%FN!XLPewXuDdnAh*X{bZ~Y4Qry+4OczD^V<(Ja?Nn66n9@vUK3r=H z0eyutnz{q&C*XJ|YkfNg_<(?ToIu&|4m>Z4rNY$E+OSs6e0vS*3tK=R)`$%CKJaT> zV%cn&xp_AnnRVUj%w8jPo*b_+W*7OUBGKjguY!6nySvkMTj~V@UT+51g1#T#&Yq=| zpJna~&=30T4apR3Y7!y&R2v%ZfmU0nBO(lrUk){^B?|UDxN+vBa`L>}!&)Yks@{O8 z0Y+h-y1(GpMp@F^UgNm~cvUVal+y5i#K)ukxnV8ZXNZ>AXF7@W`wg{@zHa%${nTuP zc*c|G#n2QJDus+rf@6aSuHrHrF;ihAP#6oG^))iH_AJ4e)*7smYeHY?80i2y*iL30 zA!4oh>cbrwJ9Y6})B@g)rKryS@As-Ojxap?+os+|xglNoKjOUNuX+<=uF?JSTM4h* zPP)j;!f7ia?sq)$4iP-SSCcv_na+X7xdrxGv6@Djp)rlH`sLbN?m8Qs7F`1W62T#6PK-(gNyKL1@|JIgRQ zu(UQiCwA6v{sU99v6TV5w!tapmcxXyp1PPNEWCKD?nc2k4fPACvRz<(Clkp3B+AA} zm{TNM>7_%cpO>T1n{B zv-~Y^WejT)t`ab52*AQE3sNLS{l7@XT1f%(B3i#fdWLg~bS=NS$G`nRgW!LBbpL+0$a zDM8w+U<4mfQki#hs=`2g`X}JJ-db^O+9j??l!k_;E)`HE(*es69k&YY>BI43jFGj{ z{%jb7ZYh=ym8L2Pj+8u)&i}^|sQS-o0U#Be4*KKm?Wy~M6rRcVk9NA<7eoUeTL zY4ASA?rFRT{3930X6frgsEPY+$0PQEbnUB7F9XTP>kCy#1E#AgfW&EKKlR#SW53I2 zD&Lp)5m56we%7xbF2F4A1zVb&F5?I z)2V4pV1B`E)dr`{>a+ILcC6b^4`Yoo48+_wr8B7afnbc^g@vF)SP3x>`}8lEBn}~ zC{*6`P-m%;fD--D{x$yk_xWoolK9iocld0_^7r$frnPM&o40H3_o~#?YmP++3&yVw z-;P^bTkjrCMP|jWYamkgur}1N5jQ{S7z#xQk<`c|J?O}ujHb>}as(YsQ7q~pj_o2KWs&#$dsYe9DUt9oo# zWEaF*0* z+83+P&uNOkLNh|@&EC4+Q24&>c3;mPSQFgl68f!HDU^Z;jyT6;?scBCqf95kk9#+h zhaFVO%^|<78D(noT64&3VRib$`@~kcCN^xss_8?D)PxtvZp2uVdtucG1tQx|Le0H* zd)QDmUvF-RNW@T>IcE9~fbL#@ioLnLXs-_>QqKwcoP7suMgpf{`47~EI{H>sdT~`-$^n+t?|fI`JN3w#z=WnI8rzUL|ryOp-hp1mb`km*%%y^@arCa zRfSb)|600IgyENz+qWMq1k{l3;P&l~V%7GG@SR+@_)%-(;c!+EV`HoIOo|NfPK9p| z&b*Yg0a{gCYPYZ77XX2hH7D^D(ocA%eXi?g80JAFwbmF~0uqnr7H_PVf>E?s7_=qeYDuL63UnmY3yimHIoxI^_q& zpaYgFgG_j{(U*Zh@4dW;5;#laO0R_oQ#G!lcIa55p%6Cz2gmhYVgAn8YPGql^_}RdwEWnlIisvc@D8=?Ca> z|1UZAQwfWK^7Hh?b`IBZmhJWtZzG#m;b~~~_=XWwOr1ePVnR_UUfnd777c^>CsD0F zg~2`1k22CduRxxWdD|Jj*=ao#?NMS#E^)pxTXl}jDL@R!? z?8}6IFHn}1q$9YUa7NRSI@#fNWBoX_=RI5cLM!5-p_FNLcqnCZO&`U>+CP;u4Ks5g z+AY@2-Kx;*8d!0)wX!1q+E|>e%?fr|+H+LIFEx-=3(9Gx*^BRfAnMn}u6(lut$A-! zGfX6;cgGu&sL&FJccVt6=Ls?iuax*lrmdbLByBv$X1elPLUP7tM}R4?Bo5Dud}|YJ zi?Uxl`Z6O`z23AXvl*ml(bENs%n|-G%pllW7|&?P6sQ5sCdqjt51R-KZ)_s`De=R= zHR>%uq79sha@@&`BKRo2AwY79Oee~QXOp635cgyZmXSh}$%X{n(Ee7B-7BbO$_9*q zB9F+B$V#$Ifoa?jCELb4!Zs;;iIKelU8FO z(zjG_k1q3uuwSic`5+UJ2LqIKR<3oIyR7$dnTwGJ=Tta|#oA zUPnS`DVm++E`j)88#6b-qzT=owh5y4A=r=n->fv|-i2D<(RrV(Nu^`HiiL8_l_*x) zx+7mse$SjJ-Eqg6FQC`4&<4N92er&GYx`r&*?Siv@sKVrhK9LQ5UK|G*%Q2)o(&G3 zExJjiYR{q+@oq8nvU&bAsmlL`BIV90TvAe!r2Sar;!0)El}w>2Xt*L5$f{75Y#Pg> z{)UI+E1H<-qvGfrFEjcz7x$}xP#vm6fTVOab@0GudH4(^#)WUN_rprPg~5CDw5EZr z=19$=X8@uL%C2#Y{*b$qKgidW(x)+B4#by}_1yE5;9;neCFSij{2K<7!G_VftZ7W- ztUj_+T5#QXasG;Mc~D zqB#Y|zKyD7=rjbody9xVpNA&xDQgpArs_{7i$NOX1qN4SZEqx*2p}vLjK9gogXO zvB@sNnZ>2Fy>9q|L5s!aOKjyZ5i~@PL!txGW4KknDW2OU{`l#9@Ef*9bq^ptJ$o-8 zy~PRW$Xz*m^PLN=qZ1uUgB+r~v~RfN{8!XtVKPKUh9L(FQwM za!<(A@SCVA-T?!ULhE`(^ncJ_0VA6$lniejcPLZ4PM4)sJafPoIPn1YGkAD~kiHFi_V+?VJMdUX zCVk8n$X|O_E-n-5#Rep$e+;z_En`-r8jbQ(Y#$rRub_C)5}3=rZXs2Cc6j?hIMgzA_oi?XMdTsg?tXq&aGh?#6W_I1`(3a&-36S=mm zsfb+GWb&CxXUoB*=MNf8+gc}@T>&<+r0?TZ|7ddPiFnk_$#oFXd@Ac=$8=(tP{DlZ2JrLixG{T0tKYBv>{Ctg+ye^%D($#C*pb-zlGde~`>o{K!XuwZusPe`{c@ zQnL{}6tNeJjz1nZ_bv5L@OC%HtZ0z+2U(xL+#6}Cis0EcQ=JeB#b|F7AfS^SxPg~Y z0|Q;J_S?XZU-wgZUFKN-pya2~w8XeH&cP|?5x%54vj~R!GaI=bPF}d5p1gxA$*+H& zWnYv$CZr5nf8(BI{fWd5dHhpg?+x$%4lc`}djr{v^;q=9YT3O~M=+LQzC{Ho|7LXd zK)H_&Yw((oM{qF1dwHYJ6|jg<>;-$eKWGYKJnHN6Nb3Ss+`>TuEv@Bmhtir_N-T)C z#gjz@R?m*7sR6f+q?oXz-&$&6$bO-sL( zGrq!5Vd0xjCPzPnXvb!e%pq;h-6k+1AzJJ+I7m+Uwq@yxvk zB%@TFN)`=%Q7{9R*r^zY7NWmnIuv-7SA&(aNELCFozBt*{Tac0di8nlv-HLDsHPX< zw3cwp+M$@P;xZocd@y~pwkp)tyTJas5PTb>rM1OkUX|Rh49d_|kwi$f(_4J&U#C6!AJ7 zI!0{c?GP_{@IC1`C$b}iA|6Gbw6EN<(oI6KYGA0w`^5rKX+no9i8(- z@K_xhb$5)s5D^2~PGpRU!40E++qOkg6dw`NY621MW)83|%m=p-O6~$V#~qVnU5RTS z6Nog=U;?cyQzDtz+iPlYaZARd9}uAAvSIwcc08Zt7&n5#;W`Wk6DeYpxjjXIFz4%N~ zj(UW9Q89|Fjbn%jFWm^YjhjcI_9&xkKe#VtRrBs_hu*FR8T2n6k$d@hW@0|orp82x zf)Q}3Nm=nghBdbXf0J7(qppOH2qdmj8o3+V8J}xam7vtCr@=ijLs%oDorjISB_*txO2n1O-4+RC$Q}N z45(W5_DA7PG+1yvB$J89)o#l=&>)W8Z#Y+{F=mG}iA6lRk~nJd*2H+gd%_F|?cz-r zjGn*Q^REh+<{bx{fGn~PIOY*G?X-da;SJiZ$tI2)VIqh!^HRMlkA64Wwh`kShMg1g zxV-liYnTYp^Vb(U^o9@XB6a>Q2foajmj-L2I9WZ{JYF|P-?{U$W z1Vp>&balRtv@06Z00h%VG=BI;ssMd^5m3|JRUep{$YcX4*5JBA_52G2;nQj#IAuG%&y?)Q;8@^K7DPqG9NJ3gH61_cr;v?uN!A~Qpyl=<^VE+Q@P zC=RPDAA6h3M0B~+3ReK#pre8Gl2HDu8h_AleD+BPL(}t_m{G+iENPu!Lh1H(? z_gOFghCd<1n1-TP2<+%hNJt3XP*W=Ntkfw~Gn1im#Z0f(h zjs4}r3W~eWfqT*yB9Ne3-$Gq*Ar|1JiS#8odhjm)Nex!x#7a1AgUUpHz@lBD3UF*` zod4_JSzPcB)jLeK9&*o9Cr5aeWn$j}GX$_7FRKJ1r;~pXkX4L!aBK^!2e9puy<%xe z6R7j18ACV)C=akL=^pKyU8%d|lmq~ApT?H$<(n7YzqE+~c@>sa0NM)sPbu2eH6kuR zVWmBerF7C{xJg%FPUtS1Xic|LSBL2MOzIkZc{U8fA0NXrpL~ql=iy|fDt$l$z2ht! zJxv5l{0#I~7$-hN^i z8Nc5vB%DhGyGH}^JSE%p>q`CUy* z0e^@|Y-1Zp#_^{t^SS&3*fWhxO4tvTQBKb3)Nj0;t(%ndmr~Kg04aItK49&y5NtXa zTqb90<^ZlI7--?fL(s23o*$_RpxYA2nw5&a`1-(j7bO_3A&)6wQOL%t9e$;|uf9i-Fg%o^6H8>sy3`N11VW1A) z`d~IS{uFL`rxj&gdkiE^yYzz%9tfesIo%V}5T z>UTC>q0vPfHz9VMn~eoV!vPnu<};MTQ|VB;O6{#!x4cnB>|7N@TX@_2MlHK#gA2{m zeclIA`(`MCbl=(#`eJE5mH|<9AR4fbLaE*rQYNzi<-@vOF#r8AVV64P6adFro4z3| zhb4bo;12awb+w)r0mDpQd`RsjZTpidbK^I$@#KlxkljK!@gIQqOvI9`n%bwd#OQ*S&>TGv8 z16D8&cj(RYlDfamey~=WwVv%_!BHCqmh1$!K~U zmw1>U8912vE=E# z{aTiI8$T(xdTVyiD6gBM^xG?43EaLq>pn0I^mVFT$$x~Xm~O~r0GTK^YSyg=Q$G(T z7v&7fA;snKuq!_a4E?s{;Raix8MkLkNLM~uLXbLKlc+Lm!M(W)3}qT|I5vznVwf(x zmX0S#A{^`aER5oS7k|jC-4oh_!6bfOaIgcpfn5j0GFadn7~CZP2r+z%{1gfhy+AQ| z0g7p=_&AvZrP&1;;RFT;VC@CxbcC2Y1$-@|n#3}xS|3qD@|QI}h%jkK$s_MOW$+Z$ zmoM<(5=}#l7a>?Jn<3T9s$vGqOd{W(C)SfV$i;suLf_iWcF6ur13^NM(#(@xA}5EHi-7yeImk4V=i z_}3EPt?MRjUoaUkqxwFM|9*?p;0H^-6x$KrPf6dES!7T;?S;vAS%k>!b^I(ZEm96x z!0H0wIzkHwYWJ=rD3U`>;8244utphLZ?Z`o0d(e2kHfb4bH7OxG&cYfdBq>*teeyu;|p~g zoLB=A#I|?12kyt4_I)f3mYYY}S=e(&J(;Fw-FrIA-)BC1dTOrE-#&X3VZIcOEcquD z(<|=rwKy7WECkFSXHt@}lR1-9G9nceO8#-6^L7>;ja`jmlNLv9_h$TyL;c0ww(%&P zAl5U3EPYSYbfi_i9QXq#@qW=nm2QqATUS`eC=jD`BDsb%kAaR!=})7RJ2 zbuCCOyTxOg=h$nS@7?=4$L+OaTR8iHV_PKqA--$tv0ifBCdPRrrRy~J?L*(}tB2Fr zAVY{z$_ORTl-A@C9d`)B6!&0mcccP^Tbh?6-1p5l%}oFFy5|9G;Om6>Pzl!r6q&ic1N z?8}GXa_OyR`5 z!>090zyo*l{U^gXFLh#QU4aQ79}k~9A+i`x=jkP0U4gat>7}M(eYStR2$z8HYU9Dh z8?``o6v%-M6EAC=c8&H3cuqeNu%|fnLs^kSpir(eylwQAc1f!48u8LCO4CepqW%(m zKRzehOmHl`@#5f(HnSGs_>JbB28 z>(#7{Wvhr>)5SQ%5a3SPQ{w#b6Qai@toj>I&`8=P!Ft0n>tf5J@aX%**V70F1`iwe zd|jHVV0xD2%FCk@5}vY|=8tK%tW4@5kEBTe;g7pW-YJJXvykuZ<>{-rJq6Taw9VwM z9n|vW=mUZ!tKSR8WPO{(lVW!VO*I=$KIWV9h}t2J(tlrwOJrwRPPuareVa}K$RBbg ze28lMDd$UMQ1?zz+Jut3q&WH~Jv@UMt5e%ZCHq-TPvuPJ?@4wH{rpIJNrQaMns`E7 zIgod~BpBJvusOn|J=Hz&AAF%KEF`93fRA9r-oDCHYE5%@kRjFt^LDO_}IV zHyk8gcQ2XmZNZchn~4CccyNy04wr*cy=kgc(f79-J0B_Xx=7jxxZ>celpo-vrdmJD z>bSGyxvlmBUnUe0?o}Ed@UJ*5)|dXohQ7o4)VDBXK3x^Ec`@W-486N%Mf2&2Y5PBL zKd;8}^5%|h>^#4r>~^giQPaA+eI4JY9lJ4VSNVKpeQMup4|-}wDY1X?_S~AWcD!A! z;OBCymp-ofHav0l=+PZtWqf#ZXNO8O#U75hce5)F5A1G#5RPhZ?+t%!Va0R+Gyb+G zZ+VvvxZOP50hfFwPGCsVm`R8lAFFR8d@V_a6aS>JiMHfrpz#KJrylu|j67EEOrA9e zn)VwEK6k4rpVs1C04ey=i@dv22tQL~sY(}V_uh%^o$rcIw|men4bl$XPHW`Mk}{Y7 zzEk-S^OawMt5S-3`C9m-FfXNOH$;{E{`N8c=x}^@`1Y*wHd}jfzV5r!6OgdG;XyElfwRy{LOH;qo!u`3uW?sAYHX z&!mq}OZ2V1&M`mjgikwt?!_gZHS@=H^s5`s54lB?`4jTF%bV?c*o+MipA(f}M;_*` zxuVdA?!V(x zY4xcOt)kTF^2*C<#DXN{YV#eXq7npQVaeJYwHm$Z;F~X zkuGamH0JlRfLDa#u}>Q~EN^80Iftj{%Jy}vTRTK{U&1yZ=T)>YqJ(htozhyVwU5_L zM!Dp+F>zrnn$7i9)*}=%DMQx%l+cwsTY&ISphQV=+04&V+H$%59rvW_Qx{gbMwn+$ z)5i9HNIr#)P+(qq@xp@28GGOpM0m&jND$ZYv?6PEu4c(XRdkuAED5iL(rsuL*lEeP zBG%(GaN=vQ?)WA~rUIU1>I}n_qn;}{TgG@A4Cfy*OkMo0lFN zYPAUnOXG%L6Ogx;h;mBNyWJ+0lYDH4+I=cyi#yvObNftuhtWAXKuep+yHrmjUl3XA zfz6dX9X`d2K)ss_P23*IbIB|_XS{lFwXtH}}Z zis^W|m~HZMMnKWf-+B-1|NYS$bcHV4`v`|r;21uoCzjtRD_}I>M;i!R(&%}NZ5oI+>dxq7_Lxx5qWD;J*!5xBwfTLxZC$dkjmQ?tr~_#`oU z*P4?wLXgN7y>2!;G|-7%QjXQNa4G4&r=eQK^5>Yo!o)7wG8PWeTlf+D^#oPCZrUHI z|5BX`$1Rcg{lH!|n-;0ND&}r#evRVGTl{c_+-Rl5IvKG^^KKEk-$xS7?MOo_#hs6_ zP@m8Q2S}+E*?3*-uZ?H%F$%w{9UxY$o~uu&W&Va9ATWoO6TL=iCh>Acn&&glyn&k+9YTXp{fb8pb>2hK|KZ5Gm^61V3#x;nY(Gv!Wu7NH=;SZu4=% zDAb2PG4)-FDBWI)p74s5LRF(NgR^+A=@3O5XS|6K5GDLv!b4O2RCB7BgB)VJLxN<7 z4>Kl2xaDQaJD?-IMbM7s{e3cy>;nl7i3nGL(Jm6;!i>5h1Iwj_A{bgOi3oopTv$BC zY;a+2!-Qz=W<~)(@^49Bv>Jwp#!-eFH*+AyLuhj1SHTP&XktS`sQ~xeRFHrlp?|HR zF5f5^tU$0+F?T`)OYXOQwes^po?|7QB1lkAujPW8QkzkML;Nu^&F6r<6MAw zCCCP7&IpPcNaz6v=MYWeub-eo2NF?|*PuaT9!+FsF6d0L1UFmY(#GWl2v^x4@?Szk z7?bqF>&U_%wWfp-gLZ;G`UvluI|Bmu(UBkl`)*&qKW;D?2U%Tn1sHqscjm(5#e)1z zsKLVhvtZ{(kMVn)erUXXEy)c92|kUr#}vSiAgW*R;&pw_B*O7D1>$n$;(VLVCdymz z;(Wg66S65}US1_>c$o<3JWi|oaXQ}T6R0N=3L4SlLNRgoScWBFBCsYv7|+iw1D1Cg z`HANl-(7hPlvT+PufzHYsQ1DwP*&2RJF!VwNX$@kCsu1f`bk>7cYqDx4+{X4rU5wp zucDgpe;}s!QIRJ?%sL&kF%YodR5^#4uCw;cAa8SI-u|BE_aa^GKx}tx6k!VKeIWXn z*uIn@>1M%7VDkQwqFR-Ir`9PJg8)~|45>7Gq55`$;KACDl&5&v#vB$r9P)TGC0D3T zG3$fb0QU3)+242zEU6h%u4aT*@QaF7!3FZB44`bTg!gkXB6sPMc4)B6&HBiN`pg6r zFJ>C!-e(l;OoSd1m^eu*aM+{8d)|(j8zEnTUpW)|6o&cY8Z#^ z1#ek9sP7((y!9&Yk6I*ZH4BvAPiR{dII+OvJbd`+Se|-7GLvV3n8W; zwOMmgBkd#|9rgEQeQR0ICW>Ybiqo6h(Q^r+SqDYL?P!ooh5Ng^y%*;D_*!+Io+K@^RYYX!ewVpxO+qF`U_m3Rc7mX&j{GA8U@9(L z8)vE^$p&r1(f~u=f{sxE1DeYe+O&XbzzUMfK|uGtq*e^*s5#cXyyk2EhZ1bjv$%Ry zU5=9|ss$1`Nsw6a!ILW2?Fh@luA#o#TEY%(9!tlMIz^U7*_uBE;>M)F9|Z(j4sX2o z>%I%VJ^~A5${2mUe6RQKC#1^L`5V45^k8F4N%n|SHTNe~&za^94l-+1W7swAqbfNw2ln(NvRN*DGEPn1X`tlQtdLgeVB1j7U&87z?&~To2R*K z5eWYxOZ$oLvZX1IK>~nmS4R6GvT-mj2|!-p*krw-2S)Td2|t`&o$cd?mk6l@oL`S~ zEVRb(u2oh7;=);*s168Sj~SI7cY6J>vVX!1uzO#9iWw9IZRvq+*Fal(AX|}Ja7p8x z_<~R?E>3shkAxYH0nEFk9nge#x>%GQ(?y`}rD5~nx~mvvIp`zRXphE*;s&%PI&ljn zVR7Gv12pg&QLNkWcQ5009^VR2}$U->XMIl>bTdDLys3V zO^~K<089G*Q9L{gw+Q7)lB>fGL8>Hq(!LjGMKYuyblZtqh6(8Z)I1+TppEn&P^AP@ zhF|D`m#s@Kcm`-hAF8R69sKY=7l6b0CVK5zI~~qYh%O~)67>~xqou63a1pyI^oK4} zIKjmjdL|!0obV<5HRe!Z<3R^eyxf@(u~Y1v9NJsF-WplIE#_`=?>BxquA_Ru;iDfM z!mpm*9A~pN?Ctc08}eleQM`ET!i|0*1-5&VidgGApx@Dx+>ec{uI5(i)Dl7pq?^7|pw?2lkN zv+Pl}2z&vmT7hySadIV4FkRN^Vfq44H-NTu(J&?ZVI^|W;|^0qd7+9D7SnM_=&J1)^1 zAn7d6`;$Gw$PqIh+v0|Ga*e+g!c*&%GT>xKpWh7(C4d+P5Aw*RJD?fEb_DbQAfDHg z!LTGFR#$X!)(r+$0(Um#*$i$%w(X+ZUX9Jh zuuWtZ(zqHtfh3JgN?sH(Xd^Tq^?Pu5HF6PZb5JlpaWF87b67zPLX9RQKK7_*H}t5JyB!izaH6ADh<_R_#vPzX$P-`H{iL&FNxd#vewgZYl zoHj^kpMW$WMr?Qifl<2zT3CqiUc;v?GklN~0i|irkPtFO%)88h_+wBc2cp?dDPMi6 z#9VGW1TN#)BH<31>yo+B7&uL`!wOSqUS_$86$pqWLG@6RfUB275|@QcSdsb^i2sQp zc1QG55D5QyAdw%Tkbp<>U4-FOHayEo4VF%7jh->4*& zcP8vTt1fkIg{Msh8K6o=bbK(N!2W;@dY5jw3g2g@BTbPEg?COvyzDIKDf}gt*=7F!w@B zkc@R_KUXq^AH0J9fxMWDtO%oE)H}XBCM{Rp9?qZ|5%5XIx~?eTBym;Xww zyc9_g`2i1`U5C!_?~#L7?ky$_bU@^6!kBA%lvU$?L8%d0Z>v5?W4^QuXEji&OmB@W ztN;)LWT-7@~fiy`0ZEn<&?C@mFDGT<=95D123}Sz^_&2hOxmVw5;P6y2FJpDsYb| zTLc00cBnj2XpK^32;qSqw`fuHh#D0Yj`jieM*c|RBaT?8#C30?REVh@WPS3?;2=q`Ca+0{^jzU-)B75ZJ2poN-fhbU{b`+OIq_4)!-_Yk<|Bm$=f8 zyxFFKvkuwZVmQ)T#%>=^eYjXH&jK!jL|m49#D`$RNEM71**K6IKlsv9iiF0JnUXwm zSrOK-OiFqudAlNvpC&MnaPu*Q)^M?dO3)t&BR167Fd8_|088#;2X|~hmp_e2B{w)C zmd#)1F9Z5E-C$mqX!?3XPxvjhH@?>_If(6m?g4mr4tEZ`q75O71de z7&IE=Byohde6v22vf}ShJ~L86niT6%0AVztx}H#0;s6Cwykru;>7~hroB-ai!bTe8 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� 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�UYMx)?09)Z*j!@n?^$6}=&(bOoi+E$%Tx@a;K!arl?~?PTBiSUyk%nR8Pf;-o#v zgK>Hri!!UtSX7LrLXnq_O!W#J019{ny*{=iY6ZMh8{P<#`vIh#SIbuKA{%d6QC6Un z#VTc9Uq^8)tt$p{WGeO}MvYsxVW#!Xrj_Q~2AF=AIJ&-Cr*a{cZfvX>We?CW_vXWj zEIs*=R-A~w+}$^)FQ8h$=#=SqacPrH&sIl!ti%TfqFGCK%qLf*w&2z z4Z@s2=Vl zLgkAcI<+Xf8fn}}r~Sy5R%6Dxh&vEs1@JRHz~eTRV=Tad7Z4LByqIvcQM&-T->*gf zaT}x;8zft?sjp%D!;S-lhJ+^{_mw8vK(yrhURIP1J?;@vt#Y>2BN4PpS%3)kXzjs$dX!-4I z9VkkS`;)CTky6gC-X-`1kv6N?n&NIfrG}VlH8QK^D@#8qwh0y1G6@dC!|+t`kSuJq zUc_q^s!JzVv6L@_$P`_b!i#2C?N7}#**E1xOT)NQpZuMO+;S486b~apf#iTtI1Ah9 z?ZKfnA*O$o8iaJG*kw`j)m-{esUe<``R!jul=Mqs%Uj3_M3Jp5HR8#(mL6TXJHkF^ z_Ytkx1;%&Rub2vx@w5mQh%0abS2Y=LJ%S_3Yhq!>5Cyv@#Olgjkkc2{7bnu#@x&Es ztZu`;O)m=U6RxQoV3D0W0e}2)tCTPWqMXTd>C6-^7Z1 zG+6N0R`?}TOJx>S8$96LSSJ`}xvs7UXalUH@&R3MicPt&-oUSjv2|^7!&k(;8q3LZS7lqK8-C)FP^+@)dy+EWx7{cdsQuD08*e-9ty%>O zBpMr!-wgu9I_lph8A})6kbWW38CYqJ->qHXhr3^t>A}~Zaw~(RbRm|O7+l!C>o3yL z!t05ysCT}dC~>?Z z#v4P!XUX8%cAE$S<0FGN>!@+(1vFI7!k@?Ey3O(XleJR(~<_Xm8>#4 z`-5O!R7JTVHUBGQV(%^#_^#_C(EWbVLzA47~s{=0hN; zzLDefy@jcq5Pc*)C{0)wZNBt-g6GDy;-CWqbO4S}0f7&qYms@^F)x>i$oD0R~L zq{)sywkuA~L95#iC)pUQE^e5i<{~Z}?Ra1dPZ?Tig%njv)(kq%@L`Nl$R-snwKKPZc(Keri~Q`W6>5u`OTNwqsgB zw?0$tY}p|XN$r*Mb3{47{v&%YWLDho=Za8RaeF*Z_mLP2t0PS6$sn!Dh}Pv&#^RG( z#+37AS7@kO)$9=nQq=_!)P@<0*)a#qD-Ox6?*EFGt&`NARc&YNQcn3#c@VvyxEO}y zpJ;zLvfpa#E%oEA#z5qdZK*>yq6U zL(PhBQo)EFd-zDGUIm|!pw3Isf0$SY2)FxD zvmlsV*8Bl1WwhdBN29Lkq3kGax9_|QGsA5j zd4Z-Z%3G(rPp)8KY}uv;GZ5Xf7=>d>C&8FA42d7`m@}dqRxzrN5c}-$S_+Sq;(wgM z{une<8W2)yHp2I)%}{!nt@nemelYm#b%Lx*rnbdc+?ZDXP)sYR;uxgHKJ5Qc_q;b_ z#3uH~_FGW{v=+$5Vn77T%vAeP`VATAE5v?g7JNq7&YsT(c&S7*B`D*ecMh-7D;U-v zDk~u+<5cbdukONDyI?+jxp#g*C{{bl7>l=1Etb`Eu&tEjHi}8$6*V5m>cQm`5^wHu zU;)VR%+&&(^$^VYzfIsFb$x;87|azfN8bj{05Q;O^1=+)0@1=GRbuU7nHWH~=c7CdoPfia#hkwi(DI z)zb2eJ)&xvG2NvnupJj`6v;arO`97hF=2_@UzuWeY<)_QsPhh@d!w(AQ{>6)!l#OY zq9D|>Wc3&9wj{w1Q?<@nBm3- zjx{?xO^|&ZL^64+9RO+bLFuC#F4i$SAm5IqaDBUL=!cD~nt7!iC(||fQu^zHTMi0Y z@S%jfOWt-+EO*thS!r404?uPl#HWFMZLKQ?5^yp6ckShFa5ZdU-Su4Tu2c5%LSDK% zoA>}-#EmG7!Z$GDh#8rRy^#b`;+n2NF|JhXYx)vQCn8>H6o&MoDbfHVM;bG<$pPzq zVXPPZ@lQU$w?SASdoMvz=Vxa+(!V((AGm=1#I$*w#BHxW58POO^$WGydJrMA zPhGk_R zK5VQE*-_2$jhh^-*}Ys0-mG(LxB}FTK-8-Ue<)aFE^&~xl4Gom9b}s=c)5l4U+CA# zQ3E_CS_QJkmI6?xB7R$Wu7<^xUlCl=yGE>cBS@z%048-seuU7a>N~?Ml9k;At>D0| z`=xx2_-X{)4g!UsDFFoxu66JLfP1tn;DrFObB5HJ080n6(2j44odxv!rdrCxsIi@&0wx@^nP z5>hf>#*06jPA9b*HGL2YKVh_**%9Cw&5( zIi$K#3*AJtun$2CiZAw{%=Bw5aEP&dyG=IyU{L(TUkp@7G$-2WL%(4Wd#NPuhVYGA zVUFP|*%RIC?>pBu=Axxe5n(Ovt6p=fc;5cRU9q?MR<`zkWfakwt#?YpL#nIN1B8N!wg!8 z^LvIK)GE65sKwc(vyxW=Bk^@p?<3X}7=G8$zd)-W=|0eNAk#whN|-em3;WTGy{pW) z#26HPry^TC#5Q^Og|?t)rlViiRSQtpYpU^Pqz5iVqbVUZNn;y_1KzBv5oV13Js3An zk8z?L0{R)xahTe+R67&@31p!(G8$Uhp$5CgfF$*jB?2X5tFj zgW30EYNO=uM~j2LZQpM!MFu!EUxe&w6S59*D${$QJIm00Hx!@(s4nCY`Q1L?EHY$N z0BQ5v5eM+6E4Z~+>b~C*43u5Xayum>lDa$p5DN5k0s!Q4M!l5aZRUzxVEKpWTsL?R z%bN%WvV@8ez880^X+GLzC613y4WC{WZVN_9QE0qwC z1wbt%sU+zIP((yjc2zdcQB?{8jioKL009tDRZ-bjv4De@1qUSg_wWB?v=w&C`P*+_ zdC%PEob&p8;5)UFHrmWbf=f|H`4Pc2x)O#48yK^}wZF*zvHOxG&xqb5zalcOHY>Gz}_WKyu5%KhSBYA(NMNw6#*kd;T6>Tg|24UBERbrk}SlY_avq&4okFJiI#PT z&;wAJolT!Js8ov)ALDD}Ps~rcL2G>`?FtnJ`=?n`U$SFr+_xcJXFnqY9}$y`En}AE zWcUM0o3rL7iG=3=v2$JRtw^OJFnvU~3)Pd5$?^xYr(AnECr7g?BPV$fF9YQNM@p=` zto?<(&3KQ-$eAn*e3h+Kv1`gMDQdD($!eR5Y(8Y`z7TFo$&tBM`5#8N5<1?;2G-$$ zeZ&{1HF&}7xH}=O!<~I-;wERH4c)X&UtJBRfgclWMGCh1 z<$?At+FO$q<;xS9NhZu940)aRBmwWW6Qb@MZ1L2zDR^6*^h=u}A1)ZKQze>lDd-kp zI*zu0;XExNS#Kn93l}UYA>nUzzWk)l7Wrc4PLEP1tD(n_ zs=EQosw=By>MOPq>1yoK)$A*`%;v1&JZ6@zmVo^*oZS`B^q>D@CsoDZKgYF5ni7u^ z_)EHx9!v5g&#w|(sm)-!2Pj2B0k$@Y8zD;^4ikUC9n%(f(p}AtxrjDeoU8Vf$ z62Ln9e^~&=^v~NB`Be7vvX6AD?wxK~1#UwvM`NxkCSzFsO{dil&`<{y+gwLJhuT?@ ztG*Gdzet6aVAG5Ma8hQPaCAVA#`352d{R4_U;-iitMMS?h~6xfE1xf*xoP z_5{%OSp>-?1F9|hy-&i(RtCtHAXo@k>#i&-H!wJFW(6gwRs9ASUuSztujC=Q`k&7D zdH88n`()FD3o_!134BVgY;`T-<=p`|&V3?$S4G#??c1WM+Py(iQYl*|jKNZan|tCs za|#(kcsg{3P_CCEy3*CxD}}p`9^z`W{f;40&f8!EIaeRH%-Su)EG^&swQd%9uTy({ zM%SsnzUUKcrf5;^eQ|Sw&$K4wO00prJIAn?0Y5~=X=Qebw6}8k71j~C!6zI7YVKCd z@R1S1t({_pSi+8SN=wEbr1dOK=SgQV^oRaCkb_E(tT45rWdgI9l8QpZ%ciYd0=mly zl8=P_ZXo9`qg;daTul_0VJH$D)P9=IMAU1_R+GGw z$UpKL8(;5!db>nagONAOyf#rB~yn_I19A+k)+T)0vk0 zMZFX1c3*G^as;pT7V@=cQ}(-S_8g0~+JOka?8@=()#DhX;tLKUb$>&}cu9s{`8$~q zSmdNz@aGw8f+hwvFa_vZ38AaTg7%>x)4hdQuU3 z(hdK>?pvF04>lEm{cf6yBdj}Lk zIY7b@0jChyxdzhk64%TnuNqzdhy}cDX89-j@(UnMC#V`kYx;`VMw_B$`r_zQ$sA0M z<}}CODrsxxhF!IqRd^Xv3*7RfiB@^0F`C^aw-UM$@=VKuPD9zJMQ~{PY-vER7;@=@ zp$7w(8hookzjE*O^XT8b;cNtMZi^Jbed@t|>wug&swaX`8umxK&!cyzUw8J!r{}tO zXL?1N+V5C#2lkSQXQDDH6;;%naBuX5kZoq7SUTu0^(G=#yGT;&=!TniUro?R({Sge z?;}jnOrJbbKEWLGf;r+^`9OjNCy(@pt@}t0D-Azt^@3< zx-LeQqDK$%q$iG5eNJ*lr@dqU#PQ`LNAk-@{Ub;B^(fKy(#z=Nacp8^h4fnlCvTMW zS1cFNytH+la{1ooMt2a!9cQxL$B(aPagf_jrW``oc%?_5E~9G{v)9t5b@_N5Hm`P; z6MEtof#Rc5sb5l~k*P;TlIwEYvJ6sAo2a$ZeZnjS{-Q>kgDp2ujW?rTP5EV4(|pDB z-M6Z`dLTs&IuJ4<&Cewni{7S7dW`)*~5heYti1(2@4Hd1(7~$oqC{ z{ksHxvTOaiXkb$yE7}OZaa0yMMCJKkD2si)b$(fYulW)FPt#y@aP10K^TUU2UKNGDy4@e^ zKoo!!$<3efGM-k#imRXcX9<(XI!VX2jBwBvowmr9h`w(?P+4~q^l^NoOn?gS zVp}J}*jnVf)$&nzG2_sTFE6?Bi2v<=kn>lqFYzWIUy~l@@h3Y~ziqaI*e{^@923lU z^7h?g*CX0nWL+g7L5W;T7_v3g=<%hTy&sk$b66q(+Hg(z_n}y0z6cKcUHJ?UYjru zl-*D1=s`;{>|fbOee;i_?zYCsKBdXtrc=c(?(H76+ok zH)_mK`%cxacH3n46zC45?OoJqr0AspS5fPo2@$cPuPG5sCUPTtGVxi5f`$K9H#YHB zE|tTIkMXmvp;M3j$>6!A(7Baa$|Dv_WFZV(P^^Zplevp2)WJ+W=ag1x5jOf(hh-a- zQC2EKWPi|TTmEDTPt{A6nLjtCj(dXTpAdn+%hUU8*c}#ptS+nFJ)%w=ti2j}nVLV< zoVQBPCk9qr{5@7?R*$yL-6-e>{{@@4QQzLn(f)U`v~*9e?xWVb2S8Y-St@bo+~qF8 zko3fTcmWz^Zmj_Ej!9d|x?%ptfBYPtbyJ9xe@6iz>(=(|XS7qkM z+c$J`eXa*ph;BR(b$&#`wA_}sN>?7C-)u3DA0h(0PF=G!B#>JBnavwaKZNuEF_^e*! z3@{=i8mDKED0IKDmxGC7t}6Zbi8)xnQ6CDL=m6Vbor`%%MR8OAjx9J!O2+4Ec5}$o zqfAun+n>w*WJa*0K>Gq0#_e9ddCOl&rs$LpfT^>2ehNfYbY^f>>CM!A_SMc3 z!S9vMly)38-#AK>d~4HU;toRI7Vu7RX(fl=xoLPbfPCkS*1Y{u&(c0@yEdnn?zr;|w+K{mYwWtTG4Xo59Un)!bJ_X9eW3f92r3w>byWhrF{MQy`5q7#Gw`3h-c{ z!o>!u=^9c0vH@<6hK2uHtu<@|0s;b1&{ft1-9uooUqEPE1Aq6hPp1De(vCaZ!H|+2 z&nG3@@@u<)Us!;(jC?x+EyN>vvYQ@He;zzv0Kvvlm|}c>{J|_;9up7SPmgF-z|SqU z@uU*;Ofj@t{l6*ZS$}%(s23+LOj6mM2avN9$cj-fz*nKRleK;Dzg;WBTJ@Qd8T1Ht ztI68El{jl21`3tNTMnAOl=0V%w*&Ryvu*%A&d434uz9xvmLBlI)UA6;q)K*i>=c9z ziX8!P?O|eN*yh{b#wT#?m%jft;f7z!Tp|lKvOl#1lTB2pO{Cg~fF+DOCK52zt&E@g z`&zk{nIrB75g6_`T6H3Hyd@vkW)}1^<f&# z3Bts*TfE-L7$qntb+s)5cq%|eeL2&=g%KyDyO!jluBVpN3~F%c80r|M1IZZJ6{$k! z1|r6nm116Ymg+llP$vh3ZV+~0#(3GZdRO=zGgbh8cuu#`$)B_E*e-}MtO+HxpN4&vf{~Rsunt%L_kN6o!?1sZ!uD&YVuZbaFr2_U!(Ln<2 zP0%50_u5WJ*iAd1@~)@kDeI@)h+H8N61F`Ta(>q^u`{-*4Q0jmS#|l?H2dKlT80^) zUJ>=H!alY}`F?QPnt}IDAVE&ywLSs%Bu$#=uJLFdvAeEe;%d@eAyQF}%Rb^2BXUbg z#Fb|Y65+NI{g-H2g%whHw{}-5<-|w?VZCQ!x0YCDYi<6R@&3|Pe&Z!S@jc0NflOlF z4~J@=`H4eMe~94Wvl+I<&?Q&IG0Z;pe36KqH{1;bwu^ac-?nJXPk)TS^Bc(_NR0-2 z>@N8Q-MNKHcRgsFt2Mlm;?j_5IrtT(SC&AwMcb5|zIKjv2Yy<)?gYM}v{|~Wkl$~4 zqGOjz+JFAwlIGx(|M9^P>sSB!rxqeN7ElfgH@J-bEijxIFRO}C#DWztE(-ekCOH`z?TBhQ)&ssw%w?iqy!#5mDCbh`U4BLtw zmict0xO+)K@QA>+zKcVv!P31eblYf}6<(QIHrT87SD=4}qmEVigXzo5ec6tF+PN$k z)f_0U%(_z{US}VNYItoijGpFPkegLp&yVwW4Rf5TRebRS@2|CJ5=LPl^KONK<=0h~ z(fMMlQo9;GJ~Bq0Ry#abG|YlcYsgGu?bl+xDfY`{?qj4>76U?#-(;$#`Rp{`}Vvefeu&y(p>bG}8Z1jITATH8(T3ZNnQowZ-TMPQO)hII<-zfmg)%#Cx_Ml%V+j{o! zMil=c;PY6Q#(b+T=TR($5>wqUsWi;qBi_9)_ z7fftJcy>uDB)11K9z9QQk_^nIVc@wfMOA`$$;$!hQ71c)m$<^5=>5_Pm!`B@lW(CdUrHG0F;2anK~`o>__ro1o39-7ACbZX~grmlFvKiBIV>PO=8?!NJAX?&8L3pUu{21h_B?L z-@a3aUd8nzhOH=HWSlkYFAQH`LfGeBHum3Q2g9?JQT>#t_g)`dk?xsM{dn?yDPj~`o3YA0~FZd>kn+6u~2Ho~VfLMOhi*DKBiKV_pM zIqPKrpY;wfQ_sF}0J(`rjkYgD1Sdam_Qt&oHmChzu0svpXxBd-X8*jP0OEv@jlzVW zuHHumLHk@BL2zNvqEX=sp1x)~H#jvu&yM<7e6l=p>zP@IzUX{H^%3cm;B6`3Hjtth zD?meOBH?lrFQ2V;uE?Dl@~zAKP^m+@IeD!{E(wi9pPI!wEz{}>oD_Gw+HmZ|_UT&6 z%f7m&DYL2KrIg^W;CnGj*6A+wlbCx1;nv2K=j&G#2;2>rmq|DU4*^AZ#4ht~vQRtn zOU<{495uW@>Q|&wsM@?xU=YPRX9GnQ^;W!o;w@l%Dg{ryAPDM$q5Y>Rm!~ftB2U>f z%B|^kV@yj`w{OR>2+~#yi-UIcJa$=65lEP3MX@)NeOq+v85AEi`hpX%495~~=ibMT zx5QDKF)!p%HlepULI-R2)(>sf#o#Tsk5h3)VV3;@Uc4%vi6FKT*4$5~Z38rO17piu z$HMSiWy=mc@$8g;@`AiB^pAmsSJVubDfv=4_Pd#1wGOJ_a_{2M@F3@EM?r@QZ2TU~ z7Sd@!Id<0Y2J-9lF zOtZCYR)^#fDlg#5E=xeBcZu|qX?NFygqaf7G4p5aEQU214Mny>#TgE3@W@Z2A!lun z?@^GtN`3hbAPzc*bsGg!#bWu$8{1GiQMyXpzmR<|lb2?K;}9h;qvMpLOOHygwyk?T zuR^ip`W96)lcl#R`N`BM1S84=Wa)FH>2utJm+DHOux%o~$ZY3CFE65Gz;aTY1B=}*~XO9;` ze=&k>^Inq=q(OAB?L#ibS2Rcf5KSs3VnXD&oN(ahZCH}OyPg#}d1QeV1Vfl1A zK139V$7+-q>})&#HCvI1rcYWk?abMzGvRxA7#^SB2X}9p!Ta`vL+#U4(^qx zjxljVU@vwDB2~EWk?tzqWwSrD>fDSg%H9e{?%an!bjxoIiFd8|oLv%xcrM}GOZ+bE zr#XVnFnfF|1x6HoTE6+zf5n;0T|mhfM?y!J6byXm1Ghi>4~{7Q#_h;=hfKI|?b0>u z6Qy<|UZ`_|qiFW~{q=Et8@8WrvAFRIw$0R#oe?FN_hd)T+gtAyiqN{j51i*le*Ad% zt?g(_=PjT8h5p+a#Io7Mae?$heIYUH+mn$$B+%inrd}7*175^K6o+#N!4sVqj}~4z zsyRp3QS`>cC8M8cz}5e(vmT7K8l%Tq9y_TlcPk?~jpS!KMe~&`5uDh%K3(G%VU{>a zD?p=e6V`C)nYF^;7hoO}@0|<+OSa=7cI1Du7iyhpF4ADcpm0cSQGWDFZrku&K@+v{ z4#k=!B0xt6E0~MuT|{y{%pxcpt}RxTM}d!y`PFG#nsP6w6RMS}DeGi?0&Y~q#FqCo z5!C3||21 zY>%oF*T_;9PqEPSB&^e-_1@Fe@ueSrh;?4E{p@m~4$eqJu7tyrzF5IOVpV?$E@(Q< z;QvMT4;||zSGhQtZ&%LG#;ppLfx}-owfEfQpH5Ry;fI;)9)ac-fO@fd;`b=P6cr06 zDEjj!h9#Zspz^deML)w)D>h0qEL;gGuZ%-S1WEYi- z+l#;tNdmiOw@u+2OS$mO4>0E;PCPwIB;`2VlY=XM9{c%w;!W%Of#Eu)iepp81MK9% z=ENU3QSk~5qcknxv5V&MOMRU4%U_8M*ZL3BQW0DdCasN^vMeOnovh)Bv;E{w7U}Ej@=oo3(hrJLss z%{yngrVgL;EEdtdErQ;-gHmIJKq9T%AFYuCyVNMELyc*&MaHKP41(6|vB!M9|D>-( zi8-0%d+b~OVtx#j&2Mq?17)4oM~)1@9(5sGsv#+Jp{;idtzjDeTJ2uQ9cz#+$Z1u3 zB%pR7t`@`(1YCg#W67^wdP544;;&tEZHm3TPAe9lNGS)jFqi2kUPPv5@+BnmsF<03 zV+sih8&$_64}J$twkc=v#{bgZMwtOOlXFOjEbLwpQAn1qlLD?KnGkyHGxY-97w$M8 zz0(tdj{sd*^+n+1xz@`#HJz8!93v^uR&>^fbWn=yy7Gk5!VxsL+2p zr4JWn4SH!1_LnVxd{8@pUFpLu27if2gtvDXy~SuC>Ii{Bn{q91nIPJCi@fvuh?|u|KTE>t5LVV zVe_fZ$GOtDK((N!h0?$=ga??d7T+pwU;Cjcrlno;kKSYq;86fX=De>Wy zU7?*KA}#ln;hbCryLsM}fA7pwf_?|rr!aM=7(2Zi7t^B+yOFh5-u6@aMwP-rqr8mXQ@b zoWO;d3eJ4p@+PN<5k;?!%_**tMU-vIn&}koM%dcZ&{n>1jSOR`KKoxbvO!xSXTv>- zN`fru01TfneSrIbOIVnedd2_+z$O)9-1ij5y-E!t^d_z?d+x0If6JQa~) zJ>j-I-yB>h=bzvyRb0K7g2}|7e*%LVTB`!Kl7PZC!Pvl{CVCNY&CaE(>N!Q7mSrth zxvcnl!p3Ur&4*Lg7B-^#3w?IeFrK7JX~RqnWko^0RQQ=-uX%xa8rBw{P~n#Lpgg}n zP#4|+V5rLv(3HD6W|T{FqNddN_6gMeQQq>QQelehFPjj^Ce7SFoMxdHBISsNR6hY4P#%_$e6UOil3II?Ig@t zu&Zag16|8!3;qfPB7c_3b`mB>1m;K7iIMGo=;e@Mc@huVsk$ z6`|rDf~DuU$4ZM*o1AZ*Dj+POM)~9*KYk1fy53#fATaB|R{MxI4t$Ewx;SfaYW8H| ze_l}-v6X5e=de<%jU1krJC_QoHTv2Q*idii%yN+K4MF4<@uQ<8dI!i^rrxeo+6&(M zp*0Oh)EXJ|J7Tg2Y5rmn#_ug*?K!|drr{9-lTx)gRIQ9aZ5)xU*E!UtqIXfNEcd)9 zE_~X;rLD;gner#;@yV~7eA!E&Z1`=X}>h>9wISDipkxljg};U<+AY&-4o!T{MgYUYaR>Mif+ZL><~D=!4@R+OMwPxEm;(n1{rtkG zo9TN{R)g{nO^C}7c}r8*>bpVSMJf193cV;et0Hx_w;&gG{s`D&W4mJ~>;qH!+BbXo zp_n@E0{Od@N%KaJn92VUqjoH2@iCx?5dKQ6)Dv7eGoP9qUY!@QwVju zBXio90b2-F$4AaDUVAdv5EIQBISnk^=>U>$vH<6ZaQQwX)tXu5}g) zkj9Ng-54B^vyv)^O!eu`X#Du=us&FI8|VIZH6dw9g=2GJgSW=P)1<-KQv%nPblZAN z9qu}87}J0&JE`=DL*_4mJy8fl=SuqPC)}`M>GMYm*n}cLJE?2`a(`kG5U^K-eT;08 z_DH_KJ8=aX&xn_QFW&bhJdAU3NGPCjgBdgqHAMpkbM%t3|H#$if)Q*hz%@zTbP5V| z+iH{!aCOIpW^Lg91H(8=I6-Z;?d|X*dj6=NqH*8qGd>od$Pf5PW&@zsA0&4asDHh_RCU2n#N3RYLPNJ;7qwy9k1T z+P@h{hUhyNshUS(*wHPKKXG7R4 z$IbW9q)wZb!IHP}aOj}$s_BE8Ma{Fqqaa~v=l8;3*)}VBAE4SVZxEJ&M6K9}h;m77 z{6dh9+*KxSpJq!+eR{w|F6T7S4Gj(kh_GkkAP!tYlsq==UbM-bPg!V^DvVLL9rd|L zPnbrb9ZTZOqqTdashe27<_O%SY-%uF1dg3sQG(}-r%K@zgh@ufkY9NleBb>LH6l3g zS~Ee9Tr)j~*-^IL?kz^%v)ntd6Wg$cGAA|Z&KF8tH)yuk9!2cfh4l-VwPoQdWp;N|~r<*E5cqu@pKL?7_7=90pC=^4%SWZG~C`27+_+(I3 z_79`W3_-Yp-Ch{9J49d=mi`LKaJ|Zkn}z4vZc7pG!z@AHB{_=i&8qw?Sve-%Yj!<< zP>IvPNd)l=>$x&$EJ*A`Xe2bhO$?^5vUJt)kthzFxlXF z3B<$xg}W?aaNgjers$%VW?G?aCjjG*0MU5Iu(V({92+hV1y%V-73G1^$5EFg~=qpbT2DW*EJ-o4@_ml$WzG&(4uLq}6 z`(um2k%Rquav$l_ZZ2mW9Ap?p>OE+#!ntO371gr!7264L z9O7ENg%0Ywe9mgkXLu$v5$42R7@w zTW)REXSqDuFStOc$nQFZ`_6~8M|r)C3o2R{H^|Vrn_UQvB8tb6+wp~gW&XQ=VjpuD zn0=906`5QAjjs3Q=8xn0r2KKm@#1=s6Ju9g`iVGxq-kGLFCSo=ZIkXLVQ_2a!R_Wk z48||P%?5Up2tk<0zbXvZ^TQi0k<43j?ytD|`S-NK*#N;^0QY%|R08OR>%bHSYz4#C6+hzay3`?dN$ct_vY%h><pc%1bqx%jLWh0!~2LZTwdIfQxp~90WkZ5 z;tb2BYn-)7?7)WAD7Mx25Uq4xj?4})f@iWh7{{ETA5kFe)ww%T2uOizI1)pYo8R=Oq{p28eJSXfo@qFC^Q5EK`>7~yVb?;z9SinV7%$TH z?Iv#cAvbo`Pi7aT4mG{J9eI3RSxS_1m__M6n^*eKY6GCH-sOh zld*FHlsJds7EmOYG+yKBS{>ABwCaAADOKBuy?B19E9Y@Lg31LFXW-B8LlhRFT>js4JiqBF#q%t;nNGwF%NMg~m%$CnF7Hu6#rMr{Vx_|G~x0(Q5)r*uGzr5QN5TL>K)%1_A*6S5 z8Y89RAACS2;x)DB-yT}hu4-G0GnS$%JnBxUiub&sJc)f1thyXsJyo{Z!urdgKQ0$! zTCRPjh=Av8p;TS6Jz{T@tOw7Sl#^F1jdJEzxUa9Rmd-CEV280N zw&&mu^?mwHpgy{1?8=$_7b2PVnZ!fvhBk|g;hF6#c@d3ag@6_^S^m6vmhHxB)69bkjY?fIk(v{ z!nFc~SJoCOKatZi51L= zMUp||amp8yhR2*^g`K@99l{}a_pdfD=RdF4Vcvr5Qc7jJTdv)s(Q6r-!Pv4rV#UR- z+rblPn5-GttrxNS4OJFwKTQb-iK%3_3}{ht!pX$yb4&^?UqQ}Z^c75BEPTZ#FBl3y zo~C>&OgvFA_-PWf&*qSX{MIYRL3qzC=X!-(r%qgD%pSsWE=3#Vta~vTsV_KLaUQ*h z_x*McF39%Q4|{o=R!2VR^(CL@#AOOe>L=jX~SCPbM z0)Pn2{qMi|%zy~C_ipa*ci``ycYD5h-TET$aP4H0HqwTHxpzn);9;}5L%{0l&K9l~ zOeA0K%8);K7saOX3Uh`ao1a3!xxR|+L$`g*vE=&o3+iq;R)RqMdj>=PzQhw=Wa0aJ z0-srdnBs@on9I;I=pSZ^n5(xE-zc>DkM;4Ki{!jAi#1RgUSBn1Amx;k*8r!SLV12VmCISo?eHmfnQsFe_APf84@CK2;ARM>|>*XeE)mrU+rliX|(0ju| zeopYTB>>Ouaz~%rcLZJgc1ynmL`(DVGk1zdyAj2LCU{EITBy~jXOv1*;K)dc<@*f@ zZ)w|+Hi`m5FpqXTYxx94!bAh%@O{9zT;ylwT;ymAdZ%dN@QITlX9c|ivG^`4zCJz- zfo1y6w~Q=%#I(u218{x~32cq)128En!PQvn+Ng^@{jEa+p{?yHD?eIYgPpSl%fx@d zN=AvnHw(IV63cZPq60~Rq6Bn{IfyX3OFvX#@3OcsPyz;`-&Ae^JAf%+b(f4*KhD-Q z42`5$Lm~o0W{DIq#WfP%$}efY%V5%xFhCz@u>dYbRPP6^j;M%>5Bc|7nnL>`TuU84 zrbIu*p0VLJO3PqYUiS(c<7`kS))9X5t?qJdK^Ps|i=3O6HIi~|i&~eY?WBBYzHj#2 zzPiWSZGUZNmgQ|Dlnt^0&_KZEnDLePrS=;^N>i-IdTuB2j$8>@Y0EsHC>8!IsB3Fi z{2BAA#3HJaZ9a(<{;9gFElW0^wnaa}ig(j#`jk`f(M|<9*P!nrtLX(@_xBNKT3F>b zYFbsfvGr}aIohMVFEmc=ADm~+iQXc(#@frm<93!>=(Csh`#b2|HYa*gR$_5UOBT`_ zIeS8TjI6+G3dORQ?-A}7MPk@X_UQKy%~-Y4|6v~L4|3K^FDpNXE)2C>QV!Sq~VZ`6JkBiZ?5(9DP$r+yGb=(Gg+%3T9Na)0L8Y z{6O0p!K)sjJAyrI%>uk)kIVe;{yqi&oh$gaX^z}5ieK`%c9<6~e6ChK`@-Y=WN)-D zmw)Y*(y@3JVwIS$bsK?#^dkFC`P z@#_F0E_9gDStb?#o?OPP&1hur%@l};>Ma8vSY-(^0?Ii?JQ`72OyQdY_hs0!&bmTp zQW|XMcNK}-18FeOCQPW>OwtjO;khYU$2h{A>jjLXn5(T08A?ZVP`IrFI}K_*e^6zB z>bio=F#civbl=)^lwWlHdQStWAX%+o%IzA%siciL4yLWtT2(4v0z9g7E~4Sosi!Jc z9Yw+_-(n;+BpymU=}U*Q1S6`d(CuBRWEs!C8e+$$!3`YIZ@BI*Aw`Q^El1-;G4BcN z#jS{OJC{ENdAK%mS2d08O94wwkZflYN41?(H?~qgxxrDtsu9kzn&?-$ z)8z@j?ZX6fZEkWdTZ3*JL|a9AQ;o{|+p zX`q9m%M{3{zw8$HD`eb4#_lRDN%*NPmT?8QG9(<CU~_PqAO{VC0!FAnGTpEEbEpd1oaBXr zXN;&`>`_?s{d!hYrqMi;U)a>dNwIy{#lt0~wg;i>E9funhn0>#pRtYc7lp9u++{hG z!Zkb>-1&(zHp{r&3o$EddUmD`fbUfQZBsZcVp?6AjrOo#VIuP?$-$T3(U8G?hNnD) z{4r^SON%&JRrm(^sNFGW!8FicQkWs*FKruuou5+aIhLx&wstM?afjGJr}`Oce((2&|}aHvxTTn$9I*jV`bazOpBAm^x!=Q(l-nwv;W19zE~}j7Kr5z>RgzW4pj8 zoXz0Dab{+*F_OCXf@W$_Gc`F(%)z_s2Nvc+j8@V!7J)aUN3jiWY@)H105{uiV6=LW zWY&tGmS$c8nujdsKpH@r^NgmyXf>eUb*fu?P1o)5rKJ}xa`lU>>tU3lWEx1o#V>r4 znyI&*RGDJ8&jfe>2F;h?{)le^pzBKq&_ii9{<9Ez|z!u_ofpoo$}(#fuD9B8CQERxr2aFdpt-T0F7w zs_P@@8(}M}%LpW5t0MMYlFrqpa*Qv!?n#59r1Xkl_$-o(VM`G>ouk{%P0lUFs%6j$ zh12^1xjYx9Q1{CgjV(7?8vFI!L|a(ALwt7FyM4X~Z|Bch?2+5#&K$`@d73tJF#7|2 zdG>f`ZELnWKQO~Olv{ca78@9Lf1?p)?qED>z6>#f$Ig3pSvfL#g`SKkOH;A)>IsAq zf%5mq3|OD@G=Djh`KvY^=7i9aUlz0U$Rhu48xRKXkv^`kxnWXanNkv{`e(%AJ(bV^ zeEV#V%bBF4YRDStS?33ys(p!PIoft!vNZ;(Yft(TeWp#%D|3^be{++b$C0NnH0>t| znf*69BR8y*I#N%=6Cb`USx(Tx_aw=ZU`-Z{Ff&73p{;fMT8$%GO}-y}$!~DuZ0Pfg z%`_(~QWl-l;O3{c*()zB(SUcz#RSIe&oQy?3SADR)}XBuD(ca-v>pJe{hh-MY}B?f zNZNZ}E0H$i77#v@pAnl3%Dn_Nw1OxGNI?HBam8bK1+4i2X)=@niczsd33kDHp4ie7H4Xzo<^7UdM~VKqhd;Xi)!QSl z9w}2e0$N)I#&Nd_wD0j~a5S8;5%l93ZOStY76xFwZ}SSLjuM)xop;cFz;fz>4F z92dmki6R@?MBm;;!GT-jQNn%G#&@SE!Nbl+|PRn$7>Dpl~jl%f1 z3<;q#vL`>Q$V-o2vT9s6i_$1Tn_wlx3dAMG96Nr|*8gs%p_D*Vn6*+q=j2hnw6GZ~ zdy`7^2q(u%Fde>u;FrA)HG^q^80I`3W&(XFq%fs4g;0!ZBvFlNchWZ;SjK$sv^b5h z$45HZ7Y4!S__2%WSd3qq=gu*HNZAt+CBLl-N4xaKFC1eRE-E;&jpKI<|A*Qr@wWze z;(xBGIzcf0#vka^jt(_{rNB z9$_jq&z%yJh|=1P(`S?sT>(z5#8+Q4n(rjOQnKioisldC@Ut9t2l&|I#bF z-?{%0UHJLJ?7hNPcZ|h$T62vR-tpL8K8_h12h8Ny$Bj@|QgTO?)CMU{CXCv_s{*Qi9LYJ|61c)tDAF0A0Os zdHSF475|h#7Ikk_LRedSZP$&@Au0kz`j{AL#gb8D3V3U6yXqVWvSs~pz#saV>Vda` z2v#GFs7fDeXHWQb-yFVWVQ~@lVSqLnM%JBERr|mfd0fU3frCHc!%7a}Rkr{O9S&_A zSJg8Q@AF}KjV?_Kq&QUBo1gWu58)!n;yIX8g^$lAXY>C87%jc141hp;-3lvEmr9`5bE>kj0Ppm5py5@8}~D zzcbs`hcsM+@HrdyAJ3{MS=5|D>W>`lsjad;sn}wPwcDOc6t;~pGKO*t4!$(N(1@0% z<0LgLM(U@`J3?L*b4acrAx6dY;G*t1iY+g8gYscpoiJH|T-8z1Z>b{0uryWdd`$Ew>6e)=* zFY7{*g&FPyEp_j?GV9H5nMeuvkYN{)Um8OAvl^dBONR|HaS3YUhkhSOS}(ez>XZcKZDQB z=>OH!O^zS&eJw@zKBOB%``Dl6o(kUHr?5U=zLk{y5SG3Wr7vBGC6eEXVU-haag}fP z6s7GN;$e26O*ucOW&CcSI=}U`K1I|D9QRj^cLq*$zwpEVGiY3Vhi@aV?-bQiF@xEY z#Q#8kigi~pa^i4RU;J@$ry|AT`bH_=#30)@@tnke@y6&_-L>pib4UfmMBpUM^%t<} zNIBH)E=5|YLiPht`cBCbd(CPd1WLK31Zm|G)jA?rxWF*31U0Z_6ekTg-V3p<;^2eD z)3NiLJ2}R;t9|EzsFCFC$0$)#{X7Tp z_R;T}r6b=jUJxb2**5{v)DhIe96T?QX8R=~=@j^rr@UY0{47)Xtxz%EboeeB)~nKX zE}t^?qg2IYEKRCg)WiCnN8wP{bWoPjo!pR_Q0bRr&25}Ofz&F>S(Z9HUnqtj+`^`B zec~G|=<^vQZ;OxYJ@FU4FHih-$Eyad&-Vhy<3l~KStr6NTo>{fwN=>n^o=8P0>SFR zDc$O)!E;3>ZMr1Qm(7a-x{{BvhQ)%1jbKYw=`CAl_i?8Nk!mA*9CzmbVVPBX_6d$Y zi!P!QhXy}~OZN~7(|7??eJ7#lz9cg{whoHk!&`U(PbPtSE9qeoXP`t?5j68C<$cct zh1FtFJN%y|?r4o*;bGAL579PH5vw**LFN4;vhY!5S zL2Y4eFH*?7yBCSrzY0O4Celij3KD6lCMmB&TQX!Nj(|63`kH}JhM6CXAC+t6HYFIg2sYy#r3qj@G+ys%$iZ<(O3*?B8S)9$So@7CQ$RN z_C*(+e1gzWghNzs#YnbvY%AC66)C>&sUuMqk{6n6fJoWV;c}_qU*fA9{y}}w^?8(b zIX8ljCVq%-Xxsiv+S0{zTEa$Opw2jJdeJ20X(CC=ybU;ftbE?=ajr$=K>AIe!k(Or z-&RgVb@3)B9Ot*;s_P{rO+xk9?WjUY*51@zZZRKV+FxJ__TiQ`5JTXrzA^FFMa&9xO0C;F= zU`XM{#H+yDR9eG->DTgv>wA{n0(UtEtrd@M*fe#mhrFcCgbPc>B}EX7heEW(YrqDa z#?n8wBDcyl<%*}tM{sD|4){W%B`?hf$k1u2HW*YQ(eWNFh~@pwhYZ2 zYh}2L+sF7FLrYhJgpG^L4m1ka3eJ4E=(aMWV<%^jnPIt7XQD!J(}uRFCIXGmDJvk> zqg<=|ivDF6+B9$;F*`h?S-b`BhHI+-(ysgpt!^ZCmDV-`@mJx73MR7weh$R77M>GZ z4}h7Wnu$&PKAEO=e+a&D=AVWQ@p<(#fmF3Snkb8J1Z|MkzOU@SR8gCPS<|$&)ipUr zJu(-U%z9CeZ}!~546nf3sWV>=N+P0zE195&C5U#C^L-^-`f4Sq_kdu2ImK;XNd{I` zs(x`e5?vW%-sjbK?TXrBakFs?v z9#67uFU2llpsvRji=K&PGByoWovR+z(R86{DQPOVDyWv`9F%c6bZKz)_E;0b#m1kL zamR8lKe+hX`w=jpxY;5aV4S`1@2mxszVE|+NClnA&+pQ4MLA31cS zY>{cqr6bZp40ee~)uN9!m6qSEeS^X9@GfU&o}J-S;%`HZ0kU?v{BWQ8 zx{#n)@^5oEb82LM6P);i(a&CrYr1?o0^U4Cj1Y|6njj1aM-Tdf6Vl;!c#VFPGaCEc zB^{6NZOLiLX3K=p{^AEbt#nbZT#8PyYpP%ynhPy%Y^MKur`= zfwyAuFPVjn_fBglGFh|jBTkjEvfAitTSF3=7XGKTEqBG&my zUQQWvgznj12e!lx(CMv9nhDpjU7Qcf(^{y-2@wi8(`gowSy@Si4Tl5T7kF*vwK)kB z0z}BTD2?`NlckwYbR|)C^$GM$8$B7j@&tv_k(no4$i7O;EY$3N^zu>QvE@LQgHm!H zZtuRcRug6-&p9ih&vF+--8InuDTUD8AA9Lwy-3Td!4ICT?Gz%Rp@dX45Q>I;eD)7# zlP{M+e(WBC_O#JnxC_snO=k~6W7dWE%@X`(NquVIk7Xc;I3N%A!8*WsfDOtkH2Dk) z13*%o*I5@oQv#G(4h&^uWxzv9eANH^(wMXyR=aW-E?kE{Uq$E{>}Z50c@TXA28yzV zy~>;qW?niGOvUL#f3>ciL$)yKYVr&`5iKiXZ1tAJ3p(FsqkmFgsWlr!_QecZulK5@ zklwQGwHEndijwltd+l2x`fkogYxaZMH(e5%*;TFtHrA>)yDY|toAy{$cT7W2=?uy( z)K|&s9v-dPLmbTUeNOnDTF)YA*vnCQhO*>df-itueCf1iM^st|x+O1I)B6=@zpx6>42-&_v4mJEo z61A);8sgn%tdgKLh8d3${jyQ`TwExTChemUPn#CMak2$1UPY`%{5E?fx*pIZPmKt) zlm>QKgjjCuT6S>+2pl%0yY0CwGZK;45M*d> z9pEEGPV&EW1Ym(<^SF%c1hc!rld;_Eht#@3N)Ke^&>TO$il0Efhj<_`PSiuqmH-0+ z&pl$}dbk#S68oG}1&D9knPMJvBqK9MtQ{Pp*=j%t!zGAA`il_E3(QKKW7MQX9y+2K zY6Vod(~%bF-pg?jY+SBLXjH7eGi;Yu_Y6V}V@M-sL*wgA zE&)+|JP@NAY?cxVT5igQuu)_!GFWQDfX^NY=7L%}p-1;5aAY^N1Q7z;RsTjrpbqO? z6>c~wc^uyj?l@MjDHT{Es_Ev{bmdiDkwFDv$=-@#85Mp7U)v?4q%t(H|CR|R-OHsP z?~;-58dDkit9nEstsX?5gRB!Wn*VGekspHyGtUMZMdJ$l<3iB})u9Rj&auIEXyQ2| z>S07!PIO-rk(<7Gp{!e03Xd>UBY*iXf3Sf7koWu=agRB-46YdOl6rW>oAPo6U*n<% zCALY->kUt4pFSjNjfLXa7s8-{AXz=VF^vBqVP_H7A}>M?;n3 zA)ps3t?8|@3%t)CZO@4jfr~HZMU*2IJ2=R=vxoZwR`Kt@hmn2!Y~Or4HkcY~i-3P` zBLJ}MxVO*AH#&j*uQ|V>^7Wg_a-tH5=2yOQea9P>z$)~JtnUv|TuaQ0C2Kgq%fBxd ziRUsO%ZBVNnaG9bJ5g&dlu+a{GW{p;8mvvqL_a#hWbYtn0}2DaJPg}G+>v*r+EQki zZA-`&n6(z$lO*ELp^$jvVA{0ow3D_?hLSC2i9b%4F3m1h12j-3(Pmkq=qAx;S)%3U z(N?oXI&?}@OsL)k7??XE}3(6876BYU>NTj)ua>W`AdZD|*zQEZJV6Tx>yfga_Z^TwfKy^rbG3 z>{OMPfPEuNE#Y*G2im4=HT0#=&(UEWB=Cz=4}ZnW!i;(|qq`|CaSyq%)qXSRpLIpM zg)U>Cpyz+%)3RA&i)(+?Kf3^Sfaf>G&Tt6z)eoLK38z>6BaetEL$cA&O262pBXDWv zo5O7%qD%7s_$4D+g9&S5KlqZ7r$XnNCb61?E1%31!~WVNx;B`zf7eI~@;7gWuA# zCmPgD9h^-QjHyUKaihQB0m~M1nCX}`<3J47@41`|B5!ChdW*7#I!)s~wJk!7tma|K_S0f_t^Av1OzJmTmp!?0AREGbrOfKDQsiwDMi8tT?=>% zLD`+HeN4n1<3MlnyI;Y6Wyw72&Lp=)j*kw~sOCkzRqYtJ(g7bs<)7U}!5kC*p0qpQ2Uz*$GXTJ*=h3EmS1A@Owa_W>i(O`%=O9}a^nTMt?)+MyYDF5S8EQiWV zJkD!!#%tmot17&7BxNuY0Di8P!xJvWXPLD#Gzk;%-sce^z zYjKUW;_}}({T#OV7p>AxjZ>sHv5sJU^>YDS$hcxL%oeM5P1|3?7ewloAh3ZW7@NK~Em3Q6SpBqaT#LcaVU&+-*qU^#%e1u3YZDe9 zX)QBkwA0krYG%QrTM{D?ZGB`KoFr^<8b~II9nvi=V{)VB-YyKVFc~XkU=1SQRzj(F z7nBz)8ANN8ZCJ5XTgKK5>`X~WoN2z%haD2~3oGbjljXgy<1t{RXMe2Gk{0=QE zA>~#_;PTn`6_NfIm67;)nAjm!t^8Kyg$qdGk!DLxZ&;l*u(eNTsRfxj;f-+eS?Uq< z+E;Yr=CeNgi)7Eb9)r$a7mtt%NbBR3w%oW=H+v1ex#^F@IRN_YZJmu%$gXT^r-Hsr zx0k#h7By7ycq2jDHpWxq=d=8xTDH;G28COIKmk0!^XCc6_Rj&V(pc1$_-_{=&RKiL zH-mBM1@!b@4Wm^5Z)l%CZ;$1Y)wR#Jk88Qd=3`L7e5}N7*_PECL1X9bvGdvNHH}Jk z0}IJ_^YC9_>^gfIn$H5HUAVi0R@Aoz8C+)KK)0P;sN6)==y|(UTi%w5^4RG=|LOA1 zKl`ZpI(>!ruzDMB!iX1Xhzk1ltW4|GA_AD8!n;(gyrNYZtoXj_3DA}gX<9|2S-nGV z?+Sh(T#|FcTep`Kb{G!732Ap@!haTk9oC(t3%MHT+qG7^IVnNn!VzhFs&!3ca)flg zdD@`t5O<`_a(0cRTE_R2EuNOHeAMKYQy)muE-Y+9u1ZJS8J<1-Y2bsWZ{Hm?m0+g6 z>ZTEScvFL*6gM)_w7n10q_P&2Ex9^MHX%}nGEC@Wl#5AdFspHpMxQB-5xIihE$JBW*GEiUS|5olQHbn3P-w{Z#o9*AVn$>Qcl z`Q=DNy!H(DwX(A{>4a9Q)<*Y{zEI5Z0yJD<@4-|Kj~Pu>#A);CBDQZ)QDvPjlvZH` z%SEv13CkQvf)U#!O)Hpeh$_koO_v3UfkoHmAU(fQ z+u(4cf0;=ALrB{pS<+N9!fa>pL-{ROfboS#hb2dd5VAgL;7>f#;Bj|?0woG@FPj=& z6Sfc)^3yNo5uFQgiw@K|ngq?XY|#b9nMWPfZ_AF`l%O;?2^}w{W_CX>8c;t&dzl!O z&HEUVAmk{$G&nGWo&GenwFJ(naTX+a-6CBB5JzG{i-qk_#S;O}>H&$$jfO&v4{hkg z)s&$MQ@I||#cVkLwlwu(YinDtl>2Besbcp5q;OwTMG@}538gaNdPd(B4CEU+ zV)si-1D-Aq`o+4yq4#x=h9^l3M7d5-&(?%udrDrILfa**YTj>;{eE)~gl{W%bc z579I0N=!0GV3P9N8j91+k}t30$JSgpND43>U|=;H@{sIra0QEW1e(MaN7 zgSO^rAQCD+xv-%Y75XFdj2=sTVgH5d0jl&ByxD?l`#51EAK%4tqTbBDw7cg(VsEGW z8kWK0_p_tKbp(w|w+0VO>Uj$d^97<}ao>ih1nGnw*((JvH5A zmt!NWTMSY0ZDVf0u0$}n*#k7FV?bLYKq)I9l~rx{V4qRKznKwh%}ELs1uZLqHZ9?g zAijrcG^lD!tbR-vw(h%VGXL+yi92-s>7zZ;l-G%^d;XcV(8{sgjM*(So}r--jgQL< zWz1fTFU_gvNw5Q(8Q;(8g1lS*63)Wl!f005+eR~)R9M_ea4pc!MuY#o09nZ1;a0QQ z!ri?KJL+z8AJdz?Kq58XsxvXQ1g={I?KY>$btNkVeh*C<$L(t`5;WzkXCkg$B6V9> zxKUD_brAWGrRlVT6eQ4KQgjNiP&hh8?`knvkoasBk8#4StE2!Kt8OAo& zUtXzCsjy$(-c6l?_~&4}Uub4s9TwE+whQ_j#80(z4x8Chn&Dla%%;zS3=Wg~;u3WF zMRv`i#wR7fc?&NeWhiLH(al|;!V*I!_Vtvd4}L_JWe!qds7W%Y0^F1b200bt>Pq$wt{LRB6km?T`H?h&LF4y1wy z|1j0KB?a{EHrD&~8X-B%JSC>sq7RE{uzXK8Ch#q>6ddy~i%qTUGL4Ipynl?f#T6UF z*ZNnCYx}a4NN~>Wf77%oDm`aDfGql;=#P>tf+qf)n;)GJt+N0P>DczBFA(>m(jT}> z&9U9RWWTo8`LY{h{RcW63DbAn*>5e>MZKfhLM}gD8yuJqN_!ue$QH-g?vG%8{#cN* z@tubhw7Tp38!^N0_eaKBGvgxHt9m5pv99SzgHv^;0TIp*U5$}QN8+NhWN)2wsKuL_ z{!@IX%NO*KzESRmleHR8qK&={>B%-7f!cD%*dAZWe=&JHBjjHH7sufrT`#|D^(qSw z$z(7+O(4@UvY!(AkBO9$jNnBF(&|W`ghMy|-xSzp(i(@A#j=hv_NqtCyJ)4>MbTSH zY)msQFl+P7#N)Z8L{2L?+R~l?cC{vElwsycuVGaGhdlL<5=yIf0 zU}--sjVCL^Jmsm7I4>>KZ)~G`#Uz)c(7bRl`#@(58#d5K*fn$2gxcEIawhfM_yT$e zGxnhSi`zWASpMIDy==r0ZUbhxAla^%5N4O2L>M z3W=NNll^$GXzeMU%JHJ*I-(D-K2NJIPYNkdsUc05-1DR}P9L`3hAgb-w=biA{-X$Z zPi8rU@W^A9@uZIePw&Imz3SRdf26*W*jWo87KAuZp=zMl8sa%^urobxp!yb7uK>4Y zaA$HR-Px+`D9{E;rjXGK;6A0^4YXw&W-qW~!qp6BSho z09pI}|L;j<7dw5sw(q|0x8dKv2p70^vNq#xkr8)lbf(dZ?qZlTQ{3a<`!g%u8I|ND zYCvYbcQ}9GMXTz{<$Q=3#~BLkZ(wQ1r4}eAh`Wph&g_)d4)Jy4FGj$%T1dMh83iL! zT!^YJL}R0{Hs@mvqOdY1)iyuSF_@h)^9|jnPtqW7U%To*2^@3Ekh;xbn0j86TfU-Y zQb~HGk*_9|=ZzZT&!iqYNaN$@FN^K;mA^i-wIaANL&A&SVwZVynq=5!l`Ix2%^y2* zliZ`@MglCpD-x5hQr;T7MM7A9iE@&m&LJpz*iwAlyWh;%RtW*{ebA;Bqj#$t;(=R@|2f}?eFI7HjvxBzFZd%(@ zudemHBu@8HJDpnQXsmQ(_PAq%RCMyiH+E0MSJGrY7tLQ9mi^~W^Bz(jZF^)g=FLz(ce0#e8W%i7sLaaqBrIwj~ik*Kk zPYM2j6;!H~S#pijC}yM27cB4y3mE5aIQ0T*+^mw*2@|-uStC%u+?k@4796MD{X$*p z;;%ZoH)MU2+4%we6SlUK@Dx6k69yWPFz*RdDY1e<^r}s18 z(NmYA2}1M;vlx$Oq5_5O2KnN1dKp6<(%Z2C1oiqf9-=36++t6399zI57`U$Valb4| z(^jmU1;RHYE=a-ai}5uc2LdD_QvM=5FI!EeBh~io2}4*saq!Q1J15d&em>& zAA0HKrrzkTYTyedj1DZJ69Dl|ZSzI1hA zF9ox`5RaR`n|9}-*X{eJ;8yZ~bWDE~4oUiGo%{*8*<&)IM96pXa|3*l-BBy#4#BPa zM@v8J-lb?VTHioI>6T zK}7`}Tpr_WwFy?rn%=pDLVwX^d+ z?a;EE@IjW9(WBsFf1FpG)FJX&`D0JIC@n|v8=Am;D$JQsU!hh5K|&}x2f6;>y|4HM z&0~VZ_NxOVz3gQ%rp_)i@ajT};}9~WsF%hl7P-q?=>VLmR9$31>XL=*U8j6qKjV7_ zsqP}#3TQM%kHec(8&qOmsF@`?5k;(Grg6Ji7$zlSz|E`LN~r@RjiQh*oA|}x7HTe7 z^!1H#t}k#1Cl@6yK%t;1VksLyeQT3kW&1+oFYz9SE9o|Cj#R?qmIQCyCo!gAwc$K? zLH3^I3=H^?d^6%M`xRM-OqEAgYO64}hV45T{Yh-Rsr*7vWM~7e+jUN7(iA_+6UvZFLQH zDcbN0n2-yhFu#{wi!9c{5d+e!>K&!6ZtX2}`?nmizd_G6_GqD~u7#hGWTA{z*d;qR zH4?No2if&#DYdb?R-yELJ82j{u0{(f7(ba(+>{u`ZzCJTSn@*4g6%E!m5CT9i}(cL zW9(W8Y%boE%Q5uyCROHZMCX&5G{i+)Xf7}GbIpG>jxDV0enC#jqCc`h{~BzDD+<*S zgEGUI{kp~?&Cb#+B_`)v$bg=Q<8E5A?Y&B6#~cxFT-}tjtKKJ4+nFrb64Ap+VYhhY zO@A&nNfg)yS9ef>PdV!Ukr;U;Of_aGF5SHha7yH+CF+XkOzXWB^Te)WOlb5kriHO_ zY(!hz_q2K!^M}^+&VM;7$l-S2*pZ^;L}cjcBZIeN`~>}y*8syqY%wX}4H`O@$5b-N|>jchd~#lJdZ&unN`y*Rq8%H__q zT&)%JtrsvxB7W+T)rhWTVj+KZqK{;A)VSh}{Mq!7iqvdNBZ$X0%*(3S^G$3R5JHe$ zPV)dp$V6UVb>q#|Z%SRR*V;4E;!9S!T&!omUjiwb~M&$fhxh{bZJfwPf!g6z5%Wyp=11=oBF zS6I8}LIf#t7e-({W;Qi10KeDuN)=1MoPu-M=?Ku+_9xk8kNp%R(b{wAFJHd>6o=7M z%RbH@WlVJ55CxARD4#uwZFtc2LK>)+&u{lov5YM+i^8aOoO;EQIq0(?l} zX*ICI9s;)cr>FSoUzaS(Hm-Sc)z7F_%cOKdH`hfa1tx7}9)L(@waS4@Bj6uu(Kf&1 zD;xNMvhxb+<5 zRR2qyoh)>{;a*y_fBIza*uDoFr%A6>ZoBLEkM)S#x@1ttz}*^{g>)cz2r}I=5kFC< z+KLtmFhx&UgkPP;H#*HqGRrR}9*;BuwjJ-&k_N01vr|@M6xh{hxE~=$`paUK>|V-0 zOquS1{;D|qJXsZq%r?to4X_ETa4RR?z^bBwSwmgqlz!`l1Ki`-9yy)C0=S##J$z+; zm7wAM32&0I+;@zF(L(2=*)s6EVe;AcQ_Mbfc|iKd?oJRH zr}hGnW8a%TXlF;a7Q-7k`&s>Xb~_&8bNSufSbaY_YX2?+)scJSAvQC(+htpK zCYQKx@YcLaiRg~QK=B~~6Q)AyW*RUlSv*Rle}oAw7sxdGLCYPJ*D)XQB}XV60O!Rf zeAWEN7b1G&=-?Ls_7l|!_`X@CftEbzj$!O)BdGGa9(@F`4{~i5zu9pLAwgtu@EHy; zKt6)~C~pq0xg^;t3NdzkaX(z#pp!LlS<>ncy5o)@2LeT?Jr!ZqBr@8JOa`^2Ij1IMpjBB3YszwkIt?8ub` zkuPBNWJ_I0x%Oq-mQ{Ug#Hn!49m)y-Be)X5@=cGA5XkM%;4(P9cL9(`Xzt`n-SNmL z#S`wNbZK*u7lBt28~9SakqFZWusCuou{Ezu#e+9)FM%r>nF=%Y+X_m7SA{tE9I-DvAA|> zbjFdwE^yTB=PUB2nrEiTi4qX3ztFLCt4_daE_z-nsgsISI!|+W`jAZ;-aXV^c;Hb^ z*6N%x!ksiLL?>HowP!q=h>M;jTV$(=AIG>s%qp{iaZa4wXdA=NrTfeBR1Xfg0CGT$zY^V}0?gWl{)RH>S%3*`3kd|Ti=r2ZHSF&Tp_CBd8y(no zdj}WMnI+N+eJ1 zWqe5`#XN9*EGK2cEa+kJNam;oi0G~xYp$<}HA`)q( zO@>G*{e080CQke~Q$Bm2dtdAyKriStwm~l|(^S*-(K~JFkwAN%j>j~DR_38*Dm$_$ zM_&rcsaxTB29N99cVX<66fQI7X20Ec7g95$@7^8z&!Fg|^!M(3(k3eZ*hP6-^*zq` z$o0>FyJ6V77g!!8slz^l5!u))N>Z?mvr;>V$X{rCTm+LHEZyJN1=hds3K`4=DM^~d&0^TlM z-DuFDm#a{Bu|ev-(hFWMsGMI^3xf&NVY%+#Y$s4j+vDgk4?7Um*3e746bHVt;jpmd zzu`tOM}jgA=n4lv{B}sRe#SJ>yGl=X5Jj=u%@bRg`jbYcqvUb%W4OML;yPM~M^H3A zeA2Xpg_UfdZoprH-7i|AGPb68918pA^QC%FE6qr}^FyzfA2fRc`Ov@8h#4iLVAk{3 zzjC&chE|g{K7NtB^_vW-uU;3Pl-tTj`6F*G4An_#EmZ#Qe|Q|?As9$jF$%i;%H_2x zZ6P_ht2#es81WJZYS}KR8%s=3F9a01nf=R_sYF%AHQKifxpK9I)s82z`e9h@L2Zt9GpZ&WW!^tkp z|JTp`0Z8ZUw?BAV?fVBcuMYjjMi@Z=QEWQ1#Tj178Vm6kQf(ZS^=?x#viZGMD@Po7 zv}1GU(HR5E(%X$KmXtl#-iT`~W-PS1M~8Gv?<%+6S#PRTO0RJ~PDs+l(>X699>oXbz~PHRM#Wdy!^1O?h;5_r&^s+YW~scUUC@`HNt?|~Q< z=B(=0+FW|6g2|o4k0#PQn%ia6!EQV;ve`hhH6eC)nA+96g_T)#wbzHFq3$8To1Z>< zA?_48MC{wvd0$tFBn+aH2s4Ew26@+Vy_=6P?Ni)DKtPVtc!6g_rB7_jxAU#yphg)J zhSo!90jFM}D87~E0XG3@I8gvwlXj!)YHGcP0+@Mv=$OSt(;RbjTfmjj}&TUjwFi7ZxS3)Mw zo>9az!1NtIovzQ}l8aAL9K@hAv#(@&fu~@ybih3*K{bFw1IXrtBa}|fw_Cs3_GVKd zIkZ8Z8RuOpQh-5-3^_*b8mi!viibp0&iCkVPuLyQ%i% zL<38H6MH59e@oJoXLy_tYEegPVM1l|&V_O+Doe(Cb*d8@+)RYA-BgK@4 zZY6sILMf8zlEK#IO8n6h04hwV;j~wB5`iy#az7i*xFgJpF%?V_66W|3pQE{t9~leW zwUk8!&m+_e`nI;-3jhme6mwumtjGci0-4h$qt3S^%jt1Ds10qjyyGT0lo{ZUPI(he zmGkHr(!o5r1Z1#w_>#VRDdK;q&FL8j!k8lGONtVKc5J-kkle{BZdq?hBmM8O<8+>j ze>0?n1YyVObbGNfF;>F{Vt&bD&%eM0%;(5Gt7w8*$LT_RL1zH0hD3PqrJr zN2lv&NQzO6qA69;!+T{IDfRN-#qz>Z-R+x>l})81mu%mQ zE#LRjQkBrqs$*}4Rg>PeFmE1p^NXXN&&`KYH!eTJ2;F@xA3iu4FjZn3v&^=f&#|=v zwsJ*o7FWPf+dcHZ=j#DOX(EBO3tw*8r5Cl*Citm#3PL>(advY_@QT-=$@ILXA+S8_ z^KgxkD-FjB_)~$yHC2J)%JYbeF`CV`uAk860tK;^g~_?>OPg%pUA+CClB&BTvaWG- zdE5X$%5VH1A3hU{1xJfpvePg)YKXSW^vM3aYxzm4y#4_T!6>GIwALrp$Vq z764dy<9*TOL8GI7OTw z(jrCYnF5(>cfG#ndXk*mz~-|pre;a%mt;OeJ)rmjY0bP+9JnCa!!sIp<;$P=kJi&3 zuI?Pk5Uk;=$-6b*ntN^LB@As8YD~gWQH0qMbbpKQbWbd>+s0%^GbYOKh>MBy`=0es zdXo6$UyQLA_jnCH;>29eF&DlfFTnUYV~DWYkqlrFh_(~tMqc-I_68#^S;-?J5f$3_ zK3{&Z6$)NS6~8Ve;PN``RY<6lF3!L`oJD(NWhFOEzsXpK2KDT?+?M#^HmoSzjR}M8M&)o-{$+&o{WMl3`mPrfUN+-(7xhzrZtQ(yk@fx z#EDjIyj%ab7*LQkv_u!OUsA~?=n8Tm?KQ2tSHcP z1iw|=+9_4!%_>0s+xG&R5Umt0KYRa`5^zBH?jxf?4^{MHEuLvOQ+q-#0t;yt^=w|b z;Z=%+R}U+&W&}`&d+7d1*(Zs6uM^qPN9hnN%IK@U;CCIeB{-is5f$Lnqh0IFd+7Oz zU3>PGMyg-j8Yhl&J5hp)Q1wd^(tiQ>IJ84Q%>Nnag z$o-M~Blbt^kJ%r;|My%!@HZGch`WqE#wOu)qbo+%jqNqIn(Io-O4~~tPcGASX}h!< zM$4CLN7fGJF6R$(iMd?`lorri!J&gi1=JK^)WNEQtAnkBu7g$7 z?x61A!h>-J@(u(X7%^bs!Nh{P)s?GjR`#>Dx%*lhS}RvpsM^%p)mrN9ej;x!xpd>j z+I8Pebz1MJxdqjWyVGNf)RSwMe8t)o)FadY|NsBQ%x3}j&>>Hw@1A70&CZK^ss{ki z4*>YL4*&rM9RL6UrVjuB1|0wZ43B-i_OYcO`_nRHG7>{DB!QGga2ytG3OGpHvP>1v zOvxwSPhvp;hcpsF0Rdu$lh~3vfsL6rb2I1FEmgaBmz$?7TUMLR=qS+xXMHhPFoAZu2t8HGTFF z|IebK|NmB0poX*U%=Pg3=w=(vFq=W!WDst`Nmj)KATY(zx0Cecr%(IKef{pbV+)O!&|7?8e_6cZaZCED`+qaQ?HD_O-Dkf( zet*lg{+|}MZ@ck186W7TLvweq*}A^+{{N%7_I-z&kH>#woZ?y zd@fcS#%pfD6cDVaGGbxAqD@#XAs{8C57rTBc)S;`D2G}|YB+Ab;jjvl_NWevU?l44 z{yLH@c;le8i)Ho+YP(20@yhP@@A2?9^8ww<9KxI~nyI*Qny*}Jh+Yv3?k`x~GSK<- zB0Z_10j}?;2H|+5AHr=5coNs$v-`kOY-nW^k6coQuW8i%9AIH9G&5k0HSLYkDr!DuedQ5SjnrXaafUb^hp=Pa*=)Xbv4?U!L{R1 zOWO0ge?Hbe0IM@8w#h@$HPQl{(W9hCN{whLD)JW)6&1Qg=hV`4fl*t6qD5UxRDEfR znlL!8>S+0ZtA6Uts04xXoO(t|OtmH$=p~^IC=H?N98nS)c&H^}Tgp|$wdYyS5z@*t zA$Sq;ta{+gk60M&SO4w?U;<5P56ltvC{@-2NH7rVgE#Z?fskBVos;hVW!J@3UqDXJ zZS({D122Acmuc1tY)llZ6v1Kh3QxP1q~pF}*B`zAVftT4{-!6ubViwZ|3LSc9Xr<{ z!EF;sMHBhbdop1w0!N5W3KlxM9fR0a?M%sJhVqK04>3u>?RFil`xH>*q$#-;UC$jQ#Lxp&X^@Nmc82l?OaDoeVBJ9`$AOJAv zA@#3Gq%66f->e#)jNQbWic(7)!`U-Nb-yX`dt_cF6$5!KELpTAzB)@V z$K4sWJy!=|mR2X(Xz<0o?v1tF4xen!QsmIJ5q02YDcJ_6!o!rhWasB)=Z0>2UT9?H z8q0Nh0|)O6ACsGiE&{K6h7AuMfC1Eq6{gWyh<-j08jD3(YV6v6@D0JzAa0U7827~;)oUu z_j`nCkJjM~#w-L`StMBTBFyxJoB^Pb?94~Ka11=jyF;()Q;X??dW|oMN@1Q@!!d6O z835IO%z#VPSKRSw={D0$?r9A_;%3 zRXi_QN(yD=dYKS&q6@M&GqO1tXS{Y?q5DK`>;~>@j%AP&xX|UJH4Z?gERaYco?n!O z=n4dBidjd*7L-?1Vkyc_x91_;oQFuh+TPUYw#XTwAKIcOTB`FuxDHbnsTIRm62icb zp8!tyV@|Jm?X6`tc-2E?rJgeVe~jtyLsbKBonX=pe664Z*7GMtqB}I-wRXkP#I~%@&-xP z4hX$qLZ1vr_BS_cUihG2>-_srzYj6=Dp(LLw8 zfaGZ`GRm6)Hx^6Q17F6GTmXEZSPm?UikwXN07FN!8dgg^@Xj5Mb(1D}-X!6I(mis1 zW-{7=mhjq3!wdK_sXcEhlhJZ)XsMDO$P+!2d|0f@h&82t2=KrN0P^V<2RTf<)XUIK zQeZwV{oO9vs*M3SfzN(srED!{RM@lU?KGD?^FbWUo8HkaubY)OaAMD5RQIEzI!wRi zIMx}UM9ZO%K+=ph7&LHF;XUwtV*+b=HGchKQy*lfW@-fBQtjW+z_OTJLvpBJkMIiG z9V*yULOd0urJ)ric+jP=*pb!ZnF&uPez)WTQ8;?-lnt;;W`IrGsR9)Jou;7SZb0w>HWz#R6hbGXCX3>(2#Uh(>ZKdh+wX6kac zyaePKX_tUVdlzzJ$V^&vK^f5dGiPPTEBC|(`A{6f zhtoD65ZEh@3oq+74e^+MG>VZrMb;kzp!#EHVKy)!;we0upt+Tyf&?sy!0ZE3hh5N> z8$-rEykj4)AygR5`54iejPFIH>rU@v^r+JBrVN~M74I0W{D9fip6LRicTt)_u?&~0 z>cAbsdlRBCpzpwwcM?INZN8-ym!D=VE9Dx4E%eaf(;Ef}utkmH$uXqH1z$EzQyK=O z1C`7VKkk~$5UC{f8oh_Cai$ckN3fJ}tX{RWLxCdTvOGhBbqWiQ#u!%XhYO>M@=sl0 z-92$%H49MVRQ07^2vorK7og+S47KZAy@&w7HJ+3M+gfsOW@Xj!aHW|ytUBG^5jU)Q z-P(73UIVxtMiOQC9V!wgLM6minN!A6XFSFIH{|TYi#V4Vi<*0v`K-qd1}9~-Wdjo* zW7)#cSwyOsinclxUyl;0g*<2Mp;uYRWZ*C?_j3VPhTtPtB|>pRuU9c60VN_>gBih2Kqlk}f3ZjrR!M$o5L`I4gM{xqrGK280 zl@NmUKvWXm9Yqw12p&1(T5MLP#m$7~1V=7&W~VbGGn*{)04G-3njWmbRMe=R{*yiy zotc{W8I_gf(dfUIIbfU?zW4V-eKP1;)Y4s=WWN~BL0;!e@h-Yfxa}bAM!d&Y4Irp) zjyp?V#4{R}qht6Y?CQ^c&(;Kcu1oxyC1FW5>47?fNIq!ltu9!|+N54OH1`Tm#Nj~1 zbfoDQxu}Udl185G|HMM@!lZY_ zj72HgL;!Wj2}Gxgj7DN4=a{702|sDU1|`Zz(}!AH+-g`Ej1n4*5*rK>0#{c9U_HF0 z9UAxc(gxhppCNgqb?zI&MRg~^`a*d>F!?H)eZMSQs|qsatH*-*TJ_p_(MfS4c9QIj zZg;}+L+TK3;h)~u}BlX$W@OGJ~eY&Drrjaj(>L|}Ff^J>8NP)V$2 z_VmVN3Ssd7*@uV!Ak%n@03|ka#ACvd{=N-1g@aEvENU~q_!(gnG|R^e%+htjQ#nb< zTi5||H1Sl-A|PCHCIe&95ISH2k5WA^vsW*e+$310Ic2b$QI5M~Nw~~2?#ZlK)#LxJ zM_1{q*!t1}%a)Zqq>FfXF^rwR5u9)hE-}#$$Z5u4NAtyo9bdnnTfUX5v^7B&QZK-% z$c7+BI>ZyHZ84edr!aM32Pyoiy7$z{k=4?f z5T#fzu@t5JXYnQ^s(HSeZloyGj<1xQd=vc&f2WO^?+XeLSePh>jVi(x=8gPo->RND zNJHaHys?GH$|t9^4JY9El;H^46% zEx_ib6Peh+G?GrYCveeZ8{6G2X``u#`BdD2d4vzaV#zmG)-6IBXNEfV6pDr0?y;oi|93MdWXU9laDfvAs^B;VG-$#`t`iEG(qs?)reeVb zBSBcuO^O=W!@U@!cHy~^Gc&GGRc{TvYL3d(wQW~bgaK)pAW0wsED=E!Kw7zuA_BV! z0Z#t?|Gn;E0WJFdey#hQ-Mr@Wd3N&nd*R>2#OMl=6ERaBT}d%2qA;qZ*awx44HF@taf|bE zenuOwW2S2t;H8F#gXevJBBssr9Ib|v-njdJhL_Xz@VR1ndi;|f?hkv6#Af<$yVd8f zFn@C(W~%S8uXXO_dLH-e^UPhp>2f=qwi8cfx6}AOCacfa)M`Af#)}=Z)%LWyH&|Y3 z*I4()+*)G1O>V=F-S&B@+?Vvs-}u=5Q(BKRnSJ6$pq<6@o)>A*cD=hz_UF^V{p_Kd zjAlwZfdfAzrhRh22=<70D^A}>`c)apf8VLW{f>^q4qz!4$t}n{e6CP zG`)|{udfe17;9_S*ScR`zvrp?sCE-+(@z#i8sA^l$YS5|1ihsvSt;L!&`m-str^ z!U9^72E>;8QYWz_I<|y|T-P)Jg(K9^adPj3D|AS8QV5?F>{o4wnX}>yr^60c%K3wp zPj056sPMK?tU7`w@x56h=3BcWcSEWW^DWwSS)=nH7YAP_ zTI4yGc8nxn;zxCS9nwb<)^%>WPpHIkp0}+I(3{d-T72f<>Pk>jn7-Q zSX3y0bS$uLu4gn^-1dM*8bVyjT`qyrOpvNt5O^FTJAy_W(0n zp%9|yO$a`NjWR)^Im6RGFs3Cgg>j>-`eHOxiCtsziCw!`t!w3xe#||ocY>^{(Mq{Jl(;MV)$3W zrSWKR{9#SJt3VX_!Q>)<)btQo4WT&()5IP+2aCcmytN;;U9AgoAhC4AiU5T;dfYs2 z*@TI#S#-OVbi95x29>JXQzUyhqYS2vB{K3xm>}YMaW0Bg5pw14xRzYB{9Z|NoLIRA zlVsp`TX5S-=|kGl$1909#Fw7GE#A!Kobq{PRFbfX=v&tUk~=>+*LA-_=dqT#{;)21 zBgw9uF1h}d_?g|L#m~=?I}lu@i}eqNIq`JT3PmXF@5BVTBrqcZ!+e;*;e&Zpw)3A1 zPiq-1cHoy?v@VFDv|gWuBd2O5JNB;_2gtW5emxgacZ9y=!O6Q%yQ4mzRn!#1-rksNZWf+GN+;(Z3(ifTZ6sl|`707{Z)++RX3AXFG z1wOPG@m$y#?0-@qy)Y9k+6l>b3cyNl01+B5PR#`PPZQsiA&~9Pld(#yRO}d0mf=%g zNO~-Zb#vStO@iQbpUfhokS)mlK;gd$Qa3Gp1mV^2lZ$tvP6d03u%TaP5UxL{XH9rS z_D7~l0&zHGPiFNyqukgUl>s&s3y_bqQt7f=5mnm4I`u~>iuqYmI^d&|BdxeLb73^T zE|l zY_ZeOfztw+RzO04DChNnlb^t)_;|1KDP}PJ#V_n)rIfx6@B0+6CbfV4Dj)tSe#F9; zdCMtr*C~Eg66G$% z>qKKxs;I4F-Ib6A@ds+3bX~5vQDFO1JFe#{rBDT&BI-WrbrgPwBT%PNVJ66}(e9ht zm+Y^L@0;q1)!n3tGeh<}`wC~N!7h+Xg(J{!i;>W$Hok=DT@iX45XgX|6r9TDkK^oL z`NiV_*u21Ip8w@!bP5GSCzt?DRe^Xa@rAa^^yo!r6a^R}ZA=~lHZJK@`T|DG|8Pm} zn=mBPmzV&NidcZ+u*75!Yk`RqE^R(#y-GAR(V*TAA>I6FY!@Jevb#oj2*x)O zBtp1}+z~$kzO12!#<-~4*7cmUYd@+yTRT`tx?Mp?hYqHjfl~`X z>8pY!{YWF|B1aVcga5m!7@#!)fYtO|voJpY? znWP*S6BMLG0ClZX$X-0XgJ~YnJA69e5f1LT(CZGgsbe2{&F*$Ec(Qvx82Fnl9T+bw z`yPI4$wqwkHwRi>AnNMB;X2YX4x=3asTIo-eePgcS-lQvFRBL0!LYEXA(q=IRY>v| zLQ7eYG|M_>WIv=f8OM?qQc6tXiIRqsH@r^7Xvj zee*f+?Xrzwlb`_W&*w@VAfD6%p!fWo?;uJ+*Rf+b5VsakU3A*wo3B|WZy|J&XvZ4W zjJ$2p&{P>ZEm>e;45ASgPAMG-5prv2rRPUSSSYR*Scbg4uqm zY>`$ODf!8b!c~>f#zuIhINkGmrCD%5R^kf8J%%v6LxNm~f$3a0HDlt4_|_?yXArFP z%(oyXL~ZGzzIhAGFF*)sVKyS=j3_Pqp=w@XwgIZPNu9*w2|DrZHM0#=bD)+v?Q1Ly zF7Pm-J#X8{(;Le)`r$PGZz$8z1UmA~KS&0iS6&<4B#-PiS)p4!r~q=kku*M`@h@K| zwS1n)reAESm+?&#FLB&7c;}=>(cd27+x|N$|5jG6nl!2r=H;q`*uDdCGN>n;a)NpX zXeaHis=TPJ>|3?-*c7#KUW?lK_rWZ%Gx+wd+}4_u(hxBVMfA*Hw9s92*4~=&+)rRN zDD)3v=9r&)#NdHtJ7RG+T+QAmX%luvTa+MMQ6THluiwGmB{qU}4P|~>Tfx~n2-K(_ zC+NgJ^|{#=DNeu0Q=MsebIr*hN1}U;+@<;8-XlgkCy=U*AGf%Qrm{ues_;1ePXjhQ z3y;&l&yMATi9Ia6y)Wt8^Z%!BK!wWzKp7^6;-y{AfRS@l2m?p0KE3P>@z5l(N1Mj& zl5YN;rGGm9p9iC!e@}%(*Yxy>Gg612ta#jpNn9E0G%Dy7!S^Wy z4o24VBZIjsgECkNb`uj!ON|i)FBfp7zPM#pc?-^NFUX78H3}=akW8w%9{FDlxdzcl z_OR=`mc>^R=0%;lg9S|!GZ>r!<-r+>c2H3Ay;dVe4UMF zlB1SMeTOv+66##kF-ob;LnN}?p02KEL4fFGom8+0UasT09%X{PUwedE{=5{a-vo~V zMsYtvMUiOJo6>-xuwc7sc8a}%rR)@ciU5&}naDbIh9ORMm9r5->bhhGGhqc=6VBMpXe}6iU zM*jYN9DDov4IfDU{icuUKfl4FiGP1YjTVm<{{IWw;wB?Kxh-bqc`hc~jFlzh`RDiS zQRg4u%_E0@e$04Qi1T5=qSgKTR9U~jaE=HypRbU2n3ogK$W+t! z_Y``ZW3Vn zC6fo8KqPlr9py8)n=(@?iMAY$k_Je`O&ooB6OSs?5I&}w@F`_HbKQ#BC7?RfCc)v> zj86#3o==2i**-^;A@V~zbV>W90qF#WMxlymHb!W%D+i?7{u71p9W*jf57XFnO^5B| zI;RqQ!kUyCpAp>QR|XN|=QjxaIDH!k{$xI;p&!i$(<=}&AZN;o@a3zJ({0hX{dsGwQmC2SA5j3=gtpndT8ksk{pi(|*O)tC&7^arx zMFGy1KxJ6kPXm-YBN8<2XTvIOKZa8j_$5-8iSP=f&(9;LwK+1S%+RAAYcP7?a{2 z#yl|zAAZ?vSo_w2k)J#?XRD-7WI7NN`ytT?zyo30&5&wm?t;breghaV7>E^<1&DSH zlaEb!e-ntE)7D%w&hjou!D0Iw!;>Uz>`QCtS*MIMBbJ*^mtrW(fihOrSU3OmBKkZZ zB_i>dKh$^K|EfjjK7@<u*MN*Ec7(^~{bQA~;{wh4wu$xS?kto?sHWf(A<(1Ikv<@4=*}F>5p2iw%-5z? zrU_l@fiiFRl0UmNMqENb=}b#(8JqkRyEsrR*0l<5+XS>ntY%9j4vzMcCE}HC{32+nHUIX>wyJ$>>ZSqFmn9VE^6ply{ znvvGeMKvql8758nC`J}Lp%yHZu*HoWP_Mg|Z>!kKnP&ntQ?8%T|mK-p9K*0*DY{Ge~ zToUah`lsn!i|V-@o*X+jG~36nwrJpjxPuWS7jiRn19>dEu2rTGOSyb-*&{W9dUgo~ zT+@DUVQ$WTWQTU?pGgghXY@zIFtM&JR&5A+2FqU;tP%>H``|=k)9p3&0d3x5!)kFc6ar>XPl=J%r3LOUoH8Qo8Y)H#={mTQahldQ1 z@%w|~>5$k8R+`Rt02UM(X9+b&q#wDao5?*m`b(TLPXJt^^7k*xq*!8CavWlJwfjiMe`cQuN))d~%G}ooFG# z&^Z~^m82g7;0O@S>ivPV>K2vq?Fj1W@H3hzsRkHUut7bXA)1qlX;JadF6Y}}NKl@x zNL{Z5_8J%mOh5@YWiF&@#1&2nusqQ?so>mGx7 zfB zZWd#m98XOSd*mA+SlHzJL&Li}zqurN6a-~_jRrX#4C0eD;--9=esbKG&W8FfNt{=-O=e6S0h|oTCtIzEf1@y9LqIX(VMrJ z&T{HX(@$DNMYZioWxPiS0U|gjqRO9Ccb|T7Q&BCJk3nbJ<_hZ2Jh$SM^5;?reJD>K4)u=@ZWMGI+4meggEZ zf{Sx~Q@O*ZIq(xEwy>b0|;)Nb`T#^onNIhs&ZE*}Hzs-b#9@?(!{scd= zHF6$U$Ma_Y$q!V5vsR1CZv;Lu4J2@8zH$sB;AMSA!b92=hy3I(^$cTMzp<`geRV3figju{>8h45u;6&GatkYd>6bSl?$zz zN<7|78?x_^G?E8Zv<9Vi+FZk`ZBTvq!QyiY+Z41GHUf#$dDG;I)4*#L))OS9rJ zgBdT*dEc3Uf6rrXiJgv=;qUS-Oh=zVm!dhxLF~h`$ht~&idz?7@s}FQJ~hCG9b^;2 z0DN>Dpn1e&E4KXrmQE!D9#|xh*V6(l4da#8|DZOG(O^*)u>*>>4uL7+j%>r9;fB5f z5G~qC?73GC)w2u+0cEES+O$$^DACw9RnFBk-r@pJw( zzbT40M+yb9)l?8KWI9ddvvFYWCvOCE0JU- zrcPZ!e}mvv-<9wQmPNcm7DbBSP?xT1M{|Cnwi|f6vPgdL_fuX#e;erQIO{J3=XP zf_N}3$3c1m9ItSetHDbouq~(5iHt`M5M`ksdo&8kU3b1K6g@YNacGKEymH=^ zE+BY4PT^OS{1?DFvIul0xWEXF#q)W#3(H?7`;IVt8}04|Gs378W;yqn2FYHBpmL+` z99eL_Fky`nr8Y*Sc{p!4%*T-ne5UOR6VP#kl9k|uR~%-8@Da}ek9D;y%G$N0*@xBy zdh(~aNl$?>m?eo7fT&oEU%>d3{vyZZ_K+ja39jyRM!j{n(E}Flkb%9NBzY{pGI)}w zL91v*v2v%(86O|u`9=o7{hG^`S0HRI%ylGzznu8V<0rHD{~cLbR%i45{QrMH-}U*x zf4j3KomHFrI97U#Jx!jf&sS&U+1lC0v%0hNZ1+}ww{{k=sPhJAOwk$GnD9UJMraF; z6dFONSo1N)4E=xr|NsC0|NsBZR8Q&af$c}G!-a2M!B?pwsto`pF97%sF8~3mQ~&@0 z{Vo6is#E{~BH$e;mWNJa1K6iFrV&$27yS^8B3)S7*muq==uoYP(Ss?%b1yMy&RZY=KAg%-e z3jP1>)kq3Ad3l+cuI8`42Xk7@Yr5||E_giWJPvvQ=b>JCJ@mtU-uALa+it@&+2lUW zxBfp}w*UY2MKfmE{ZpT(4}{whKY*5*ZECA#&|Ni$te0%sx?2B7KPUh7{;thm>F^)& z0lfeCFdY7W|70H+w{=>u`ytGO`CokBz;COS=b{=oId-&V_s#tUvuvg^w?Cd+JlVAo zae0ApQInecZ_u$eqdi`t<);U$xC;<43RgGQXu5U9id|JNmH{osUz8~lQt+cm+?Q(Mei+^7?!pgg@^Q=26H%$Hb zHkZ4v18v*!e=dD_6*BR+3I4y6=1wx(@3-P{{JgK7^l>uY6KXmwR||D_y!`o0c8hJU z%Xr3WqpPZ9jq@APA%Wc~b3e$S!n zcxr4UZha5Wg3dqAV}DPJNjt;qzVBZ5#lhroHGhw)!e@Jr8+C&FePeBQ%k5S``@QaN zXROeVckO$vL!!5vuIiKU`rociyv|_paxC`5f=NUU%N( zo%flCnL~BJq z+CjZ-UGk@~mK*JlBw!|cf0tJ4(#nJe-#D6ejcdYh!%tzzmMq=R1vWDrx;s+(<#`i) z9b2#Km8)?lS1?*#bQ`<{>fhI9t}yCoJeaGUDLtzW!+$l>4#r`l_EvU zuJbC{7?ZhFYjcuw?hLahv?!yawpprzO%Ui`;k4tLTNXC# zWa`J2cA}B%Wu}aEX&y3`4o^#PYi;wRMbuI|Z4=r9hh4{!Blb6EyTc6g-j3xf51@4W z5aX82R$QNK%buXJw}{Hx7B6Ge3|8HqT)Q5cJ+)qU=NKxQf(s>Bzt*KG`n8xEM{ z5qXv|=MIk?v#>>LhmwGCTnKa8G3d{f6%=umx)Vk2X#s!J(HiN-i|ti+DzBY-p~3d2 z1EY0UOnn*Ji;izH4dz~e%Ylrsa*ol*<_AHe2cx~DG4(Bt1C+N+sp&!lW@!w^T=qt6 z7p|~lM2#MBj_}uP+49IvViV!W&QtM$vfVT6k`tbDlnDWtp5hOv?hJX8K)i{1XuU3? z5e}fyK{50Xj4*2&!CCb{Hk4htDgXGIvgl@b$S$8Y6a9;)+@Ssi(@jDDCDHF5QFQ1y z_r=oz$L1GKSOA$%3ID?Bl%Qy!(GfwUB69>K>Jz{dxH*zdn(UlfR26SsZi+5_^!Nnl zupta7sPpYTja@tbDTgYng-2m3U-tT*Y4Shn`YYsk3_M?w)dygv?j=#0dBE_ zB>qJYxY$rPCRN&nxt~gk)6;C*e0Iya_rxYvo5?<&!Fqc#eK#Y~4G;Mjb;BNdyfqm4 zu-?SWs(H@Rl$j2tB{hgfTUY!DzKZ{J<^d|vd<=Tfobf8DKWDt1?i&q0J-sZ zhQeB@X(i2d%3^InQ#6rxbOrxPcj*yGKUD6z!Q1~~1_iY{ta*EHFTJrv?d;!sb+UtR zl?+Be>=^XW>;uqpoqi#svd&_wvU8;oh52jzoNi%j(`3-$sx0agZ0WpI?WpZS4?IFP zW(lZ2hl)lca2Vp|3-L9;g5}`HBdg8jS-m#+-RQM$QGS zPgphp_QAvXiU|Bm<(paa!dYlEd({uZG5G4hxQLbWTkE512@N1@;!T?P(ns)3A=XX` z9T)nzfmIg)tRR@nsu+O2Y48+xaWO%NZyuAAp#6QXT0X8pq^Y+XA1l{s?uL5+}=!pg>nlGc!?RH(MVUjNT*# zSm|@57TE5V#)RNK+b_BqLs>F=@FE0TR=08S16}kJ;H-F&IsBZ$Y ziG=|*Z$e}Bq>iRvuAq-JZH%JAW80BWsU|{IkyOzUR8O@}wC(OcgKyA;+yTh_B{!); zsn31jPKHUnp0(>q#x(k+yWYVfeWoX7{<>@6k%#*TaQb2YiZFlq$yV)%G z)-o2sh(=bPG50E-=)nA8GDvwvn9;M}VhfMMYfD~mYnO9}A7Ht{!;-b(-UH2}8Iqvg zzHh@#_Jf)1I}|12eTsRrSNv>%2AYqEspCUGE)^y~f_0{LF2qpZBqQFceDHhkWMIqw zCP}B@K{FmJ<2OTu|D%RZ@Z_q!nlM#g_P(T(_XQtgw@~~@L)@iok*u^Ro*-PM;uM=| zzsPsvl!=BM?zJ52toBJ9zw>a)0tp(#aF6m7vb430X=vKgm$6*EFh+*4nW~&sRL|LDof$%_A`+KWun;4y(yBE` zBWIP)`oRg|Su8mRh~xNLj7Zo`N!WA8@lX`BiSh&hVnCh01zaT{aWy>&tuS(yjt2;! zGP#Y@qpFk31_4wMOc)sJ`l#9rv`o=-=;c6Ymx+}Heh}ALA^|MZ?Ba*^)DhKMN~C;l zExAXKmyK{y-xm+Ee!ociQZCFkX7Ox+pY~5HFil2}HfA9^kfaNZ zB)E0Uxc=NSY}W0Yeu1-V{?_(8g%8M52O%p16r*fGkbAx^;LbMY#NCsOst_bIcZ-r6 zv#Fuxmca3sPei(D$fyOkc4O_?_(`ot^rLiA(nu>mE-L$Z(Q|j3U}|@-&}w6bb3%Pr zv8ilGxnfOvQF|7GH(prLv6iz@e>+%=f5J&ABBBbRot8GbZlYHvOavqQ;lGl9PzUxM z2|gC)GUeKxu4wy9q*I?9=1>Q)+Qu>J1W3dFe;Kc5SqJ29GLJ8?NpRQ7J%)e6UhJvS zwFP0_bMMGFrJvY2=7VWjRLCXf+B1jf%eG*)q1UHUe4gkLzi34Y)kFGh_y1!1LIPwz zWr^<}F3^48QeO*dFWT0~))L@SVYcHL zY?6nD5^j6A2!RayaR@+x%6*)^IJ7_7S{xjm3?3AySy7?EW6{mxDGTYM@JI3m#-pe- z51h#>b04JVEPJo;`weL?n{aCXM4Eh`Zl7$2W_I1KcHvX|DleUQqWUyDEEFukjK-KG z3VFdB5OPHlfjm;Rkt zY>HgRscr)ehCZlctTE?hW7-URmtE+_ZmStQKtP`}08EHuAuc@Q{gW|T%CGyn)U1E0 z2fJ?1W+M+$2cnY}BLe3uq;Cq#yNDs31ZyfGEfHuRE+OB_fPJ_!yMK(e*HJv70H^m4 zH1&T%kUg}lCy)qtJ@V5ag5I;A5Ty@o0D9SbVuGiqk@QxZN3Yl#xIR$haD#OdWS&Rp zO2cdy@2$qJ(x9JB(&Jm&3+CR7%5Lrm1YR>g_Vkmgvm`Zm@a^dGkNY z(FP%%Jpl2fi0PjqL2ht{f$c=Rxyq~;@*{CXDd>UnGbH39Uj6z!NnM?LDDoaSZHhc+ zHf-Pa8Sno)4zroqb0aO4M17{^hSm3vA+JwA4SH9yV>>2@`2?YHdz&EZ`dcLq$T^6I zL<1W>sFJcUJstnV9Wcc`a%>t}MzN>w+UdEiIIM7oraujiOI3|1Ul_^Y87i1vOXlCWcvU_3Ru&b>!K9lB(2m=4#2CTvtc~cb)nCb-ygzU z0iB9jo#%VsX;ogNGO$$|b^3Sr#V=jIl2YAZdZbBV_c!Q&n^B%309BFFI^fY4Ghq8# z)Av2khwIa-H1u)}7R?aP4PH;>8a$@0&seBc3baUvWQh^%A8V1qc&$T`Dl+|KpGoo? zj8RxrP$QY+NvI%giEZ`-n@rtKl8#PiD4HAVK*^)e)@cerin4#X4{Mr;z4S!&#mo}_ zXb2db<2YpGec2(tnav%ne#s8FxpnJ~HOlmlL(huX8D#x*24K<)QNg_=o?(8p>9qM3vos8%3F+Q!+edHpM|7sUUQ-( zJ&S7a(RdBweX*6Sl20lM7M3z?%Tg<NdP+1rW`1pbr8qL zN~B##qS4WtVK03N^{|A7nY6HSh(tf@wX&uvY9X6QTm$DrG`q?sH<;NXZjwJI*Ki7GTdYq~M;0VKo<*{O*T8=hEwtIl|LN8lULNggpKh8Bw0Mz1wxdA(|9( ze!-w|MIt6T>)2=7!#&D}^`v$$3ZF*ss8aN%w3BU^NEy6a2`XQP+TrXP*#b07EO%w~ zj!*W42I|Kh6Ul{<_e_;HuYXOWKv70D6iof}Y4-tSeb4l-#v0&b{KV#QDSnVqms`I? zBkX0pwts8S@}kYzv|K{sR=p}hI0CbgJ=^=hcjy0L2DZ$&l09AsUjc=spK84DnlP)v z6?n&JuhPG25eQP@zNI<-R9c#@z7@}MMUHO&TOT@V_v8e`jwr3ql-nbrc+ug@JZr50 zh2uUE2_l=&Tv}QKKWz|DB+QK^E5uNX8gu4eAs*M3XRsQ^tM2DoOgDu2ccoE+eFV%l zP*YYCLPg_C#Gqp_$Yxz8tal-Y0Y_|q2{1DFnMVDHX0HrUYpbCq68ug~W zhuExruUPD?dLx7~{RB4{ML?xRX$1h5&v(8ywME<$G$^h`-~@OgrTI|e?FhtZ3em#F zXyQxr@7G;J-o@iOT67SFxwRPhsEZf?75sL>7gV)he6Sj!gXR{B{)RDc-4RH&=1}W_ zywa6GKY!ds4R24}zoD(vf5i=G;&3vH%Hc#-qQ6V7;R6-7zcyvcyI>>}0U#AK8E&xF z(WTF95rSO0sQmhVW*ls+c3uR_ffydn#@E5(iJro1TP)!~)R1CC?;AFErC3B4!y&Z` zrOjeEy>~Y@5Pp$5n8gzks8uq&H2cRiqh$L*51k^+enJ_Q1s3{AAtpZ}Q=Zx+=xL zi*M;ab8@$y)$?+;zSO4WTzg+za=F${=h0mYj0~af#c|p_>MU!J4T&=uvEEHbo--Yg z6Et*yy}zZRL*#?=fyDTUL1`qluKS;h@zPv~t6Q>)EYW=$PHPP1Rw5-UhE_KH;&Gjh z$tw=|5n*nUu&OEo1j8=X6(8nQ^W`ON9}zK{a4VR%c zD(_O;SyydJzxx?*SVT)`yKCHgGN6sA_HT?oVeHB<^yT6xK^+P~^LzkoSD#o8p7`qIc`PpBf}{~Nc8o~nu)0!7si+P06+s(!R@yBb2)y^u}A62kjY z87N>ksaaqM?ysqB86xodT+N&&Y&7zDG@Wig-Q)hh*JT^rB**<6lp*R?Tb7!d%Lue} zYxL35{`5l2=@qn~=FdV_J2~!A8*(G7RSJ!v6m7yT%@a9rV)-QcuhV-FRDTY!TwEJ! z{)YiW)6dDn8Fb=g!1d+A1XGr&j1UFve-%H18U| z=T6hWh_~$7%*?iw-~ZnD**Ckx1pR`!%m}wNo4w&ch4QHueX}fb5JKxkY^{?u(tQ&b zn!-h3lowtxDhZ6(%L^ldo@4&a=~{NBcA^-3WAnpB6MR;t_C;}3Iz<Q7o;vV}rV|}=38!XA zI+rW4ap#C3C=-DjQ2BxXnJc}a&NS>fZ+<}3Kd%h?h`e%m7a!_)7s7}DWjjP&)zT%* zfI{gMVY(nKXbR;|cvmWI)Z*L|f}(Vx-%RfVGLY^W?@)O|ad94HNEFAz zj4RGA;5(6O-euoD^shys!(60pU{MX}@Uk0PR2yJo<#)F1{M(6@`%w>Vc7}t}Tyc9m6?= z`&-4jxMvC$p&)vJ0}1KkONsRy7SOSsqUO>RlpjF&W!u9&u>dq`9A}twHtJB?%H3g% z<19BtjWvB0`N>R!D_hap+-*PB_L)LE%x{nPHj>{T&`0c>S@_!%aD$;gru3K+$uK4% zn9))cH^N|EpsvV@-6BS?Fcn3|g>s2U@Mpxu@B4}Mv#m^D6WG{M6C=H6GMqlQQq$GD z)mN(oilhN>#M(jw1LM8GeWN$2kO=YGQarLK=1c z*Pg{B&xZ~`ZbRZ9UUO+Nz)Y2LsvCni4OQB+)47!9zor^o(l3&lhvzG}7Yk1+RoAy= zcLTFUmMk&w?KQXbqko3fVcKPK`8vY!9P@WorQ*Y!XrQ~@VbLCc`Li-qi*B-`ORM$G z0oPVMB4C;6+JIuTUOsg~Fsz=F7FTtL!}BB^2kh>r3#x$Yhyk*Nc`M}j6-F0z@{Da; zYa&9DfL?rFHV8LGNAd{+;Mr&&R2Rl_4JX>qC1bD~q2p4OkLyE|`znD=N=@>Ey77p7 zUDx741GpiY0(r!uwOO-H-7hNuBTGx}Q`>uiTOuMAMuqIAvf*Nt)w-x z?OACTWSQ=8tx}Y!MmU{sf$XD))Q0Lh{J3wcGEMApn&yvX9o5T;063m&xJ$(BNM4I@ zBRINw8>=rw1o;VB<%EE7FBaM~*z}7UT`LCY@NTscd}FKl#U}bzGf3Y_4F3N(GyQl$ z9gU41$~D(6S4p@J@Jq@osKcpOYpb@6cry91vxb%Xm{zU|ag76a5L0P&b0mBe`R6Y; zJlpjs!_5=tZqZcGOIlQ<1d)`C?GS>cn7gkN3e;_=*dmpptxK~#STa<$j_6Y#?}wCm zfn|oMwXiq3N5TmAXo5eDSvH1zi5CZ-L`Uu|y!wzgwVUjBHa5>8ynY!;<{ZO{-4lFW zVE0W+a-gschfR#kv7hE14mFDON#-2MgC{Z!=${C7c(;iH;K@R^M3y1X4D^AcG1(<& zM=!Y|5lGcb4JQq$UMUJzD{*nCR(fl3CJFK;dj_t4dkmURwhjKYt>%=)wAeDyUA4WH zKb`d3=&SjC!#9(|8|mSmng_5F&`I5aMUHP-pC_We%U-khPR4O>Wg=47nRLsl9@Tzfy(*+$CYJL=^>Q>7whtKy$o| z!4+_nDKpo#s$0MfrjP3Ym+p+Ljl$jOO3SxqD_*rFBeEK%eYldboG9|kFs%P1JKdZ* zIYvu`$SVWi4uFAjwg_6LL}qtv_b*7MvLoch@>PKxKqd=T0vSf9>oeA)Guq}lVX0_f z-@1Sy{=};+5jB@VG{BK52oYI06IMR{ss3VFFBaD09ct5b%I)}#R-xx$iEw)nVwn}w z1c1jHT3At%l;K#IH=Ooz|D(auYCaE65 z_lPrBrO6*Nl2l(EyGJ)qKvn~bZ|A!u-(U8l)0xeXh-d9%C1dD0YWtyYZ3^dletA>5 zs(#%o8^XSx$ARm?veW8FYN}qAwJ#|*MvL6L0DU82f&AypO^ms7Q0^3Q>Y04ba;g*# z{$8`7x}~eYA}iTZv_{amE29a^zfNyS?z9y6kF8rZV*r5DQ2NGS&H94+*am;*$qL?} zE3iOU7Pku7X?V4-TP@>7t$ZC>_+^V0d};rrc*fKc6G`1h_P_~V{j0P8sIP)j>PQN6 zu`71uD_S;1*QDIUngvYRJOT)zuN)X#loi&qUqg*0saA+HZtX>R* zgAtgh8QFL~+I*%g*37m0XT(o*?c z@-)XrTy8-iQ&*ys1OI?LPhLpXN2F$IAS|C&($ z%I1&$ItTL0V>LA+_$2Q$w6o=NdrJOiXfOPBl}pqAIn7XI>D`>vi__8^*`ev2*eZlm zr>$EDu+QqG`6aOPa4mTyW4IIoE42ES%S}Q{%Bgah_>tZv<63b2@&i?lQfQD@hs0T`wHk3NWbiE^lI;9Di(O^;9YCttaBQnJr-Z^{%*qmPw0 z97Fm_K=emKiG(BNB?gh-1|<^_BY6cs^sHH%=8vHa@7T`1o~$|pcvEbj@IKxaU4NoY zcq`e=lm{iZfs-_i`=0X|Skd=fZ z4p&hl;Dh0~3DEqZ(vBLqawjKMeH+M2=-`jD5B))KiE%6+1VU`yBIQ07B~YCmmI!qp0uxTn^U;YNA%XNsz@R1&-pi$`(31Gm|*L4V&#_SlO4FNz&ef7dt17j_y#XZG@zC2}Xp5N}Ad>G`KU_qWRK?;=?}#6Pj#} z*)3N--~I{4qg^YXiTI%fepLvBuqS4R1Kq63Wf+^9RtLMIe+Y?D{VHUs2!+nEK>NA*=6;Oo`^|1*0iG(?^;+#6PJC&TmUJg9w zSj=lsve-0Z)KM(uRp8Mc$*IeAzCtGmb))Ji_p$n6S^Q~1sjHV7r-{Y+C=))^xY>nh zZHC-mfX+QC5}FvgcP+G?+NbQ@p8-sLsHhu4Xcu*pcUeleM6KbUvnrfN2W+d0W7D}i zh81rk_vyE#roqFZ_0@6fl}Be#?02yzude~uM$0!wm~s%x04MFpk7cN#h~(noNj}d7 z%8XUJDoE{$e!5pFcx5!QjAPprwY0|`O1c`3QlY$&cId4Oh*pPx4aWIz8Zkg$RC2e^ zb_bhU|8%91Osbr?+6xiuX;X^Jb+d^1RUbVvac^cKX;p8627VZFzG$i0ad(k-(*j4> zWm&S>+asWfOMjTh1p%y3fh zyLkmnQsqb=JZX{S3DnQh;>i6(lA9aS<=f?(8Cp7&bQg3*{Ut+q`Xv0xNU1TFV+$<^{@Pw$Jm@?6 zd2=|t>xscJ-i;BDhZvdJaRp|b%B*PU6N?^z2=JHu51S!^)(@T!y-djO3$~A5srW4h z%E0BNs+J_4KJ8WfR5~#;iil&)5?jFaRtI~n64GuolVc_1td&ofcA5Lqu7`p!arDU! z=065Jx|BQvIL3{j*Y(cfF$oH1f)&kL(iF>5;%$XoOb&ZUC`s^E(kdn-@6&&zd8Ee< zmUM_oGg!Km=yz(LYC}W|nL=1*;u~Vn7CNzA8*!sZ)Hdc~Y+r}mGm;j*l#%Hv7UqH+ z50^*MDt3j~M`()1o+O9L)w?8U(1d7e1Up1PhW?ezNx;bJSET|aZUQ@@0w$bMY0bMq zndwT+TnouVpcBk_fm=>jIA!v$WAyU9MVRnFFl56?I}NcCU74IDW%BP)$m2uwZ(>cJ zlrymCXJp~z)D1Z^eK;PDk11ZWVCp`C>TgA=BI5$exDeBT3X$SPk1CNXlr zWO6>+!YBZWDl+B6R4;_ZNKA)AcBr!yzFfgXmi%wxPQ=Qdndda(k-0Ck_76eO`i^d= zpubT0DMuTo1~wA<5P>;USJHLaPO6D&3i?QSti3AJwe+2SW)@~9N-m}2+QPr~_C73m z&WcfyZD(W8k2i>0Zgk%}q5wgLF!sdowUldwS>NhtZ1Z$90aFDC6By%o4&* zV*J*s)}mB%&UGb2B!wmrOQRz+)A|uv*(BhHW*YzfxJJ=&A$MiBPPoynSEuGxU`)k-n_t* z$LOkrzE)TV_nQ)(V=Cl%T{Y!4P;_WsmqR*dMQ|*97AfV;ZSN2N#OVkz7UkPKNX=hf5}k=@U3-N33*q>RT>NSTE_1Ki z=()cre7Ln;*Xk`q51np-SRUfoBwBm*il~uNh%P)-zh4brG>qcVR&sF={hm>n&}cv* zrFLs?gjZ0<;}i4n=y`N?lTcL0VO(Rh={r`-bm5`?2y8Q{ne zSvNF`Wa&Fe%h;Rte0K;Qr;DEzMN=*cfjUep?r#OYR)^wN2hNTPZ+N7Qw5|$oc@us+ zc50g8cHpC)RMQ=%GNE`_%;6&CX%YmsF2-=RC6oNcrWO+6V+|r;BpG{|aRX7Vooh#$ zB`FZ3Rgv7$NjsG!cQ51cLPhgoRx0tRI{llHNnRR+QMl~TOCl~Y4-7|b00$R3x}KD@ zkU0in*CWg$g=(W35dpsJP#U@x9R#%Z3WI%CM-N1&b4=Qq|7zJSQ8UgF{MLpR9KllS z(Y-2c$RxiCtY)Y`GH2~WqcT&pKEyZum}lWbnGOAA>Q*H@f_k}ah8-2VuOsv+GsU@Wk_l-qe;!f;PSbcbOsoZLYH0@8kj8C$-2vg5&@Oq zIbF$F5EgHgE9^3CW2zaxI0-3IIBF)wx)y^+0#`?5A#%#kk#KA$BZOqUnaINxX~uow zgx2CerV(Fuhw2k^zMsPE$^Ky8c9wRwcXoS=J>{Fdd(C^@ zeEzYxTPQcE9s${EdC4zSm!OuiR_*n*J8P_g?ezz5KuL-HZDZ z)eXMWY|Cv3{-tf-Hmq&k3~>aAlJBZ*jBP|cKmh;$kXknkOiU<5j-XQ;=#`uI>8c6< z{51ghIsgD10`~Bu6G|rVKJwt+#S%0xGy=E3%=F;){YRbD5UBA`!I1)VD{#ULfH6Ub zMvt|)oaC$n0|)>Bs5JlqHe>(*0hcuZ05)U*04ETI-uuvW{6hlM^!)^O=~a=3}_xt}2U44k>M+ zC8ebR5C9YbReMN)D4NeEj-_9-5FV!`*6r{_uKT7MD($r=Gg^*a!18UE7Z{NBnZy|BnaXdK<1qSF7LF zeP3(bY1IwCpHl_^LLN&rxQKrfBBE7`|tiR(YR-k6{40tqy#*6y)6?`U*>!|wg9)0VoSbJr zouE55&g$VSN*U?w?E_O9G>37Qo}tdqvoV)-*d&@=4khBj<=UU#pBP@L769G#Vd zIpqZjos}MALM6Vn;Vve+>h>D*n`+zp=rV?Khw-=-6FoOP)2n!vkEZ9Ewlak2ri}Bs zmUHw6Pi4p>K+bN67AJL`%$+>YFT&X@DsFyn@5qU8&o0PT*I7xWsFp$NF3py9R%87x zC8a+MDsbkE{~dO;1-C?G>o{T}V$aVtI)E_7Mo^jeqb#^=XmqokY#8Ed*ls7;<|vua zP=OXru^iNKSW3Li$%iyBP}g+Mhpn%fpx3nY=VeWe#MffuvJILte=ZrGTQ5DD%jaiW zcTJ7z+_GlSHBh#=Uj&`;-Wl-)>M}`vGPsj%PtOO+wHg zpFPDg>AgOOM5D%nu}5#)_UoB5nxdUtmUOy!G=VtMdo_l`VWNe=;r+~R>-A~Q^4k0! zDzoaPhqf}>yLqvCJ!+NsaY>H2&QC(juqrumx1w>zCWhmp;~8O@W8 zY4%KbTmRM>K20p13>2HQijKWb`TGf6zPjVUj?-eT{kn>*il1L;A(pGhZ+t(|W5d#C zlwneJx@dPt*RHnl6?uz{y%wQj*tDFWlo<5s#t6p@m%aji^&P5l6XDYLQ-|v(-oZ~c zzeB&+erZ#D$eY#^)4|Aj7ZTaYj~Yj~GhIaHs<)5uk@Kq-#_NAimF9WA&$+a*wA`fe z_$mHL*mo|)!xMT!$B7+8)dn}XGfELNXV1|#)9LiGEZfpgxbRP;(`cwPRJxi?28x-G zMOlno*FQ<6@3i#v6rLW77`jJOr=-xX#p3Z@wC0yTO`{MV+(0I@^!Th&jRsFS-%@Gm zvy{3mMx81-{Z5?yKZ7kVoHI>G*H58wrO`IhclpGI>1j1ODpaZV=|#9@1p_(y71W*z z>_sx|IC-SWg&Un!f5Cq>r_-O-FDLZ+W|{p~ox$lB-LyL3R`qc7wxx>eDE`J?(JZ!< z4Lty6J-2>B@)dd46q*o3DWWV==}b^&8E_d}fYR#hQ zT#Fz9$4ScM3Gc0ME}gu;THhU!CB9%i^=;*)QV$P(TYQRm{zRDl1q)d`yNx!V!PQfN z9@(1UQB;~LWQqKaW^xsF&1S@}%*nLOLb6D=YH=FHA&$2+J6T^0+e!hd5rBRf1hQd9V!LY)xtzO zXm%fte{vu9-Sv%S6dH{GgH1>q&;xO$)z?Xynvi>q0jg$ryBMx+0Zp6m=|UYlWb+uZzi4YR=hBJ9>T2%igPxd}#%vq|eh7(A?`m{~)Ft`e`!OH5{N?ct$%30aBOl6k5ObgZ~) znN0~XxCp-<51xmg}OhuEe`jSm%+)eV>~d0HKVx=AWxu=iV%{U ztgUg5H4WjYZV_*MC4E#;uBJ{I{B?0AyD5lK0fPWw*IQ^P@B~!}oKV|qAnLJ(p&-w> z8!I$pucY@=T6|fk6@>s8EvVo{8iaJP)1NfdADV`7e4(zki?g;CmV#HVOs|^H0bm8Q zN2PL2CS_~Ng9cl72U^8Q;>B;tYeEC4Siy~R;xCj?efTZ*WVep?N6=ihT51z{=8st~ zVi+IoCI)M{pG0q+$bSNQEBJ?~Sipoj(65&!IW8CzIcnG~qs>4n>_Tj{2-IH`CwT0x z=nR&KR-`OBbbCNFW%bNlm&O#xb#wxOFl4|R(^TU1Sg1Jde~c@~#a;y~iUT(70j)LO zm3(Qg&tD#z4JhIn*$PngEyFd1fpt59SW_`UV5GX5@?h4lis*z?YGAemwKLig1WxCm zM;eCy4rB@9m62M%T5GD@^tF+!IuyS!BCbdYjr-W|Hu#Of|i{S(u&?ZS8_?|B=<#{GcpO%P;?2S0uzLeV)hHuXdWPy>P`=zHgI$1 zOY_X-tb)jxiWCfNUAd#si zrz5i;aHM-QcCn+W{s0dbQm8e*vlyFw@#Z>iWWxiH;g?gr3We+@)f%sW-eO4do6InQ zY-`-I(7~`FgBe&nhD{LRqUQRO2zG_+KPsRrJ|<)DoKhX^dpb@^h{AA}xNrIM7{RI`@0i|(mmrjjBO%!f4&0M)90*6$(nrz+!{fG} zXrEt2+4b?ph<$+SC9rA!P|o)|-dH84@@eq`ykRxNP;_bqmyLm!p1rlxKpk!2=uhq; zoK_JmvouVwqBAdUmRYEcNt*$t17!_&8H@t;)~Yo@`ZO~UqJ!BHW9fn61ZN29DLii7 zEN;CdRnq2;Hy3w}--(UKaDKvW-)%NUm4^>ZkeUo`_>#&CuVQR+NXI{6FrTdylT8@4 zcd(CEC7Lx$H1Y|WUheZxK)7i1cY7(`SXu%#kpdt32P=~~ZW}~5M=;(WPSZeFp)@)| z=tUo-WigwJKSa?8&vTe1VxykLsX2z&9Xjg1JZ~IwAWjFk*9=gai#ZDrE5Bfx3ha!7 zTF5s^E@QS#Omu9F6A)s!?FQHiH*Bp|zGZ6`rUn?~ERN7ug_)}BOoL>}+-K|v zDLJL-*;?~CrTEJq3OQOV`~^e=%5Ha!7dyv^V7oLNLqgDH%#e)l0B%|d$Rf#x;M6|9 z7go{kLZWC^YWvy9aScebK(6za22#5dSX#J=e$0g;6KhRZTyqVhiIkrN>bgXTmH1Q; z1b>k4qd^&N#CADd46n8d{L=uid?kXoFUx1t> zZ8y{<4lT%A-c5sC7eSZ6z>GJ%3-Fk`gnhypyN8?vdLv@5sBD+rQ^Rrm5uH{y5S|Cl z;iOY+Vqru%f~_~7xi=47o5xKw`p8NobH#8W!zP;{r*|azl5B za?L}KUc$wVT9%Sl$j*kujQ9l9Xv3C!6Oj1M4dqF3PFKV=hsJ4hzZx<(;bE15$b2GN z{@CHrcHN84Vl!e}NkC|?j;+_ zW1i#iY+4T-}UJ#I2o~@hBt3007!A4~I zhtC@8kQyrJt)|l z^BM-crK7pfGS?H{2X2=*(mEKAWKYn z+)^g5@R*p;C%vx!>I@x;81589d&*pRE@o}RsOd@gp^?61V_>!#^1L_~$UB>h0D2wZ zElaBh9IUP#{@VkqK8O%tyr}7cAr_{np1^m5lu8bufkHD_5D+64lofT!Tb`~9WcQuj z!gJYM*aRWe9~}hICHAS;a8f?l4v;!V98CXy|HO;^KqL|Gx~>O50z3O9@Br!B!qd}y z3UqxXV&Zq?Oq+CXJt1~Pc5(pi%YiYQT7Pm4ul3jlw-{OYy~9K!tgVRjt=>>}o(2Nb zo~(*BhSkJDuC6hZ(U5Eoby^Kr;OgUGaUaf+wtmi=!UgH zpY9e*R=}l6s%>qBs&*p!i7Mcd&BJEk0hR-s)#MB^)zNbIzNx*FMe?MkI_>%bY;VSv z`af?OXnfXAxUirr0&KFbn!nozd}pI%U0VUO+X4ij72nl z{D}Sgia|&E5XFM;pqU3VS;Id_15^l%TLHHo^$5@BE-+f_EWBC6UdV34tv$%dj1D$dFVK`E z5UD|L>3tAjgc0(D*W1>MWKk~O3=|_YL4c(Lz(DU@>k&gPBoEUVNVt*uQ$~L&Fmghp zcDqTaHi%hlhoNukWb<>f^irX~*-8d=$z+9V$i<%f z%Ju~W*0<&Cq(?Y*SE5S%w1{_QJW91xhO%8I$*nQ+l`QJB3Ypb+O4-#Iq*Xg7hAL$6 z<#N@vN@dJaenMQTAP;ekFJM+&C?%J2&?;WMAt{x(Q%1Cze*By*4MZ6p z%?gbn!o_P; zBU-TGQpOyE5N%vqri?f=rJ6DW)~-2*>X(ZvTVd>}hUYshf`Uvw#vHc+6$=oNg@t*g zwA%|365B^zF`>ai-ns{AP#VR`sM#$Y1ii=0?7{YGIWR9M{F2HOwL;cP#J!gu|4ji4 z2sU8x9o@`X@Qnyhlidq|>o|D&z5kEI!A+YaeHqA2#=!eiWxTa)xm%ogY?5f%g0^8n$A2zXtbO7EO<@Ho z1St3b(}(cKlTHf$QPY8te@OM8O8YGXh@41Kdw10BT6z(PSFc6f4<9s5zxlu z2BS%#hE-tTm?yZz0zk@CY|H z18yZq$bURNCCRXXUGi36x*e0Lp4f4t@1o0euRBYdz{&%IWuw!hOm*@^o;icAG)qPs zml6h6EfeBOy!+$DQtDhqjKSi=V3cV| z1SOl9i6;uf+r>FaPZ4fXW5!vGl!1MDxpVSyT=Yz(nRC(2_)_cmxXh7%2ILBjUNUX! z$1I+#nq`x-ae6YNpgY~A_!&IjK-jY`uXde_BIkFIJu{u&S=8>&zK+kFnOGW%@r(&j z*%r#Q!u|^53-&8W^l}*b%O?TDpjMzY6<}>*h)}C*EL={TvQDulK*QIAZ30IJR_dui z?A8Y9EQ6fTuK(j66yaPtf5(Ix?PKA%_g|V1$=KQWZ z4_b2y*Ac*@mD7Jibep^Y4_|&E#Ov-z`qOaX!*62a0szXqFC8#%i*`(vROvETT^u2Q zn?fzaO84MS_h3-AeK>L22POt*G?d;Z3pj^zvfMVPBG8d?v_p<-3o`0_L6aPMF{y%s z-6E4%Z%e6a6xzMjbPRaSKtc&qkPtlqBzTLkC)UIBl^U+ zL!ctG#nk?_Nn|S~jvK;slRLC6;av;q*ipHMCyDNL3PsH$%^n z^=W$zTtRyW3jv@SFijcY;=-e36&o@hEWzZTV#qD!*&x+GRFnpw#c_v=|9o;5fyn_P zJbMV?)e4YkuZ$%$=x(4B>x?M#4{9aj&+Q&9b8nyVBAna!elbpMmsJNH{?-T3)=Qgh z`;??@Qn<^Ba@7LEk(nGHQWioo@Zeej0JwTY_@w7z`#3=g_p}2L3kyoYv_i!laPWMq z<1~`yTTUm6XkJt0;iT^VWB;E`lLQVG-*bCm!6rjn#n=n#lq`CuT7H z)0z)4r#?&-LnoVbW{D?_XuArWHVsV3$BG_aYL%H(wWOBR)qfexI25oTV@}W(4&g@o z*A9;U;nLhOA}GU-C_&}NFOU2Yw7h$Omu|p-7lE&wSx)1ghT;KXP&9~rA(dG2X!(V8 zFVruTOAN>j+gFNBSGP|`lK2M@AYl^J1V|*Hzs8wW7D2UpSAczoNK(E_Mjvr{&6y<; z{>#U)gvzWM_L5&r2(+kwB3c}V(gMR>Siu+DBA}199nzVdONEO&-iJDMqd?Ncc@}C< zwhm8pWBPY5x4WP2-c%8kh7;iwc&(^ChBzH<{!&DmD9D_hQ;=xEvP5Uj*tX8twr$(C zZQHhO+qQkiwr$nhq{l6=^vT}8D#(6r-T?4-fUW*Y?X90M}Jqfbv>-btz z8*S@V&4J_wpz(84BBD*tshR1tz4>3MyAuQNadt$5;=yCrGw^`7YdpvLiKRvij1zsU z`S~WHE|A~OYlZg@Z$TU?Ao)jjA|+iyjHub^+au7ng$@a;Mz-%0+_VAKcv=SN=Xki8 z@Zsegn~FxFoxmZ7rbl9+m5p?-AO~jY>PGN$U1K}ne)yIC=H1w)!#S-%tvfYBTet`5 zJ;+667V8BJM^zzmy$VEP5OpR6>g^|9ccVKF32@;{fJqm+uP6*iy42i@L@qpB5k zfQXM7gEW~rRtB{+$PQ-fv9C1837Yh;IQCJ#u;U1eMprL-)u&Oudef$qZ_r?o_o5#> z1cPH}c+3)O{a%%SQ@>C!_VONkk9ximAql$|B1eqf2t#8S^Vq{>0I>l8No#FvN*Ay|z@M@d0bSV{j&-vAAux_#;^PUwhoAl!NWl8))0Em1+F6|1 z6KocHC(j~tCCSBM490zh_L@Onz;o063)hKuqzmpugH(`)B@NW>qlDA8#*Rg8wq}%@ z{De3jwq_PG?s?zF>1MXryhjv`XT4V_;|m-%FBDcNb~yiAQo|M`Z3Kb#HxV!`o?pxs zO@2S*B9bjyw-GSi25|#q`!LcWYft}Sd|?G{aAhK!Qm}zSBz$x-8`295LaT_Qtp24& zYMkd{ZW~Guvk5VM=m=qWp?Ns@@7$f|6!uN(q&gw{X+tLl+?8Z0#E%>z!Ni_Jp9hEo z@DOU^2k?9W2lod)xcG!2MJE#!4GM5wqHo{w5y#keApN0NhhLnh!;rk0x?;Kd4%qjPv9+)JTXH`#F9+9Ocs4G9FAbD-!Us4Fp_xsRsd;qv+ zIKTd*Gj{AQXGM9T5}$IQbb-=%P(7wMZl3=I9Oz~*`R>^^lSa+@3^WSaZ4H=&;O`Z& zR}THgIs_Wch>{4vkI^r70os2x0w^8%(AdatZ>m-1pd?}Gqz-1H#jggv23S~olon3x zy_=*V~e(x9hw1}<>JeaZG%y+ zJuqX31(-AB32?9_JZ13Y<>*jn5rFmL1KBSif_}yWeE^ro;47wwz$O3XdG&i~^8d&O zJ1mFy*+%F7^!r)zyBh~O8OFC3gF}GEOKpMoCAh@Zv-@H5`;>0_>v{-w@+NC6O6lI*NnxsND&yUtD(j+Ls_Z0kUdQ z^;-9G13P!bVGw+P>5rgw)g>JtNc+50GfrD^NrOsJwV z2%XcVP3Y;0^JfAY=~%z<1DLAzY9z`Z(+_LVhlX>O%zr&#&?hnPuS@Jiu}@--o-i+Y z=VP`?W@OH&PaN^C@lMhu{k-16ez`y_4A!W~h3XHTj3f~3XEjU`!BKTw7B6#KfPMn- zgulaO<={QXO8X$u`I{C#j_#W-LV)T80Y|UR`_=N%9{BkOO5fbrk&2MB=gS~EvKYua z0qRww5n-NM!W0EimF=PL`(B@;liA!(Cv5#?3!JEd02I$3v-X&fRi0lz7)FW~wNFj@ z=icS>B5y9V=)+}yBMqC`dSW4>7TB{un29iDac9EubAPyU_#Fl=+ATfVbzm9sojjmi z<_c69g4vIaKVvWFUi%twP?)jI#GbYAZHw8k7y{CqwHU%zSUe#&b@e*wyPc8H`z2Yg z?vjs??5VXrudZ^l^!vBscjwdbZF#S5YtJ(Rtzk7T9*~_7;+q)Bh9Qf&Y#)w}%OKPD z?&#DKi-@16pd4js5U%S0uXk1}+l)^^(7-bqbld@}(O|mt9(qVjP(7Nm0R6b`cRpSTVS6g@K@Loypq9xiz4)nrr}#Bkm{6BA`TlZjtCu@my64(jel3V zG^MvLro`zc=%FMNy@(X@DI3OweX_Cl&p7zT1527>5~t8 z!VOpv`IR%LFmFpHDj{QFkUQZvfYNn^!s4>#(FnWoFQ8#HoAdj(64kn7tSiyDg`Ika zuvTETMYYC_5njKiw0F6jEpHlo9lB);G zgXa%ZNvj!x3BP4Q3+=h&-aV&&KG8{AY<+#V#g8UxO{zo{NIL;uRRc$%Yc{_;bb_U>fh6-G9Qf;nO))&UC z5gIRxLThjmGfHaUeLJc=r{y3`*b1>YRiV*(JMb3BN+mcf*qum2Ddjk)Dp_@0+SWvw z0jCxV&Xmd`3V17ECy5rJF>X`5jJKDT^Vh&Fs^*Fl*VN#MZ``q|bR+nilvi!qL6ePPujdj>2Uxc^ zgwP8y5Tda>HFU+wJV<(MHjFB_r$#xg4fr!!ZGcP-wLiH`n?YTs}>78Y#K1;#aSC;b`!W*VCofr@N$DLC@8?F6!N)Xnr)YYX-5$| zZ)D}~uy49iZoBhHV{0c(2yuKTPKcq_Z)+PB6!4DXJy}ODH>x6B2?s|R@xhIHc|Z%Q zEcbl5C;XTpHNDFpe4l#HouvX>I4kfKf%=%P6m|U7|2ag9XH6cC<1Z>GPy^K6T7Zyg z;!#f37;D_yH%_FvxlX=tJ}1a&zsv8kAe?rUX=CFHTdpzfKS%Q2M7{pXC*OYMsU)rb z4!Qm*FqtioROvZwJ}-@tA&x@ugl@=Fqn>hJP&mLn-Wj$hftJ3r-B)C60;N5rMhxie z>_uu3y?PlNCed>WMA}LP>NZra#nz5itwj9b8uIttZH#@ohe;0a$M&U)9< zpRubtcXN7aRe{&?Mw5!`O*=VCWi^B{KXz<0*$pg3?5rO0{VvblQ4=WGO58%`$ICa1 zYUhBo26=1Srt3qS@kVU3q03i(lsPolZ5!u3?6>1^O+L&HJxWikrYYS763x~s@;Cy^bL;2{ zboh$#JHvJ2%SB?9|i9 zkt2S@pt$+ly%OQwz;!3G2X|!tW}BG?!c9BaeN-18YYkp!A-=CfsB^KwzkvTOoKR-V zXJ`baGI6x^g-tSLxjPAouD%7^9-IO8P^`WcO`0V&*cV%AWE@)EbnzG`9wqlA+%abn zY$(r;=casC>QkoFTstfzrBlye8pef-j37J=HG33S2G5Of^$x{~8`+_vg%$L}>e~4o zqEj!IAFqAcrg{;c>q+p2#}O!NQjg*?FMeItFWQ8WYl)g*7Y zNWAppkKAWaLCOlzaa#FvpojyY=i99Sd;3w@T}K8S!0Np;sba|6kkO<7c1*ABijmd6D8G0&j=hx8#i>RRjSQ~wnRw; zbtj@#0QcnYgA9H-SkDc!NJnW0I&M>vBfJA($5b800OLPcF#|%2U(+yl>&X#k*eHBY z60NAMA9NM$P~`ddP~mheWI9m0x`S&mV(0U5_*KKw=Afi-Z*!Dk{BS)##(6;uLp$?C z913wT4dEXSRJa$x=(PZqF97#Z;EosWgZ>Rmmgd7QS`(c2oN7IsBmean_u+74@}_YK zWnFqL7SzKTVs<5AGj~SMl+pc019fmZcm2JXbpS2~MZLo$ia(4*Dnd|54-qrT zz(f)WDFq#^F1|lwP9GjC9o9c1G-HZ!h>fX{GqL#3(%^>lt(0FGn95z z8Pnp1!q%4R8E)qWk+Ynr68-k7_OHgvx~Sl8Jt){5bO~mJ`PVDgU;tqo9e?gT)0j?~ z4K%liKICZ7Zup6SwSM|tYhaDj@v?XYYzHI*bKZ6p(T0A{V3kTY;mu$l(AcIg_DIzM zRmm%YJx;Q$7DHoK2pfaV}M#A-sT){Wg&mI__E2EA_^=r&r_;K@kt92z?VmU~Kw zNuZ_S;tBwVnH52R*9dY*CT)sv`t+Rxt1$`-Drl2f{aIvx}IOu z@FEDH-}R&@;X~F=Rrifp;T8q^Zqm`Xtb#Zmdlr*6H5T=mW*STWiAI61hNR00>J)&) zO7_d`SKFNKvAUoB4OqLk{*@29{Qy9^WXRdvU9X@d@~$muYQ|UaD0C*)iK$jShtUXm z=uN;}lJX!V?Y7U5GakYJqRs)djHHf$+u+)Yzy?81S&q4qmMR<0{u5L9sD3@}V#J-J z$ML-wm77KxX;Qsg)`?bq!6NRqe+)dkMVzzX622%S#bDu~Bijp!bmE91#rYj=pFx;P zzD2I`@)t}Q^9j*|2x53sObNz(dK+w-=A>gW{LMi%K8uhus(1P8&f@+F7~+`Q?jM8n zvq1z}ySYvjf=qaG6Kd#ytEYt?n3vTq!sKWa>_V}}L<*<p|TH-Ya97;MjARoMLR`Bo^Z4rwHBqbN%gNcLwt|l zaFF0WI%M2NLC;&H&~}NacbZ;%dyUd^7rij;TtJ zp6RPCsQ|Y4X^XP@YDFY5z^X<0{MxcV^D>n7Rd<=D22G92J>XqTRZ5~UzRn$FkQ4=o zKwb?BxTi|kbN-daS-F)NVoYsNEM*bJI%DKzK#Pw)Ea1wk%IdTXiyKpw?yo(hyh40K%p@NNn;Vgua1rI7GWz!>qH!c}U)Wy>$Bag{Y@Z+4r*IrEk@pH4+o57=zV+6QO0f zj`GgzVwHU=X!8+wM*C|Nn-5D4gJA1Iuid8)#(|;P^~!w{WP6=*zfHTJ$75p8RL2+S zcKgdItLN^n343r6kTTjL?-c0Ajq?|jum#ur@xdKo`UxmwtT0oOd5NEgyv_J(3;6D* znaK0~C5W~m)jzjgSGp4_;M4Qmt_9i@F(_)W`v#xL#m{cEBoQedQI0eUIInaS{p=5U zjsSNZJ`)k!&XO8Gm@#nJCqaZKNBNCI(FnHSovhhMcoZ>1%c(xV?K5K6BasO z1pBw3#FZ|nPF;Do+Ol>p3TxQY#76h!vTsLey*4vFs|ya6VoJG!xA`C@pM(d zjU)HyXT+Q)bq1G!d!*se)2^r-UkS^iQ$Tp?fKzGtM8L=bxubN$qeOFbwK{l@f$Kux zl&uu&Vag{EPUFxn$6)ioa(?&09nZFrsIP^uOn<_-w>u$hY&s*<$$O5wAFWn9t^JY>J-%rX#G^bxU8}7t#`a{v=PQ>YWqa*pe zF?sNjPfHt^N*JBmUrBP%26rLbaq`NZvA|s|qHwO(u2Fa?%|dgMDMz?sV`b{TH@9T; zh)xL|{jcp?&8a})Q$4``j+j_>7s)gWAj**X#fj3E3mTI@kJCM`>c_m+&*_1z#Z!?r zb{#fMp84uq(5%YtQ1lhZrO9cKYAf>ZVAEvJsJ*+#^KEr>-D=0~H-upEj!$T5umys^7C|brBwkhrWSf5XfVm%?Sbf>oz3YLolekgQV1-JE@dx8yF zx-1MKFTXoZHSwW0GFtrOqK@cFTUTsDf5X_Rd}9YDXKMgDUKHF2*a6U;|7+i;o)1^4 zb*CNQ6%bBd`8s5FUjI5Y&i~o!SD&i(!~Wr}e=4=w2Cb-j5(a%v00DT)fl0qUg^KT9 zYZ3!i!!LOWox-@l%-jQMjGQDYUAO9YRg+AXi)JdpQFNEiEEs^R1&$-|&l<h_@8O)+i%C7Mi^hc`e(i9p!a1@K$?pFTQWZW6L=tuT>Wt1IZ_lmK(4$Fsd~7` z&=l#f{xNK7B-7d8O-NC^ZEQ{r4Mq{ZKZ_J0fy@{CRD?^eo2SgH67tWdxNDl9M9&;I zW2@WlXPetXVc!B3TQ;{cG<-{ub0*dwhl{xD8hG^DDtsl0iQjOe*SQg=&BOA*ZGG^Y zhH>wEw#0>w>MgJ?-?vJNS%5At0IS-^BSxYN0Px=fiC*w_&qtLxCmlwD zR0tn_oB$2DaKBz1K@kyP+z8bfBmQ=&gA`E$KtUfsH~<8=D*&N&JqjSK0wBlu_4D=7P6Qxn>3!Ap^ul_uZF9rkd27qw zb^Q79D_ZpSSKoNn#E)#)aElTglernA)pUf&gl(Q z+~|J;FHAy1nt;T~}VJ-pQl7H+Iu zySMprPyV%il0vsjeVO}fg>L96O=C(`q83`gZqS+8Z$Wwo#kX`1G>;DO&+%l9Io3 zcD(B~b9UJBtQz^r)i!0DslT>#)%vY^R`MQzeeZtk9g&wAYHCO+f`Uu~B zJ#UkLefZEm!=0_{zGuvSfgR!IZiMcv@{a4`@P4AbhNY#2%u}Vg&qJ$q>Z6Weq79BN zrEsFRV1IfVtkh8}Y3zZr^4Z7I!{M^Ut5&mR+xyrSznEgUck3M3MxzTec4uS4#yloE zAqQUEt`$mGbtQO8NRcrxqyg324WDm71*$W?7@Mx3EMw z*iU_!pR+PPgwGn;xp85zKz{R{7q;pi$)qM+tlt(WRi!3&{U|d#vLzEZjbJ-Uydlds^J z3`5ipl!3`)OJ1&~Qn+$+@}0cJ!n<6NZ@P-12qcygHuy3I2u?sE^QOo0Gotjw=r_=J z6M8y$9dB`d$o-d6`!GTX&&kY@%};aU$;@%Of<&$_Z!d!2=1Y1!Yhi*lIrSeJUyv{6 zN}EL=1(BYeejE}RbL7~KSrHn~CeVUYtkF`CnDQ+VYASsKks->=z058TY!wP&pPm`& zp!$3$Dg&S&Kqhk4s!Nl>S5bOLKE0 zzl{Vv=VX1GST)f1nutCu8p-8m195p>K8v^{V&_P&b3>=XDng}-vwuSgbn*zX-vfe>e&J^hDwdC1yZ05>fw2H^w!~lwLe`l;UEOm%?%9$b3n>erDV0 zC05+Ge6Mv?KC^c24q?gN==tCs4py0Lsag^U9tz&@O}YMgV0>T2G=d=rY`ft-m6jIsd?S?<&Y-b{c{iwx0#mpURZ*U<_Iz6NI zrfG9Bcck)$ga;%mdB0D`y{$VA@V&eHM)4!-y2|)P_MU}D*`l8ue^4J59$~yUpnvYY z-1Kqjli@hLY*F0X5B%q{lKJKO0tAuy*?cD1}BL@|WH|k@F%eK-l^CUue{DCc3i|1zG zhxcPtb|z&)%FRK$1J@fx**Fw#<7yI?Jj;?T-P(xds(|@8E(Wgpu zGIE8J%BPhSa}QGH7t3YyQc@@Ib4#3M)7^8XIcHwh#MkNGtBS5;N~v@0i>F=E!;Eks zA;B0Qsmq&S>M}@{4yIY?ylg2ef4R&|Y9UkQUkq=<@vdh@Pj70ez&0o`8`Q+6BwfO4 zM3b98V~Si_HZOth+g3Pupw4L^JH*eY%+_g&5t?Llc=xRg0!I?=6prl%(#!oHCJWMT z(McaE73h>eh0~fSQ`6uf zgtIWHuTWu!753EGE>b7KG29+8@nd%mq9T&xzN&<7D=%E*;|4c!3KDTJtzqh%TubsW zDLZ*MXR(dX{mDnZz}bX#vAqpwC_-rRFxHMJuC|xEPYe$ss+E`D%iL&6GEbN1sp0+# z-2N0^UcPf^wtH^roOx4WXs5$^AhV)$#yno^{^<$+*H%X+jjm{@EIu6g=hlMASZFxh z&9nLDtW1>o6ptVrf9M#YbCTeT(pp4@HyCfAjQ-YP2i7rcgJke&2iqH_HK#>_ z3SJKVsG{qdDMmF8iy;$3%{^TI*5^&Qa zUO_xO$Cwm|8t|fe4f|h?!`i!v@55_i0g%&5ticAzCEBB{<%c?dDQ8xFP79 zp#D6NT3izGLPKcbnmMwR^zqoIA3z0N15SFFZQzgOJ4Zz7hw`37RuMht6!$3<=x3f# z(|}4*;9GgQN38d_eYtzqZJElLonUD}%G(4rdp7w<-j6FuI#X}Pe5UXKH^iX#5%u5sUMKUy z+6fd#M8*i7b=Km>&FiVOR=u<%N1}AtYi!VsCm1fDW^%=?cFl}ZVpNj^RvHN1DhtTY zDmfzZ0jYPfn^?F!a^29WR`V*h6j@-1jC^43bTDWSYz#BLzb48>nyxmFy?`a|sjZrX`gUnepsO&gW%?!K&$o(_ECQ-;f)zK+S@EAnQb}3(cW9O?;>4bYl)d3b4^QsQ5gRTh< zHq&V5Vxu&&7&>CJl#{~RpQP4_s(ul@5)KZ?tnm4SNd5f9&It@&PMTjF6@brLdbsGmsC-@!H_E|o;~xqa1RGyjn4u#B6jaD?MWybv)OhA6}$iS)0=_E22F zd&mC(WyT192`cHHY2pj8F%?MM%c~v<>t9ZPld$ugNFN1gBrP ztb`Ili8X7Dk)U=+))U>0${)*StyhFi^c0Pcp(OOo4+TTiOCIO9+N9!Gr?;^$I%d93U>sKnT%($5> zj+X76Nd(p(h5lZiv$V>ZTv8@ZVVyT5X$M+0rhJ?Z(mkL^8&Z`H;+g1F(@*R@+#380 zuDNRr;sm)ZCPXT>e5V9V_1EOF!S!=YE<|eaR8HLK-bdYowv1J_Xudd#t~$?jAH;GWn9amt1`P$=cC=59}RzA9=f&Pc*=>Zzuh% z@MEBlbcd59U>!%782use!%(52l!M&~7h0!O(w%P9gxbtrcJM#B`83`F5Q2H0E{z+X zy@S)JYcRh!Bt%*HtvZ?TX z;{8fs7S`QvJ(JcANBtQu{3S<^{joZU2UO!C@?CI*2!RL*aQYD>_PP_YXApP zI5*H?I0qNk?+u61q=hl&ioJ=1MX+PUJXQAfi?1GKxPk<-FE{P|m2@d2r_kD@Cnt7bX^=K;$U-66^jw7yY$);l_f&qOOX<_j z<9<;jB~4HgIhxWtB7TdS^tRYHXLPLKTN=fFey9a_?( z{4{TILz0?Z0RpvV?tX)=D+JX)GW|_DFgSb6lOO#8k(+}m5aJKe2ABH6y|-Ab>7_sx z*?DxzU5eO##&(}L6hyjkOUk}0;4Tz=b>zPg$tfe6y!d<=acHzrd;lk1Kwj!! z3+BUNt!}YsDSA6M&{Ot>iYN3}24@_@BCw9c8H|z125eiAf7le#>F~R-=&x^ z=>CNp=^g~!D)f%(=j~c#4!|`A8%6rMl%C-tM+tvRS5tUS8vcW;Q!b|7&O$r>IZ z;+WLXH(V-32$W}H1rg$u3oW#hl_bxQu#f%PsfHndT@e|=81-6XqmT_PH!yNsrYTDb z>hnvcMN&rFl?PRbva2aeYh3x$6%oSvMn|bT76+X+*$JlJ+zxjN)&}27y3yb`J;Hel zm*Z>cN*~2;qo#i#*;z8KuoGlm(2|yqCT)iJ>XmA@-phJjD{wz6My)OeRi1GB?v&=o ze3a813Gn9`q$zt;;Yn8uv+E8Dks82XHVSqU3-cVQ?ap+QAz$~?$P$0-S`Kh|q%W5) zw^~L z=vq#6mN~ZK4fKXm-!;9AWUO+loz@Tc?+$f@zbgEOI|L0QfzT$rfzlE}EHpKut>p5% z#bR#$QSdZ!)hbx&@K5iq4_pGv!;;w1c{s-iAG)3QG>0JP4v@Zdl18YF(g`5$Erl0` zwBwD`HaRB^36kl??$c?jJ1#3=xg}H6BB(l$M~7CRe$J5g=dkD-?s-k}6vaLU z3mSoelGs%$0Rr5XNNfT$sH3Kig{0IF0mqM9!LKne&>0;_&|>@$0Y+~;@Qb(8OYJ-? z(1&q&XT4O#-DOgD<2FE_^)I}_LX2B9aI9k{=UyFx$+m8$Ob?C1wSy@d!wjg|eRmAf zo6aO{=K0Wsx3Aa*TqMBvvyLt`UtG);v7vrMM%rT#e<0IRpC(@=f&77RgRzcnfX9S) zA*FyKtXblJT2an%GRid}Ck6qx`BH`PRTLa1)hC5eK#i7QJF z5GX!lVJaHe&|<>Pr*A}zs5ze9n+%3L@QZ1!1F zD|&^{p+`F1Xm#T$jM8LJHy*4Py8t_S0nW`ztMwZe?>o>QHAgrwq#|46QjjO+)HqJ;5^1Jnq-PD7-TS{GP_YiFhc%Pzzn;{1m!c6l>UPs&q%mDy zFZ%5d651%_DU8sJ#d@Ok;K!bXT}8%ol$_>tAc=rdL5cE~2UGb%+E_mCj*I-_3)o<-FR4bCcnJLNlCQkP@^oCSI@)^O9SzV=ZqK(Esm6W z5umalRo zmBflOpzxs^=?>x%rsXyOuZlEMYRW3nVZU-8bF51Oa;*yU7F;T#_^zfJz3q7+(DgR_EZjV! zM)xH`IF&ukalmb=g*HKXc=FFD0)9X-fWHZRIY)P*;XT+B1cV1mwWn%8G34> zLXr>tSYTPt_;=Aft;W<6Umc`%%7O%8lp!ViWIpdDu5X9>N6#fOe$FhPDLJe=tfDd^ z=4=pSg)m3NxaxuhEsbc-Rf{J`wgZZl#7WC(I=faV8!#I1-Sy5>SA>B-$JGPwLOB$_5*lqOy4b)ZoXs;U;17;UftBh?$wY?c9aoT;o1$o zTiP9tC-I>~-j3A6AcqUo2=4Z@YhV2~;v(f!E_PspdCF4HAf|(mnD~(FC=SGT!J=>n znpWspRo*sn8T9``{x0q%`pS|e$=voBb{q=sG*HWpc;3*Otqd9vp%M3hr$d#i@HlO> zQbD6x&O$|3WC}QP3l_VSkn7vFjI!}4Jn%c7uO!V@zSJaSPbf=$TO?AMC32oZ`jMP^ zGM=C!%?w<$^xwWc3C;N>;#gvqohH{m5cP-X7K$jvpA^rIT?tZS(P=Kla$;^m{-%A< zEm||a>`fuMfR)dLcnh}$+e*4$0Cjt-@B{(PQOx|Sw1ie~k(?>ZuYms%f7@WI%HWo3 zT8`r8_RS{`!s6-j3Gohl-xP(VkVOzjl7oT8~t0u4I79mq@CQ~nAK$N8enTDCt zfHg=e=y)ue=Ho2YvIqyc5fVV~OAiy7s$3abt3Ql`E18H)l{}4}0SZm$T0lg!pC})59Cn{X zqgMM77E}(D0Ojd2T%{fyO3(l)$iiW){_4P_#R}#sC1{Q3&}`nLuNGfZ6V=rep@a74_Zr6 zM`wa%$hU&_ffpW?Q1Qps$kv4=P&CNccYJ=s{qG7{yP!_2VxmjG6&n3ott#LA0%kws z+N^!-(6Z$4Si30Q3OcOIwMB>)TO&=4C`LY zL@hA^YV(W)&dC{7#EHkcvNj5hCT0z%QM=G(9?l8lreP&;l@eFG>PJO@fs$(>0~{L? zqYLcv12(MJ9&Iuldv<6M^Dh$?a@R!KiE)8Bg*P8zqQw~q^4XlA@T3Nik0d49;mA7V zRRoTTX|rO}OdnY$q>is9nzWvLoyqblFB1UXHJfa*3ev&iZ7$p`IYB}F;0HIHcMiaW z@_9k9jbu0Q%e!#ETtLew(r<_Rx2VBOg+4yhs4_Mxw)q z<{GhsQW$4*2K)e6EV1=b(kd^mJrRX_rV(t<%tTRs!rJ8CgmQy>hZ=T zA0V9aou6P^H`URddz!w{+g=|Hk~yXOAaEGdirBJ`%tYV_9Shr$4k&DaXv{?Ox>T%z z>~oQit;-AI6X;-48sTIr{{RqQGR9<_cy97vjBLMQfVXU2Umf zAwnx@NkW}QW=&<|9mwnwWctqB3Dn=sm`U{*Eu{Pjm{f;zM4Bkk1d`6#Uc^p?dWxb; z2r^4n5Rx275f4|)q41Tx#c7NBNfww|6u?AF+4`hrjS%>@FBlCJ8I9IDSNKw*T=D-< zmNV3Y3<7O4EbI5080{w~D;U!;Bjef(7sH_ExRbn>_-)~2JOt0@QfjvTG>91+Q&h-A zVA3A8oUmw+XjMa02Y8h{MZ7zaT9C!mhyQg%Obrg_Sc=iFP`8sZ#S?2ZXcM<}QOe?2 zsA)5r%*8J}C9(3FJ(^2o;wYqr+=d%5F##(ca}~serGtAU!4`AnKx|2_oI`>una0ym z`bQ~gqpP*P{bD8++gI`}*gBV8dmw1RVK8r4RCWL3xav9_{_rw#v8Ddr1KjP@5&l8% z>`(_4akzvPq_!k@K0UQknyy~DsTv*O!qA|GSb6I=G4J}o>uyu@E^=1W$8No5a7P1s z=W7aIzc4Gp;e7Ez?GUsSx!p~N$hhg?%w=^aMhX8Ca&p}d{|ODkS;FT zYW86uBHr6J|I#4tp~h2)G`Gk|nt2zTy%r@X(K|w~@LZs3iJ`llHmqyzUph?qhd-OX zjGL))3Co30WexLrdygSn0p$&?h5yH4mJM{l7&K0zco%8LgkI5Br=EP?qS!Fr=eF$KirM?o@A9^cj8e$`Y^3b3F#Qu| zS4cx~U}K1cL_#VAe*1JbZ*=-|l97viact(yfeiJP)HD?{*0%EJ@QaLpa(lxFd?93( z+pHDo<5mObwfxqSPfD}lJ7@zB_J+vl$JI%w#TpKuDr~f|>%RYdW*_5c%ocTMx$C9f zk26}I?+R~vjKCVq-kahFU$*|D4r7GF*4Ycwh4rP!-bAgACX+VPk!A-kqli11aIEAG zH8AMCseoe@A5v5UwnV4KJ)VhNJ}9uMu*POFrn40;>(}~X99H#6?I9-*i1OtINYUZm zv?ek)6r+_`BnHlFtD_03+sP76v;o1VDfR-OHvjKc|D zB;zLdyioZnjXve$=Jv!>NFx{SRH<6*h$YfzRWwk1mN=rit4I~L@u@VHzC zZK(t1jeJ>po1xWuA)aSXy=5p>%}nWO zekan;r&f96<#8)Z^{oa-NQPdSz_z)a_BW40M$G7XS%|=_#AXpK;(>#1R7qC*kP!Vt z$5wc+o_P%)Vg=qc8)RY$`psG{lU4fzaYD;to zCm!-oO@@Y(fw(zk$s%GI265SpG)Q->_5RiS_ikX#k`E-{16j}?Y0`s=R)?4>D~JG* zjDUk*5&r4Yobz$-ISle#{pRcST;3mT5rSDj{2+>DH$?F*x~Oa;vT6)1Lv%8f37khm z+}+Lv$6F*kxWc8E+ypz5Yj8#1bGsEWAJVZ4xm1N-L(2wR7H3gLJ4*hm6`C8LdK)C? z8m>^`Vr!M>49eUn_qY4tr73cc6%dx%v1q}nVTz$8mP>qj+$f-C8))unjlDq>7oD^Y zpF<61#nXx!7P9}VbZQ|%KW7(q%o?lgw3YgJ(7tE}I{ldi{qpZ`1% z$26uQemhi0=V4Fmb{j#rGW;ffPiMSW)35NFL<%yF;j2KwmJ%a@+iP#K12Z+KosYk< zPt6LQ1&YxC0ld@LO!B3hp~^mpOCNnE%!$@dAby@5vOzOmjL<9Uw*jPSTN3Qt zAKAc3GZsDubl;N=0~!l}P&K*+>I3#K86AkHknkSePjf#CN=8(|fewObBuA8`1YoIq z(&hSCaQ;yUb1(|LYfua9IEpQD3RL2X#^_VG1s8B2@#HB1yLAnDY+66ADMsMCHf@sw z=3v2~X=TYRaFS!^m;!Od7W%h}C{a}-rXS?&t*&Ib^eIrvbl~SM z%vG^fjmGz-*@apEp>5>1`*t=b;NP2QZVkZN7Y3i`aBPkg{f{1MM!w-1e>ULVTi@>w z)w~={*H*XM7#}`xdZq`_^a1ydmsa~IyZ^brrtb`I&^f>4O8>W8!XJg%?9IaAY|Dk{ zdK@pnlIa`w9TR`&AGCd0L-vm%TI;khIC7Zb&&*)s&VX~QlK;uSY$hD>vV`hN-<=|b zv{xM8se?dWwo?Kia;x2vti+RW@Yi*W=B^D|6_;J!6NK!rJ2$*Ihqf_Loy`+BI^wqF ztAtE(f8aA)%*m9=)@FN^s@`K_r$^DMt2BAge$y6FEEgydDT4$!>zEno7APyQaQ_K@ z%8R+|qcWt;@o zn+IS#ijSMenWB-s7#OWkz}GK5e4|p6qp&WFtcRIMY9=+CBB1$X<|p49S0J;Evxo8? z2`_m0B@<@qBvE^1$;%0s@F0GyZd#Ds73OvgONDFz4Z#4$uxeK1^|w5VVjm)uUy(@= z$oyLS(Bi;!TxZ6~5PBfAs@S4&=pA@DVgv1;#;g`}WGlTTQZO8D)}zTAr`nl?lP>ba zod@ar<@#oR`yh_ zC#{U(^|VF3kB5FQohuUF3^<*7FY(P+u!qr4z=~&WPxzk?QN%UPwPR;{qB{}w z+XzsWsq4y2ONp;oSg5vhTl^f>@r3OC3Bq%cChA(lUdY!Pk!y*L-4%Jle|7})EObIK zJepaCibaf$;tI&Xo)l6e`{5PB74gOy@)px}3>X*$LGNi?bdaXu%?4vyB$ik}_9s z!tt%tQIYYa?19?b54yPNM@rd0WwA3GvBK4(Ea4-MXf^(hP}RN+4_n=$9g4pyW)kt7 zKV_*In{3nKCO9`$|_=C^F-w_vwoEqXn| zW=4NB!Saz3T%#WlkTSj-iL&72LI9EN4LkweKW4vUkK=cTu0jXwzFQJ(GcRCaE%_)- zOownja74-S7JcEn7oFZ7{S2b9{C?`}h)Li_(oZORv=s*9sK1bYK%X0yP{T6)q#RY1 z7~u(OEIji@!@e>~ABlJ|fT>Aq$y!X5m%(vO$UM={i%!k!)zoWBuy`R*LuRioGDC z?dqE#@WXp#?X6|a8AkRY$?tuWXgnsKMS>X1GPX}2zcNL}>&KvfT-MmF@qYmog@IF@ zSwH*N==EEkvMuH`9un_8L8l%>D zPTsb6+adUe?1R=vVmYAsK*WeTK{G}MCOm0%5uLx?9#v)D(GWssB0UG7xCHx?M7=oB zOZ;tdiF>ViiFrks*sGie__Vv1>=LIX8D!F|nhoS2SIL z^uU~vJ}&YnTN&@-PWL;jtZ#UdMa=JaT+R*^R$hr}*uAh~{gER(%hDnG%U%R^@NY`8 z`=y$MPz62MNm*@N%WxA{c7uCWGyIDZqU`fDDWxdN;>ICP?I!!hDBU-*Qy}PQ6C8u< z2`nI2MWdEq2_*|nav_%P*`o@@9PZDKjG8S`iDqX9B>$*JBsaFvC+yK_jj=`Q-C9i% zvPt_HYYQu`WDI-UCllHmD>h!RIqXX3-Si+P01(QpGgbi>s}O2CeANMa=5AQ;MymUXigBA_p{?Bs)q~LPbcV%=F>&>9wh#ev9ucrYshxcRB z34HVr#zqCB3oA8uVE>;C`mw&SN+r8!Mp{i_w(`%%(}vj{3GVJT>XFVm(GmeHeMO^T3fyDc=%cSoGFY|Hb|#|8E(&) zle^2!WEacCpDv3bbPB86USGXk2*N16Md``qYyqW}tnA zEFWn0C+yi}OYUoE@)~l~z?;g!2Jd+bB0xH9f$AZm_QNU>4ZXEb#szc(6tmz*;eCM1 zU77xI_kTLSWq+L2X&4MKbu1b%J3JYYfIA5-ChL#B>)287RhtYBR)Qfry2vfED{;4G5^^AzAncl>iV z-^COz6MvE}=c=AH+Dsm_i8>(*S$+fazQ5--2$&6%ZbR`#E-Vt5JafO z75bA>(><5*bZAu|m}+fiG~gIqlLWhd9vk1wHx@oUx57M3{Da4DpdLGm7nmSmH{O&eR&2eoRQUsg8>0>~p}`TI&0x(fFNRp6`Ht5Y`=`24 z>r9b!CLhPZ))Gbeodk=FYH8bE>=B20eK-kT+{cKazsBC&%wKeP^k8Jg!S3o^ zIX!+oSfN;wgM@@FdNOnt$iThCB>Y`*o8zQT9yi+`UedZGoLfqR`LQhA-n_mWM=kHQ zCV`cmmEHGn%m=QG2sH_qZ)zf4TS8}NJu0pMwdY29Qey7ZPRJ9@iJTbpqKLZ0uO|vv zOS0VK#1gmk2<744>)!QkCvW;m$t{-KPCyzo019G=1x2l@HrQ31q>0E9txyJ{O&XuWQ3JO;vfTED!c%0c~V3mq@^= zSWSaiO-Nxgj*y$)mH*TvpZ)KCyCHWB-(iFQ8{d&qZ6Wz8O{6R;OGstZ2|=)-G%@(&Ua>C^-={a3eAcEX$K9x61w|M@egNqQ@`s)ks6`3DEQ3Oc>qpG$zDK zNjfJwtqo`7vouC}3>kNRjlrMi0e}BlZ%~&PwQrjYA^m>BDOmxtQT{+Ms-DxrA zo<)%M%Z@R9X_#$g-V$$A^2~|IG#8@g$(sSn{wT&yZUd2W!8rNhk`m=A#JNF|yseTl z2c~Qb1s3iMrl+7_t+|m1%Lnb6t+f%5$!m`%$TMWTo&l+533ywRQYggCtV>WvU8lBf zT`6b#0#BA=RqoVrmM(Ak7aZVnCgchVa`XsF`i8fWc{ExGkm5}y65jG)R)_+%((xq_ z69RB@A0aY0wqNJ_a{BXS;z^c+DYoaBnJE8ZDq9g2;LrQ!*~P3jBTK0{LEZHkN0!?X zS`B2g4Mf2NJu#oYSbD1I$-->F{pAubG z*1ea=++mgd;H4pTB$9h`cCuH6uhrk%tuZ-6OMR~X>i@gl|J0uFhYJd(Mmb8%FeCNU z1>r8Tn}%M|Q=CX-J9tkIaz>OB5k2EOBxB?u6iD=S(4hsdxSO)KLP4Tg2T)LABN8+} zSl&mVjLoIH85QYu;>4e2k#z?q(%uwvb`mJVt#a3KOY}K{*@P(P3>mqHR_U!>FVO)B z1Q=FxH+9o>b>C9$`L0ykxd`r>hDZ>ybf)ddf*2q_LhTQ!qmb6fl+)_gY2H+=m}71y zuZa-Hf=!;1a@Tm43f{G%QbR;znD&S39ZPf#NzBb+Bl-E+2rO^C9x^B)^wZt0RSw`l z(hQCtqBS$%F(Hvw`*dT;&y}EnH=l1RLDyJonx7s5{)mFK}tC4qU5zU zcv}&Ny_Mrz8d?Mtp_W2st*wrFZnKXphx1--ZqY0_z#_(kamw+>Ha(?20eV-uea3+I zDp;%fdIdKjBZL-2AXgd-fw*rgb=k!Ov$;jCLR&f8ngIC6N0#G6?bx9sdhrUBtpHnjoD{_v~dqx*zu? zC4>g{Ce+61NvnKxgT$nVmT9seCJe<!^<@IcV%P$3@6K?WA0(+r+xGT0FYH72wFoa@MUsTbaQ||5o>ee=~py zV-X~^L`obcPFh98{|PL7DH-+&$`mX}b+8wqKUSY60}0jV={zC5gk~?TWU6^ahY2nj zMRwJKcaf;rBKEa``o-?h10Fg0#t!F~!q|VyEOPWpaGQ;)I7^h_P1~h5=sn_%s2kdm zh13*gnltKL$huJxwm58EOxYpK-wks)4Q+RjgWfb8BMA$7wh2v_5LK3nyc8DkqF@}_ ze!ysYlZw|OEn#5_i$LFuO;j#y6NGJ2a(I%rTaJYO$0}JXs40^J0(vcZgP~@3=)b{g z*TP{pSN~ia{#sK3Yo^ijT=l2iPdZa-=}nLtlZwR?)ms&cJqU#LW%R};tItTDgjnj; zi;w%tH#E|~SR5^;(bASgY}q7qn}oYsAO>=Ufjg$SBlUVw;-N>ox1pV0lN27aUM;1~ zMVO-5DPlp<9}IyX4GHxuWFGLQkdR&V#Kwy%eIk`UHagwTW?wCxDa0dh8W+DQ2o#FZ z^Nf9YG<25fG&PZ&0^2LwLndDx3gq))xLa(muxR|G^W^c)pPif$d}7Cjg?}jw1AAI3 zjx?QLg(GzR+;2IWw?rOsQ%Q!dy+44P7POmQyy4k{WEB&rc@kff@4B)MKpG zy&1YVi~N-N}{J9771iw3`vEr-l za^8rHlW<8fYqdU~bWBVXH;;6Ot#?P$>`h`WznM$9sqN%0)Sxw`_DCj1-nD{Ps0+dL zHWDi>$v&r913cC*Bf@qi41D6v%UK}#c6RTXGl$gVWDA3+$~fqn`;syxF~H!vn5cOu z=2yUo<-ua1^tKK`vk*(=g(^!*a`vr--LxpC-DIzuK1{85(@S;b-wa)@+UdQyV@&!Z zRdG4UaR3^|?9t6^%WRSp z`|>kJT?WX_#gnnExyxP02H)nPOBZ~Cr4Rl4%Jjin@3OcGgn1D39)ASvdyQ2iJRYCEt~iL%--;=b_89Sw=I3s6H3SV zMzJ0d`5IC;*hg-ZkTiXVEaxrUon+zs?D2xaNT> zE7HIs|0671W?Viar=$`MUN|BCI$jeInU?;{sm5B_x-**TO__0eA*BnSSTuL>b4<^{ zmdVwTjiTxfIhcF|x1E_Z3jE?U4iXx;@Z|U$;|#YOwuGCBRFdw4z+mm&Of$)4GPhH} zp8T|dIY_DerYu(!YR3w2=#;c{r#0L9d4g_P*k#&17QCdSpWX}86+0+Q0wlZ+32Uav zHMu?RFwVy6rYgogybm&B(Q?qhrkknBb6N4nIa6@tK&v~DXQC*S**XOoIyqnVn*8D?XnZR}FWE)8N;X>^>M6>0lYrKjdMHg+5XeIy>fa zA1Cd(h6)5pwX8|Wrn=E7?wF^n)&E0YPu3?mJ4lK<-B(a%(p4^|Kcu2oweds=>qsGL zi(6FLp$}r+uNsv|ykh8;o-9)Fj1RL{C2p|)c0=`;^7zaV;F@#<>fAb(Fxq%BUcEV( znVawV%#^^*v2Z?;;K@N-n}vdSC`{v43G7AAzA|y&y2MR7Ys%2%%&ykzR7_PC7BQr{ zYiyiwLh10Yh1-{ww<$_B?30jtwuU>o?VK>c3_A#&)AZ*7<9WuOIcq9f3}je8?1|kS zS-2{mV@^{(tO7O%d6MA~J7ly6&jn(~&`Y}*(-OH2FHWLzGQg|DkgT`68c5T2yWhXv z#))>Pbj-=fyo5G`D|J1Vmrh9iWeA