This commit is contained in:
parent
eb99648a4e
commit
10e635be93
63
platform/mellanox/hw-management/hwmgmt_nonup_patches
Normal file
63
platform/mellanox/hw-management/hwmgmt_nonup_patches
Normal file
@ -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
|
135
platform/mellanox/integration-scripts.mk
Normal file
135
platform/mellanox/integration-scripts.mk
Normal file
@ -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
|
171
platform/mellanox/integration-scripts/helper.py
Normal file
171
platform/mellanox/integration-scripts/helper.py
Normal file
@ -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
|
324
platform/mellanox/integration-scripts/hwmgmt_kernel_patches.py
Executable file
324
platform/mellanox/integration-scripts/hwmgmt_kernel_patches.py
Executable file
@ -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()
|
@ -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
|
@ -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
|
@ -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
|
||||||
|
#
|
||||||
|
############################################################
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
12
platform/mellanox/integration-scripts/tests/data/new_kconfig
Normal file
12
platform/mellanox/integration-scripts/tests/data/new_kconfig
Normal file
@ -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
|
27
platform/mellanox/integration-scripts/tests/data/new_series
Normal file
27
platform/mellanox/integration-scripts/tests/data/new_series
Normal file
@ -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
|
64
platform/mellanox/integration-scripts/tests/data/series
Executable file
64
platform/mellanox/integration-scripts/tests/data/series
Executable file
@ -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
|
||||||
|
#
|
||||||
|
############################################################
|
159
platform/mellanox/integration-scripts/tests/test_filehandler.py
Normal file
159
platform/mellanox/integration-scripts/tests/test_filehandler.py
Normal file
@ -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)
|
144
platform/mellanox/integration-scripts/tests/test_hwmgmtaction.py
Normal file
144
platform/mellanox/integration-scripts/tests/test_hwmgmtaction.py
Normal file
@ -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")
|
@ -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.
|
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`
|
- 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`
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ include $(PLATFORM_PATH)/mlnx-onie-fw-update.mk
|
|||||||
include $(PLATFORM_PATH)/mlnx-ssd-fw-update.mk
|
include $(PLATFORM_PATH)/mlnx-ssd-fw-update.mk
|
||||||
include $(PLATFORM_PATH)/iproute2.mk
|
include $(PLATFORM_PATH)/iproute2.mk
|
||||||
include $(PLATFORM_PATH)/install-pending-fw.mk
|
include $(PLATFORM_PATH)/install-pending-fw.mk
|
||||||
|
include $(PLATFORM_PATH)/integration-scripts.mk
|
||||||
|
|
||||||
SONIC_ALL += $(SONIC_ONE_IMAGE) \
|
SONIC_ALL += $(SONIC_ONE_IMAGE) \
|
||||||
$(DOCKER_FPM)
|
$(DOCKER_FPM)
|
||||||
|
Loading…
Reference in New Issue
Block a user