diff --git a/platform/mellanox/hw-management/hwmgmt_nonup_patches b/platform/mellanox/hw-management/hwmgmt_nonup_patches new file mode 100644 index 0000000000..98c6161769 --- /dev/null +++ b/platform/mellanox/hw-management/hwmgmt_nonup_patches @@ -0,0 +1,63 @@ +# Current non-upstream patch list, should be updated by hwmgmt_kernel_patches.py script +0099-mlxsw-core_hwmon-Fix-variable-names-for-hwmon-attrib.patch +0100-mlxsw-core_thermal-Rename-labels-according-to-naming.patch +0101-mlxsw-core_thermal-Remove-obsolete-API-for-query-res.patch +0102-mlxsw-reg-Add-mgpir_-prefix-to-MGPIR-fields-comments.patch +0103-mlxsw-core-Remove-unnecessary-asserts.patch +0104-mlxsw-reg-Extend-MTMP-register-with-new-slot-number-.patch +0105-mlxsw-reg-Extend-MTBR-register-with-new-slot-number-.patch +0106-mlxsw-reg-Extend-MCIA-register-with-new-slot-number-.patch +0107-mlxsw-reg-Extend-MCION-register-with-new-slot-number.patch +0108-mlxsw-reg-Extend-PMMP-register-with-new-slot-number-.patch +0109-mlxsw-reg-Extend-MGPIR-register-with-new-slot-fields.patch +0110-mlxsw-core_env-Pass-slot-index-during-PMAOS-register.patch +0111-mlxsw-reg-Add-new-field-to-Management-General-Periph.patch +0112-mlxsw-core-Extend-interfaces-for-cable-info-access-w.patch +0113-mlxsw-core-Extend-port-module-data-structures-for-li.patch +0114-mlxsw-core-Move-port-module-events-enablement-to-a-s.patch +0115-mlxsw-core_hwmon-Split-gearbox-initialization.patch +0116-mlxsw-core_hwmon-Extend-internal-structures-to-suppo.patch +0117-mlxsw-core_hwmon-Introduce-slot-parameter-in-hwmon-i.patch +0118-mlxsw-core_hwmon-Extend-hwmon-device-with-gearbox-ma.patch +0119-mlxsw-core_thermal-Extend-internal-structures-to-sup.patch +0120-mlxsw-core_thermal-Split-gearbox-initialization.patch +0121-mlxsw-core_thermal-Extend-thermal-area-with-gearbox-.patch +0122-mlxsw-core_thermal-Add-line-card-id-prefix-to-line-c.patch +0123-mlxsw-core_thermal-Use-exact-name-of-cooling-devices.patch +0124-mlxsw-core_thermal-Use-common-define-for-thermal-zon.patch +0125-devlink-add-support-to-create-line-card-and-expose-t.patch +0126-devlink-implement-line-card-provisioning.patch +0127-devlink-implement-line-card-active-state.patch +0128-devlink-add-port-to-line-card-relationship-set.patch +0129-devlink-introduce-linecard-info-get-message.patch +0130-devlink-introduce-linecard-info-get-message.patch +0131-mlxsw-reg-Add-Ports-Mapping-event-Configuration-Regi.patch +0132-mlxsw-reg-Add-Management-DownStream-Device-Query-Reg.patch +0133-mlxsw-reg-Add-Management-DownStream-Device-Control-R.patch +0134-mlxsw-reg-Add-Management-Binary-Code-Transfer-Regist.patch +0135-mlxsw-core_linecards-Add-line-card-objects-and-imple.patch +0136-mlxsw-core_linecards-Implement-line-card-activation-.patch +0137-mlxsw-core-Extend-driver-ops-by-remove-selected-port.patch +0138-mlxsw-spectrum-Add-port-to-linecard-mapping.patch +0139-mlxsw-reg-Introduce-Management-Temperature-Extended-.patch +0140-mlxsw-core-Add-APIs-for-thermal-sensor-mapping.patch +0141-mlxsw-reg-Add-Management-DownStream-Device-Tunneling.patch +0142-mlxsw-core_linecards-Probe-devices-for-provisioned-l.patch +0143-mlxsw-core_linecards-Expose-device-FW-version-over-d.patch +0144-mlxsw-core-Introduce-flash-update-components.patch +0145-mlxfw-Get-the-PSID-value-using-op-instead-of-passing.patch +0146-mlxsw-core_linecards-Implement-line-card-device-flas.patch +0147-mlxsw-core_linecards-Introduce-ops-for-linecards-sta.patch +0148-mlxsw-core-Add-interfaces-for-line-card-initializati.patch +0149-mlxsw-core_thermal-Add-interfaces-for-line-card-init.patch +0150-mlxsw-core_hwmon-Add-interfaces-for-line-card-initia.patch +0151-mlxsw-minimal-Prepare-driver-for-modular-system-supp.patch +0152-mlxsw-core-Extend-bus-init-function-with-event-handl.patch +0153-mlxsw-i2c-Add-support-for-system-events-handling.patch +0154-mlxsw-core-Export-line-card-API.patch +0155-mlxsw-minimal-Add-system-event-handler.patch +0156-mlxsw-minimal-Add-interfaces-for-line-card-initializ.patch +0163-platform-mellanox-Introduce-support-for-rack-manager.patch +0176-platform-mellanox-fix-reset_pwr_converter_fail-attri.patch +0177-Documentation-ABI-fix-description-of-fix-reset_pwr_c.patch +0178-platform-mellanox-Introduce-support-for-next-generat.patch diff --git a/platform/mellanox/integration-scripts.mk b/platform/mellanox/integration-scripts.mk new file mode 100644 index 0000000000..9268880842 --- /dev/null +++ b/platform/mellanox/integration-scripts.mk @@ -0,0 +1,135 @@ +# +# Copyright (c) 2016-2022 NVIDIA CORPORATION & AFFILIATES. +# Apache-2.0 +# +# 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Mellanox Integration Scripts + +# override this for other branches +BRANCH_SONIC = master +# set this flag to y to create a branch instead of commit +CREATE_BRANCH = n + +TEMP_HW_MGMT_DIR = /tmp/hw_mgmt +PTCH_DIR = $(TEMP_HW_MGMT_DIR)/patch_dir/ +NON_UP_PTCH_DIR = $(TEMP_HW_MGMT_DIR)/non_up_patch_dir/ +PTCH_LIST = $(TEMP_HW_MGMT_DIR)/series +KCFG_LIST = $(TEMP_HW_MGMT_DIR)/kconfig +HWMGMT_NONUP_LIST = $(BUILD_WORKDIR)/$($(MLNX_HW_MANAGEMENT)_SRC_PATH)/hwmgmt_nonup_patches +HWMGMT_USER_OUTFILE = $(BUILD_WORKDIR)/integrate-mlnx-hw-mgmt_user.out +TMPFILE_OUT := $(shell mktemp) +SB_HEAD = $(shell git rev-parse --short HEAD) +SLK_HEAD = $(shell cd src/sonic-linux-kernel; git rev-parse --short HEAD) + +integrate-mlnx-hw-mgmt: + $(FLUSH_LOG) + rm -rf $(TEMP_HW_MGMT_DIR) $(TMPFILE_OUT) + mkdir -p $(PTCH_DIR) $(NON_UP_PTCH_DIR) + touch $(PTCH_LIST) $(KCFG_LIST) + + # clean up existing untracked files + pushd $(BUILD_WORKDIR); git clean -f -- platform/mellanox/ +ifeq ($(CREATE_BRANCH), y) + git checkout -B "$(BRANCH_SONIC)_$(SB_HEAD)_integrate_$(MLNX_HW_MANAGEMENT_VERSION)" HEAD + echo $(BRANCH_SONIC)_$(SB_HEAD)_integrate_$(MLNX_HW_MANAGEMENT_VERSION) branch created in sonic-buildimage +endif + popd + + pushd $(BUILD_WORKDIR)/src/sonic-linux-kernel; git clean -f -- patch/ +ifeq ($(CREATE_BRANCH), y) + git checkout -B "$(BRANCH_SONIC)_$(SLK_HEAD)_integrate_$(MLNX_HW_MANAGEMENT_VERSION)" HEAD + echo $(BRANCH_SONIC)_$(SLK_HEAD)_integrate_$(MLNX_HW_MANAGEMENT_VERSION) branch created in sonic-linux-kernel +endif + popd + + echo "#### Integrate HW-MGMT $(MLNX_HW_MANAGEMENT_VERSION) Kernel Patches into SONiC" > ${HWMGMT_USER_OUTFILE} + pushd $(BUILD_WORKDIR)/$(PLATFORM_PATH) $(LOG_SIMPLE) + + # Run tests + pushd integration-scripts/tests; pytest-3 -v; popd + + # Checkout to the corresponding hw-mgmt version and update mk file + pushd hw-management/hw-mgmt; git checkout V.${MLNX_HW_MANAGEMENT_VERSION}; popd + sed -i "s/\(^MLNX_HW_MANAGEMENT_VERSION = \).*/\1${MLNX_HW_MANAGEMENT_VERSION}/g" hw-management.mk + + # Pre-processing before runing hw_mgmt script + integration-scripts/hwmgmt_kernel_patches.py pre \ + --config_inclusion $(KCFG_LIST) \ + --build_root $(BUILD_WORKDIR) $(LOG_SIMPLE) + + $(BUILD_WORKDIR)/$($(MLNX_HW_MANAGEMENT)_SRC_PATH)/hw-mgmt/recipes-kernel/linux/deploy_kernel_patches.py \ + --dst_accepted_folder $(PTCH_DIR) \ + --dst_candidate_folder $(NON_UP_PTCH_DIR) \ + --series_file $(PTCH_LIST) \ + --config_file $(KCFG_LIST) \ + --kernel_version $(KERNEL_VERSION) \ + --os_type sonic $(LOG_SIMPLE) + + # Post-processing + integration-scripts/hwmgmt_kernel_patches.py post \ + --patches $(PTCH_DIR) \ + --non_up_patches $(NON_UP_PTCH_DIR) \ + --config_inclusion $(KCFG_LIST) \ + --series $(PTCH_LIST) \ + --current_non_up_patches $(HWMGMT_NONUP_LIST) \ + --build_root $(BUILD_WORKDIR) $(LOG_SIMPLE) + + # Commit the changes in linux kernel and and log the diff + pushd $(BUILD_WORKDIR)/src/sonic-linux-kernel + git add -- patch/ + + echo -en "\n###-> series file changes in sonic-linux-kernel <-###\n" >> ${HWMGMT_USER_OUTFILE} + git diff --no-color --staged -- patch/series >> ${HWMGMT_USER_OUTFILE} + + echo -en "\n###-> kconfig-inclusions file changes in sonic-linux-kernel <-###\n" >> ${HWMGMT_USER_OUTFILE} + git diff --no-color --staged -- patch/kconfig-inclusions >> ${HWMGMT_USER_OUTFILE} + + echo -en "\n###-> kconfig-exclusions file changes in sonic-linux-kernel <-###\n" >> ${HWMGMT_USER_OUTFILE} + git diff --no-color --staged -- patch/kconfig-exclusions >> ${HWMGMT_USER_OUTFILE} + + echo -en '\n###-> Summary of files updated in sonic-linux-kernel <-###\n' >> ${HWMGMT_USER_OUTFILE} + git diff --no-color --staged --stat --output=${TMPFILE_OUT} + cat ${TMPFILE_OUT} | tee -a ${HWMGMT_USER_OUTFILE} + + git diff --staged --quiet || git commit -m "Intgerate HW-MGMT ${MLNX_HW_MANAGEMENT_VERSION} Changes"; + popd + + # Commit the changes in buildimage and log the diff + pushd $(BUILD_WORKDIR) + git add -- $($(MLNX_HW_MANAGEMENT)_SRC_PATH) + git add -- $(PLATFORM_PATH)/non-upstream-patches/ + git add -- $(PLATFORM_PATH)/hw-management.mk + + echo -en '\n###-> Non Upstream series.patch changes <-###\n' >> ${HWMGMT_USER_OUTFILE} + git diff --no-color --staged -- $(PLATFORM_PATH)/non-upstream-patches/series.patch >> ${HWMGMT_USER_OUTFILE} + + echo -en '\n###-> Non Upstream patch list file <-###\n' >> ${HWMGMT_USER_OUTFILE} + git diff --no-color --staged -- $($(MLNX_HW_MANAGEMENT)_SRC_PATH)/hwmgmt_nonup_patches >> ${HWMGMT_USER_OUTFILE} + + echo -en '\n###-> hw-mgmt submodule update <-###\n' >> ${HWMGMT_USER_OUTFILE} + git diff --no-color --staged -- $($(MLNX_HW_MANAGEMENT)_SRC_PATH)/hw-mgmt >> ${HWMGMT_USER_OUTFILE} + + echo -en '\n###-> hw-management make file version change <-###\n' >> ${HWMGMT_USER_OUTFILE} + git diff --no-color --staged -- $(PLATFORM_PATH)/hw-management.mk >> ${HWMGMT_USER_OUTFILE} + + echo -en '\n###-> Summary of buildimage changes <-###\n' >> ${HWMGMT_USER_OUTFILE} + git diff --no-color --staged --stat --output=${TMPFILE_OUT} -- $(PLATFORM_PATH) + cat ${TMPFILE_OUT} | tee -a ${HWMGMT_USER_OUTFILE} + + git diff --staged --quiet || git commit -m "Intgerate HW-MGMT ${MLNX_HW_MANAGEMENT_VERSION} Changes"; + popd + + popd $(LOG_SIMPLE) + +SONIC_PHONY_TARGETS += integrate-mlnx-hw-mgmt diff --git a/platform/mellanox/integration-scripts/helper.py b/platform/mellanox/integration-scripts/helper.py new file mode 100644 index 0000000000..4c7587e516 --- /dev/null +++ b/platform/mellanox/integration-scripts/helper.py @@ -0,0 +1,171 @@ +import os +import glob +import re + +MARK_ID = "###->" +MLNX_KFG_MARKER = "mellanox" +HW_MGMT_MARKER = "mellanox_hw_mgmt" +SLK_PATCH_LOC = "src/sonic-linux-kernel/patch/" +SLK_KCONFIG = SLK_PATCH_LOC + "kconfig-inclusions" +SLK_KCONFIG_EXCLUDE = SLK_PATCH_LOC + "kconfig-exclusions" +SLK_SERIES = SLK_PATCH_LOC + "series" +NON_UP_PATCH_DIR = "platform/mellanox/non-upstream-patches/" +NON_UP_PATCH_LOC = NON_UP_PATCH_DIR + "patches" +NON_UP_PATCH_DIFF = NON_UP_PATCH_DIR + "series.patch" +KCFG_HDR_RE = "\[(.*)\]" + # kconfig_inclusion headers to consider +HDRS = ["common", "amd64"] + +class FileHandler: + + @staticmethod + def write_lines(path, lines, raw=False): + # Create the dir if it doesn't exist already + os.makedirs(os.path.dirname(path), exist_ok=True) + with open(path, 'w') as f: + for line in lines: + if raw: + f.write(f"{line}") + else: + f.write(f"{line}\n") + + @staticmethod + def read_raw(path): + # Read the data line by line into a list + data = [] + with open(path) as im: + data = im.readlines() + return data + + @staticmethod + def read_strip(path, as_string=False): + # Read the data line by line into a list and strip whitelines + data = FileHandler.read_raw(path) + data = [d.strip() for d in data] + if as_string: + return "\n".join(data) + return data + + @staticmethod + def read_strip_minimal(path, as_string=False, ignore_start_with="#"): + # Read the data line by line into a list, strip spaces and ignore comments + data = FileHandler.read_raw(path) + filtered_data = [] + for l in data: + l = l.strip() + if l and not l.startswith(ignore_start_with): + filtered_data.append(l) + if as_string: + return "\n".join(filtered_data) + return filtered_data + + @staticmethod + def read_dir(path, ext="*") -> list: + return [os.path.basename(f) for f in glob.glob(os.path.join(path, ext))] + + @staticmethod + def find_marker_indices(lines: list, marker=None) -> tuple: + i_start = -1 + i_end = len(lines) + # print("TEST", marker, lines) + if marker: + for index, line in enumerate(lines): + # assumes one unique marker per file + # if multiple marker sections are present, reads the first one + if line.strip().startswith(MARK_ID): + if marker+"-start" in line: + i_start = index + elif marker+"-end" in line: + i_end = index + # print(i_start, i_end) + return (i_start, i_end) + + @staticmethod + def read_kconfig_inclusion(path, marker=MLNX_KFG_MARKER): + lines = FileHandler.read_strip(path) + if not marker: + return lines + i_start, i_end = FileHandler.find_marker_indices(lines, marker) + + if i_start < 0 or i_end >= len(lines): + print("-> WARNING No Marker Found") + return [] + + return lines[i_start+1:i_end] + + @staticmethod + def write_lines_marker(path, writable_opts: list, marker=None): + # if marker is none, just write the opts into the file, + # otherwise write the data only b/w the marker + curr_data = FileHandler.read_raw(path) + i_start, i_end = FileHandler.find_marker_indices(curr_data, marker) + newline_writ_opts = [opt + "\n" for opt in writable_opts] + if i_start < 0 or i_end >= len(curr_data): + print("-> WARNING No Marker Found, writing data at the end of file") + curr_data.extend(["\n"]) + curr_data.extend(newline_writ_opts) + else: + curr_data = curr_data[0:i_start+1] + newline_writ_opts + curr_data[i_end:] + + print("-> INFO Written the following opts: \n{}".format("".join(FileHandler.read_raw(path)))) + FileHandler.write_lines(path, curr_data, True) + + @staticmethod + def read_kconfig_parser(path) -> dict: + # kconfig_inclusion output formatted to {"no_parent", "common":[,], "amd64": [,], "arm64": [,]} + lines = FileHandler.read_strip_minimal(path) + ret = dict({"no_parent":[]}) + curr_hdr = "" + for line in lines: + match = re.search(KCFG_HDR_RE, line) + if match: + curr_hdr = match.group(1) + ret[curr_hdr] = [] + elif curr_hdr in ret: + ret[curr_hdr].append(line) + else: + ret["no_parent"].append(line) + return ret + + +class KCFG: + + @staticmethod + def parse_opt_str(opt: str) -> tuple: + if not opt.startswith("CONFIG"): + print("-> DEBUG: Malformed kconfig opt, {}".format(opt)) + return () + + tmp = opt.split("=") + if len(tmp) != 2: + print("-> DEBUG: Malformed kconfig opt, {}".format(opt)) + return () + + return (tmp[0], tmp[1]) + + @staticmethod + def parse_opts_strs(kcfg_sec: list) -> list(tuple()): + opts = [] # list of tuples (CONFIG_*, "m|y|n") + for kcfg in kcfg_sec: + tmp = KCFG.parse_opt_str(kcfg) + if tmp: + opts.append(tmp) + return opts + + @staticmethod + def get_writable_opts(opts): + lines = [] + for opt in opts: + lines.append("{}={}".format(opt[0].upper(), opt[1])) + return lines + + +class Action(): + def __init__(self, args): + self.args = args + + def perform(self): + pass + + def write_user_out(self): + pass diff --git a/platform/mellanox/integration-scripts/hwmgmt_kernel_patches.py b/platform/mellanox/integration-scripts/hwmgmt_kernel_patches.py new file mode 100755 index 0000000000..bd7c1ac13e --- /dev/null +++ b/platform/mellanox/integration-scripts/hwmgmt_kernel_patches.py @@ -0,0 +1,324 @@ +#!/usr/bin/env python + +import os +import sys +import shutil +import argparse +import copy +import difflib + +from helper import * + +class Data: + # list of new upstream patches + new_up = list() + # list of new non-upstream patches + new_non_up = list() + # current series file raw data + old_series = list() + # current non-upstream patch list + old_non_up = list() + # New series file written by hw_mgmt integration script + new_series = list() + # List of new opts written by hw_mgmt integration script + updated_kcfg = list(tuple()) + # index of the mlnx_hw_mgmt patches start marker in old_series + i_mlnx_start = -1 + # index of the mlnx_hw_mgmt patches end marker in old_series + i_mlnx_end = -1 + # Updated sonic-linux-kernel/patch/series file contents + up_slk_series = list() + # SLK series file content updated with non-upstream patches, used to generate diff + agg_slk_series = list() + # Diff to be written into the series.patch file + agg_slk_series_diff = list() + # current kcfg opts + current_kcfg = list(tuple()) + # current raw kconfig exclude data + kcfg_exclude = list() + +class HwMgmtAction(Action): + + @staticmethod + def get(args): + action = None + if args.action.lower() == "pre": + action = PreProcess(args) + elif args.action.lower() == "post": + action = PostProcess(args) + + if not action.check(): + print("-> ERR: Argument Checks Failed") + sys.exit(1) + + return action + + def check(self): + if not self.args.config_inclusion: + print("-> ERR: config_inclusion is missing") + return False + + if not self.args.build_root: + print("-> ERR: build_root is missing") + return False + + if not os.path.isfile(self.args.config_inclusion): + print("-> ERR: config_inclusion {} doesn't exist".format(self.args.config_inclusion)) + return False + + if not os.path.exists(self.args.build_root): + print("-> ERR: Build Root {} doesn't exist".format(self.args.build_root)) + return False + + return True + +class PreProcess(HwMgmtAction): + def __init__(self, args): + super().__init__(args) + + def check(self): + return super(PreProcess, self).check() + + def perform(self): + """ Move MLNX Kconfig to the loc pointed by config_inclusion """ + kcfg_sec = FileHandler.read_kconfig_inclusion(os.path.join(self.args.build_root, SLK_KCONFIG)) + writable_opts = KCFG.get_writable_opts(KCFG.parse_opts_strs(kcfg_sec)) + FileHandler.write_lines(self.args.config_inclusion, writable_opts) + print("-> OPTS written to temp config_inclusion file: \n{}".format(FileHandler.read_strip(self.args.config_inclusion, True))) + +class PostProcess(HwMgmtAction): + def __init__(self, args): + super().__init__(args) + + def check(self): + if not super(PostProcess, self).check(): + return False + + if not (self.args.patches and os.path.exists(self.args.patches)): + print("-> ERR: upstream patch directory is missing ") + return False + + if not (self.args.non_up_patches and os.path.exists(self.args.non_up_patches)): + print("-> ERR: non upstream patch directory is missing") + return False + + if not (self.args.series and os.path.isfile(self.args.series)): + print("-> ERR: series file doesn't exist {}".format(self.args.series)) + return False + + if not (self.args.current_non_up_patches and os.path.exists(self.args.current_non_up_patches)): + print("-> ERR: current non_up_patches doesn't exist {}".format(self.args.current_non_up_patches)) + return False + + return True + + def read_data(self): + # Read the data written by hw-mgmt script into the internal Data Structures + Data.new_series = FileHandler.read_strip_minimal(self.args.series) + Data.old_series = FileHandler.read_raw(os.path.join(self.args.build_root, SLK_SERIES)) + Data.old_non_up = FileHandler.read_strip_minimal(self.args.current_non_up_patches) + + # Read the new kcfg + new_cfg = FileHandler.read_kconfig_inclusion(self.args.config_inclusion, None) + Data.updated_kcfg = KCFG.parse_opts_strs(new_cfg) + + # entire current config, [common] + [amd64] + all_kcfg = FileHandler.read_kconfig_parser(os.path.join(self.args.build_root, SLK_KCONFIG)) + Data.current_kcfg = [] + for hdr in HDRS: + Data.current_kcfg.extend(all_kcfg.get(hdr, [])) + Data.current_kcfg = KCFG.parse_opts_strs(Data.current_kcfg) + + Data.kcfg_exclude = FileHandler.read_raw(os.path.join(self.args.build_root, SLK_KCONFIG_EXCLUDE)) + + new_up = set(FileHandler.read_dir(self.args.patches, "*.patch")) + new_non_up = set(FileHandler.read_dir(self.args.non_up_patches, "*.patch")) + + for patch in Data.new_series: + if patch in new_up: + Data.new_up.append(patch) + elif patch in new_non_up: + Data.new_non_up.append(patch) + else: + print("-> FATAL: Patch {} not found either in upstream or non-upstream list".format(patch)) + if not self.args.is_test: + sys.exit(1) + + def find_mlnx_hw_mgmt_markers(self): + """ Find the indexes where the current mlnx patches sits in SLK_SERIES file """ + (Data.i_mlnx_start, Data.i_mlnx_end) = FileHandler.find_marker_indices(Data.old_series, marker=HW_MGMT_MARKER) + if Data.i_mlnx_start < 0 or Data.i_mlnx_end > len(Data.old_series): + print("-> FATAL mellanox_hw_mgmt markers not found. Couldn't continue.. exiting") + sys.exit() + + def rm_old_up_mlnx(self): + """ Delete the old mlnx upstream patches """ + print("\n -> POST: Removed the following upstream patches:") + index = Data.i_mlnx_start + while index <= Data.i_mlnx_end: + file_n = os.path.join(self.args.build_root, os.path.join(SLK_PATCH_LOC, Data.old_series[index].strip())) + if os.path.isfile(file_n): + print(Data.old_series[index].strip()) + os.remove(file_n) + index = index + 1 + + def mv_new_up_mlnx(self): + for patch in Data.new_up: + src_path = os.path.join(self.args.patches, patch) + shutil.copy(src_path, os.path.join(self.args.build_root, SLK_PATCH_LOC)) + + def write_final_slk_series(self): + tmp_new_up = [d+"\n" for d in Data.new_up] + Data.up_slk_series = Data.old_series[0:Data.i_mlnx_start+1] + tmp_new_up + Data.old_series[Data.i_mlnx_end:] + print("\n -> POST: Updated sonic-linux-kernel/series file: \n{}".format("".join(Data.up_slk_series))) + FileHandler.write_lines(os.path.join(self.args.build_root, SLK_SERIES), Data.up_slk_series, True) + + def rm_old_non_up_mlnx(self): + """ Remove the old non-upstream patches + """ + print("\n -> POST: Removed the following supposedly non-upstream patches:") + # Remove all the old patches and any patches that got accepted with this kernel version + for patch in Data.old_non_up + Data.new_up: + file_n = os.path.join(self.args.build_root, os.path.join(NON_UP_PATCH_LOC, patch)) + if os.path.isfile(file_n): + print(patch) + os.remove(file_n) + + # Make sure the dir is now empty as all these patches are of hw-mgmt + files = FileHandler.read_dir(os.path.join(self.args.build_root, NON_UP_PATCH_LOC), "*.patch") + if files: + # TODO: When there are SDK non-upstream patches, the logic has to be updated + print("\n -> FATAL: Patches Remaining in {}: \n{}".format(NON_UP_PATCH_LOC, files)) + sys.exit(1) + + def mv_new_non_up_mlnx(self): + for patch in Data.new_non_up: + src_path = os.path.join(self.args.non_up_patches, patch) + shutil.copy(src_path, os.path.join(self.args.build_root, NON_UP_PATCH_LOC)) + + def construct_series_with_non_up(self): + Data.agg_slk_series = copy.deepcopy(Data.up_slk_series) + lines = ["# Current non-upstream patch list, should be updated by hwmgmt_kernel_patches.py script"] + for index, patch in enumerate(Data.new_series): + patch = patch + "\n" + if patch not in Data.agg_slk_series: + if index == 0: + # if the first patch is a non-upstream patch, then use the marker as the prev index + prev_patch = Data.old_series[Data.i_mlnx_start] + else: + prev_patch = Data.new_series[index-1] + "\n" + if prev_patch not in Data.agg_slk_series: + print("\n -> FATAL: ERR: patch {} is not found in agg_slk_series list: \n {}".format(prev_patch, "".join(Data.agg_slk_series))) + sys.exit(1) + index_prev_patch = Data.agg_slk_series.index(prev_patch) + if index_prev_patch < len(Data.agg_slk_series) - 1: + Data.agg_slk_series = Data.agg_slk_series[0:index_prev_patch+1] + [patch] + Data.agg_slk_series[index_prev_patch + 1:] + else: + Data.agg_slk_series = Data.agg_slk_series + [patch] + print("\n -> INFO: patch {} added to agg_slk_series:".format(patch.strip())) + lines.append(patch.strip()) + + # Update the non_up_current_patch_list file + FileHandler.write_lines(self.args.current_non_up_patches, lines) + print("\n -> POST: series file updated with non-upstream patches \n{}".format("".join(Data.agg_slk_series))) + + def write_series_diff(self): + diff = difflib.unified_diff(Data.up_slk_series, Data.agg_slk_series, fromfile='a/patch/series', tofile="b/patch/series", lineterm="\n") + lines = [] + for line in diff: + lines.append(line) + print("\n -> POST: final series.diff \n{}".format("".join(lines))) + FileHandler.write_lines(os.path.join(self.args.build_root, NON_UP_PATCH_DIFF), lines, True) + + def check_kconfig_conflicts(self): + # current config under mellanox marker + old_mlnx_kcfg = FileHandler.read_kconfig_inclusion(os.path.join(self.args.build_root, SLK_KCONFIG)) + old_mlnx_kcfg = KCFG.parse_opts_strs(old_mlnx_kcfg) + + print("-> INFO: [common] + [amd64] Kconfig: \n{}".format("\n".join(KCFG.get_writable_opts(Data.current_kcfg)))) + print("-> INFO: current mellanox marker Kconfig: \n{}".format("\n".join(KCFG.get_writable_opts(old_mlnx_kcfg)))) + + # Filter the mellanox config from current config + conflict_prone = set(Data.current_kcfg) + for kcfg in old_mlnx_kcfg: + if kcfg in conflict_prone: + conflict_prone.remove(kcfg) + + print("-> INFO: conflict prone Kconfig: \n{}".format("\n".join(KCFG.get_writable_opts(list(conflict_prone))))) + print("-> INFO: updated kconfig for mellanox marker: \n{}".format("\n".join(KCFG.get_writable_opts(Data.updated_kcfg)))) + + # check for conflicts + has_conflict = False + for (cfg, val) in Data.updated_kcfg: + for (cfg_o, val_o) in conflict_prone: + if cfg == cfg_o and val != val_o: + print("-> ERR Conflict seen on the following kconfig: {}, old_opt: {}, new_opt: {}".format(cfg, val_o, val)) + has_conflict = True + return has_conflict + + def handle_exclusions(self): + new_lines = [] + curr_hdr = "" + for line_raw in Data.kcfg_exclude: + line = line_raw.strip() + should_exclude = False + if line: + match = re.search(KCFG_HDR_RE, line) + if match: + curr_hdr = match.group(1) + else: + for (kcfg, _) in Data.updated_kcfg: + if kcfg == line and curr_hdr in HDRS: + should_exclude = True + if not should_exclude: + new_lines.append(line_raw) + FileHandler.write_lines(os.path.join(self.args.build_root, SLK_KCONFIG_EXCLUDE), new_lines, True) + print("-> INFO: updated kconfig-exclusion: \n{}".format("".join(FileHandler.read_raw(os.path.join(self.args.build_root, SLK_KCONFIG_EXCLUDE))))) + + def perform(self): + """ Read the data output from the deploy_kernel_patches.py script + and move to appropriate locations """ + self.read_data() + self.find_mlnx_hw_mgmt_markers() + # Find and report conflicts in new kconfig + if self.check_kconfig_conflicts(): + print("-> FATAL Conflicts in kconfig-inclusion detected, exiting...") + sys.exit(1) + else: + # Write the new kcfg to the new file + path = os.path.join(self.args.build_root, SLK_KCONFIG) + FileHandler.write_lines_marker(path, KCFG.get_writable_opts(Data.updated_kcfg), MLNX_KFG_MARKER) + self.handle_exclusions() + # Handle Upstream patches + self.rm_old_up_mlnx() + self.mv_new_up_mlnx() + self.write_final_slk_series() + # Handle Non Upstream patches + self.rm_old_non_up_mlnx() + self.mv_new_non_up_mlnx() + self.construct_series_with_non_up() + self.write_series_diff() + + +def create_parser(): + # Create argument parser + parser = argparse.ArgumentParser() + + # Positional mandatory arguments + parser.add_argument("action", type=str, choices=["pre", "post"]) + + # Optional arguments + parser.add_argument("--patches", type=str) + parser.add_argument("--non_up_patches", type=str) + parser.add_argument("--config_inclusion", type=str) + parser.add_argument("--series", type=str) + parser.add_argument("--current_non_up_patches", type=str) + parser.add_argument("--build_root", type=str) + parser.add_argument("--is_test", action="store_true") + return parser + + +if __name__ == '__main__': + parser = create_parser() + action = HwMgmtAction.get(parser.parse_args()) + action.perform() diff --git a/platform/mellanox/integration-scripts/tests/data/expected_data/kconfig-exclusions b/platform/mellanox/integration-scripts/tests/data/expected_data/kconfig-exclusions new file mode 100644 index 0000000000..809120c015 --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/expected_data/kconfig-exclusions @@ -0,0 +1,23 @@ +[common] +# Unset STRICT_DEVMEM according to Broadcom's requirement and for CENTEC arm64 arch +CONFIG_STRICT_DEVMEM +# Unset classid and priority network cgroups due to conflict between cgroups v1 and v2 +CONFIG_CGROUP_NET_CLASSID +CONFIG_NET_CLS_CGROUP +CONFIG_NETFILTER_XT_MATCH_CGROUP +CONFIG_CGROUP_NET_PRIO + +[amd64] +# Unset X86_PAT according to Broadcom's requirement +CONFIG_X86_PAT +CONFIG_MLXSW_PCI +CONFIG_THERMAL_STATISTICS + +[arm64] + +[armhf] + +[marvell-armhf] +CONFIG_ARCH_VIRT +CONFIG_ARCH_BCM +CONFIG_ARCH_EXYNOS diff --git a/platform/mellanox/integration-scripts/tests/data/expected_data/kconfig-inclusions b/platform/mellanox/integration-scripts/tests/data/expected_data/kconfig-inclusions new file mode 100644 index 0000000000..9ff894f945 --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/expected_data/kconfig-inclusions @@ -0,0 +1,40 @@ +# Description: Add kconfig options that has to be included in the kernel +# Note: Markers should start with "###->" +# Header should end with .*-start eg: any_description-start +# Footer must end with .*-end eg: any_description-end +# Markers should not be nested + +[common] +CONFIG_LOG_BUF_SHIFT=20 + +[amd64] +# For Inventec d7032 +CONFIG_GPIO_ICH=m +# For mitac ly1200 +CONFIG_SENSORS_MAX31790=m +# For optoe +CONFIG_EEPROM_OPTOE=m + +###-> mellanox-start +CONFIG_SPI_PXA2XX=m +CONFIG_THERMAL_NETLINK=y +CONFIG_SENSORS_XDPE152=m +CONFIG_SENSORS_DRIVETEMP=m +CONFIG_SENSORS_IIO_HWMON=m +CONFIG_SENSORS_LM25066=m +CONFIG_SENSORS_UCD9000=m +CONFIG_SENSORS_UCD9200=m +CONFIG_THERMAL_OF=y +###-> mellanox-end + +# For Cisco 8000 +CONFIG_PHYLIB=m +CONFIG_GPIOLIB=y +CONFIG_OF_GPIO=y +CONFIG_OF=y +CONFIG_OF_MDIO=m + +[armhf] +CONFIG_EEPROM_SFF_8436=m +CONFIG_EEPROM_OPTOE=m +CONFIG_I2C_MUX_GPIO=m diff --git a/platform/mellanox/integration-scripts/tests/data/expected_data/series b/platform/mellanox/integration-scripts/tests/data/expected_data/series new file mode 100644 index 0000000000..96eea9dd09 --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/expected_data/series @@ -0,0 +1,76 @@ +# This series applies on GIT commit 18c5597832fcf6988111b05a9a1607ae148723c +# Note: Markers should start with "###->". +# Header should end with .*-start eg: any_description-start +# Footer must end with .*-end eg: any_description-end +# Markers should not be nested + +# Backport from 5.15 +0001-x86-platform-Increase-maximum-GPIO-number-for-X86_64.patch + +# Backport from 5.16 +0001-net-arp-introduce-arp_evict_nocarrier-sysctl-paramet.patch + +# Backport from 5.19 +0001-net-ipv6-Introduce-accept_unsolicited_na-knob-to-imp.patch +0002-net-ipv6-Expand-and-rename-accept_unsolicited_na-to-.patch + +# +# This series applies on GIT commit 1451b36b2b0d62178e42f648d8a18131af18f7d8 +# Tkernel-sched-core-fix-cgroup-fork-race.patch +# Tconfig-mlnx-sn2700.patch +# Tdriver-at24-fix-odd-length-two-byte-access.patch +# Tdriver-hwmon-lm75b-update.patch +# Tdriver-hwmon-pmbus-add-dps460-support.patch +# Tdriver-hwmon-pmbus-ucd9200-mlnx.patch +# Trtnetlink-catch-EOPNOTSUPP-errors.patch +# Tbridge-per-port-multicast-broadcast-flood-flags.patch +# + +# Mellanox patches for 5.10 +###-> mellanox_sdk-start +###-> mellanox_sdk-end + +###-> mellanox_hw_mgmt-start +0001-i2c-mlxcpld-Update-module-license.patch +0002-i2c-mlxcpld-Decrease-polling-time-for-performance-im.patch +0003-i2c-mlxcpld-Add-support-for-I2C-bus-frequency-settin.patch +0004-i2c-mux-mlxcpld-Update-module-license.patch +0005-i2c-mux-mlxcpld-Move-header-file-out-of-x86-realm.patch +0006-i2c-mux-mlxcpld-Convert-driver-to-platform-driver.patch +0007-i2c-mux-mlxcpld-Prepare-mux-selection-infrastructure.patch +0008-i2c-mux-mlxcpld-Get-rid-of-adapter-numbers-enforceme.patch +0009-i2c-mux-mlxcpld-Extend-driver-to-support-word-addres.patch +0010-i2c-mux-mlxcpld-Extend-supported-mux-number.patch +0011-i2c-mux-mlxcpld-Add-callback-to-notify-mux-creation-.patch +0099-mlxsw-core_hwmon-Fix-variable-names-for-hwmon-attrib.patch +0100-mlxsw-core_thermal-Rename-labels-according-to-naming.patch +0101-mlxsw-core_thermal-Remove-obsolete-API-for-query-res.patch +0102-mlxsw-reg-Add-mgpir_-prefix-to-MGPIR-fields-comments.patch +0103-mlxsw-core-Remove-unnecessary-asserts.patch +0104-mlxsw-reg-Extend-MTMP-register-with-new-slot-number-.patch +0105-mlxsw-reg-Extend-MTBR-register-with-new-slot-number-.patch +0106-mlxsw-reg-Extend-MCIA-register-with-new-slot-number-.patch +0107-mlxsw-reg-Extend-MCION-register-with-new-slot-number.patch +###-> mellanox_hw_mgmt-end + +# Cisco patches for 5.10 kernel +cisco-mtd-part.patch +cisco-mdio-mux-support-acpi.patch +cisco-x86-gpio-config.patch + +# sFlow + dropmon support +0001-psample-Encapsulate-packet-metadata-in-a-struct.patch +0002-psample-Add-additional-metadata-attributes.patch +0003-psample-define-the-macro-PSAMPLE_MD_EXTENDED_ATTR.patch + +# +# Marvell platform patches for 4.19 +armhf_secondary_boot_online.patch +# +# +############################################################ +# +# Internal patches will be added below (placeholder) +# Do not add any public patch below this marker +# +############################################################ diff --git a/platform/mellanox/integration-scripts/tests/data/expected_data/series.patch b/platform/mellanox/integration-scripts/tests/data/expected_data/series.patch new file mode 100644 index 0000000000..4a3a1a1bd8 --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/expected_data/series.patch @@ -0,0 +1,13 @@ +--- a/patch/series ++++ b/patch/series +@@ -51,6 +51,10 @@ + 0105-mlxsw-reg-Extend-MTBR-register-with-new-slot-number-.patch + 0106-mlxsw-reg-Extend-MCIA-register-with-new-slot-number-.patch + 0107-mlxsw-reg-Extend-MCION-register-with-new-slot-number.patch ++0168-TMP-mlxsw-minimal-Ignore-error-reading-SPAD-register.patch ++0169-TMP-mlxsw-i2c-Prevent-transaction-execution-for-spec.patch ++0172-DS-platform-mlx-platform-Add-SPI-path-for-rack-switc.patch ++0174-DS-mlxsw-core_linecards-Skip-devlink-and-provisionin.patch + ###-> mellanox_hw_mgmt-end + + # Cisco patches for 5.10 kernel diff --git a/platform/mellanox/integration-scripts/tests/data/hwmgmt_nonup_patches b/platform/mellanox/integration-scripts/tests/data/hwmgmt_nonup_patches new file mode 100644 index 0000000000..6b6ff8d79a --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/hwmgmt_nonup_patches @@ -0,0 +1,10 @@ +# Current non-upstream patch list, should be updated by integrate_kernel_patches.py script +0099-mlxsw-core_hwmon-Fix-variable-names-for-hwmon-attrib.patch +0100-mlxsw-core_thermal-Rename-labels-according-to-naming.patch +0101-mlxsw-core_thermal-Remove-obsolete-API-for-query-res.patch +0102-mlxsw-reg-Add-mgpir_-prefix-to-MGPIR-fields-comments.patch +0103-mlxsw-core-Remove-unnecessary-asserts.patch +0104-mlxsw-reg-Extend-MTMP-register-with-new-slot-number-.patch +0105-mlxsw-reg-Extend-MTBR-register-with-new-slot-number-.patch +0106-mlxsw-reg-Extend-MCIA-register-with-new-slot-number-.patch +0107-mlxsw-reg-Extend-MCION-register-with-new-slot-number.patch diff --git a/platform/mellanox/integration-scripts/tests/data/kconfig-exclusions b/platform/mellanox/integration-scripts/tests/data/kconfig-exclusions new file mode 100644 index 0000000000..3a930bffdc --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/kconfig-exclusions @@ -0,0 +1,24 @@ +[common] +# Unset STRICT_DEVMEM according to Broadcom's requirement and for CENTEC arm64 arch +CONFIG_STRICT_DEVMEM +# Unset classid and priority network cgroups due to conflict between cgroups v1 and v2 +CONFIG_CGROUP_NET_CLASSID +CONFIG_NET_CLS_CGROUP +CONFIG_NETFILTER_XT_MATCH_CGROUP +CONFIG_CGROUP_NET_PRIO + +[amd64] +# Unset X86_PAT according to Broadcom's requirement +CONFIG_SENSORS_UCD9200 +CONFIG_X86_PAT +CONFIG_MLXSW_PCI +CONFIG_THERMAL_STATISTICS + +[arm64] + +[armhf] + +[marvell-armhf] +CONFIG_ARCH_VIRT +CONFIG_ARCH_BCM +CONFIG_ARCH_EXYNOS diff --git a/platform/mellanox/integration-scripts/tests/data/kconfig-inclusions b/platform/mellanox/integration-scripts/tests/data/kconfig-inclusions new file mode 100644 index 0000000000..cb828fd258 --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/kconfig-inclusions @@ -0,0 +1,36 @@ +# Description: Add kconfig options that has to be included in the kernel +# Note: Markers should start with "###->" +# Header should end with .*-start eg: any_description-start +# Footer must end with .*-end eg: any_description-end +# Markers should not be nested + +[common] +CONFIG_LOG_BUF_SHIFT=20 + +[amd64] +# For Inventec d7032 +CONFIG_GPIO_ICH=m +# For mitac ly1200 +CONFIG_SENSORS_MAX31790=m +# For optoe +CONFIG_EEPROM_OPTOE=m + +###-> mellanox-start +CONFIG_OF=y +CONFIG_THERMAL_OF=y +CONFIG_CPU_THERMAL=y +CONFIG_PINCTRL_CANNONLAKE=m +CONFIG_PINCTRL_DENVERTON=m +###-> mellanox-end + +# For Cisco 8000 +CONFIG_PHYLIB=m +CONFIG_GPIOLIB=y +CONFIG_OF_GPIO=y +CONFIG_OF=y +CONFIG_OF_MDIO=m + +[armhf] +CONFIG_EEPROM_SFF_8436=m +CONFIG_EEPROM_OPTOE=m +CONFIG_I2C_MUX_GPIO=m diff --git a/platform/mellanox/integration-scripts/tests/data/new_kconfig b/platform/mellanox/integration-scripts/tests/data/new_kconfig new file mode 100644 index 0000000000..ba54e9876b --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/new_kconfig @@ -0,0 +1,12 @@ + +# New hw-mgmt 7.0020.5048 kernel config flags + +CONFIG_SPI_PXA2XX=m +CONFIG_THERMAL_NETLINK=y +CONFIG_SENSORS_XDPE152=m +CONFIG_SENSORS_DRIVETEMP=m +CONFIG_SENSORS_IIO_HWMON=m +CONFIG_SENSORS_LM25066=m +CONFIG_SENSORS_UCD9000=m +CONFIG_SENSORS_UCD9200=m +CONFIG_THERMAL_OF=y diff --git a/platform/mellanox/integration-scripts/tests/data/new_series b/platform/mellanox/integration-scripts/tests/data/new_series new file mode 100644 index 0000000000..c4343bd3e9 --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/new_series @@ -0,0 +1,27 @@ + +# Patches updated from hw-mgmt 7.0020.5048 + +0001-i2c-mlxcpld-Update-module-license.patch +0002-i2c-mlxcpld-Decrease-polling-time-for-performance-im.patch +0003-i2c-mlxcpld-Add-support-for-I2C-bus-frequency-settin.patch +0004-i2c-mux-mlxcpld-Update-module-license.patch +0005-i2c-mux-mlxcpld-Move-header-file-out-of-x86-realm.patch +0006-i2c-mux-mlxcpld-Convert-driver-to-platform-driver.patch +0007-i2c-mux-mlxcpld-Prepare-mux-selection-infrastructure.patch +0008-i2c-mux-mlxcpld-Get-rid-of-adapter-numbers-enforceme.patch +0009-i2c-mux-mlxcpld-Extend-driver-to-support-word-addres.patch +0010-i2c-mux-mlxcpld-Extend-supported-mux-number.patch +0011-i2c-mux-mlxcpld-Add-callback-to-notify-mux-creation-.patch +0099-mlxsw-core_hwmon-Fix-variable-names-for-hwmon-attrib.patch +0100-mlxsw-core_thermal-Rename-labels-according-to-naming.patch +0101-mlxsw-core_thermal-Remove-obsolete-API-for-query-res.patch +0102-mlxsw-reg-Add-mgpir_-prefix-to-MGPIR-fields-comments.patch +0103-mlxsw-core-Remove-unnecessary-asserts.patch +0104-mlxsw-reg-Extend-MTMP-register-with-new-slot-number-.patch +0105-mlxsw-reg-Extend-MTBR-register-with-new-slot-number-.patch +0106-mlxsw-reg-Extend-MCIA-register-with-new-slot-number-.patch +0107-mlxsw-reg-Extend-MCION-register-with-new-slot-number.patch +0168-TMP-mlxsw-minimal-Ignore-error-reading-SPAD-register.patch +0169-TMP-mlxsw-i2c-Prevent-transaction-execution-for-spec.patch +0172-DS-platform-mlx-platform-Add-SPI-path-for-rack-switc.patch +0174-DS-mlxsw-core_linecards-Skip-devlink-and-provisionin.patch diff --git a/platform/mellanox/integration-scripts/tests/data/series b/platform/mellanox/integration-scripts/tests/data/series new file mode 100755 index 0000000000..3130b7f175 --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/data/series @@ -0,0 +1,64 @@ +# This series applies on GIT commit 18c5597832fcf6988111b05a9a1607ae148723c +# Note: Markers should start with "###->". +# Header should end with .*-start eg: any_description-start +# Footer must end with .*-end eg: any_description-end +# Markers should not be nested + +# Backport from 5.15 +0001-x86-platform-Increase-maximum-GPIO-number-for-X86_64.patch + +# Backport from 5.16 +0001-net-arp-introduce-arp_evict_nocarrier-sysctl-paramet.patch + +# Backport from 5.19 +0001-net-ipv6-Introduce-accept_unsolicited_na-knob-to-imp.patch +0002-net-ipv6-Expand-and-rename-accept_unsolicited_na-to-.patch + +# +# This series applies on GIT commit 1451b36b2b0d62178e42f648d8a18131af18f7d8 +# Tkernel-sched-core-fix-cgroup-fork-race.patch +# Tconfig-mlnx-sn2700.patch +# Tdriver-at24-fix-odd-length-two-byte-access.patch +# Tdriver-hwmon-lm75b-update.patch +# Tdriver-hwmon-pmbus-add-dps460-support.patch +# Tdriver-hwmon-pmbus-ucd9200-mlnx.patch +# Trtnetlink-catch-EOPNOTSUPP-errors.patch +# Tbridge-per-port-multicast-broadcast-flood-flags.patch +# + +# Mellanox patches for 5.10 +###-> mellanox_sdk-start +###-> mellanox_sdk-end + +###-> mellanox_hw_mgmt-start +0001-i2c-mlxcpld-Update-module-license.patch +0002-i2c-mlxcpld-Decrease-polling-time-for-performan.patch +0003-i2c-mlxcpld-Add-support-for-I2C-bus-frequency-s.patch +0004-i2c-mux-mlxcpld-Update-module-license.patch +0005-i2c-mux-mlxcpld-Move-header-file-out-of-x86-rea.patch +0006-i2c-mux-mlxcpld-Convert-driver-to-platform-driv.patch +0007-i2c-mux-mlxcpld-Prepare-mux-selection-infrastru.patch +0008-i2c-mux-mlxcpld-Get-rid-of-adapter-numbers-enfo.patch +###-> mellanox_hw_mgmt-end + +# Cisco patches for 5.10 kernel +cisco-mtd-part.patch +cisco-mdio-mux-support-acpi.patch +cisco-x86-gpio-config.patch + +# sFlow + dropmon support +0001-psample-Encapsulate-packet-metadata-in-a-struct.patch +0002-psample-Add-additional-metadata-attributes.patch +0003-psample-define-the-macro-PSAMPLE_MD_EXTENDED_ATTR.patch + +# +# Marvell platform patches for 4.19 +armhf_secondary_boot_online.patch +# +# +############################################################ +# +# Internal patches will be added below (placeholder) +# Do not add any public patch below this marker +# +############################################################ diff --git a/platform/mellanox/integration-scripts/tests/test_filehandler.py b/platform/mellanox/integration-scripts/tests/test_filehandler.py new file mode 100644 index 0000000000..8b7c39ae13 --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/test_filehandler.py @@ -0,0 +1,159 @@ +import sys +from unittest import mock +sys.path.append('../') +from helper import * + +MOCK_SLK_SERIES = """\ +# Trtnetlink-catch-EOPNOTSUPP-errors.patch +# Tbridge-per-port-multicast-broadcast-flood-flags.patch +# + +# Mellanox patches for 5.10 +###-> mellanox_sdk-start +###-> mellanox_sdk-end + +###-> mellanox_hw_mgmt-start +0001-i2c-mlxcpld-Update-module-license.patch +0002-i2c-mlxcpld-Decrease-polling-time-for-performan.patch +0003-i2c-mlxcpld-Add-support-for-I2C-bus-frequency-s.patch +0004-i2c-mux-mlxcpld-Update-module-license.patch +###-> mellanox_hw_mgmt-end +""" + +MOCK_SLK_KCFG = """\ +CONFIG_RANDOM=rrr + +[common] +CONFIG_LOG_BUF_SHIFT=20 + +[amd64] +CONFIG_SENSORS_DPS1900=m + +###-> mellanox-start +CONFIG_OF=y +CONFIG_THERMAL_OF=y +CONFIG_DW_DMAC_PCI=y +###-> mellanox-end + +[armhf] +CONFIG_EEPROM_SFF_8436=m +CONFIG_EEPROM_OPTOE=m +CONFIG_I2C_MUX_GPIO=y +""" + +UPDATED_MLNX_KCFG = """\ +CONFIG_OF=y +CONFIG_THERMAL_OF=y +CONFIG_DW_DMAC_PCI=y +CONFIG_I2C_I801=m +CONFIG_PINCTRL=y +CONFIG_PINCTRL_INTEL=m +CONFIG_I2C_MUX_PCA954X=m +CONFIG_SPI_PXA2XX=m +""" + +FINAL_MOCK_SLK_KCFG = """\ +CONFIG_RANDOM=rrr + +[common] +CONFIG_LOG_BUF_SHIFT=20 + +[amd64] +CONFIG_SENSORS_DPS1900=m + +###-> mellanox-start +CONFIG_OF=y +CONFIG_THERMAL_OF=y +CONFIG_DW_DMAC_PCI=y +CONFIG_I2C_I801=m +CONFIG_PINCTRL=y +CONFIG_PINCTRL_INTEL=m +CONFIG_I2C_MUX_PCA954X=m +CONFIG_SPI_PXA2XX=m +###-> mellanox-end + +[armhf] +CONFIG_EEPROM_SFF_8436=m +CONFIG_EEPROM_OPTOE=m +CONFIG_I2C_MUX_GPIO=y +""" + +LINES_WRITE = [] +LINES_READ = [] + +def writer_mock(path, lines, raw=False): + global LINES_WRITE + if raw: + join_with = "" + else: + join_with = "\n" + print("Expected: ") + print(join_with.join(LINES_WRITE)) + print("Recieved:") + print(join_with.join(lines)) + assert LINES_WRITE == lines + +def read_raw_mock(path): + global LINES_READ + return LINES_READ + +class TestFilehandler: + def test_find_markers(self): + lines = MOCK_SLK_SERIES.split("\n") + print(lines) + i_start, i_end = FileHandler.find_marker_indices(lines, "mellanox_hw_mgmt") + print(i_start, i_end) + assert lines[i_start] == "###-> mellanox_hw_mgmt-start" + assert lines[i_end] == "###-> mellanox_hw_mgmt-end" + + i_start, i_end = FileHandler.find_marker_indices(lines, "mellanox_sdk") + print(i_start, i_end) + assert lines[i_start] == "###-> mellanox_sdk-start" + assert lines[i_end] == "###-> mellanox_sdk-end" + + i_start, i_end = FileHandler.find_marker_indices(lines, "whatevrr") + print(i_start, i_end) + assert i_start == -1 + assert i_end == len(lines) + + i_start, i_end = FileHandler.find_marker_indices(lines) + print(i_start, i_end) + assert i_start == -1 + assert i_end == len(lines) + + @mock.patch('helper.FileHandler.read_raw', side_effect=read_raw_mock) + def test_read_kconfig_parser(self, mock_read_raw): + global LINES_READ + LINES_READ = MOCK_SLK_KCFG.split("\n") + all_cfg = FileHandler.read_kconfig_parser("") + print(all_cfg) + assert all_cfg['no_parent'] == ['CONFIG_RANDOM=rrr'] + assert all_cfg['common'] == ['CONFIG_LOG_BUF_SHIFT=20'] + assert all_cfg['amd64'] == ['CONFIG_SENSORS_DPS1900=m', 'CONFIG_OF=y', 'CONFIG_THERMAL_OF=y', 'CONFIG_DW_DMAC_PCI=y'] + assert all_cfg['armhf'] == ['CONFIG_EEPROM_SFF_8436=m', 'CONFIG_EEPROM_OPTOE=m', 'CONFIG_I2C_MUX_GPIO=y'] + + @mock.patch('helper.FileHandler.write_lines', side_effect=writer_mock) + @mock.patch('helper.FileHandler.read_raw', side_effect=read_raw_mock) + def test_write_lines_marker(self, mock_read_raw, mock_write_lines_marker): + global LINES_READ + global LINES_WRITE + LINES_READ = MOCK_SLK_KCFG.splitlines(True) + LINES_WRITE = FINAL_MOCK_SLK_KCFG.splitlines(True) + + list_opts = KCFG.parse_opts_strs(UPDATED_MLNX_KCFG.split("\n")) + writable_opts = KCFG.get_writable_opts(list_opts) + + FileHandler.write_lines_marker("", writable_opts, marker="mellanox") + + @mock.patch('helper.FileHandler.write_lines', side_effect=writer_mock) + @mock.patch('helper.FileHandler.read_raw', side_effect=read_raw_mock) + def test_read_kconfig_inclusion(self, mock_read_raw, mock_write_lines_marker): + global LINES_READ + LINES_READ = FINAL_MOCK_SLK_KCFG.splitlines(True) + opts = FileHandler.read_kconfig_inclusion("") + + global LINES_WRITE + LINES_WRITE = UPDATED_MLNX_KCFG.splitlines() + writable_opts = KCFG.get_writable_opts(KCFG.parse_opts_strs(opts)) + print(writable_opts) + FileHandler.write_lines("", writable_opts) diff --git a/platform/mellanox/integration-scripts/tests/test_hwmgmtaction.py b/platform/mellanox/integration-scripts/tests/test_hwmgmtaction.py new file mode 100644 index 0000000000..6dd71ee0e2 --- /dev/null +++ b/platform/mellanox/integration-scripts/tests/test_hwmgmtaction.py @@ -0,0 +1,144 @@ +import sys +import shutil +from unittest import mock, TestCase +sys.path.append('../') +from hwmgmt_kernel_patches import * + +NEW_NONUP_LIST = """ \ +0168-TMP-mlxsw-minimal-Ignore-error-reading-SPAD-register.patch +0169-TMP-mlxsw-i2c-Prevent-transaction-execution-for-spec.patch +0172-DS-platform-mlx-platform-Add-SPI-path-for-rack-switc.patch +0174-DS-mlxsw-core_linecards-Skip-devlink-and-provisionin.patch +""" + +NEW_UP_LIST = """\ +0001-i2c-mlxcpld-Update-module-license.patch +0002-i2c-mlxcpld-Decrease-polling-time-for-performance-im.patch +0003-i2c-mlxcpld-Add-support-for-I2C-bus-frequency-settin.patch +0004-i2c-mux-mlxcpld-Update-module-license.patch +0005-i2c-mux-mlxcpld-Move-header-file-out-of-x86-realm.patch +0006-i2c-mux-mlxcpld-Convert-driver-to-platform-driver.patch +0007-i2c-mux-mlxcpld-Prepare-mux-selection-infrastructure.patch +0008-i2c-mux-mlxcpld-Get-rid-of-adapter-numbers-enforceme.patch +0009-i2c-mux-mlxcpld-Extend-driver-to-support-word-addres.patch +0010-i2c-mux-mlxcpld-Extend-supported-mux-number.patch +0011-i2c-mux-mlxcpld-Add-callback-to-notify-mux-creation-.patch +0099-mlxsw-core_hwmon-Fix-variable-names-for-hwmon-attrib.patch +0100-mlxsw-core_thermal-Rename-labels-according-to-naming.patch +0101-mlxsw-core_thermal-Remove-obsolete-API-for-query-res.patch +0102-mlxsw-reg-Add-mgpir_-prefix-to-MGPIR-fields-comments.patch +0103-mlxsw-core-Remove-unnecessary-asserts.patch +0104-mlxsw-reg-Extend-MTMP-register-with-new-slot-number-.patch +0105-mlxsw-reg-Extend-MTBR-register-with-new-slot-number-.patch +0106-mlxsw-reg-Extend-MCIA-register-with-new-slot-number-.patch +0107-mlxsw-reg-Extend-MCION-register-with-new-slot-number.patch +""" + +REL_INPUTS_DIR = "platform/mellanox/integration-scripts/tests/data/" +MOCK_INPUTS_DIR = "/sonic/" + REL_INPUTS_DIR +MOCK_WRITE_FILE = MOCK_INPUTS_DIR + "test_writer_file.out" + +def write_lines_mock(path, lines, raw=False): + # Create the dir if it doesn't exist already + with open(MOCK_WRITE_FILE, 'w') as f: + for line in lines: + if raw: + f.write(f"{line}") + else: + f.write(f"{line}\n") + +def mock_hwmgmt_args(): + with mock.patch("sys.argv", ["hwmgmt_kernel_patches.py", "post", + "--patches", "/tmp", + "--non_up_patches", "/tmp", + "--config_inclusion", MOCK_INPUTS_DIR+"/new_kconfig", + "--series", MOCK_INPUTS_DIR+"/new_series", + "--current_non_up_patches", MOCK_INPUTS_DIR+"/hwmgmt_nonup_patches", + "--build_root", "/sonic", + "--is_test"]): + parser = create_parser() + return parser.parse_args() + +def check_file_content(path): + list1 = FileHandler.read_raw(MOCK_WRITE_FILE) + list2 = FileHandler.read_raw(path) + for i in range(0, len(list1)): + if list1[i] != list2[i]: + print("--- {}\n--- {}".format(list1[i], list2[i])) + return False + return True + +@mock.patch('helper.SLK_PATCH_LOC', REL_INPUTS_DIR) +@mock.patch('helper.SLK_SERIES', REL_INPUTS_DIR+"series") +@mock.patch('helper.SLK_KCONFIG', REL_INPUTS_DIR+"kconfig-inclusion") +class TestHwMgmtPostAction(TestCase): + def setUp(self): + self.action = HwMgmtAction.get(mock_hwmgmt_args()) + self.action.read_data() + # Populate the new_up, new_non_up list + Data.new_up = NEW_UP_LIST.splitlines() + Data.new_non_up = NEW_NONUP_LIST.splitlines() + Data.old_series = FileHandler.read_raw(MOCK_INPUTS_DIR+"/series") + all_kcfg = FileHandler.read_kconfig_parser(MOCK_INPUTS_DIR+"/kconfig-inclusions") + Data.current_kcfg = [] + for hdr in HDRS: + Data.current_kcfg.extend(all_kcfg.get(hdr, [])) + Data.current_kcfg = KCFG.parse_opts_strs(Data.current_kcfg) + Data.kcfg_exclude = FileHandler.read_raw(MOCK_INPUTS_DIR+"/kconfig-exclusions") + + def tearDown(self): + try: + os.remove(MOCK_WRITE_FILE) + except: + pass + + def test_find_mlnx_hw_mgmt_markers(self): + self.action.find_mlnx_hw_mgmt_markers() + print(Data.i_mlnx_start, Data.i_mlnx_end) + assert Data.old_series[Data.i_mlnx_start].strip() == "###-> mellanox_hw_mgmt-start" + assert Data.old_series[Data.i_mlnx_end].strip() == "###-> mellanox_hw_mgmt-end" + + def test_check_kconfig_conflicts(self): + # Add a line to create conflict + print(Data.current_kcfg) + Data.updated_kcfg.append(["CONFIG_EEPROM_OPTOE", "n"]) + self.action.find_mlnx_hw_mgmt_markers() + assert self.action.check_kconfig_conflicts() == True + + # Add a duplicate option + Data.updated_kcfg.pop(-1) + Data.updated_kcfg.append(["CONFIG_EEPROM_OPTOE", "m"]) + assert self.action.check_kconfig_conflicts() == False + + # Check with no conflicts or duplicates + Data.updated_kcfg.pop(-1) + assert self.action.check_kconfig_conflicts() == False + + @mock.patch('helper.FileHandler.write_lines', side_effect=write_lines_mock) + def test_write_final_slk_series(self, mock_write_lines): + self.action.find_mlnx_hw_mgmt_markers() + assert not self.action.check_kconfig_conflicts() + self.action.write_final_slk_series() + assert check_file_content(MOCK_INPUTS_DIR+"expected_data/series") + + def test_write_kconfig_inclusion(self): + self.action.find_mlnx_hw_mgmt_markers() + assert not self.action.check_kconfig_conflicts() + print(Data.updated_kcfg) + shutil.copy(MOCK_INPUTS_DIR+"/kconfig-inclusions", MOCK_WRITE_FILE) + FileHandler.write_lines_marker(MOCK_WRITE_FILE, KCFG.get_writable_opts(Data.updated_kcfg), MLNX_KFG_MARKER) + assert check_file_content(MOCK_INPUTS_DIR+"expected_data/kconfig-inclusions") + + @mock.patch('helper.FileHandler.write_lines', side_effect=write_lines_mock) + def test_handle_exclusions(self, mock_write_lines): + self.action.find_mlnx_hw_mgmt_markers() + self.action.handle_exclusions() + assert check_file_content(MOCK_INPUTS_DIR+"expected_data/kconfig-exclusions") + + @mock.patch('helper.FileHandler.write_lines', side_effect=write_lines_mock) + def test_write_series_diff(self, mock_write_lines): + self.action.find_mlnx_hw_mgmt_markers() + self.action.write_final_slk_series() + self.action.construct_series_with_non_up() + self.action.write_series_diff() + assert check_file_content(MOCK_INPUTS_DIR+"expected_data/series.patch") diff --git a/platform/mellanox/non-upstream-patches/README.md b/platform/mellanox/non-upstream-patches/README.md index a4393d818d..f2f25abfc9 100644 --- a/platform/mellanox/non-upstream-patches/README.md +++ b/platform/mellanox/non-upstream-patches/README.md @@ -23,4 +23,3 @@ EXTERNAL_KERNEL_PATCH_LOC/ Set `INCLUDE_EXTERNAL_PATCHES=y` using `SONIC_OVERRIDE_BUILD_VARS` to include these changes before building the kernel. - Eg: `NOJESSIE=1 NOSTRETCH=1 NOBUSTER=1 make SONIC_OVERRIDE_BUILD_VARS=' INCLUDE_EXTERNAL_PATCHES=y ' target/debs/bullseye/linux-headers-5.10.0-12-2-common_5.10.103-1_all.deb` - diff --git a/platform/mellanox/rules.mk b/platform/mellanox/rules.mk index 82c5556f37..a640fd0938 100644 --- a/platform/mellanox/rules.mk +++ b/platform/mellanox/rules.mk @@ -31,6 +31,7 @@ include $(PLATFORM_PATH)/mlnx-onie-fw-update.mk include $(PLATFORM_PATH)/mlnx-ssd-fw-update.mk include $(PLATFORM_PATH)/iproute2.mk include $(PLATFORM_PATH)/install-pending-fw.mk +include $(PLATFORM_PATH)/integration-scripts.mk SONIC_ALL += $(SONIC_ONE_IMAGE) \ $(DOCKER_FPM)