From fe9267633f13a1bb2a69ceaf77db65dd97dd6e1a Mon Sep 17 00:00:00 2001 From: Jiaqi Cheng Date: Thu, 30 Oct 2025 22:13:53 +0800 Subject: [PATCH] hikptool: Supports querying UB DFX information. Supports querying DFX information of UBUS, UMMU, and UB firmware. Updated tool version: 1.1.6 Signed-off-by: Jiaqi Cheng (cherry picked from commit 3d022bbecd250c76bddee6b8cb51889ae037538e) --- ...INVAL-when-the-parameter-check-fails.patch | 35 - ...fix-compiler-security-option-problem.patch | 39 - ...x-the-security-compilation-PIE-issue.patch | 51 - ...fix-print-sas_dev-info-error-problem.patch | 43 - ...kptool-rciep-rsp-filed-error-problem.patch | 44 - ...-pcie_info-cmd-print-display-problem.patch | 37 - ...func-api-modified-to-be-open-to-the-.patch | 123 - ...lete-pcie-AP_INT-module-for-dump-reg.patch | 28 - ...e-dump-reg-num-is-not-enough-problem.patch | 28 - ...f-PCS-lane-registers-in-the-PCIe-dum.patch | 125 - 0011-optimize-the-nic_mac-dump-register.patch | 46 - ...elease-bug-in-hikp_roh_get_cam_reg_n.patch | 53 - 0013-fix-missing-white-space-issue.patch | 28 - ...fix-maininfo-detail-info-print-error.patch | 86 - ...fix-print-sas_dqe-info-error-problem.patch | 29 - ...mpiling-specifications-check-problem.patch | 30 - ...veloping-of-hikptool-ub_dfx-function.patch | 497 -- ...eloping-of-hikptool-ub_link-function.patch | 182 - ...eveloping-of-hikptool-ub_bp-function.patch | 172 - ...veloping-of-hikptool-ub_crd-function.patch | 208 - ...eloping-of-hikptool-ub_info-function.patch | 164 - 0022-add-support-query-ip-guid-entries.patch | 638 -- ...l-delete-redundant-copyright-notices.patch | 53 - 0024-hikptool-add-pm-trace.patch | 343 - ...add-The-security-compilation-options.patch | 53 - ...t-cmd-add-print-arb-info-and-phy-inf.patch | 61 - 0027-hikptool-add-pcie-new-dump.patch | 399 -- ...dd-show-CDR-DFX-info-in-nic_port-cmd.patch | 201 - ...-new-cmd-support-query-ncsi-dfx-info.patch | 227 - 0030-hikptool-Don-t-show-gen5.patch | 30 - ...x-the-missing-bank-ID-in-roce_trp-GE.patch | 50 - ...ool-fix-the-memory-leak-risk-problem.patch | 486 -- ...-cmd-support-query-fault-notify-pkt-.patch | 223 - ...-cmd-to-support-query-port-fault-inf.patch | 238 - ...upport-to-query-pfc-storm-parameters.patch | 240 - ...kptool-add-sub-cmd-nic_torus-support.patch | 310 - ...ed-display-the-hot-plug-card-info-in.patch | 140 - ...ate-the-tool-version-number-to-1.1.0.patch | 28 - ...d-a-common-frame-for-hikptool-roce-r.patch | 386 -- ...d-roce_rst-cmd-for-reset-signal-regi.patch | 179 - ...d-roce_global_cfg-cmd-for-global-con.patch | 210 - ...d-roce_bond-cmd-for-bond-registers-q.patch | 179 - ...roce-Add-ext-query-for-roce_caep-cmd.patch | 174 - ...-roce-Add-ext-query-for-roce_mdb-cmd.patch | 210 - ...-roce-Add-ext-query-for-roce_qmm-cmd.patch | 252 - ...g-the-SerDes-Relationship-of-the-PCI.patch | 100 - ...the-function-of-querying-SAS-device-.patch | 177 - ...e-calloc-to-alloc-memory-for-array-i.patch | 31 - ...x-missing-check-of-reg-num-responsed.patch | 127 - ...nge-the-unic_ppp-directory-to-ub_ppp.patch | 43 - ...e-Fix-the-wrong-maximum-of-gmv-index.patch | 29 - ...d-some-centralized-code-review-comme.patch | 1390 ---- ...x-the-infinite-loop-due-to-compatibi.patch | 42 - ...-the-display-information-for-roh-mac.patch | 37 - ...ment-serdes-relationship-of-the-PCIe.patch | 30 - ...ed-parsing-the-optical-module-that-u.patch | 484 -- ...n-issue-where-the-MAC-type-is-incorr.patch | 71 - ..._port-command-is-adapted-to-display-.patch | 167 - ...kptool-fix-cleancode-codecheck-alarm.patch | 79 - ...hikptool-Delete-meaningless-printing.patch | 32 - ...ate-the-tool-version-number-to-1.1.1.patch | 28 - ...m-register-is-added-to-the-PCIe-dump.patch | 44 - ...int-names-of-registers-for-gmv-mdb-p.patch | 739 -- ...pport-exposing-names-of-extend-regis.patch | 354 - ...x-the-validation-check-of-cur_block_.patch | 70 - ...x-redundant-update-of-total_block_nu.patch | 36 - ...dd-check-for-total_block_num-from-FW.patch | 70 - ...-the-review-problems-found-in-the-R-.patch | 1376 ---- ...port-static-compilation-for-hikptool.patch | 76 - ...ool-nic-Fix-the-Code-review-comments.patch | 265 - ...-nic-add-check-for-the-value-from-FW.patch | 172 - ...-the-Code-review-comments-in-NIC-mod.patch | 85 - ...urn-real-errno-if-realpath-failed-in.patch | 43 - ...urn-real-cmd-status-if-alloc-failed-.patch | 165 - ...ck-path-before-used-it-in-function-h.patch | 40 - ...ck-strtol-if-it-failed-in-get_numvfs.patch | 35 - ...ing-NUL-at-the-end-of-the-buffer-len.patch | 43 - ...id-array-boundary-exceeded-in-hikp_n.patch | 59 - ...l-nic-Fix-bad-usage-of-format-string.patch | 31 - ...hikptool-nic-Fix-potential-dead-loop.patch | 43 - ...hikptool-Rectify-the-cleancode-issue.patch | 482 -- ...the-macro-definition-of-the-header-f.patch | 1097 --- ...he-memory-release-interface-is-added.patch | 1557 ----- ...p-register-names-for-SSU-and-PPP-mod.patch | 519 -- ...Added-the-dfx-register-for-PCIe-dump.patch | 54 - ...ro_num-error-is-rectified-and-the-of.patch | 62 - ...-obtaining-statistics-on-flow-contro.patch | 185 - ...kptool-Rectify-the-compilation-alarm.patch | 102 - ...ate-the-tool-version-number-to-1.1.3.patch | 28 - 0090-hikptool-Support-for-info-collect.patch | 6084 ----------------- 0091-hikptool-Added-compilation-options.patch | 2007 ------ ...e-query-result-of-pcie_dumpreg-does-.patch | 59 - ...hikptool-hccs-support-dump-hccs-info.patch | 1032 --- ...e-PCS-layer-register-print-command-i.patch | 73 - ...solved-the-problem-that-it-takes-a-l.patch | 119 - ...port-dump-SDMA-register-information-.patch | 472 -- ...-collect-sdma-hikptool-dump-reg-info.patch | 389 -- ...ate-the-tool-version-number-to-1.1.4.patch | 28 - ...-support-for-exporting-black-box-dat.patch | 713 -- ...kptool-The-cpu_ring-command-is-added.patch | 225 - ...-hikptool-Code-quality-reinforcement.patch | 465 -- ...dd-more-RoCE-registers-for-diagnosis.patch | 78 - ...l-roce-Support-to-print-u64-reg_data.patch | 198 - ...d-roce_dfx_sta-cmd-for-RoCE-DFX-stat.patch | 248 - ...kptool-Fix-ASAN-compilation-warnings.patch | 72 - ...d-serdes-module-submodule-dump-types.patch | 47 - ...e-the-ROCE-SCC-module-register-dump-.patch | 194 - ...tool-solve-some-code-review-comments.patch | 881 --- ...l-optimization-tool-help-information.patch | 238 - ...some-cleanup-and-refactoring-of-rasd.patch | 875 --- ...ptool-hccs-Fix-the-usage-description.patch | 42 - ...ptool-hccs-enable-HCCS-dfx-for-HIP11.patch | 25 - ...d-the-nic_led-command-implementation.patch | 253 - 0114-hikptool-Add-dfx-to-roce_dfx_sta.patch | 34 - ...-dump-ncsi-table-entry-configuration.patch | 472 -- ...e-one-click-log-collection-supported.patch | 241 - 0117-hikptool-Remove-sas_dqe-command.patch | 389 -- ...the-version-number-of-the-SO-dynamic.patch | 30 - hikptool-1.1.5.tar.gz | Bin 1534781 -> 0 bytes hikptool-1.1.6.tar.gz | Bin 0 -> 212297 bytes hikptool.spec | 206 +- 121 files changed, 6 insertions(+), 34240 deletions(-) delete mode 100644 0001-socip-Return-EINVAL-when-the-parameter-check-fails.patch delete mode 100644 0002-fix-compiler-security-option-problem.patch delete mode 100644 0003-fix-the-security-compilation-PIE-issue.patch delete mode 100644 0004-hikptool-fix-print-sas_dev-info-error-problem.patch delete mode 100644 0005-fix-hikptool-rciep-rsp-filed-error-problem.patch delete mode 100644 0006-fix-pcie_info-cmd-print-display-problem.patch delete mode 100644 0007-fix-signal-proc-func-api-modified-to-be-open-to-the-.patch delete mode 100644 0008-delete-pcie-AP_INT-module-for-dump-reg.patch delete mode 100644 0009-fix-serdes-module-dump-reg-num-is-not-enough-problem.patch delete mode 100644 0010-fix-the-number-of-PCS-lane-registers-in-the-PCIe-dum.patch delete mode 100644 0011-optimize-the-nic_mac-dump-register.patch delete mode 100644 0012-Fix-a-resource-release-bug-in-hikp_roh_get_cam_reg_n.patch delete mode 100644 0013-fix-missing-white-space-issue.patch delete mode 100644 0014-hikptool-fix-maininfo-detail-info-print-error.patch delete mode 100644 0015-hikptool-fix-print-sas_dqe-info-error-problem.patch delete mode 100644 0016-hikptool-fix-compiling-specifications-check-problem.patch delete mode 100644 0017-Complete-the-developing-of-hikptool-ub_dfx-function.patch delete mode 100644 0018-Complete-the-developing-of-hikptool-ub_link-function.patch delete mode 100644 0019-Complete-the-developing-of-hikptool-ub_bp-function.patch delete mode 100644 0020-Complete-the-developing-of-hikptool-ub_crd-function.patch delete mode 100644 0021-Complete-the-developing-of-hikptool-ub_info-function.patch delete mode 100644 0022-add-support-query-ip-guid-entries.patch delete mode 100644 0023-hikptool-delete-redundant-copyright-notices.patch delete mode 100644 0024-hikptool-add-pm-trace.patch delete mode 100644 0025-hikptool-add-The-security-compilation-options.patch delete mode 100644 0026-hikptool-nic_port-cmd-add-print-arb-info-and-phy-inf.patch delete mode 100644 0027-hikptool-add-pcie-new-dump.patch delete mode 100644 0028-hikptool-add-show-CDR-DFX-info-in-nic_port-cmd.patch delete mode 100644 0029-hikptool-add-new-cmd-support-query-ncsi-dfx-info.patch delete mode 100644 0030-hikptool-Don-t-show-gen5.patch delete mode 100644 0031-hikptool-RDMA-Fix-the-missing-bank-ID-in-roce_trp-GE.patch delete mode 100644 0032-hikptool-fix-the-memory-leak-risk-problem.patch delete mode 100644 0033-hikptool-add-new-cmd-support-query-fault-notify-pkt-.patch delete mode 100644 0034-hikptool-add-new-cmd-to-support-query-port-fault-inf.patch delete mode 100644 0035-hikptool-support-to-query-pfc-storm-parameters.patch delete mode 100644 0036-hikptool-add-sub-cmd-nic_torus-support.patch delete mode 100644 0037-hikptool-optimized-display-the-hot-plug-card-info-in.patch delete mode 100644 0038-hikptool-Update-the-tool-version-number-to-1.1.0.patch delete mode 100644 0039-hikptool-roce-Add-a-common-frame-for-hikptool-roce-r.patch delete mode 100644 0040-hikptool-roce-Add-roce_rst-cmd-for-reset-signal-regi.patch delete mode 100644 0041-hikptool-roce-Add-roce_global_cfg-cmd-for-global-con.patch delete mode 100644 0042-hikptool-roce-Add-roce_bond-cmd-for-bond-registers-q.patch delete mode 100644 0043-hikptool-roce-Add-ext-query-for-roce_caep-cmd.patch delete mode 100644 0044-hikptool-roce-Add-ext-query-for-roce_mdb-cmd.patch delete mode 100644 0045-hikptool-roce-Add-ext-query-for-roce_qmm-cmd.patch delete mode 100644 0046-hikptool-Querying-the-SerDes-Relationship-of-the-PCI.patch delete mode 100644 0047-hikptool-Remove-the-function-of-querying-SAS-device-.patch delete mode 100644 0048-hikptool-roce-Use-calloc-to-alloc-memory-for-array-i.patch delete mode 100644 0049-hikptool-roce-Fix-missing-check-of-reg-num-responsed.patch delete mode 100644 0050-hikptool-Change-the-unic_ppp-directory-to-ub_ppp.patch delete mode 100644 0051-hikptool-roce-Fix-the-wrong-maximum-of-gmv-index.patch delete mode 100644 0052-hikptool-Resolved-some-centralized-code-review-comme.patch delete mode 100644 0053-hikptool-roce-Fix-the-infinite-loop-due-to-compatibi.patch delete mode 100644 0054-hikptool-roh-fix-the-display-information-for-roh-mac.patch delete mode 100644 0055-hikptool-augument-serdes-relationship-of-the-PCIe.patch delete mode 100644 0056-hikptool-Supported-parsing-the-optical-module-that-u.patch delete mode 100644 0057-hikptool-Fixed-an-issue-where-the-MAC-type-is-incorr.patch delete mode 100644 0058-hikptool-The-nic_port-command-is-adapted-to-display-.patch delete mode 100644 0059-hikptool-fix-cleancode-codecheck-alarm.patch delete mode 100644 0060-hikptool-Delete-meaningless-printing.patch delete mode 100644 0061-hikptool-Update-the-tool-version-number-to-1.1.1.patch delete mode 100644 0062-hikptool-The-ecam-register-is-added-to-the-PCIe-dump.patch delete mode 100644 0063-hikptool-roce-Print-names-of-registers-for-gmv-mdb-p.patch delete mode 100644 0064-hikptool-roce-Support-exposing-names-of-extend-regis.patch delete mode 100644 0065-hikptool-roce-Fix-the-validation-check-of-cur_block_.patch delete mode 100644 0066-hikptool-roce-Fix-redundant-update-of-total_block_nu.patch delete mode 100644 0067-hikptool-roce-Add-check-for-total_block_num-from-FW.patch delete mode 100644 0068-hikptool-Resolve-the-review-problems-found-in-the-R-.patch delete mode 100644 0069-hikptool-Support-static-compilation-for-hikptool.patch delete mode 100644 0070-hikptool-nic-Fix-the-Code-review-comments.patch delete mode 100644 0071-hikptool-nic-add-check-for-the-value-from-FW.patch delete mode 100644 0072-hikptool-nic-Fix-the-Code-review-comments-in-NIC-mod.patch delete mode 100644 0073-hikptool-nic-return-real-errno-if-realpath-failed-in.patch delete mode 100644 0074-hikptool-nic-return-real-cmd-status-if-alloc-failed-.patch delete mode 100644 0075-hikptool-nic-check-path-before-used-it-in-function-h.patch delete mode 100644 0076-hikptool-nic-check-strtol-if-it-failed-in-get_numvfs.patch delete mode 100644 0077-hikptool-nic-adding-NUL-at-the-end-of-the-buffer-len.patch delete mode 100644 0078-hikptool-nic-avoid-array-boundary-exceeded-in-hikp_n.patch delete mode 100644 0079-hikptool-nic-Fix-bad-usage-of-format-string.patch delete mode 100644 0080-hikptool-nic-Fix-potential-dead-loop.patch delete mode 100644 0081-hikptool-Rectify-the-cleancode-issue.patch delete mode 100644 0082-hikptool-Modify-the-macro-definition-of-the-header-f.patch delete mode 100644 0083-hikptool-The-memory-release-interface-is-added.patch delete mode 100644 0084-hikptool-nic-Dump-register-names-for-SSU-and-PPP-mod.patch delete mode 100644 0085-hikptool-Added-the-dfx-register-for-PCIe-dump.patch delete mode 100644 0086-hikptool-The-macro_num-error-is-rectified-and-the-of.patch delete mode 100644 0087-Fix-the-logic-of-obtaining-statistics-on-flow-contro.patch delete mode 100644 0088-hikptool-Rectify-the-compilation-alarm.patch delete mode 100644 0089-hikptool-Update-the-tool-version-number-to-1.1.3.patch delete mode 100644 0090-hikptool-Support-for-info-collect.patch delete mode 100644 0091-hikptool-Added-compilation-options.patch delete mode 100644 0092-hikptool-pcie-The-query-result-of-pcie_dumpreg-does-.patch delete mode 100644 0093-hikptool-hccs-support-dump-hccs-info.patch delete mode 100644 0094-hikptool-pcie-The-PCS-layer-register-print-command-i.patch delete mode 100644 0095-hikptool-pcie-Resolved-the-problem-that-it-takes-a-l.patch delete mode 100644 0096-Hikptool-add-support-dump-SDMA-register-information-.patch delete mode 100644 0097-Add-support-collect-sdma-hikptool-dump-reg-info.patch delete mode 100644 0098-hikptool-Update-the-tool-version-number-to-1.1.4.patch delete mode 100644 0099-hikptool-ras-Add-support-for-exporting-black-box-dat.patch delete mode 100644 0100-hikptool-The-cpu_ring-command-is-added.patch delete mode 100644 0101-hikptool-Code-quality-reinforcement.patch delete mode 100644 0102-hikptool-Add-more-RoCE-registers-for-diagnosis.patch delete mode 100644 0103-hikptool-roce-Support-to-print-u64-reg_data.patch delete mode 100644 0104-hikptool-roce-Add-roce_dfx_sta-cmd-for-RoCE-DFX-stat.patch delete mode 100644 0105-hikptool-Fix-ASAN-compilation-warnings.patch delete mode 100644 0106-hikptool-Add-serdes-module-submodule-dump-types.patch delete mode 100644 0107-hikptool-Optimize-the-ROCE-SCC-module-register-dump-.patch delete mode 100644 0108-hikptool-solve-some-code-review-comments.patch delete mode 100644 0109-hikptool-optimization-tool-help-information.patch delete mode 100644 0110-hikptool-ras-do-some-cleanup-and-refactoring-of-rasd.patch delete mode 100644 0111-hikptool-hccs-Fix-the-usage-description.patch delete mode 100644 0112-hikptool-hccs-enable-HCCS-dfx-for-HIP11.patch delete mode 100644 0113-hikptool-Add-the-nic_led-command-implementation.patch delete mode 100644 0114-hikptool-Add-dfx-to-roce_dfx_sta.patch delete mode 100644 0115-hikptool-Add-new-dump-ncsi-table-entry-configuration.patch delete mode 100644 0116-hikptool-Optimize-one-click-log-collection-supported.patch delete mode 100644 0117-hikptool-Remove-sas_dqe-command.patch delete mode 100644 0118-hikptool-Modify-the-version-number-of-the-SO-dynamic.patch delete mode 100644 hikptool-1.1.5.tar.gz create mode 100644 hikptool-1.1.6.tar.gz diff --git a/0001-socip-Return-EINVAL-when-the-parameter-check-fails.patch b/0001-socip-Return-EINVAL-when-the-parameter-check-fails.patch deleted file mode 100644 index 112cf62..0000000 --- a/0001-socip-Return-EINVAL-when-the-parameter-check-fails.patch +++ /dev/null @@ -1,35 +0,0 @@ -From b70d76d5c20b3fb32e01986568c695da5879106b Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Sat, 10 Dec 2022 18:07:54 +0800 -Subject: [PATCH] socip: Return -EINVAL when the parameter check fails - -Return -EINVAL when the parameter check fails - -Signed-off-by: fangjian ---- - socip/hikp_socip_dumpreg.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/socip/hikp_socip_dumpreg.c b/socip/hikp_socip_dumpreg.c -index 088f5dd..b74dac8 100644 ---- a/socip/hikp_socip_dumpreg.c -+++ b/socip/hikp_socip_dumpreg.c -@@ -131,6 +131,7 @@ static void hikp_socip_dumpreg_execute(struct major_cmd_ctrl *self) - struct hikp_cmd_ret *cmd_ret; - - if (!check_socip_dumpreg_param()) { -+ self->err_no = -EINVAL; - cmd_socip_dump_help(self, NULL); - return; - } -@@ -141,6 +142,7 @@ static void hikp_socip_dumpreg_execute(struct major_cmd_ctrl *self) - hikp_cmd_init(&req_header, SOCIP_MOD, HIKP_SOCIP_CMD_DUMPREG, param[MODULE_ID_INDEX].val); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (!cmd_ret) { -+ self->err_no=-EINVAL; - HIKP_ERROR_PRINT("hikp_cmd_alloc\n"); - return; - } --- -2.33.0 - diff --git a/0002-fix-compiler-security-option-problem.patch b/0002-fix-compiler-security-option-problem.patch deleted file mode 100644 index 6a96cfd..0000000 --- a/0002-fix-compiler-security-option-problem.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0a4e7eb4cb35e126e9ca6e8e1f8f4282a008d0d2 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 13 Dec 2022 21:32:52 +0800 -Subject: [PATCH] fix compiler security option problem - -add compiler option -pie -fPIE, -Wl,-z,relro,-z,now -and disable rpath - -Signed-off-by: veega2022 ---- - CMakeLists.txt | 7 ++++++- - 1 file changed, 6 insertions(+), 1 deletion(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 1d79a31..c697edf 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -11,6 +11,9 @@ - - project(hikptool C) - -+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O2 -pie -fPIE -Wall") -+set(CMAKE_SKIP_RPATH TRUE) -+ - macro(get_header_dir_recurse HEADER_DIR_LIST) - file(GLOB_RECURSE HEADER_LIST *.h) - set(DIR_LIST "") -@@ -40,5 +43,7 @@ get_header_dir_recurse(HIKPTOOL_HEADER_DIR) - target_include_directories(hikptool PRIVATE ${HIKPTOOL_HEADER_DIR}) - target_link_directories(hikptool PRIVATE ${CMAKE_INSTALL_PREFIX}/lib) - target_link_libraries(hikptool PRIVATE KPTDEV_SO) --target_link_options(hikptool PRIVATE -g -lpthread -ldl -lm -lrt -T ${CMAKE_CURRENT_SOURCE_DIR}/hikp_register.ld) -+target_link_options(hikptool PRIVATE -+ -Wl,-z,relro,-z,now -Wl,-z,noexecstack -+ -g -lpthread -ldl -lm -lrt -T ${CMAKE_CURRENT_SOURCE_DIR}/hikp_register.ld) - install(TARGETS hikptool RUNTIME DESTINATION bin OPTIONAL) --- -2.33.0 - diff --git a/0003-fix-the-security-compilation-PIE-issue.patch b/0003-fix-the-security-compilation-PIE-issue.patch deleted file mode 100644 index 00e9ec8..0000000 --- a/0003-fix-the-security-compilation-PIE-issue.patch +++ /dev/null @@ -1,51 +0,0 @@ -From bac5c53adcb43f4bbba6f436c98d6451d55c80ad Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 15 Mar 2023 08:28:37 +0000 -Subject: [PATCH] fix the security compilation PIE issue - -add link options "-fPIE -pie", because the -T link is used, the pie becomes -invalid.Therefore,change the ld file PROVIDE address to 0. - -Signed-off-by: veega2022 ---- - CMakeLists.txt | 4 ++-- - hikp_register.ld | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 0ba7370..6a396e7 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -11,7 +11,7 @@ - - project(hikptool C) - --set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O2 -pie -fPIE -Wall") -+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O2 -fPIC -fPIE -Wall") - set(CMAKE_SKIP_RPATH TRUE) - - macro(get_header_dir_recurse HEADER_DIR_LIST) -@@ -44,6 +44,6 @@ target_include_directories(hikptool PRIVATE ${HIKPTOOL_HEADER_DIR}) - target_link_directories(hikptool PRIVATE ${CMAKE_INSTALL_PREFIX}/lib) - target_link_libraries(hikptool PRIVATE KPTDEV_SO) - target_link_options(hikptool PRIVATE -- -Wl,-z,relro,-z,now -Wl,-z,noexecstack -+ -Wl,-z,relro,-z,now -Wl,-z,noexecstack -fPIE -pie - -g -lpthread -ldl -lm -lrt -T ${CMAKE_CURRENT_SOURCE_DIR}/hikp_register.ld) - install(TARGETS hikptool RUNTIME DESTINATION bin OPTIONAL) -diff --git a/hikp_register.ld b/hikp_register.ld -index b1bec44..3bd44ff 100644 ---- a/hikp_register.ld -+++ b/hikp_register.ld -@@ -11,7 +11,7 @@ SEARCH_DIR("=/usr/aarch64-Huawei-linux/lib64"); SEARCH_DIR("=/usr/lib64"); SEARC - SECTIONS - { - /* Read-only sections, merged into text segment: */ -- PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS; -+ PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x0)); . = SEGMENT_START("text-segment", 0x0) + SIZEOF_HEADERS; - .interp : { *(.interp) } - .note.gnu.build-id : { *(.note.gnu.build-id) } - .hash : { *(.hash) } --- -2.25.1 - diff --git a/0004-hikptool-fix-print-sas_dev-info-error-problem.patch b/0004-hikptool-fix-print-sas_dev-info-error-problem.patch deleted file mode 100644 index 19509e6..0000000 --- a/0004-hikptool-fix-print-sas_dev-info-error-problem.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 1a4f58e149d14146d399878418bdba9dc824e0a6 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 6 Apr 2023 11:33:14 +0000 -Subject: [PATCH] hikptool: fix print sas_dev info error problem - -the volatile modifier is added because the O2 compilation optimization is enbaled. -As a result, the pointer data is not updated. - -Signed-off-by: veega2022 ---- - sas/sas_func/sas_read_dev.c | 2 +- - tool_lib/tool_lib.h | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/sas/sas_func/sas_read_dev.c b/sas/sas_func/sas_read_dev.c -index 382a1ef..d01f95f 100644 ---- a/sas/sas_func/sas_read_dev.c -+++ b/sas/sas_func/sas_read_dev.c -@@ -77,7 +77,7 @@ static void print_dev_link(const uint32_t *reg_save, uint32_t reg_num) - - static void print_dev_info(const void *reg_save, uint32_t reg_num) - { -- struct hikp_sas_itct *itct = (struct hikp_sas_itct *)reg_save; -+ volatile struct hikp_sas_itct *itct = (volatile struct hikp_sas_itct *)reg_save; - - printf("The device information as below:\n"); - printf("dev_type: %d\n", itct->dw0.dev_type); -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 29e7e8c..b211175 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.0.12" -+#define TOOL_VER "1.0.13" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.25.1 - diff --git a/0005-fix-hikptool-rciep-rsp-filed-error-problem.patch b/0005-fix-hikptool-rciep-rsp-filed-error-problem.patch deleted file mode 100644 index 4729653..0000000 --- a/0005-fix-hikptool-rciep-rsp-filed-error-problem.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 436ab65e026ae1260b7e7cab905a23096bf7e1e5 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 10 May 2023 17:39:59 +0800 -Subject: [PATCH 01/18] fix hikptool rciep rsp filed error problem - -union hikp_space_rsp 0xF8h is reserved and 0xFCh is cpl_status - -Signed-off-by: hesiyuan ---- - libhikptdev/src/rciep/hikpt_rciep.c | 2 +- - libhikptdev/src/rciep/hikpt_rciep.h | 4 ++-- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/libhikptdev/src/rciep/hikpt_rciep.c b/libhikptdev/src/rciep/hikpt_rciep.c -index 9b7a82a..5c7e82f 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.c -+++ b/libhikptdev/src/rciep/hikpt_rciep.c -@@ -97,7 +97,7 @@ static uint32_t hikp_wait_for_cpl_status(void) - uint32_t status; - - do { -- status = g_hikp_req->field.cpl_status; -+ status = g_hikp_rsp->field.cpl_status; - if (status != HIKP_INIT_STAT) - return status; - count--; -diff --git a/libhikptdev/src/rciep/hikpt_rciep.h b/libhikptdev/src/rciep/hikpt_rciep.h -index 093724a..8fbb3c0 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.h -+++ b/libhikptdev/src/rciep/hikpt_rciep.h -@@ -75,8 +75,8 @@ union hikp_space_rsp { - uint32_t version; /* 000h */ - uint32_t rsp_para_num; /* 004h */ - uint32_t data[HIKP_RSP_DATA_MAX]; /* 008h */ -- uint32_t cpl_status; /* 0F8h */ -- uint32_t pid_record; /* 0FCh */ -+ uint32_t rsv; /* 0F8h */ -+ uint32_t cpl_status; /* 0FCh */ - struct iep_doorbell sw_db; /* 100h. Fixed and unmodifiable */ - } field; - --- -2.25.1 - diff --git a/0006-fix-pcie_info-cmd-print-display-problem.patch b/0006-fix-pcie_info-cmd-print-display-problem.patch deleted file mode 100644 index 3de81ad..0000000 --- a/0006-fix-pcie_info-cmd-print-display-problem.patch +++ /dev/null @@ -1,37 +0,0 @@ -From befc663ba761c1b334b50de138e57e2a00be4f32 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 10 May 2023 17:54:59 +0800 -Subject: [PATCH 02/18] fix pcie_info cmd print display problem - -The spelling of WITDH is incorrect. Change it to WIDTH. - -Signed-off-by: hesiyuan ---- - pcie/func_lib/pcie_func/pcie_statistics.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.c b/pcie/func_lib/pcie_func/pcie_statistics.c -index f12660d..308a142 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.c -+++ b/pcie/func_lib/pcie_func/pcie_statistics.c -@@ -22,7 +22,7 @@ - #include "pcie_statistics.h" - - static const char *g_global_width_name[GLOBAL_WIDTH_TABLE_SIZE] = { -- "PCIE_WITDH_X1", "PCIE_WITDH_X2", "PCIE_WITDH_X4", "PCIE_WITDH_X8", "PCIE_WITDH_X16" -+ "PCIE_WIDTH_X1", "PCIE_WIDTH_X2", "PCIE_WIDTH_X4", "PCIE_WIDTH_X8", "PCIE_WIDTH_X16" - }; - - static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, uint32_t *port_num) -@@ -81,7 +81,7 @@ int pcie_port_distribution_get(uint32_t chip_id) - for (i = 0; i < pair_num; i++) { - if (port_info->info_pair[i].port_width >= HIKP_ARRAY_SIZE(g_global_width_name)) { - Info("PCIe Base", "port_id[%u] %s\n", port_info->info_pair[i].port_id, -- "UNKNOWN_WITDH"); -+ "UNKNOWN_WIDTH"); - continue; - } - Info("PCIe Base", "port_id[%u] %s\n", port_info->info_pair[i].port_id, --- -2.25.1 - diff --git a/0007-fix-signal-proc-func-api-modified-to-be-open-to-the-.patch b/0007-fix-signal-proc-func-api-modified-to-be-open-to-the-.patch deleted file mode 100644 index 582149a..0000000 --- a/0007-fix-signal-proc-func-api-modified-to-be-open-to-the-.patch +++ /dev/null @@ -1,123 +0,0 @@ -From e649f6245f73b99e5c2501f789a3b363c2a25554 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 10 May 2023 18:05:01 +0800 -Subject: [PATCH 03/18] fix signal proc func api modified to be open to the - public - -move sig_init api to op_logs public header file - -Signed-off-by: wangkang ---- - hikp_init_main.c | 20 -------------------- - libhikptdev/src/rciep/hikpt_rciep.h | 2 +- - tool_lib/op_logs.c | 23 ++++++++++++++++++++++- - tool_lib/op_logs.h | 3 ++- - 4 files changed, 25 insertions(+), 23 deletions(-) - -diff --git a/hikp_init_main.c b/hikp_init_main.c -index 4102c69..4629b40 100644 ---- a/hikp_init_main.c -+++ b/hikp_init_main.c -@@ -19,26 +19,6 @@ - /* hikptool command adapter */ - struct cmd_adapter g_tool = { 0 }; - --static void _sig_ign_handle(int arg) --{ -- signal_op_log_write(arg); -- hikp_unlock(); -- _exit(1); --} -- --static void sig_init(void) --{ -- (void)signal(SIGINT, _sig_ign_handle); /* Quit process */ -- (void)signal(SIGTERM, _sig_ign_handle); -- (void)signal(SIGQUIT, _sig_ign_handle); -- (void)signal(SIGHUP, _sig_ign_handle); -- (void)signal(SIGSEGV, _sig_ign_handle); -- (void)signal(SIGBUS, _sig_ign_handle); -- (void)signal(SIGFPE, _sig_ign_handle); -- (void)signal(SIGABRT, _sig_ign_handle); -- (void)signal(SIGTSTP, _sig_ign_handle); /* Stop process */ --} -- - static void show_tool_version(const struct cmd_adapter *adapter) - { - printf("%s version %s Huawei\n", adapter->name, adapter->version); -diff --git a/libhikptdev/src/rciep/hikpt_rciep.h b/libhikptdev/src/rciep/hikpt_rciep.h -index 8fbb3c0..dd08759 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.h -+++ b/libhikptdev/src/rciep/hikpt_rciep.h -@@ -40,7 +40,7 @@ - #define MAX_LOCK_COUNT 5 - #define LOCK_CHECK_GAP_US 1000 - #define CPL_CHECK_GAP_US 1000 --#define WAIT_CPL_MAX_MS 5000 -+#define WAIT_CPL_MAX_MS 8000 - - enum { - HIKP_RESOURCE_DIR, -diff --git a/tool_lib/op_logs.c b/tool_lib/op_logs.c -index d6082a3..069428d 100644 ---- a/tool_lib/op_logs.c -+++ b/tool_lib/op_logs.c -@@ -14,7 +14,9 @@ - #include - #include - #include -+#include - #include "tool_lib.h" -+#include "hikptdev_plug.h" - #include "op_logs.h" - - static char g_op_log[OP_LOG_FILE_PATH_MAXLEN] = {0}; -@@ -23,7 +25,6 @@ static bool g_record = true; - static bool g_log_info; - static char g_input_buf[OP_LOG_FILE_W_MAXSIZE + 1] = {0}; - -- - static void op_log_write(const char *log_data) - { - size_t w_size; -@@ -414,3 +415,23 @@ SIGNAL_LOG_OUT: - (void)close(fd); - (void)uda_unfcntl(&op_log_fd, UDA_FLOCK_BLOCK); - } -+ -+static void signal_handle(int arg) -+{ -+ signal_op_log_write(arg); -+ hikp_unlock(); -+ _exit(1); -+} -+ -+void sig_init(void) -+{ -+ (void)signal(SIGINT, signal_handle); /* Quit process */ -+ (void)signal(SIGTERM, signal_handle); -+ (void)signal(SIGQUIT, signal_handle); -+ (void)signal(SIGHUP, signal_handle); -+ (void)signal(SIGSEGV, signal_handle); -+ (void)signal(SIGBUS, signal_handle); -+ (void)signal(SIGFPE, signal_handle); -+ (void)signal(SIGABRT, signal_handle); -+ (void)signal(SIGTSTP, signal_handle); /* Stop process */ -+} -diff --git a/tool_lib/op_logs.h b/tool_lib/op_logs.h -index 597f063..6b6e421 100644 ---- a/tool_lib/op_logs.h -+++ b/tool_lib/op_logs.h -@@ -45,7 +45,8 @@ struct op_log_print_t { - char *str; - }; - --void signal_op_log_write(int signal_code); -+void sig_init(void); -+ - void op_log_on(void); - void op_log_off(void); - int op_log_initialise(const char *log_dir); --- -2.25.1 - diff --git a/0008-delete-pcie-AP_INT-module-for-dump-reg.patch b/0008-delete-pcie-AP_INT-module-for-dump-reg.patch deleted file mode 100644 index b0a94be..0000000 --- a/0008-delete-pcie-AP_INT-module-for-dump-reg.patch +++ /dev/null @@ -1,28 +0,0 @@ -From b369c7bf28b576097b46470d509ac61116872958 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 10 May 2023 18:09:55 +0800 -Subject: [PATCH 04/18] delete pcie AP_INT module for dump reg - -the AP_INT module is abandoned, so deleted this module and do not dump -this module reg - -Signed-off-by: hesiyuan ---- - pcie/func_lib/pcie_func/pcie_reg_read.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_reg_read.c b/pcie/func_lib/pcie_func/pcie_reg_read.c -index 6ba4f07..b3d4643 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_read.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_read.c -@@ -30,7 +30,6 @@ static struct pcie_module_table g_module_table[] = { - {"PCIPC_REG", PCIPC_REG_ID}, - {"AP_MCTP_REG", AP_MCTP_REG_ID}, - {"AP_ENGINE_REG", AP_ENGINE_REG_ID}, -- {"AP_INT_REG", AP_INT_REG_ID}, - {"AP_DMA_REG", AP_DMA_REG_ID}, - {"TOP_REG", TOP_REG_ID}, - {"CORE_GLOBAL_REG", CORE_GLOBAL_REG_ID}, --- -2.25.1 - diff --git a/0009-fix-serdes-module-dump-reg-num-is-not-enough-problem.patch b/0009-fix-serdes-module-dump-reg-num-is-not-enough-problem.patch deleted file mode 100644 index 09917b7..0000000 --- a/0009-fix-serdes-module-dump-reg-num-is-not-enough-problem.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 2b679f7b8023298c3942b424545a4eff8aebe683 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 10 May 2023 18:14:50 +0800 -Subject: [PATCH 05/18] fix serdes module dump reg num is not enough problem - -The number of new chip registers may increase. Therefore, increase the number of dump registers. - -Signed-off-by: wangkang ---- - serdes/hikp_serdes.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index 89e66e1..dd9eee3 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -23,7 +23,7 @@ - - static struct cmd_serdes_param g_serdes_param = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - --#define SERDES_OUTPUT_MAX_SIZE 2048 -+#define SERDES_OUTPUT_MAX_SIZE 2560 - static char g_serdes_data_out_buf[SERDES_OUTPUT_MAX_SIZE] = {0}; - - static int cmd_serdes_maininfo_help(struct major_cmd_ctrl *self, const char *argv) --- -2.25.1 - diff --git a/0010-fix-the-number-of-PCS-lane-registers-in-the-PCIe-dum.patch b/0010-fix-the-number-of-PCS-lane-registers-in-the-PCIe-dum.patch deleted file mode 100644 index 6947fef..0000000 --- a/0010-fix-the-number-of-PCS-lane-registers-in-the-PCIe-dum.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 104dce7743c31c73a54095844d704272fa14de69 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 10 May 2023 18:20:58 +0800 -Subject: [PATCH 06/18] fix the number of PCS lane registers in the PCIe - dumpreg - -Traverse the PCS registers of all lanes under the current core. - -Signed-off-by: hesiyuan ---- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 36 +++++++++++------------- - pcie/func_lib/pcie_func/pcie_reg_dump.h | 10 +++++++ - pcie/usr_cmd/interface/pcie_common_api.h | 4 +++ - 3 files changed, 31 insertions(+), 19 deletions(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index 7d91969..e10ff7e 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -108,13 +108,13 @@ struct pcie_dumpreg_info g_reg_table_mac[] = { - }; - - struct pcie_dumpreg_info g_reg_table_pcs[] = { -- {0, "SERDES_STATUS_RPT"}, -- {0, "EBUF_STATUS"}, -- {0, "GEN3_DEC_ENC_STATUS"}, -- {0, "WAKE_STATUS"}, -- {0, "RECV_DET_OR_PWR_CHAGE"}, -- {0, "EQEVAL_STATUS"}, -- {0, "LANE_INTR_STATUS"}, -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(SERDES_STATUS_RPT), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(EBUF_STATUS), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(GEN3_DEC_ENC_STATUS), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(WAKE_STATUS), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(RECV_DET_OR_PWR_CHAGE), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(EQEVAL_STATUS), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(LANE_INTR_STATUS), - }; - - struct pcie_dumpreg_info g_reg_table_iob_tx[] = { -@@ -348,6 +348,13 @@ static void pcie_dumpreg_save_glb_analysis_log(const uint32_t *data, uint32_t da - pcie_dumpreg_write_value_to_file(g_reg_table_core_glb[item_i].name, - g_reg_table_core_glb[item_i].val); - } -+ /* PCS REG */ -+ for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_pcs) && -+ data_i < data_num; item_i++, data_i++) { -+ g_reg_table_pcs[item_i].val = data[data_i]; -+ pcie_dumpreg_write_value_to_file(g_reg_table_pcs[item_i].name, -+ g_reg_table_pcs[item_i].val); -+ } - } - - static void pcie_dumpreg_save_port_analysis_log(uint32_t *data, uint32_t data_num) -@@ -376,13 +383,6 @@ static void pcie_dumpreg_save_port_analysis_log(uint32_t *data, uint32_t data_nu - pcie_dumpreg_write_value_to_file(g_reg_table_mac[item_i].name, - g_reg_table_mac[item_i].val); - } -- /* PCS REG */ -- for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_pcs) && -- data_i < data_num; item_i++, data_i++) { -- g_reg_table_pcs[item_i].val = data[data_i]; -- pcie_dumpreg_write_value_to_file(g_reg_table_pcs[item_i].name, -- g_reg_table_pcs[item_i].val); -- } - } - - static int pcie_dumpreg_write_header_to_file(uint32_t version, -@@ -421,14 +421,12 @@ static int pcie_dumpreg_save_log(uint32_t *data, uint32_t data_num, - switch (req_data->level) { - case DUMP_GLOBAL_LEVEL: - expect_data_num = HIKP_ARRAY_SIZE(g_reg_table_iob_tx) + -- HIKP_ARRAY_SIZE(g_reg_table_iob_rx) + HIKP_ARRAY_SIZE(g_reg_table_ap_glb) + -- HIKP_ARRAY_SIZE(g_reg_table_core_glb); -+ HIKP_ARRAY_SIZE(g_reg_table_iob_rx) + HIKP_ARRAY_SIZE(g_reg_table_ap_glb) + -+ HIKP_ARRAY_SIZE(g_reg_table_core_glb) + HIKP_ARRAY_SIZE(g_reg_table_pcs); - break; - case DUMP_PORT_LEVEL: - expect_data_num = HIKP_ARRAY_SIZE(g_reg_table_tl) + -- HIKP_ARRAY_SIZE(g_reg_table_dl) + -- HIKP_ARRAY_SIZE(g_reg_table_mac) + -- HIKP_ARRAY_SIZE(g_reg_table_pcs); -+ HIKP_ARRAY_SIZE(g_reg_table_dl) + HIKP_ARRAY_SIZE(g_reg_table_mac); - break; - default: - Err("PCIe DUMPREG", "check dump level failed.\n"); -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.h b/pcie/func_lib/pcie_func/pcie_reg_dump.h -index 1993c1f..4ec1909 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.h -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.h -@@ -20,6 +20,16 @@ - #define MAX_STR_LEN 80 - #define PCIE_DUMPREG_LOGFILE_NAME "pcie_dumpreg" - -+#define HIKP_PCIE_PCS_LANE_TBL_ENTRY(name) \ -+ {0, STR(CONTACT(name, _00))}, {0, STR(CONTACT(name, _01))}, \ -+ {0, STR(CONTACT(name, _02))}, {0, STR(CONTACT(name, _03))}, \ -+ {0, STR(CONTACT(name, _04))}, {0, STR(CONTACT(name, _05))}, \ -+ {0, STR(CONTACT(name, _06))}, {0, STR(CONTACT(name, _07))}, \ -+ {0, STR(CONTACT(name, _08))}, {0, STR(CONTACT(name, _09))}, \ -+ {0, STR(CONTACT(name, _10))}, {0, STR(CONTACT(name, _11))}, \ -+ {0, STR(CONTACT(name, _12))}, {0, STR(CONTACT(name, _13))}, \ -+ {0, STR(CONTACT(name, _14))}, {0, STR(CONTACT(name, _15))} -+ - enum pcie_dump_level { - DUMP_GLOBAL_LEVEL = 1, - DUMP_PORT_LEVEL = 2, -diff --git a/pcie/usr_cmd/interface/pcie_common_api.h b/pcie/usr_cmd/interface/pcie_common_api.h -index f6541bd..9809575 100644 ---- a/pcie/usr_cmd/interface/pcie_common_api.h -+++ b/pcie/usr_cmd/interface/pcie_common_api.h -@@ -17,6 +17,10 @@ - #include - #include - -+#define CONTACT(x, y) x##y -+#define STR_INTER(x) #x -+#define STR(x) STR_INTER(x) -+ - struct print_info { - char *buff; - size_t buff_size; --- -2.25.1 - diff --git a/0011-optimize-the-nic_mac-dump-register.patch b/0011-optimize-the-nic_mac-dump-register.patch deleted file mode 100644 index da86356..0000000 --- a/0011-optimize-the-nic_mac-dump-register.patch +++ /dev/null @@ -1,46 +0,0 @@ -From c0f8dd5ae8fe688825e77cf63ddb30d0cb27ecdf Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 11 May 2023 08:54:09 +0800 -Subject: [PATCH 08/18] optimize the nic_mac dump register - -if reg dump block data num is 0, print not support dump and return. -hikptool version: 1.0.14 - -Signed-off-by: veega2022 ---- - net/nic/nic_mac/hikp_nic_mac_dump.c | 5 +++++ - tool_lib/tool_lib.h | 2 +- - 2 files changed, 6 insertions(+), 1 deletion(-) - -diff --git a/net/nic/nic_mac/hikp_nic_mac_dump.c b/net/nic/nic_mac/hikp_nic_mac_dump.c -index 6e856a8..3e818cd 100644 ---- a/net/nic/nic_mac/hikp_nic_mac_dump.c -+++ b/net/nic/nic_mac/hikp_nic_mac_dump.c -@@ -64,6 +64,11 @@ static int mac_cmd_dump_mod(struct major_cmd_ctrl *self, const char *name, - uint32_t i; - int ret; - -+ if (blk_num == 0) { -+ printf("%s module is not support dump.\n", name); -+ return 0; -+ } -+ - printf("============ %10s REG INFO ==============\n", name); - printf("\t %s :\t%10s\n", "offset", "value"); - -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index bf37465..9766a7e 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.0.13" -+#define TOOL_VER "1.0.14" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.25.1 - diff --git a/0012-Fix-a-resource-release-bug-in-hikp_roh_get_cam_reg_n.patch b/0012-Fix-a-resource-release-bug-in-hikp_roh_get_cam_reg_n.patch deleted file mode 100644 index 8d1ac2d..0000000 --- a/0012-Fix-a-resource-release-bug-in-hikp_roh_get_cam_reg_n.patch +++ /dev/null @@ -1,53 +0,0 @@ -From e51911b2c5daa7f9d650849aaa4f389291415255 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 11 May 2023 09:29:48 +0800 -Subject: [PATCH 14/18] Fix a resource release bug in hikp_roh_get_cam_reg_num - -Fix a resource release bug in hikp_roh_get_cam_reg_num - -Signed-off-by: chenke chenke54@huawei.com ---- - net/roh/hikp_roh_mac.c | 6 +++++- - net/roh/hikp_roh_show_bp.c | 2 +- - 2 files changed, 6 insertions(+), 2 deletions(-) - -diff --git a/net/roh/hikp_roh_mac.c b/net/roh/hikp_roh_mac.c -index 90708b1..43f954c 100644 ---- a/net/roh/hikp_roh_mac.c -+++ b/net/roh/hikp_roh_mac.c -@@ -141,6 +141,7 @@ static int hikp_roh_get_cam_reg_num(struct major_cmd_ctrl *self) - struct roh_mac_req_para req_data = { 0 }; - struct hikp_cmd_header req_header = { 0 }; - struct hikp_cmd_ret *cmd_ret = NULL; -+ uint32_t cam_reg_num; - - req_data.bdf = g_roh_mac_param.target.bdf; - hikp_cmd_init(&req_header, ROH_MOD, HIKP_ROH_MAC, CMD_GET_CAM_REG_NUM); -@@ -153,7 +154,10 @@ static int hikp_roh_get_cam_reg_num(struct major_cmd_ctrl *self) - return -EIO; - } - mac_rsp = (struct roh_mac_cam_reg_num *)(cmd_ret->rsp_data); -- return mac_rsp->cam_reg_num; -+ cam_reg_num = mac_rsp->cam_reg_num; -+ free(cmd_ret); -+ cmd_ret = NULL; -+ return cam_reg_num; - } - - static int hikp_roh_build_cam(struct major_cmd_ctrl *self, struct cam_table_entry_t *cam_table) -diff --git a/net/roh/hikp_roh_show_bp.c b/net/roh/hikp_roh_show_bp.c -index c89e98b..73a53d8 100644 ---- a/net/roh/hikp_roh_show_bp.c -+++ b/net/roh/hikp_roh_show_bp.c -@@ -44,7 +44,7 @@ static int hikp_roh_show_bp(struct major_cmd_ctrl *self) - union bp_val res; - uint8_t flit_bp; - int mac_id; -- int ret; -+ int ret = 0; - - struct hikp_cmd_ret *cmd_ret = NULL; - struct hikp_cmd_header req_header = { 0 }; --- -2.25.1 - diff --git a/0013-fix-missing-white-space-issue.patch b/0013-fix-missing-white-space-issue.patch deleted file mode 100644 index 4ffa6c4..0000000 --- a/0013-fix-missing-white-space-issue.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 28283e9ab010f418846eaa00511721745927088f Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 11 May 2023 09:36:38 +0800 -Subject: [PATCH 15/18] fix missing white space issue - -Add a space on the left and right of the "=" - -Signed-off-by: veega2022 ---- - socip/hikp_socip_dumpreg.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/socip/hikp_socip_dumpreg.c b/socip/hikp_socip_dumpreg.c -index b74dac8..32325bb 100644 ---- a/socip/hikp_socip_dumpreg.c -+++ b/socip/hikp_socip_dumpreg.c -@@ -142,7 +142,7 @@ static void hikp_socip_dumpreg_execute(struct major_cmd_ctrl *self) - hikp_cmd_init(&req_header, SOCIP_MOD, HIKP_SOCIP_CMD_DUMPREG, param[MODULE_ID_INDEX].val); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (!cmd_ret) { -- self->err_no=-EINVAL; -+ self->err_no = -EINVAL; - HIKP_ERROR_PRINT("hikp_cmd_alloc\n"); - return; - } --- -2.25.1 - diff --git a/0014-hikptool-fix-maininfo-detail-info-print-error.patch b/0014-hikptool-fix-maininfo-detail-info-print-error.patch deleted file mode 100644 index 547ff04..0000000 --- a/0014-hikptool-fix-maininfo-detail-info-print-error.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 90c8f3c14e4d5cf1ea5fd8181810f07d33af4e9b Mon Sep 17 00:00:00 2001 -From: huangguanhua -Date: Thu, 18 May 2023 16:29:28 +0800 -Subject: [PATCH 17/18] hikptool-fix-maininfo-detail-info-print-error - -Signed-off-by: huangguanhua ---- - serdes/hikp_serdes.c | 12 ++++++++---- - serdes/hikp_serdes.h | 3 ++- - tool_lib/op_logs.c | 6 +++--- - 3 files changed, 13 insertions(+), 8 deletions(-) - -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index dd9eee3..527fd53 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -184,21 +184,22 @@ static void hikp_serdes_brief_info_print(struct major_cmd_ctrl *self, - "Tap16,Tap17,Tap18,Tap19,Tap20]\n" \ - "FWFourEye: It only takes effect when the firmware is running and " \ - "continuous adaptation is turned on\n" \ -+ "Snr: [SNR_METRIC,SNR_METRIC_HIS_MIN,SNR_CYCLES,HEH,SNR_METRIC_SW]\n" \ - "-----------------------------------------------------" \ - "------------------------------------------------" \ - "-----------------------------------------------------" \ - "------------------------------------------------" \ -- "-------------------\n" \ -+ "--------------------------------\n" \ - " [ FFE ]" \ - "[ CTLE ]" \ - "[ " \ - "DFE ]" \ -- "[ FWFourEye ][ snr ]\n" \ -+ "[ FWFourEye ][ Snr ]\n" \ - "-----------------------------------------------------" \ - "-------------------------------------------------" \ - "-----------------------------------------------------" \ - "-------------------------------------------------" \ -- "------------------\n") -+ "--------------------------------\n") - - static void hikp_serdes_detail_info_print(struct major_cmd_ctrl *self, - const struct hilink_detail_info *data, -@@ -233,7 +234,10 @@ static void hikp_serdes_detail_info_print(struct major_cmd_ctrl *self, - printf("][%4d,%4d,%4d,%4d]", - data[ds_id].eye_diagram.top, data[ds_id].eye_diagram.bottom, - data[ds_id].eye_diagram.left, data[ds_id].eye_diagram.right); -- printf("[%7d]\n", data[ds_id].snr); -+ /* 0: SNR_METRIC, 1:SNR_METRIC_HIS_MIN */ -+ printf("[%3d,%3d,%3d,%3d,%3d]\n", data[ds_id].snr_para[0], data[ds_id].snr_para[1], -+ /* 2:SNR_CYCLES, 3:HEH, 4:SNR_METRIC_SW */ -+ data[ds_id].snr_para[2], data[ds_id].snr_para[3], data[ds_id].snr_para[4]); - } - } - -diff --git a/serdes/hikp_serdes.h b/serdes/hikp_serdes.h -index 99b9b15..83c28b8 100644 ---- a/serdes/hikp_serdes.h -+++ b/serdes/hikp_serdes.h -@@ -192,7 +192,8 @@ struct hilink_detail_info { - struct hilink_rx_param rx_ctle_cfg; - struct hilink_serdes_rx_tap rx_tap_cfg; - struct hilink_4p_eye_result eye_diagram; -- uint32_t snr; -+ /* 5: (0: SNR_METRIC, 1:SNR_METRIC_HIS_MIN, 2:SNR_CYCLES, 3:HEH, 4:SNR_METRIC_SW) */ -+ int32_t snr_para[5]; - }; - - struct hilink_brief_info { -diff --git a/tool_lib/op_logs.c b/tool_lib/op_logs.c -index 069428d..d91ddb0 100644 ---- a/tool_lib/op_logs.c -+++ b/tool_lib/op_logs.c -@@ -431,7 +431,7 @@ void sig_init(void) - (void)signal(SIGHUP, signal_handle); - (void)signal(SIGSEGV, signal_handle); - (void)signal(SIGBUS, signal_handle); -- (void)signal(SIGFPE, signal_handle); -- (void)signal(SIGABRT, signal_handle); -- (void)signal(SIGTSTP, signal_handle); /* Stop process */ -+ (void)signal(SIGFPE, signal_handle); -+ (void)signal(SIGABRT, signal_handle); -+ (void)signal(SIGTSTP, signal_handle); /* Stop process */ - } --- -2.25.1 - diff --git a/0015-hikptool-fix-print-sas_dqe-info-error-problem.patch b/0015-hikptool-fix-print-sas_dqe-info-error-problem.patch deleted file mode 100644 index b9a73b1..0000000 --- a/0015-hikptool-fix-print-sas_dqe-info-error-problem.patch +++ /dev/null @@ -1,29 +0,0 @@ -From dc15df882b56ec2abff2a5bba45238309a02f5e9 Mon Sep 17 00:00:00 2001 -From: FuJia Ni -Date: Thu, 25 May 2023 09:36:39 +0800 -Subject: [PATCH 18/18] hikptool: fix print sas_dqe info error problem - -the volatile modifier is added because the O2 compilation optimization is enbaled. -As a result, the pointer data is not updated. - -Signed-off-by: FuJia Ni ---- - sas/sas_func/sas_read_dqe.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sas/sas_func/sas_read_dqe.c b/sas/sas_func/sas_read_dqe.c -index fc04682..2f653df 100644 ---- a/sas/sas_func/sas_read_dqe.c -+++ b/sas/sas_func/sas_read_dqe.c -@@ -47,7 +47,7 @@ static int sas_get_dqe(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - - static void print_dqe_info(const void *reg_save, uint32_t reg_num) - { -- struct hisi_sas_dq_info *dqe = (struct hisi_sas_dq_info *)(reg_save); -+ volatile struct hisi_sas_dq_info *dqe = (volatile struct hisi_sas_dq_info *)(reg_save); - - printf("The dqe dw0 information as below:\n"); - printf("abort_flag: %u\n", dqe->dw0.abort_flag); --- -2.25.1 - diff --git a/0016-hikptool-fix-compiling-specifications-check-problem.patch b/0016-hikptool-fix-compiling-specifications-check-problem.patch deleted file mode 100644 index 7d00876..0000000 --- a/0016-hikptool-fix-compiling-specifications-check-problem.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 834b2fe48984703a41aceb2307b8604b93d0e6e8 Mon Sep 17 00:00:00 2001 -From: veega -Date: Thu, 1 Jun 2023 09:56:39 +0800 -Subject: [PATCH] hikptool: fix compiling specifications check problem - -delete -g option for release vesion and add compile option: -Wextra --fno-common -std=gnu11 -Wfloat-equal - -Signed-off-by: veega ---- - CMakeLists.txt | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 6a396e7..174dd8f 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -11,7 +11,8 @@ - - project(hikptool C) - --set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O2 -fPIC -fPIE -Wall") -+set(CMAKE_C_FLAGS -+ "${CMAKE_C_FLAGS} -O2 -fPIC -fPIE -Wall -Wextra -fno-common -std=gnu11 -Wfloat-equal") - set(CMAKE_SKIP_RPATH TRUE) - - macro(get_header_dir_recurse HEADER_DIR_LIST) --- -2.25.1 - diff --git a/0017-Complete-the-developing-of-hikptool-ub_dfx-function.patch b/0017-Complete-the-developing-of-hikptool-ub_dfx-function.patch deleted file mode 100644 index 73dfb8d..0000000 --- a/0017-Complete-the-developing-of-hikptool-ub_dfx-function.patch +++ /dev/null @@ -1,497 +0,0 @@ -From 11887e073c584d64c800ac5183fee43f895fccb1 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 11 May 2023 08:52:35 +0800 -Subject: [PATCH 07/15] Complete the developing of hikptool ub_dfx function - -The hikptool ub_dfx command is submitted for the first time. -This command can be used to dump register information of the LRB, PFA, and PM modules. - -Signed-off-by: Jianqiang Li ---- - libhikptdev/include/hikptdev_plug.h | 1 + - net/hikp_net_lib.h | 9 + - net/ub/ub_dfx/hikp_ub_dfx.c | 319 ++++++++++++++++++++++++++++ - net/ub/ub_dfx/hikp_ub_dfx.h | 100 +++++++++ - tool_lib/tool_lib.h | 2 +- - 5 files changed, 430 insertions(+), 1 deletion(-) - create mode 100644 net/ub/ub_dfx/hikp_ub_dfx.c - create mode 100644 net/ub/ub_dfx/hikp_ub_dfx.h - -diff --git a/libhikptdev/include/hikptdev_plug.h b/libhikptdev/include/hikptdev_plug.h -index 42bea6b..56cea78 100644 ---- a/libhikptdev/include/hikptdev_plug.h -+++ b/libhikptdev/include/hikptdev_plug.h -@@ -43,6 +43,7 @@ enum cmd_module_type { - MAC_MOD = 8, - DPDK_MOD = 9, - CXL_MOD = 10, -+ UB_MOD = 11, - }; - - void hikp_unlock(void); -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index cc99d0c..af0a51d 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -98,6 +98,15 @@ enum roce_cmd_type { - GET_ROCEE_TSP_CMD, - }; - -+enum ub_cmd_type { -+ GET_UNIC_PPP_CMD = 0x1, -+ GET_UB_DFX_INFO_CMD, -+ GET_UB_LINK_INFO_CMD, -+ GET_UB_BP_INFO_CMD, -+ GET_UB_CRD_INFO_CMD, -+ GET_UB_BASIC_INFO_CMD, -+}; -+ - #define HIKP_MAX_PF_NUM 8 - #define HIKP_NIC_MAX_FUNC_NUM 256 - -diff --git a/net/ub/ub_dfx/hikp_ub_dfx.c b/net/ub/ub_dfx/hikp_ub_dfx.c -new file mode 100644 -index 0000000..c50f555 ---- /dev/null -+++ b/net/ub/ub_dfx/hikp_ub_dfx.c -@@ -0,0 +1,319 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "tool_cmd.h" -+#include "hikp_net_lib.h" -+#include "hikp_ub_dfx.h" -+ -+struct ub_dfx_param g_ub_dfx_param = { 0 }; -+ -+static const struct dfx_module_cmd g_ub_dfx_module_parse[] = { -+ {"LRB", LRB_DFX_REG_DUMP}, -+ {"PFA", PFA_DFX_REG_DUMP}, -+ {"PM", PM_DFX_REG_DUMP} -+}; -+ -+static const struct dfx_type_parse g_dfx_type_parse[] = { -+ {INCORRECT_REG_TYPE, WIDTH_32_BIT, "INCORRECT TYPE"}, -+ {TYPE_32_STATS, WIDTH_32_BIT, "32 bit statistics"}, -+ {TYPE_32_RUNNING_STATUS, WIDTH_32_BIT, "32 bit running status"}, -+ {TYPE_64_STATS, WIDTH_64_BIT, "64 bit statistics"}, -+}; -+ -+static void dfx_help_info(const struct major_cmd_ctrl *self) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. ubn0 or 0000:35:00.0"); -+ printf(" %s\n", " [-m/--module LRB/PFA/PM] : this is necessary param\n"); -+} -+ -+static int hikp_ub_dfx_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ dfx_help_info(self); -+ return 0; -+} -+ -+static int hikp_ub_dfx_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_ub_dfx_param.target)); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ return self->err_no; -+ } -+ -+ return 0; -+} -+ -+static int hikp_ub_dfx_module_select(struct major_cmd_ctrl *self, const char *argv) -+{ -+ size_t arr_size = HIKP_ARRAY_SIZE(g_ub_dfx_module_parse); -+ bool is_found; -+ size_t i; -+ -+ for (i = 0; i < arr_size; i++) { -+ is_found = strncmp(argv, (const char *)g_ub_dfx_module_parse[i].module_name, -+ sizeof(g_ub_dfx_module_parse[i].module_name)) == 0; -+ if (is_found) { -+ g_ub_dfx_param.sub_cmd_code = g_ub_dfx_module_parse[i].sub_cmd_code; -+ g_ub_dfx_param.module_idx = i; -+ g_ub_dfx_param.flag |= MODULE_SET_FLAG; -+ return 0; -+ } -+ } -+ dfx_help_info(self); -+ snprintf(self->err_str, sizeof(self->err_str), "-m/--module param error!!!"); -+ self->err_no = -EINVAL; -+ -+ return -EINVAL; -+} -+ -+static int hikp_ub_dfx_get_blk_data(struct hikp_cmd_ret **cmd_ret, -+ uint32_t blk_id, uint32_t sub_cmd_code) -+{ -+ struct hikp_cmd_header req_header = { 0 }; -+ struct ub_dfx_req_para req_data = { 0 }; -+ -+ req_data.bdf = g_ub_dfx_param.target.bdf; -+ req_data.block_id = blk_id; -+ hikp_cmd_init(&req_header, UB_MOD, GET_UB_DFX_INFO_CMD, sub_cmd_code); -+ *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -+ -+ return hikp_rsp_normal_check(*cmd_ret); -+} -+ -+static int hikp_ub_get_first_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t **reg_data, -+ uint32_t *max_dfx_size, uint32_t *version) -+{ -+ struct ub_dfx_rsp *dfx_rsp = NULL; -+ struct hikp_cmd_ret *cmd_ret; -+ int ret; -+ -+ ret = hikp_ub_dfx_get_blk_data(&cmd_ret, 0, g_ub_dfx_param.sub_cmd_code); -+ if (ret < 0) -+ goto err_out; -+ -+ dfx_rsp = (struct ub_dfx_rsp *)(cmd_ret->rsp_data); -+ *version = cmd_ret->version; -+ *rsp_head = dfx_rsp->rsp_head; -+ if (rsp_head->total_blk_num == 0) { -+ /* if total block number is zero, set total type number to zero anyway */ -+ rsp_head->total_type_num = 0; -+ goto err_out; -+ } -+ *max_dfx_size = (uint32_t)(rsp_head->total_blk_num * MAX_DFX_DATA_NUM * sizeof(uint32_t)); -+ *reg_data = (uint32_t *)calloc(1, *max_dfx_size); -+ if (*reg_data == NULL) { -+ HIKP_ERROR_PRINT("malloc log memory 0x%x failed.\n", *max_dfx_size); -+ ret = -ENOMEM; -+ goto err_out; -+ } -+ -+ if (rsp_head->cur_blk_size > *max_dfx_size) { -+ free(*reg_data); -+ *reg_data = NULL; -+ HIKP_ERROR_PRINT("blk0 reg_data copy size error, data size: 0x%x, max size: 0x%x\n", -+ rsp_head->cur_blk_size, *max_dfx_size); -+ ret = -EINVAL; -+ goto err_out; -+ } -+ memcpy(*reg_data, dfx_rsp->reg_data, rsp_head->cur_blk_size); -+ -+ *max_dfx_size -= (uint32_t)rsp_head->cur_blk_size; -+err_out: -+ free(cmd_ret); -+ cmd_ret = NULL; -+ -+ return ret; -+} -+ -+static int hikp_ub_get_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t blk_id, -+ uint32_t *reg_data, uint32_t *max_dfx_size) -+{ -+ struct ub_dfx_rsp *dfx_rsp = NULL; -+ struct hikp_cmd_ret *cmd_ret; -+ int ret; -+ -+ ret = hikp_ub_dfx_get_blk_data(&cmd_ret, blk_id, g_ub_dfx_param.sub_cmd_code); -+ if (ret < 0) -+ goto err_out; -+ -+ dfx_rsp = (struct ub_dfx_rsp *)(cmd_ret->rsp_data); -+ *rsp_head = dfx_rsp->rsp_head; -+ if (rsp_head->cur_blk_size > *max_dfx_size) { -+ HIKP_ERROR_PRINT("blk%u reg_data copy size error, " -+ "data size: 0x%x, max size: 0x%x\n", -+ blk_id, rsp_head->cur_blk_size, *max_dfx_size); -+ ret = -EINVAL; -+ goto err_out; -+ } -+ memcpy(reg_data, dfx_rsp->reg_data, rsp_head->cur_blk_size); -+ *max_dfx_size -= (uint32_t)rsp_head->cur_blk_size; -+ -+err_out: -+ free(cmd_ret); -+ cmd_ret = NULL; -+ -+ return ret; -+} -+ -+static bool is_type_found(uint16_t type_id, uint32_t *index) -+{ -+ size_t arr_size = HIKP_ARRAY_SIZE(g_dfx_type_parse); -+ size_t i; -+ -+ for (i = 0; i < arr_size; i++) { -+ if (g_dfx_type_parse[i].type_id == type_id) { -+ *index = i; -+ return true; -+ } -+ } -+ -+ return false; -+} -+ -+static void hikp_ub_dfx_print_type_head(uint8_t type_id, uint8_t *last_type_id) -+{ -+ uint32_t index = 0; -+ -+ if (type_id != *last_type_id) { -+ printf("-----------------------------------------------------\n"); -+ if (is_type_found(type_id, &index)) -+ printf("type name: %s\n\n", g_dfx_type_parse[index].type_name); -+ else -+ HIKP_WARN_PRINT("type name: unknown type, type id is %u\n\n", type_id); -+ -+ *last_type_id = type_id; -+ } -+} -+ -+static void hikp_ub_dfx_print_b32(uint32_t num, uint32_t *reg_data) -+{ -+ uint32_t word_num = num * WORD_NUM_PER_REG; -+ uint16_t offset; -+ uint32_t value; -+ uint32_t index; -+ uint32_t i; -+ -+ for (i = 0, index = 1; i < word_num; i = i + WORD_NUM_PER_REG, index++) { -+ offset = (uint16_t)HI_GET_BITFIELD(reg_data[i], 0, DFX_REG_ADDR_MASK); -+ value = reg_data[i + 1]; -+ printf("%03u: 0x%04x\t0x%08x\n", index, offset, value); -+ } -+} -+ -+static void hikp_ub_dfx_print_b64(uint32_t num, uint32_t *reg_data) -+{ -+ uint32_t word_num = num * WORD_NUM_PER_REG; -+ uint16_t offset; -+ uint64_t value; -+ uint32_t index; -+ uint32_t i; -+ -+ for (i = 0, index = 1; i < word_num; i = i + WORD_NUM_PER_REG, index++) { -+ offset = (uint16_t)HI_GET_BITFIELD(reg_data[i], 0, DFX_REG_ADDR_MASK); -+ value = (uint64_t)reg_data[i + 1] | -+ (HI_GET_BITFIELD((uint64_t)reg_data[i], DFX_REG_VALUE_OFF, -+ DFX_REG_VALUE_MASK) << BIT_NUM_OF_WORD); -+ printf("%03u: 0x%04x\t0x%016lx\n", index, offset, value); -+ } -+} -+ -+static void hikp_ub_dfx_print(const struct ub_dfx_rsp_head *rsp_head, uint32_t *reg_data) -+{ -+ struct ub_dfx_type_head *type_head; -+ uint8_t last_type_id = 0; -+ uint32_t *ptr = reg_data; -+ uint8_t i; -+ -+ printf("****************** module %s reg dump start ********************\n", -+ g_ub_dfx_module_parse[g_ub_dfx_param.module_idx].module_name); -+ for (i = 0; i < rsp_head->total_type_num; i++) { -+ type_head = (struct ub_dfx_type_head *)ptr; -+ if (type_head->type_id == INCORRECT_REG_TYPE) { -+ HIKP_ERROR_PRINT("No.%u type is incorrect reg type\n", i + 1u); -+ break; -+ } -+ hikp_ub_dfx_print_type_head(type_head->type_id, &last_type_id); -+ ptr++; -+ if (type_head->bit_width == WIDTH_32_BIT) { -+ hikp_ub_dfx_print_b32((uint32_t)type_head->reg_num, ptr); -+ } else if (type_head->bit_width == WIDTH_64_BIT) { -+ hikp_ub_dfx_print_b64((uint32_t)type_head->reg_num, ptr); -+ } else { -+ HIKP_ERROR_PRINT("type%u's bit width error.\n", type_head->type_id); -+ break; -+ } -+ ptr += (uint32_t)type_head->reg_num * WORD_NUM_PER_REG; -+ } -+ printf("################### ====== dump end ====== ######################\n"); -+} -+ -+static void hikp_ub_dfx_execute(struct major_cmd_ctrl *self) -+{ -+ struct ub_dfx_rsp_head rsp_head = { 0 }; -+ struct ub_dfx_rsp_head tmp_head = { 0 }; -+ uint32_t *reg_data = NULL; -+ uint32_t max_dfx_size = 0; -+ uint32_t real_reg_size; -+ uint32_t version; -+ uint32_t i; -+ -+ if (!(g_ub_dfx_param.flag & MODULE_SET_FLAG)) { -+ self->err_no = -EINVAL; -+ snprintf(self->err_str, sizeof(self->err_str), "Please specify a module."); -+ dfx_help_info(self); -+ return; -+ } -+ -+ self->err_no = hikp_ub_get_first_blk_dfx(&rsp_head, ®_data, &max_dfx_size, &version); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "get the first block dfx fail."); -+ return; -+ } -+ real_reg_size = (uint32_t)rsp_head.cur_blk_size; -+ for (i = 1; i < rsp_head.total_blk_num; i++) { -+ self->err_no = hikp_ub_get_blk_dfx(&tmp_head, i, -+ reg_data + (real_reg_size / sizeof(uint32_t)), -+ &max_dfx_size); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "getting block%u reg fail.", i); -+ free(reg_data); -+ return; -+ } -+ real_reg_size += (uint32_t)tmp_head.cur_blk_size; -+ memset(&tmp_head, 0, sizeof(struct ub_dfx_rsp_head)); -+ } -+ -+ printf("DFX cmd version: 0x%x\n\n", version); -+ hikp_ub_dfx_print((const struct ub_dfx_rsp_head *)&rsp_head, reg_data); -+ free(reg_data); -+} -+ -+static void cmd_ub_dfx_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_ub_dfx_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_ub_dfx_help); -+ cmd_option_register("-i", "--interface", true, hikp_ub_dfx_target); -+ cmd_option_register("-m", "--module", true, hikp_ub_dfx_module_select); -+} -+ -+HIKP_CMD_DECLARE("ub_dfx", "dump ub dfx info of hardware", cmd_ub_dfx_init); -diff --git a/net/ub/ub_dfx/hikp_ub_dfx.h b/net/ub/ub_dfx/hikp_ub_dfx.h -new file mode 100644 -index 0000000..4ba37a1 ---- /dev/null -+++ b/net/ub/ub_dfx/hikp_ub_dfx.h -@@ -0,0 +1,100 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_UB_DFX_H -+#define HIKP_UB_DFX_H -+ -+#include "hikp_net_lib.h" -+ -+#define MAX_DFX_DATA_NUM 59 -+#define MODULE_SET_FLAG 0x1 -+ -+enum ub_dfx_cmd_type { -+ LRB_DFX_REG_DUMP = 0, -+ PFA_DFX_REG_DUMP = 1, -+ PM_DFX_REG_DUMP = 2, -+ INVALID_MODULE = 0xFFFFFFFF, -+}; -+ -+enum ub_dfx_reg_type { -+ INCORRECT_REG_TYPE = 0, -+ TYPE_32_STATS = 1, -+ TYPE_32_RUNNING_STATUS = 2, -+ TYPE_64_STATS = 3, -+ TYPE_INVALID = 255, -+}; -+ -+#define MAX_TYPE_NAME_LEN 40 -+ -+enum ub_dfx_reg_width { -+ WIDTH_32_BIT = 32, -+ WIDTH_64_BIT = 64, -+}; -+ -+struct dfx_type_parse { -+ uint8_t type_id; -+ uint8_t bit_width; -+ uint8_t type_name[MAX_TYPE_NAME_LEN]; -+}; -+ -+struct ub_dfx_param { -+ struct tool_target target; -+ uint32_t sub_cmd_code; -+ uint8_t module_idx; -+ uint8_t flag; -+}; -+ -+#define MAX_MODULE_NAME_LEN 20 -+struct dfx_module_cmd { -+ uint8_t module_name[MAX_MODULE_NAME_LEN]; -+ uint32_t sub_cmd_code; -+}; -+ -+struct ub_dfx_req_para { -+ struct bdf_t bdf; -+ uint8_t block_id; -+}; -+ -+struct ub_dfx_type_head { -+ uint8_t type_id; -+ uint8_t bit_width; -+ uint8_t reg_num; -+ uint8_t flag; -+}; -+ -+struct ub_dfx_rsp_head { -+ uint8_t total_blk_num; -+ uint8_t total_type_num; -+ uint8_t cur_blk_size; -+ uint8_t rsvd; -+}; -+ -+/********************************************************* -+ * All registers are returned as key-value pairs, and divided -+ * into three groups of data. -+ * 1. 32bit regs: R0 bit0~bit15: offset, R1 bit0~bit31: value -+ * 2. 64bit regs: R0 bit0~bit15: offset, R0 bit16~bit31 high16 value, R1 bit0~bit31: low32 value -+ *********************************************************/ -+#define DFX_REG_VALUE_OFF 16 -+#define DFX_REG_VALUE_MASK 0xFFFF -+#define DFX_REG_ADDR_MASK 0xFFFF -+ -+#define WORD_NUM_PER_REG 2 -+#define BIT_NUM_OF_WORD 32 -+ -+struct ub_dfx_rsp { -+ struct ub_dfx_rsp_head rsp_head; -+ uint32_t reg_data[MAX_DFX_DATA_NUM]; -+}; -+ -+#endif /* HIKP_UB_DFX_H */ -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index b211175..bf37465 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.0.14" -+#define TOOL_VER "1.0.15" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.36.1.windows.1 diff --git a/0018-Complete-the-developing-of-hikptool-ub_link-function.patch b/0018-Complete-the-developing-of-hikptool-ub_link-function.patch deleted file mode 100644 index 30670e9..0000000 --- a/0018-Complete-the-developing-of-hikptool-ub_link-function.patch +++ /dev/null @@ -1,182 +0,0 @@ -From a9a370cf2127f8317759ef3d963c4c7db89c499c Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 11 May 2023 08:56:30 +0800 -Subject: [PATCH 09/15] Complete the developing of hikptool ub_link function - -The hikptool ub_link command is submitted for the first time. -This command can be used to query the link state machine and status statistics during link establishment. - -Signed-off-by: Jianqiang Li ---- - net/ub/ub_link/hikp_ub_link.c | 98 +++++++++++++++++++++++++++++++++++ - net/ub/ub_link/hikp_ub_link.h | 53 +++++++++++++++++++ - 2 files changed, 151 insertions(+) - create mode 100644 net/ub/ub_link/hikp_ub_link.c - create mode 100644 net/ub/ub_link/hikp_ub_link.h - -diff --git a/net/ub/ub_link/hikp_ub_link.c b/net/ub/ub_link/hikp_ub_link.c -new file mode 100644 -index 0000000..b6353f7 ---- /dev/null -+++ b/net/ub/ub_link/hikp_ub_link.c -@@ -0,0 +1,98 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_ub_link.h" -+ -+static struct ub_link_param g_ub_link_param = { 0 }; -+ -+static int hikp_ub_link_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. ubn0 or 0000:35:00.0"); -+ printf("\n"); -+ return 0; -+} -+ -+static int hikp_ub_link_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_ub_link_param.target)); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ return self->err_no; -+ } -+ -+ return 0; -+} -+ -+static void hikp_ub_link_info_show(const struct ub_link_rsp *info) -+{ -+ printf("%-32s %u\n", "mac id:", info->mac_id); -+ printf("%-32s %s\n", "hdlc link status:", info->hdlc_link ? "true" : "false"); -+ printf("%-32s %s\n", "hpcs link status:", info->hpcs_link ? "true" : "false"); -+ printf("%-32s 0x%08x\n", "hdlc_link_fsm register value:", info->hdlc_link_fsm); -+ printf("%-32s 0x%08x\n", "hpcs_link_fsm register value:", info->hpcs_link_fsm); -+} -+ -+static int hikp_ub_query_link_info(const struct bdf_t *bdf) -+{ -+ struct hikp_cmd_header header = { 0 }; -+ struct ub_link_req_paras req = { 0 }; -+ struct hikp_cmd_ret *cmd_ret; -+ struct ub_link_rsp *rsp; -+ -+ req.bdf = *bdf; -+ hikp_cmd_init(&header, UB_MOD, GET_UB_LINK_INFO_CMD, UB_LINK_INFO_DUMP); -+ cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); -+ if (cmd_ret == NULL || cmd_ret->status != 0) { -+ free(cmd_ret); -+ cmd_ret = NULL; -+ return -EIO; -+ } -+ -+ rsp = (struct ub_link_rsp *)cmd_ret->rsp_data; -+ hikp_ub_link_info_show(rsp); -+ -+ free(cmd_ret); -+ cmd_ret = NULL; -+ return 0; -+} -+ -+static void hikp_ub_link_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ struct bdf_t *bdf = &g_ub_link_param.target.bdf; -+ int ret; -+ -+ ret = hikp_ub_query_link_info(bdf); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "fail to get link info."); -+ self->err_no = ret; -+ return; -+ } -+} -+ -+static void cmd_ub_link_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_ub_link_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_ub_link_help); -+ cmd_option_register("-i", "--interface", true, hikp_ub_link_target); -+} -+ -+HIKP_CMD_DECLARE("ub_link", "get ub link information", cmd_ub_link_init); -diff --git a/net/ub/ub_link/hikp_ub_link.h b/net/ub/ub_link/hikp_ub_link.h -new file mode 100644 -index 0000000..dec5129 ---- /dev/null -+++ b/net/ub/ub_link/hikp_ub_link.h -@@ -0,0 +1,53 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_UB_LINK_H -+#define HIKP_UB_LINK_H -+ -+#include "hikp_net_lib.h" -+ -+enum ub_link_sub_cmd_type { -+ UB_LINK_INFO_DUMP = 0, -+}; -+ -+struct ub_link_param { -+ struct tool_target target; -+}; -+ -+struct ub_link_req_paras { -+ struct bdf_t bdf; -+}; -+ -+struct ub_link_rsp { -+ uint8_t mac_id; -+ uint8_t hdlc_link; -+ uint8_t hpcs_link; -+ uint8_t rsvd; -+ uint32_t hdlc_link_fsm; -+ uint32_t hpcs_link_fsm; -+}; -+ -+#endif /* HIKP_UB_LINK_H */ --- -2.36.1.windows.1 - diff --git a/0019-Complete-the-developing-of-hikptool-ub_bp-function.patch b/0019-Complete-the-developing-of-hikptool-ub_bp-function.patch deleted file mode 100644 index 21e5164..0000000 --- a/0019-Complete-the-developing-of-hikptool-ub_bp-function.patch +++ /dev/null @@ -1,172 +0,0 @@ -From 4e6d7c9e6614b3d7eaa83a513b06a53f93a23484 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 11 May 2023 08:58:01 +0800 -Subject: [PATCH 10/15] Complete the developing of hikptool ub_bp function - -The hikptool ub_bp command is submitted for the first time. -This command can be used to query the back pressure status of the VL in the UB-N. - -Signed-off-by: Jianqiang Li ---- - net/ub/ub_bp/hikp_ub_bp.c | 102 ++++++++++++++++++++++++++++++++++++++ - net/ub/ub_bp/hikp_ub_bp.h | 39 +++++++++++++++ - 2 files changed, 141 insertions(+) - create mode 100644 net/ub/ub_bp/hikp_ub_bp.c - create mode 100644 net/ub/ub_bp/hikp_ub_bp.h - -diff --git a/net/ub/ub_bp/hikp_ub_bp.c b/net/ub/ub_bp/hikp_ub_bp.c -new file mode 100644 -index 0000000..70a9a4b ---- /dev/null -+++ b/net/ub/ub_bp/hikp_ub_bp.c -@@ -0,0 +1,102 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_ub_bp.h" -+ -+static struct ub_bp_param g_ub_bp_param = { 0 }; -+ -+static int hikp_ub_bp_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. ubn0 or 0000:35:00.0"); -+ printf("\n"); -+ return 0; -+} -+ -+static int hikp_ub_bp_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_ub_bp_param.target)); -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ return self->err_no; -+ } -+ return 0; -+} -+ -+static void hikp_ub_bp_info_show(const struct ub_bp_rsp *info) -+{ -+ int bp_val_offset; -+ -+ printf("%-28s : %u\n", "mac id", info->mac_id); -+ printf("%-28s : ", "back pressure status"); -+ -+ for (bp_val_offset = MAX_VL_NUM; bp_val_offset >= 0; bp_val_offset--) { -+ printf("%d", HI_GETBIT(info->bp_val, bp_val_offset) ? 1 : 0); -+ } -+ printf("\n"); -+} -+ -+ -+static int hikp_ub_query_bp(const struct bdf_t *bdf) -+{ -+ struct hikp_cmd_header header = { 0 }; -+ struct ub_bp_req_para req = { 0 }; -+ struct hikp_cmd_ret *cmd_ret; -+ struct ub_bp_rsp *rsp; -+ -+ req.bdf = *bdf; -+ hikp_cmd_init(&header, UB_MOD, GET_UB_BP_INFO_CMD, UB_BP_INFO_DUMP); -+ cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); -+ if (cmd_ret == NULL || cmd_ret->status != 0) { -+ free(cmd_ret); -+ cmd_ret = NULL; -+ return -EIO; -+ } -+ -+ rsp = (struct ub_bp_rsp *)cmd_ret->rsp_data; -+ hikp_ub_bp_info_show(rsp); -+ -+ free(cmd_ret); -+ cmd_ret = NULL; -+ return 0; -+} -+ -+static void hikp_ub_bp_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ struct bdf_t *bdf = &g_ub_bp_param.target.bdf; -+ int ret; -+ -+ ret = hikp_ub_query_bp(bdf); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "fail to get ub bp info."); -+ self->err_no = ret; -+ return; -+ } -+} -+ -+static void cmd_ub_bp_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_ub_bp_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_ub_bp_help); -+ cmd_option_register("-i", "--interface", true, hikp_ub_bp_target); -+} -+ -+HIKP_CMD_DECLARE("ub_bp", "get ub bp information", cmd_ub_bp_init); -diff --git a/net/ub/ub_bp/hikp_ub_bp.h b/net/ub/ub_bp/hikp_ub_bp.h -new file mode 100644 -index 0000000..0bd4740 ---- /dev/null -+++ b/net/ub/ub_bp/hikp_ub_bp.h -@@ -0,0 +1,39 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_UB_BP_H -+#define HIKP_UB_BP_H -+ -+#include "hikp_net_lib.h" -+ -+#define MAX_VL_NUM 17 -+ -+enum ub_bp_sub_cmd_type { -+ UB_BP_INFO_DUMP = 0, -+}; -+ -+struct ub_bp_param { -+ struct tool_target target; -+}; -+ -+struct ub_bp_req_para { -+ struct bdf_t bdf; -+}; -+ -+struct ub_bp_rsp { -+ uint8_t mac_id; -+ uint8_t rsvd[3]; -+ uint32_t bp_val; -+}; -+ -+#endif /* HIKP_UB_BP_H */ --- -2.36.1.windows.1 - diff --git a/0020-Complete-the-developing-of-hikptool-ub_crd-function.patch b/0020-Complete-the-developing-of-hikptool-ub_crd-function.patch deleted file mode 100644 index ca4b8f6..0000000 --- a/0020-Complete-the-developing-of-hikptool-ub_crd-function.patch +++ /dev/null @@ -1,208 +0,0 @@ -From 575dc2b31315c2ea0e9fe488f30f86135e9ea7bf Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 11 May 2023 08:59:11 +0800 -Subject: [PATCH 11/15] Complete the developing of hikptool ub_crd function - -The hikptool ub_crd command is submitted for the first time. -This command is used to query the letter of credit status by reading the register value. - -Signed-off-by: Jianqiang Li ---- - net/ub/ub_crd/hikp_ub_crd.c | 133 ++++++++++++++++++++++++++++++++++++ - net/ub/ub_crd/hikp_ub_crd.h | 44 ++++++++++++ - 2 files changed, 177 insertions(+) - create mode 100644 net/ub/ub_crd/hikp_ub_crd.c - create mode 100644 net/ub/ub_crd/hikp_ub_crd.h - -diff --git a/net/ub/ub_crd/hikp_ub_crd.c b/net/ub/ub_crd/hikp_ub_crd.c -new file mode 100644 -index 0000000..d5d0015 ---- /dev/null -+++ b/net/ub/ub_crd/hikp_ub_crd.c -@@ -0,0 +1,133 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_ub_crd.h" -+ -+static struct ub_crd_param g_ub_crd_param = { 0 }; -+ -+static int hikp_ub_crd_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. ubn0 or 0000:35:00.0"); -+ printf("\n"); -+ return 0; -+} -+ -+static int hikp_ub_crd_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_ub_crd_param.target)); -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ return self->err_no; -+ } -+ return 0; -+} -+ -+static int hikp_ub_show_crd(uint32_t off, struct ub_crd_rsp *crd_rsp, uint32_t num_rows, -+ char const *crds[][2]) -+{ -+ int reg_index; -+ int i; -+ -+ for (i = 0; i < num_rows; i++) { -+ union cut_reg reg; -+ -+ reg_index = off + i; -+ reg.value = crd_rsp->cut_reg_value[reg_index]; -+ if (strcmp(crds[i][0], "NULL") != 0) -+ printf("%-28s : %#x\n", crds[i][0], reg.cut[0]); -+ -+ if (strcmp(crds[i][1], "NULL") != 0) -+ printf("%-28s : %#x\n", crds[i][1], reg.cut[1]); -+ } -+ return off + num_rows; -+} -+ -+static int hikp_ub_query_crd(void) -+{ -+ struct hikp_cmd_header req_header = { 0 }; -+ struct ub_crd_req_para req_data = { 0 }; -+ struct hikp_cmd_ret *cmd_ret = NULL; -+ struct ub_crd_rsp *crd_rsp = NULL; -+ int offset; -+ int ret; -+ -+ char const *init_crds[][2] = { -+ {"CFG_REMOTE_ICRD", "CFG_REMOTE_LCRD"}, -+ {"CFG_REMOTE_CRD_VL6", "CFG_REMOTE_CRD_VL7"}, -+ {"CFG_REMOTE_CRD_VL4", "CFG_REMOTE_CRD_VL5"}, -+ {"CFG_REMOTE_CRD_VL2", "CFG_REMOTE_CRD_VL3"}, -+ {"CFG_REMOTE_CRD_VL0", "CFG_REMOTE_CRD_VL1"}, -+ {"CFG_REMOTE_CRD_VL8", "NULL"} }; -+ -+ char const *temp_crds[][2] = { -+ {"TX_LCRD_VNA_EXIST_NUM", "NULL"}, {"TX_ICRD_VNA_EXIST_NUM", "NULL"}, -+ {"TX_CRD_VN0_EXIST_NUM", "NULL"}, {"TX_CRD_VN1_EXIST_NUM", "NULL"}, -+ {"TX_CRD_VN2_EXIST_NUM", "NULL"}, {"TX_CRD_VN3_EXIST_NUM", "NULL"}, -+ {"TX_CRD_VN4_EXIST_NUM", "NULL"}, {"TX_CRD_VN5_EXIST_NUM", "NULL"}, -+ {"TX_CRD_VN6_EXIST_NUM", "NULL"}, {"TX_CRD_VN7_EXIST_NUM", "NULL"}, -+ {"TX_ACK_EXIST_NUM", "NULL"}, {"TX_ROH_LCRD_LOCAL_NUM", "NULL"} }; -+ -+ hikp_cmd_init(&req_header, UB_MOD, GET_UB_CRD_INFO_CMD, UB_CRD_INFO_DUMP); -+ req_data.bdf = g_ub_crd_param.target.bdf; -+ cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -+ if (cmd_ret == NULL || cmd_ret->status != 0) { -+ free(cmd_ret); -+ cmd_ret = NULL; -+ return -EIO; -+ } -+ -+ crd_rsp = (struct ub_crd_rsp *)(cmd_ret->rsp_data); -+ -+ printf("******************** CREDIT CNT START ********************\n"); -+ printf("------------------- INIT CREDIT START -----------------\n"); -+ offset = hikp_ub_show_crd(0, crd_rsp, NUM_ROWS_INIT_CRDS, init_crds); -+ printf("------------------- INIT CREDIT END --------------------\n"); -+ printf("------------------- TEMP CREDIT START ------------------\n"); -+ offset = hikp_ub_show_crd(offset, crd_rsp, NUM_ROWS_TEMP_CRDS, temp_crds); -+ printf("------------------- TEMP CREDIT END --------------------\n"); -+ printf("********************* CREDIT CNT END *********************\n"); -+ -+ free(cmd_ret); -+ cmd_ret = NULL; -+ return 0; -+} -+ -+static void hikp_ub_crd_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ int ret; -+ -+ ret = hikp_ub_query_crd(); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "fail to get ub crd info."); -+ self->err_no = ret; -+ return; -+ } -+} -+ -+static void cmd_ub_crd_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_ub_crd_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_ub_crd_help); -+ cmd_option_register("-i", "--interface", true, hikp_ub_crd_target); -+} -+ -+HIKP_CMD_DECLARE("ub_crd", "get ub crd information", cmd_ub_crd_init); -diff --git a/net/ub/ub_crd/hikp_ub_crd.h b/net/ub/ub_crd/hikp_ub_crd.h -new file mode 100644 -index 0000000..5dfa38a ---- /dev/null -+++ b/net/ub/ub_crd/hikp_ub_crd.h -@@ -0,0 +1,44 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_UB_CRD_H -+#define HIKP_UB_CRD_H -+ -+#include "hikp_net_lib.h" -+ -+#define MAX_CRD_SIZE 20 -+#define NUM_ROWS_INIT_CRDS 6 -+#define NUM_ROWS_TEMP_CRDS 12 -+ -+enum ub_crd_sub_cmd_type { -+ UB_CRD_INFO_DUMP = 0, -+}; -+ -+union cut_reg { -+ uint32_t value; -+ uint16_t cut[2]; -+}; -+ -+struct ub_crd_param { -+ struct tool_target target; -+}; -+ -+struct ub_crd_req_para { -+ struct bdf_t bdf; -+}; -+ -+struct ub_crd_rsp { -+ uint32_t cut_reg_value[MAX_CRD_SIZE]; -+}; -+ -+#endif /* HIKP_UB_CRD_H */ --- -2.36.1.windows.1 - diff --git a/0021-Complete-the-developing-of-hikptool-ub_info-function.patch b/0021-Complete-the-developing-of-hikptool-ub_info-function.patch deleted file mode 100644 index ac36926..0000000 --- a/0021-Complete-the-developing-of-hikptool-ub_info-function.patch +++ /dev/null @@ -1,164 +0,0 @@ -From 43db6b06b49696cb4fd9556c975b2cf67da4b86b Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 11 May 2023 09:00:25 +0800 -Subject: [PATCH 12/15] Complete the developing of hikptool ub_info function - -The hikptool ub_info command is submitted for the first time. -This command is used to query whether the cloud attack defense function is enabled and query the single-port multi-stack working mode. - -Signed-off-by: Jianqiang Li ---- - net/ub/ub_info/hikp_ub_info.c | 96 +++++++++++++++++++++++++++++++++++ - net/ub/ub_info/hikp_ub_info.h | 37 ++++++++++++++ - 2 files changed, 133 insertions(+) - create mode 100644 net/ub/ub_info/hikp_ub_info.c - create mode 100644 net/ub/ub_info/hikp_ub_info.h - -diff --git a/net/ub/ub_info/hikp_ub_info.c b/net/ub/ub_info/hikp_ub_info.c -new file mode 100644 -index 0000000..3b354dd ---- /dev/null -+++ b/net/ub/ub_info/hikp_ub_info.c -@@ -0,0 +1,96 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_ub_info.h" -+ -+static struct ub_info_param g_ub_info_param = { 0 }; -+ -+static int hikp_ub_info_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. ubn0 or 0000:35:00.0"); -+ printf("\n"); -+ return 0; -+} -+ -+static int hikp_ub_info_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_ub_info_param.target)); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ return self->err_no; -+ } -+ -+ return 0; -+} -+ -+static void hikp_ub_basic_info_show(const struct ub_info_rsp *info) -+{ -+ printf("%-32s : %s\n", "cloud-based attack defense", info->cloud_mode ? "YES" : "NO"); -+ printf("%-32s : %s\n", "pf working mode", info->pf_drv_type ? "UB" : "RDMA"); -+ printf("%-32s : %s\n", "vf working mode", info->vf_drv_type ? "UB" : "RDMA"); -+} -+ -+static int hikp_ub_query_basic_info(const struct bdf_t *bdf) -+{ -+ struct hikp_cmd_header header = { 0 }; -+ struct ub_info_req_para req = { 0 }; -+ struct hikp_cmd_ret *cmd_ret; -+ struct ub_info_rsp *rsp; -+ -+ req.bdf = *bdf; -+ hikp_cmd_init(&header, UB_MOD, GET_UB_BASIC_INFO_CMD, UB_BASIC_INFO_DUMP); -+ cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); -+ if (cmd_ret == NULL || cmd_ret->status != 0) { -+ free(cmd_ret); -+ cmd_ret = NULL; -+ return -EIO; -+ } -+ -+ rsp = (struct ub_info_rsp *)cmd_ret->rsp_data; -+ hikp_ub_basic_info_show(rsp); -+ -+ free(cmd_ret); -+ cmd_ret = NULL; -+ return 0; -+} -+ -+static void hikp_ub_info_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ struct bdf_t *bdf = &g_ub_info_param.target.bdf; -+ int ret; -+ -+ ret = hikp_ub_query_basic_info(bdf); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "fail to get basic info."); -+ self->err_no = ret; -+ return; -+ } -+} -+ -+static void cmd_ub_info_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_ub_info_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_ub_info_help); -+ cmd_option_register("-i", "--interface", true, hikp_ub_info_target); -+} -+ -+HIKP_CMD_DECLARE("ub_info", "get ub basic information", cmd_ub_info_init); -diff --git a/net/ub/ub_info/hikp_ub_info.h b/net/ub/ub_info/hikp_ub_info.h -new file mode 100644 -index 0000000..a9cb858 ---- /dev/null -+++ b/net/ub/ub_info/hikp_ub_info.h -@@ -0,0 +1,37 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_UB_INFO_H -+#define HIKP_UB_INFO_H -+ -+#include "hikp_net_lib.h" -+ -+enum ub_info_sub_cmd_type { -+ UB_BASIC_INFO_DUMP = 0, -+}; -+ -+struct ub_info_param { -+ struct tool_target target; -+}; -+ -+struct ub_info_req_para { -+ struct bdf_t bdf; -+}; -+ -+struct ub_info_rsp { -+ uint32_t cloud_mode; -+ uint32_t pf_drv_type; -+ uint32_t vf_drv_type; -+}; -+ -+#endif /* HIKP_UB_INFO_H */ --- -2.36.1.windows.1 - diff --git a/0022-add-support-query-ip-guid-entries.patch b/0022-add-support-query-ip-guid-entries.patch deleted file mode 100644 index 289d916..0000000 --- a/0022-add-support-query-ip-guid-entries.patch +++ /dev/null @@ -1,638 +0,0 @@ -From b51c3b0cdb438a18a4db2e180b57c84c49dab011 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 11 May 2023 09:23:48 +0800 -Subject: [PATCH 13/15] add support query ip/guid entries - -The function of reading IP and guid entries through the imp command is added. - -Signed-off-by: Jianqiang Li ---- - net/ub/ub_unic/hikp_unic_ppp.c | 468 +++++++++++++++++++++++++++++++++ - net/ub/ub_unic/hikp_unic_ppp.h | 139 ++++++++++ - 2 files changed, 607 insertions(+) - create mode 100644 net/ub/ub_unic/hikp_unic_ppp.c - create mode 100644 net/ub/ub_unic/hikp_unic_ppp.h - -diff --git a/net/ub/ub_unic/hikp_unic_ppp.c b/net/ub/ub_unic/hikp_unic_ppp.c -new file mode 100644 -index 0000000..5325b03 ---- /dev/null -+++ b/net/ub/ub_unic/hikp_unic_ppp.c -@@ -0,0 +1,468 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include "hikp_unic_ppp.h" -+ -+static struct hikp_unic_ppp_hw_resources g_unic_ppp_hw_res = { 0 }; -+static struct unic_ppp_param g_unic_ppp_param = { 0 }; -+ -+static void hikp_unic_ppp_show_ip_tbl(const void *data); -+static void hikp_unic_ppp_show_guid_tbl(const void *data); -+ -+static int hikp_unic_query_ppp_ip_tbl(struct hikp_cmd_header *req_header, -+ const struct bdf_t *bdf, void *data); -+static int hikp_unic_query_ppp_guid_tbl(struct hikp_cmd_header *req_header, -+ const struct bdf_t *bdf, void *data); -+ -+static const struct unic_ppp_feature_cmd g_unic_ppp_feature_cmd[] = { -+ { UNIC_PPP_IP_TBL_NAME, UNIC_IP_TBL_DUMP, true, -+ hikp_unic_query_ppp_ip_tbl, hikp_unic_ppp_show_ip_tbl }, -+ { UNIC_PPP_GUID_TBL_NAME, UNIC_GUID_TBL_DUMP, true, -+ hikp_unic_query_ppp_guid_tbl, hikp_unic_ppp_show_guid_tbl }, -+}; -+ -+static int hikp_unic_ppp_cmd_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. ubn0 or 0000:35:00.0"); -+ printf(" %s, %-24s %s\n", "-du", "--dump", "dump ip or guid table info."); -+ -+ return 0; -+} -+ -+static int hikp_unic_cmd_get_ppp_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_unic_ppp_param.target)); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "unknown device!"); -+ return self->err_no; -+ } -+ -+ return 0; -+} -+ -+static int hikp_unic_cmd_ppp_feature_select(struct major_cmd_ctrl *self, const char *argv) -+{ -+ size_t feat_size = HIKP_ARRAY_SIZE(g_unic_ppp_feature_cmd); -+ size_t i; -+ -+ for (i = 0; i < feat_size; i++) { -+ if (strncmp(argv, g_unic_ppp_feature_cmd[i].feature_name, -+ HIKP_UNIC_PPP_MAX_FEATURE_NAME_LEN) == 0) { -+ g_unic_ppp_param.feature_idx = i; -+ return 0; -+ } -+ } -+ -+ hikp_unic_ppp_cmd_help(self, NULL); -+ snprintf(self->err_str, sizeof(self->err_str), "please input valid dump type."); -+ self->err_no = -EINVAL; -+ -+ return self->err_no; -+} -+ -+static int hikp_unic_ppp_get_blk(struct hikp_cmd_header *req_header, -+ const struct unic_ppp_req_para *req_data, void *buf, -+ size_t buf_len, struct unic_ppp_rsp_head *rsp_head) -+{ -+ struct hikp_cmd_ret *cmd_ret; -+ struct unic_ppp_rsp *rsp; -+ int ret = 0; -+ -+ cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(*req_data)); -+ if (cmd_ret == NULL || cmd_ret->status != 0) { -+ ret = -EIO; -+ goto out; -+ } -+ -+ rsp = (struct unic_ppp_rsp *)cmd_ret->rsp_data; -+ if (rsp->rsp_head.cur_blk_size > buf_len) { -+ HIKP_ERROR_PRINT("unic_ppp block context copy size error, " -+ "buffer size=%llu, data size=%u.\n", -+ buf_len, rsp->rsp_head.cur_blk_size); -+ ret = -EINVAL; -+ goto out; -+ } -+ memcpy(buf, rsp->rsp_data, rsp->rsp_head.cur_blk_size); -+ memcpy(rsp_head, &rsp->rsp_head, sizeof(struct unic_ppp_rsp_head)); -+ -+out: -+ free(cmd_ret); -+ return ret; -+} -+ -+static int hikp_unic_query_ppp_by_blkid(struct hikp_cmd_header *req_header, const struct bdf_t *bdf, -+ void *data, size_t len) -+{ -+ struct unic_ppp_rsp_head rsp_head = { 0 }; -+ struct unic_ppp_req_para req_data = { 0 }; -+ uint32_t total_blk_size; -+ uint8_t blk_id = 0; -+ int ret = 0; -+ -+ req_data.bdf = *bdf; -+ req_data.block_id = blk_id; -+ ret = hikp_unic_ppp_get_blk(req_header, &req_data, data, len, &rsp_head); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Fail to get block-%u context.\n", blk_id); -+ return ret; -+ } -+ total_blk_size = rsp_head.cur_blk_size; -+ -+ for (blk_id = 1; blk_id < rsp_head.total_blk_num; blk_id++) { -+ req_data.block_id = blk_id; -+ ret = hikp_unic_ppp_get_blk(req_header, &req_data, (uint8_t *)data + total_blk_size, -+ len - total_blk_size, &rsp_head); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Fail to get block-%u context.\n", blk_id); -+ return ret; -+ } -+ total_blk_size += rsp_head.cur_blk_size; -+ } -+ -+ return ret; -+} -+ -+static int hikp_unic_get_ppp_entry_hw_res(const struct bdf_t *bdf, -+ struct hikp_unic_ppp_hw_resources *hw_res) -+{ -+ struct hikp_cmd_header req_header = { 0 }; -+ -+ hikp_cmd_init(&req_header, UB_MOD, GET_UNIC_PPP_CMD, UNIC_PPP_ENTRY_HW_SPEC_GET); -+ return hikp_unic_query_ppp_by_blkid(&req_header, bdf, hw_res, -+ sizeof(struct hikp_unic_ppp_hw_resources)); -+} -+ -+static int hikp_unic_ppp_alloc_ip_tbl_entry(const struct hikp_unic_ppp_hw_resources *hw_res, -+ struct unic_ip_tbl *ip_tbl) -+{ -+ uint32_t max_ip_entry_size; -+ -+ max_ip_entry_size = hw_res->ip_max_mem_size + hw_res->ip_overflow_size; -+ if (max_ip_entry_size == 0) { -+ HIKP_ERROR_PRINT("ip tbl query is not supported\n"); -+ return -EIO; -+ } -+ ip_tbl->entry = (struct unic_ip_entry *)calloc(max_ip_entry_size, -+ sizeof(struct unic_ip_entry)); -+ if (ip_tbl->entry == NULL) { -+ HIKP_ERROR_PRINT("fail to alloc ip_table_entry memory.\n"); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+static int hikp_unic_ppp_alloc_guid_tbl_entry(const struct hikp_unic_ppp_hw_resources *hw_res, -+ struct unic_guid_tbl *guid_tbl) -+{ -+ if (hw_res->uc_guid_tbl_size == 0 && hw_res->mc_guid_tbl_size == 0) { -+ HIKP_ERROR_PRINT("guid tbl query is not supported\n"); -+ return -EIO; -+ } -+ guid_tbl->uc_tbl.entry = (struct unic_guid_uc_entry *)calloc(hw_res->uc_guid_tbl_size, -+ sizeof(struct unic_guid_uc_entry)); -+ if (guid_tbl->uc_tbl.entry == NULL) { -+ HIKP_ERROR_PRINT("fail to alloc uc_guid_entry_table memory.\n"); -+ return -ENOMEM; -+ } -+ -+ guid_tbl->mc_tbl.entry = (struct unic_guid_mc_entry *)calloc(hw_res->mc_guid_tbl_size, -+ sizeof(struct unic_guid_mc_entry)); -+ if (guid_tbl->mc_tbl.entry == NULL) { -+ HIKP_ERROR_PRINT("fail to alloc mc_guid_entry_table memory.\n"); -+ free(guid_tbl->uc_tbl.entry); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+static union unic_ppp_feature_info* -+hikp_unic_ppp_data_alloc(const struct unic_ppp_feature_cmd *unic_ppp_cmd, -+ const struct hikp_unic_ppp_hw_resources *hw_res) -+{ -+ union unic_ppp_feature_info *unic_ppp_data; -+ int ret = -1; -+ -+ unic_ppp_data = (union unic_ppp_feature_info *)calloc(1, -+ sizeof(union unic_ppp_feature_info)); -+ if (unic_ppp_data == NULL) { -+ HIKP_ERROR_PRINT("Fail to allocate unic_ppp_feature_info memory.\n"); -+ return NULL; -+ } -+ -+ if (g_unic_ppp_param.feature_idx == UNIC_PPP_IP_FEATURE_IDX) { -+ ret = hikp_unic_ppp_alloc_ip_tbl_entry(hw_res, &unic_ppp_data->ip_tbl); -+ } else if (g_unic_ppp_param.feature_idx == UNIC_PPP_GUID_FEATURE_IDX) { -+ ret = hikp_unic_ppp_alloc_guid_tbl_entry(hw_res, &unic_ppp_data->guid_tbl); -+ } -+ -+ if (ret != 0) { -+ goto out; -+ } -+ -+ return unic_ppp_data; -+out: -+ free(unic_ppp_data); -+ return NULL; -+} -+ -+static int hikp_unic_query_ppp_ip_tbl(struct hikp_cmd_header *req_header, const struct bdf_t *bdf, -+ void *data) -+{ -+ struct unic_ip_tbl *ip_tbl = (struct unic_ip_tbl *)data; -+ struct unic_ppp_rsp_head unic_rsp_head = { 0 }; -+ struct unic_ppp_req_para req_data = { 0 }; -+ uint32_t max_ip_entry_size; -+ uint32_t entry_size = 0; -+ size_t left_buf_len = 0; -+ uint32_t index = 0; -+ int ret = -1; -+ -+ max_ip_entry_size = g_unic_ppp_hw_res.ip_max_mem_size + g_unic_ppp_hw_res.ip_overflow_size; -+ req_data.bdf = *bdf; -+ while (index < max_ip_entry_size) { -+ req_data.cur_entry_idx = index; -+ left_buf_len = sizeof(struct unic_ip_entry) * (max_ip_entry_size - entry_size); -+ ret = hikp_unic_ppp_get_blk(req_header, &req_data, ip_tbl->entry + entry_size, -+ left_buf_len, &unic_rsp_head); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Fail to get the ip entry after index=%u, ret=%d.\n", -+ index, ret); -+ return ret; -+ } -+ entry_size += unic_rsp_head.cur_blk_entry_cnt; -+ index = unic_rsp_head.next_entry_idx; -+ } -+ ip_tbl->entry_size = entry_size; -+ -+ return ret; -+} -+ -+static int hikp_unic_query_ppp_guid_tbl(struct hikp_cmd_header *req_header, -+ const struct bdf_t *bdf, void *data) -+{ -+ struct unic_guid_tbl *guid_tbl = (struct unic_guid_tbl*)data; -+ struct unic_ppp_rsp_head unic_rsp_head = { 0 }; -+ struct unic_ppp_req_para req_data = { 0 }; -+ uint32_t entry_size = 0; -+ size_t left_buf_len = 0; -+ uint32_t index = 0; -+ int ret = -1; -+ -+ req_data.bdf = *bdf; -+ req_data.is_unicast = 1; -+ while (index < g_unic_ppp_hw_res.uc_guid_tbl_size) { -+ req_data.cur_entry_idx = index; -+ left_buf_len = sizeof(struct unic_guid_uc_entry) * -+ (g_unic_ppp_hw_res.uc_guid_tbl_size - entry_size); -+ ret = hikp_unic_ppp_get_blk(req_header, &req_data, -+ guid_tbl->uc_tbl.entry + entry_size, -+ left_buf_len, &unic_rsp_head); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Fail to get the uc_guid entry after index=%u, ret=%d.\n", -+ index, ret); -+ return ret; -+ } -+ entry_size += unic_rsp_head.cur_blk_entry_cnt; -+ index = unic_rsp_head.next_entry_idx; -+ } -+ guid_tbl->uc_tbl.entry_size = entry_size; -+ -+ left_buf_len = 0; -+ entry_size = 0; -+ index = 0; -+ req_data.is_unicast = 0; -+ -+ while (index < g_unic_ppp_hw_res.mc_guid_tbl_size) { -+ req_data.cur_entry_idx = index; -+ left_buf_len = sizeof(struct unic_guid_mc_entry) * -+ (g_unic_ppp_hw_res.mc_guid_tbl_size - entry_size); -+ ret = hikp_unic_ppp_get_blk(req_header, &req_data, -+ guid_tbl->mc_tbl.entry + entry_size, -+ left_buf_len, &unic_rsp_head); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Fail to get the mc_guid entry after index=%u, ret=%d.\n", -+ index, ret); -+ return ret; -+ } -+ entry_size += unic_rsp_head.cur_blk_entry_cnt; -+ index = unic_rsp_head.next_entry_idx; -+ } -+ guid_tbl->mc_tbl.entry_size = entry_size; -+ -+ return ret; -+} -+ -+static void hikp_unic_ppp_show_ip_tbl(const void *data) -+{ -+ struct unic_ip_tbl *ip_tbl = (struct unic_ip_tbl *)data; -+ struct unic_ip_entry *entry; -+ uint16_t *ip_addr_tbl_str; -+ int i, j; -+ -+ printf("ip_table_size = %u\n", ip_tbl->entry_size); -+ printf("index\t| func_id\t| ip_addr\n"); -+ for (i = 0; i < ip_tbl->entry_size; i++) { -+ entry = &ip_tbl->entry[i]; -+ ip_addr_tbl_str = (uint16_t *)entry->ip_addr; -+ printf("%-4u\t| %-3u\t\t| ", entry->index, entry->function_id); -+ for (j = 0; j < IP_ADDR_TBL_LEN - 1; j++) -+ printf("%04x:" , ntohs(ip_addr_tbl_str[j])); -+ printf("%04x\n", ntohs(ip_addr_tbl_str[IP_ADDR_TBL_LEN - 1])); -+ } -+} -+ -+static void hikp_unic_ppp_show_guid_tbl(const void *data) -+{ -+ struct unic_guid_tbl *guid_tbl = (struct unic_guid_tbl *)data; -+ uint32_t cnt; -+ int i; -+ -+ printf("unicast guid num : %u\n", guid_tbl->uc_tbl.entry_size); -+ if (guid_tbl->uc_tbl.entry_size > 0) { -+ printf("| num\t| func id | GUID \n"); -+ for (cnt = 0; cnt < guid_tbl->uc_tbl.entry_size; cnt++) { -+ printf("| %3u\t| %7u | ", cnt, guid_tbl->uc_tbl.entry[cnt].function_id); -+ for (i = 0; i < HIKP_UNIC_GUID_ADDR_LEN - 1; i++) { -+ printf("%02x:", guid_tbl->uc_tbl.entry[cnt].guid_addr[i]); -+ } -+ printf("%02x\n", -+ guid_tbl->uc_tbl.entry[cnt].guid_addr[HIKP_UNIC_GUID_ADDR_LEN - 1]); -+ } -+ } -+ -+ printf("multicast guid num : %u\n", guid_tbl->mc_tbl.entry_size); -+ if (guid_tbl->mc_tbl.entry_size > 0) { -+ printf("| num\t| idx\t| %-48s\t| bitmap\n", "GUID"); -+ for (cnt = 0; cnt < guid_tbl->mc_tbl.entry_size; cnt++) { -+ printf("| %3u\t| %4u\t| ", cnt, guid_tbl->mc_tbl.entry[cnt].idx); -+ for (i = 0; i < HIKP_UNIC_GUID_ADDR_LEN - 1; i++) { -+ printf("%02x:", guid_tbl->mc_tbl.entry[cnt].guid_addr[i]); -+ } -+ printf("%02x\t| ", -+ guid_tbl->mc_tbl.entry[cnt].guid_addr[HIKP_UNIC_GUID_ADDR_LEN - 1]); -+ for (i = HIKP_UNIC_GUID_BITMAP_LEN - 1; i > 0; i--) { -+ printf("%08x:", guid_tbl->mc_tbl.entry[cnt].function_bitmap[i]); -+ } -+ printf("%08x\n", guid_tbl->mc_tbl.entry[cnt].function_bitmap[0]); -+ } -+ } -+} -+ -+static int hikp_unic_ppp_check_input_param(struct major_cmd_ctrl *self, -+ const struct unic_ppp_param *ppp_param) -+{ -+ const struct bdf_t *bdf = &ppp_param->target.bdf; -+ -+ if (bdf->dev_id != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "VF does not support query!"); -+ self->err_no = -EINVAL; -+ return self->err_no; -+ } -+ -+ if (ppp_param->feature_idx == UNIC_PPP_INIT_FEATURE_IDX) { -+ hikp_unic_ppp_cmd_help(self, NULL); -+ snprintf(self->err_str, sizeof(self->err_str), "-du/--dump parameter error!"); -+ self->err_no = -EINVAL; -+ return self->err_no; -+ } -+ -+ return 0; -+} -+ -+static void hikp_unic_ppp_data_free(union unic_ppp_feature_info *unic_ppp_data) -+{ -+ struct unic_guid_tbl *guid_tbl; -+ struct unic_ip_tbl *ip_tbl; -+ -+ if (g_unic_ppp_param.feature_idx == UNIC_PPP_IP_FEATURE_IDX) { -+ ip_tbl = &unic_ppp_data->ip_tbl; -+ free(ip_tbl->entry); -+ } else if (g_unic_ppp_param.feature_idx == UNIC_PPP_GUID_FEATURE_IDX) { -+ guid_tbl = &unic_ppp_data->guid_tbl; -+ free(guid_tbl->uc_tbl.entry); -+ free(guid_tbl->mc_tbl.entry); -+ } -+ -+ free(unic_ppp_data); -+} -+ -+static void hikp_unic_ppp_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ const struct unic_ppp_feature_cmd *unic_ppp_cmd; -+ union unic_ppp_feature_info *unic_ppp_data; -+ struct hikp_cmd_header req_header = {0}; -+ int ret; -+ -+ ret = hikp_unic_ppp_check_input_param(self, &g_unic_ppp_param); -+ if (ret != 0) -+ return; -+ -+ ret = hikp_unic_get_ppp_entry_hw_res(&g_unic_ppp_param.target.bdf, &g_unic_ppp_hw_res); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "fail to obtain unic_ppp hardware resources."); -+ self->err_no = ret; -+ return; -+ } -+ -+ unic_ppp_cmd = &g_unic_ppp_feature_cmd[g_unic_ppp_param.feature_idx]; -+ unic_ppp_data = hikp_unic_ppp_data_alloc(unic_ppp_cmd, &g_unic_ppp_hw_res); -+ if (unic_ppp_data == NULL) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "failed to allocate unic_ppp_data memory!"); -+ self->err_no = -ENOMEM; -+ return; -+ } -+ -+ hikp_cmd_init(&req_header, UB_MOD, GET_UNIC_PPP_CMD, unic_ppp_cmd->sub_cmd_code); -+ ret = unic_ppp_cmd->query(&req_header, &g_unic_ppp_param.target.bdf, unic_ppp_data); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "failed to query %s info, ret = %d.", unic_ppp_cmd->feature_name, ret); -+ self->err_no = ret; -+ goto out; -+ } -+ -+ printf("############## UNIC_PPP: %s info ############\n", unic_ppp_cmd->feature_name); -+ unic_ppp_cmd->show(unic_ppp_data); -+ printf("#################### END #######################\n"); -+ -+out: -+ hikp_unic_ppp_data_free(unic_ppp_data); -+} -+ -+static void cmd_unic_get_ppp_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ g_unic_ppp_param.feature_idx = UNIC_PPP_INIT_FEATURE_IDX; -+ major_cmd->execute = hikp_unic_ppp_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_unic_ppp_cmd_help); -+ cmd_option_register("-i", "--interface", true, hikp_unic_cmd_get_ppp_target); -+ cmd_option_register("-du", "--dump", true, hikp_unic_cmd_ppp_feature_select); -+} -+ -+HIKP_CMD_DECLARE("unic_ppp", "dump ppp info of unic!", cmd_unic_get_ppp_init); -\ No newline at end of file -diff --git a/net/ub/ub_unic/hikp_unic_ppp.h b/net/ub/ub_unic/hikp_unic_ppp.h -new file mode 100644 -index 0000000..c25fabd ---- /dev/null -+++ b/net/ub/ub_unic/hikp_unic_ppp.h -@@ -0,0 +1,139 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_UNIC_PPP_H -+#define HIKP_UNIC_PPP_H -+ -+#include "hikp_net_lib.h" -+ -+#define HIKP_UNIC_IP_ADDR_FMT_SIZE 50 -+#define MAX_IP_ADDR_STR_LEN 50 -+#define IP_ADDR_LEN 16 -+#define IP_ADDR_TBL_LEN 8 -+ -+#define HIKP_UNIC_IP_ADDR_LEN 4 -+#define HIKP_UNIC_GUID_BITMAP_LEN 8 -+#define HIKP_UNIC_GUID_ADDR_LEN 16 -+ -+#define UNIC_PPP_MAX_RSP_DATA 57 -+#define HIKP_UNIC_PPP_MAX_FEATURE_NAME_LEN 20 -+ -+#define UNIC_PPP_IP_TBL_NAME "ip" -+#define UNIC_PPP_GUID_TBL_NAME "guid" -+ -+enum unic_ppp_sub_cmd_type { -+ UNIC_PPP_ENTRY_HW_SPEC_GET = 0, -+ UNIC_IP_TBL_DUMP, -+ UNIC_GUID_TBL_DUMP, -+}; -+ -+enum unic_ppp_feature_idx { -+ UNIC_PPP_IP_FEATURE_IDX = 0, -+ UNIC_PPP_GUID_FEATURE_IDX, -+ UNIC_PPP_INIT_FEATURE_IDX = -1, -+}; -+ -+struct hikp_unic_ppp_hw_resources { -+ uint16_t uc_guid_tbl_size; -+ uint16_t mc_guid_tbl_size; -+ uint32_t ip_max_mem_size; -+ uint32_t ip_overflow_size; -+ uint32_t rsv; -+ /* port information */ -+ uint16_t total_func_num; /* contain PF and VF. */ -+ uint16_t abs_func_id_base; /* The absolute func_id of the first VF in this port. */ -+ uint32_t rsv1[11]; -+}; -+ -+struct unic_ip_entry { -+ uint32_t index; -+ uint32_t function_id; -+ uint32_t ip_addr[HIKP_UNIC_IP_ADDR_LEN]; -+}; -+ -+struct unic_ip_tbl { -+ uint32_t entry_size; -+ struct unic_ip_entry *entry; -+}; -+ -+struct unic_guid_uc_entry { -+ uint32_t function_id; -+ uint8_t guid_addr[HIKP_UNIC_GUID_ADDR_LEN]; -+}; -+ -+struct unic_guid_uc_tbl { -+ uint32_t entry_size; -+ struct unic_guid_uc_entry *entry; -+}; -+ -+struct unic_guid_mc_entry { -+ uint32_t idx; -+ uint8_t guid_addr[HIKP_UNIC_GUID_ADDR_LEN]; -+ uint32_t function_bitmap[8]; -+}; -+ -+struct unic_guid_mc_tbl { -+ uint32_t entry_size; -+ struct unic_guid_mc_entry *entry; -+}; -+ -+struct unic_guid_tbl { -+ struct unic_guid_uc_tbl uc_tbl; -+ struct unic_guid_mc_tbl mc_tbl; -+}; -+ -+union unic_ppp_feature_info { -+ struct unic_guid_tbl guid_tbl; -+ struct unic_ip_tbl ip_tbl; -+}; -+ -+struct unic_ppp_feature_cmd { -+ const char feature_name[HIKP_UNIC_PPP_MAX_FEATURE_NAME_LEN]; -+ uint32_t sub_cmd_code; -+ bool need_query_hw_res; -+ int (*query)(struct hikp_cmd_header *req_header, -+ const struct bdf_t *bdf, void *data); -+ void (*show)(const void *data); -+}; -+ -+struct unic_ppp_param { -+ struct tool_target target; -+ int feature_idx; -+}; -+ -+struct unic_ppp_req_para { -+ struct bdf_t bdf; -+ uint8_t block_id; -+ union { -+ uint8_t is_unicast; /* 1: uc GUID, 0: mc GUID. */ -+ uint8_t rsv; /* firmware ignores it if isn't used to query GUID table. */ -+ }; -+ uint8_t rsv1[2]; -+ uint32_t cur_entry_idx; /* firmware queries GUID/IP table from the value. */ -+}; -+ -+struct unic_ppp_rsp_head { -+ uint8_t total_blk_num; -+ uint8_t cur_blk_size; /* real data size, not contain head size. */ -+ uint16_t rsv; -+ /* firmware must set following fields when query GUID/IP table. */ -+ uint32_t next_entry_idx; -+ uint32_t cur_blk_entry_cnt; -+}; -+ -+typedef struct unic_ppp_rsp { -+ struct unic_ppp_rsp_head rsp_head; /* 12 Byte */ -+ uint32_t rsp_data[UNIC_PPP_MAX_RSP_DATA]; -+} unic_ppp_rsp_t; -+ -+#endif /* HIKP_UNIC_PPP_H */ --- -2.36.1.windows.1 - diff --git a/0023-hikptool-delete-redundant-copyright-notices.patch b/0023-hikptool-delete-redundant-copyright-notices.patch deleted file mode 100644 index 5e0529a..0000000 --- a/0023-hikptool-delete-redundant-copyright-notices.patch +++ /dev/null @@ -1,53 +0,0 @@ -From a170acb3dc9203cd1d9708c9834640df0a916f72 Mon Sep 17 00:00:00 2001 -From: veega -Date: Tue, 16 May 2023 10:39:39 +0800 -Subject: [PATCH] hikptool: delete redundant copyright notices - -Delete redundant copyright notices in hikp_ub_link.h - -Signed-off-by: veega ---- - net/ub/ub_link/hikp_ub_link.h | 13 ------------- - tool_lib/tool_lib.h | 2 +- - 2 files changed, 1 insertion(+), 14 deletions(-) - -diff --git a/net/ub/ub_link/hikp_ub_link.h b/net/ub/ub_link/hikp_ub_link.h -index 14ee912..7c71cb2 100644 ---- a/net/ub/ub_link/hikp_ub_link.h -+++ b/net/ub/ub_link/hikp_ub_link.h -@@ -11,19 +11,6 @@ - * See the Mulan PSL v2 for more details. - */ - --/* -- * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -- * Hikptool is licensed under Mulan PSL v2. -- * You can use this software according to the terms and conditions of the Mulan PSL v2. -- * You may obtain a copy of Mulan PSL v2 at: -- * http://license.coscl.org.cn/MulanPSL2 -- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -- * -- * See the Mulan PSL v2 for more details. -- */ -- - #ifndef HIKP_UB_LINK_H - #define HIKP_UB_LINK_H - -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 9766a7e..6548b57 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.0.15" -+#define TOOL_VER "1.0.16" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.36.1.windows.1 - diff --git a/0024-hikptool-add-pm-trace.patch b/0024-hikptool-add-pm-trace.patch deleted file mode 100644 index 09ad6bb..0000000 --- a/0024-hikptool-add-pm-trace.patch +++ /dev/null @@ -1,343 +0,0 @@ -From c28cf6381c20a707a2898503677facf304896752 Mon Sep 17 00:00:00 2001 -From: Bingquan Mou -Date: Wed, 28 Jun 2023 11:13:03 +0800 -Subject: [PATCH] hikptool: the PM trace function is added to the PCIe module. - -The pm trace function of the PCIe module is added to improve the DFX. - -Signed-off-by: Bingquan Mou ---- - pcie/func_lib/pcie_func/pcie_common.h | 1 + - pcie/func_lib/pcie_func/pcie_link_ltssm.c | 180 +++++++++++++++++++++ - pcie/func_lib/pcie_func/pcie_link_ltssm.h | 7 + - pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c | 17 +- - pcie/usr_cmd/interface/pcie_common_api.c | 1 + - pcie/usr_cmd/interface/pcie_common_api.h | 1 + - 6 files changed, 205 insertions(+), 2 deletions(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_common.h b/pcie/func_lib/pcie_func/pcie_common.h -index 434b4ed..98d9e25 100644 ---- a/pcie/func_lib/pcie_func/pcie_common.h -+++ b/pcie/func_lib/pcie_func/pcie_common.h -@@ -28,6 +28,7 @@ enum pcie_trace_cmd_type { - TRACE_CLEAR = 2, - TRACE_INFO = 3, - TRACE_MODE = 4, -+ TRACE_PM = 5, - }; - - enum pcie_info_cmd_type { -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.c b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -index d57688b..9c4b70c 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.c -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -@@ -43,6 +43,31 @@ union ltssm_state_reg { - uint64_t val; - }; - -+union pm_state_reg { -+ struct { -+ uint64_t pm_state : 6; /* [0:5] */ -+ uint64_t pm_clock : 18; /* [6:23] */ -+ uint64_t reserved1 : 8; /* [24:31] */ -+ uint64_t refclk_stable_vld : 1; /* [32] */ -+ uint64_t enter_l12_case : 1; /* [33] */ -+ uint64_t pm_t_dl_l2_gnt_timeout : 1; /* [34] */ -+ uint64_t pm_t_dl_l1_gnt_timeout : 1; /* [35] */ -+ uint64_t pm_t_dl_l0s_gnt_timeout : 1; /* [36] */ -+ uint64_t pm_t_dl_lastack_timeout : 1; /* [37] */ -+ uint64_t pme_turn_off_vld_hold : 1; /* [38] */ -+ uint64_t pm_blk_tlp_timeout : 1; /* [39] */ -+ uint64_t aspm_nak_vld : 1; /* [40] */ -+ uint64_t retrain_link_vld : 1; /* [41] */ -+ uint64_t pending_dllp_vld : 1; /* [42] */ -+ uint64_t pm_wakeup_tol0_en : 1; /* [43] */ -+ uint64_t mac2pm_rx_data_vld : 1; /* [44] */ -+ uint64_t dfe_req : 1; /* [45] */ -+ uint64_t pm_t_dfe_time_meet : 1; /* [46] */ -+ uint64_t reserved2 : 17; /* [47:63] */ -+ } bits; -+ uint64_t val; -+}; -+ - static int pcie_get_ltssm_trace(uint32_t port_id, uint64_t *ltssm_status, uint32_t *ltssm_num) - { - struct hikp_cmd_header req_header; -@@ -280,3 +305,158 @@ free_cmd_ret: - - return ret; - } -+ -+static int pcie_get_pm_trace(uint32_t port_id, uint64_t *pm_status, uint32_t *pm_num) -+{ -+ struct hikp_cmd_header req_header; -+ struct hikp_cmd_ret *cmd_ret = NULL; -+ struct pcie_trace_req_para req_data = { 0 }; -+ size_t src_size, dst_size; -+ int ret; -+ -+ req_data.port_id = port_id; -+ hikp_cmd_init(&req_header, PCIE_MOD, PCIE_TRACE, TRACE_PM); -+ cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -+ ret = hikp_rsp_normal_check(cmd_ret); -+ if (ret) { -+ Err("PCIe Base", "pcie pm trace cmd_ret check failed, ret: %d.\n", ret); -+ goto free_cmd_ret; -+ } -+ -+ if (cmd_ret->rsp_data_num == 0) { -+ Err("PCIe Base", "without rsp data.\n"); -+ ret = -EINVAL; -+ goto free_cmd_ret; -+ } -+ /* 0: First uint32_t is pm trace num received from TF */ -+ *pm_num = cmd_ret->rsp_data[0]; -+ -+ if ((cmd_ret->rsp_data_num - 1) * sizeof(uint32_t) != (*pm_num) * sizeof(uint64_t)) { -+ Err("PCIe Base", "rsp data number check failed, rsp_data_num: %u, pm_num: %u.\n", -+ cmd_ret->rsp_data_num, *pm_num); -+ ret = -EINVAL; -+ goto free_cmd_ret; -+ } -+ -+ src_size = (*pm_num) * sizeof(uint64_t); -+ dst_size = TRACER_DEPTH * sizeof(uint64_t); -+ if (src_size > dst_size) { -+ Err("PCIe Base", "size check failed, %u > %u.\n", src_size, dst_size); -+ ret = -EINVAL; -+ goto free_cmd_ret; -+ } -+ memcpy(pm_status, (cmd_ret->rsp_data + 1), src_size); -+ -+free_cmd_ret: -+ free(cmd_ret); -+ return ret; -+} -+ -+struct pcie_pm_num_string g_pm_string_table[] = { -+ {0x0, "pm_pme_idle"}, -+ {0x1, "pm_wait_dc_pme_msg_send_out"}, -+ {0x2, "pm_wait_dc_tl_enter_l2"}, -+ {0x3, "pm_wait_dc_dl_enter_l2"}, -+ {0x4, "pm_wait_dc_mac_enter_l2"}, -+ {0x5, "pm_dc_enter_l2"}, -+ {0x6, "pm_wait_dc_tl_enter_pcipm_l1"}, -+ {0x7, "pm_wait_dc_dl_enter_pcipm_l1"}, -+ {0x8, "pm_wait_dc_tl_enter_aspm_l1"}, -+ {0x9, "pm_wait_dc_dl_enter_aspm_l1"}, -+ {0xa, "pm_wait_tl_enter_aspm_l0"}, -+ {0xb, "pm_wait_dl_enter_aspm_l0"}, -+ {0xc, "pm_wait_dc_mac_enter_l1"}, -+ {0xd, "pm_wait_mac_enter_l0s"}, -+ {0xe, "pm_device_in_l0s"}, -+ {0xf, "pm_dc_device_in_l1"}, -+ {0x10, "pm_wait_dc_enter_l0"}, -+ {0x11, "pm_wait_uc_tl_enter_l2"}, -+ {0x12, "pm_wait_uc_dl_enter_l2"}, -+ {0x13, "pm_wait_uc_mac_enter_l2"}, -+ {0x15, "pm_wait_uc_tl_enter_pcipm_l1"}, -+ {0x17, "pm_wait_uc_dl_enter_aspm_l1"}, -+ {0x18, "pm_wait_uc_tl_enter_aspm_l1"}, -+ {0x1a, "pm_wait_uc_dl_enter_pcipm_l1"}, -+ {0x1c, "pm_wait_uc_mac_enter_l1"}, -+ {0x1d, "pm_wait_uc_pme_enter_l1_nak_sent_out"}, -+ {0x1e, "pm_wait_uc_enter_l0"}, -+ {0x20, "pm_device_will_enter_l1_substate"}, -+ {0x21, "pm_device_in_l1_1"}, -+ {0x22, "pm_device_will_exit_l1_substate"}, -+ {0x23, "pm_device_in_l1_2_entry"}, -+ {0x24, "pm_device_in_l1_2_idle"}, -+ {0x25, "pm_device_in_l1_2_exit"}, -+ {-1, "unknown"} /* end of array */ -+}; -+ -+static char *hisi_pcie_pm_string_get(uint32_t pm) -+{ -+ int i = 0; -+ -+ while (g_pm_string_table[i].pm >= 0) { -+ if ((uint32_t)g_pm_string_table[i].pm != pm) { -+ i++; -+ continue; -+ } -+ break; -+ } -+ -+ return g_pm_string_table[i].pm_c; -+} -+ -+static int pcie_print_pm_trace(const uint64_t *pm_status, uint32_t pm_num) -+{ -+ uint32_t i; -+ char *pm_c = NULL; -+ union pm_state_reg pm_val; -+ -+ if (pm_num > TRACER_DEPTH || pm_num == 0) { -+ Err("PCIe Base", "pm_num(%u) is over range or zero\n", pm_num); -+ return -EINVAL; -+ } -+ Info("PCIe Base", "pm tracer:\n"); -+ Info("PCIe Base", "\ttrace state: %llx\n", pm_status[0]); -+ Info("PCIe Base", -+ "\tpm[ii]: BE8: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 " -+ "BD8: 23:6 5:0 : pm state\n"); -+ for (i = 1; i < pm_num; i++) { -+ pm_val.val = pm_status[i]; -+ pm_c = hisi_pcie_pm_string_get((uint32_t)pm_val.bits.pm_state); -+ Info("PCIe Base", -+ "\tpm[%02u]:\t %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x 0x%06x 0x%02x %s\n", -+ i, -+ (uint32_t)pm_val.bits.pm_t_dfe_time_meet, -+ (uint32_t)pm_val.bits.dfe_req, -+ (uint32_t)pm_val.bits.mac2pm_rx_data_vld, -+ (uint32_t)pm_val.bits.pm_wakeup_tol0_en, -+ (uint32_t)pm_val.bits.pending_dllp_vld, -+ (uint32_t)pm_val.bits.retrain_link_vld, -+ (uint32_t)pm_val.bits.aspm_nak_vld, -+ (uint32_t)pm_val.bits.pm_blk_tlp_timeout, -+ (uint32_t)pm_val.bits.pme_turn_off_vld_hold, -+ (uint32_t)pm_val.bits.pm_t_dl_lastack_timeout, -+ (uint32_t)pm_val.bits.pm_t_dl_l0s_gnt_timeout, -+ (uint32_t)pm_val.bits.pm_t_dl_l1_gnt_timeout, -+ (uint32_t)pm_val.bits.pm_t_dl_l2_gnt_timeout, -+ (uint32_t)pm_val.bits.enter_l12_case, -+ (uint32_t)pm_val.bits.refclk_stable_vld, -+ (uint32_t)pm_val.bits.pm_clock, -+ (uint32_t)pm_val.bits.pm_state, -+ pm_c); -+ } -+ -+ return 0; -+} -+ -+int pcie_pm_trace(uint32_t port_id) -+{ -+ int ret; -+ uint32_t pm_num = 0; -+ uint64_t pm_st_save[TRACER_DEPTH]; -+ -+ ret = pcie_get_pm_trace(port_id, pm_st_save, &pm_num); -+ if (ret) -+ return ret; -+ -+ return pcie_print_pm_trace(pm_st_save, pm_num); -+} -\ No newline at end of file -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.h b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -index eb57ead..8f3502b 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.h -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -@@ -18,12 +18,18 @@ - - #define TRACE_STR_NUM 0x20 - #define TRACER_DEPTH 65 -+#define PM_TRACE_STR_NUM 0x28 - - struct pcie_ltssm_num_string { - int ltssm; - char ltssm_c[TRACE_STR_NUM]; - }; - -+struct pcie_pm_num_string { -+ int pm; -+ char pm_c[PM_TRACE_STR_NUM]; -+}; -+ - struct pcie_trace_req_para { - uint32_t port_id; - uint32_t trace_mode; -@@ -51,5 +57,6 @@ int pcie_ltssm_trace_show(uint32_t port_id); - int pcie_ltssm_trace_clear(uint32_t port_id); - int pcie_ltssm_trace_mode_set(uint32_t port_id, uint32_t mode); - int pcie_ltssm_link_status_get(uint32_t port_id); -+int pcie_pm_trace(uint32_t port_id); - - #endif -diff --git a/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c b/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c -index e50b434..8ceb85a 100644 ---- a/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c -+++ b/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c -@@ -37,6 +37,7 @@ static int pcie_trace_help(struct major_cmd_ctrl *self, const char *argv) - printf(" %s, %-25s %s\n", "-m", "--mode", - "set ltssm trace mode val 1:recver_en 0:recver_dis\n"); - printf(" %s, %-25s %s\n", "-f", "--information", "display link information\n"); -+ printf(" %s, %-25s %s\n", "-pm", "--pm-state", "show pm status\n"); - printf("\n"); - - return 0; -@@ -57,6 +58,13 @@ static int pcie_trace_show(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - -+static int pcie_pm_show(struct major_cmd_ctrl *self, const char *argv) -+{ -+ g_trace_cmd.cmd_type = TRACE_PM; -+ -+ return 0; -+} -+ - static int pcie_trace_mode_set(struct major_cmd_ctrl *self, const char *argv) - { - int ret; -@@ -108,6 +116,8 @@ static int pcie_trace_excute_funs_call(int cmd_type) - return comm_api->ltssm_trace_mode_set(port_id, recover_en); - else if (cmd_type == TRACE_INFO) - return comm_api->ltssm_link_information_get(port_id); -+ else if (cmd_type == TRACE_PM) -+ return comm_api->pm_trace(port_id); - else - return -EINVAL; - } -@@ -120,14 +130,16 @@ static void pcie_trace_execute(struct major_cmd_ctrl *self) - "pcie_trace_show success.", - "pcie_trace_clear success.", - "get mac link information success.", -- "pcie_trace_mode_set success." -+ "pcie_trace_mode_set success.", -+ "pcie_pm_trace success." - }; - const char *err_msg[] = { - "pcie_trace sub command type error.", - "pcie_trace_show error.", - "pcie_trace_clear error.", - "get mac link information error.", -- "pcie_trace_mode_set error." -+ "pcie_trace_mode_set error.", -+ "pcie_pm_trace error" - }; - - ret = pcie_trace_excute_funs_call(g_trace_cmd.cmd_type); -@@ -153,6 +165,7 @@ static void cmd_pcie_trace_init(void) - cmd_option_register("-m", "--mode", true, pcie_trace_mode_set); - cmd_option_register("-f", "--information", false, pcie_link_information_get); - cmd_option_register("-i", "--interface", true, pcie_port_id_set); -+ cmd_option_register("-pm", "--pm-state", false, pcie_pm_show); - } - - HIKP_CMD_DECLARE("pcie_trace", "pcie ltssm trace", cmd_pcie_trace_init); -diff --git a/pcie/usr_cmd/interface/pcie_common_api.c b/pcie/usr_cmd/interface/pcie_common_api.c -index 491daf2..8875481 100644 ---- a/pcie/usr_cmd/interface/pcie_common_api.c -+++ b/pcie/usr_cmd/interface/pcie_common_api.c -@@ -27,6 +27,7 @@ struct pcie_comm_api g_tools_api = { - .err_status_clear = pcie_error_state_clear, - .reg_dump = pcie_dumpreg_do_dump, - .reg_read = pcie_reg_read, -+ .pm_trace = pcie_pm_trace, - }; - - -diff --git a/pcie/usr_cmd/interface/pcie_common_api.h b/pcie/usr_cmd/interface/pcie_common_api.h -index 9809575..08d4403 100644 ---- a/pcie/usr_cmd/interface/pcie_common_api.h -+++ b/pcie/usr_cmd/interface/pcie_common_api.h -@@ -37,6 +37,7 @@ struct pcie_comm_api { - int (*err_status_clear)(uint32_t port_id); - int (*reg_dump)(uint32_t port_id, uint32_t dump_level); - int (*reg_read)(uint32_t port_id, uint32_t moudle_id, uint32_t offset); -+ int (*pm_trace)(uint32_t port_id); - }; - - struct pcie_comm_api *pcie_get_comm_api(void); --- -2.33.0 \ No newline at end of file diff --git a/0025-hikptool-add-The-security-compilation-options.patch b/0025-hikptool-add-The-security-compilation-options.patch deleted file mode 100644 index 94cedde..0000000 --- a/0025-hikptool-add-The-security-compilation-options.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 0dfd23227be058ce1618660fbf7e52d7ca6e5f10 Mon Sep 17 00:00:00 2001 -From: veega -Date: Tue, 4 Jul 2023 21:14:47 +0800 -Subject: [PATCH] hikptool: add The security compilation options - -Add -fstack-protector-strong and -D_FORTIFY_SOURCE=2 compiler options -for SP and FS. add -s link options for Strip. - -Signed-off-by: veega ---- - CMakeLists.txt | 6 +++--- - libhikptdev/src/rciep/CMakeLists.txt | 4 +++- - 2 files changed, 6 insertions(+), 4 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 174dd8f..cbd063c 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -11,8 +11,8 @@ - - project(hikptool C) - --set(CMAKE_C_FLAGS -- "${CMAKE_C_FLAGS} -O2 -fPIC -fPIE -Wall -Wextra -fno-common -std=gnu11 -Wfloat-equal") -+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -fPIC -fPIE -Wall -Wextra -fno-common -std=gnu11") -+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wfloat-equal -fstack-protector-strong -D_FORTIFY_SOURCE=2") - set(CMAKE_SKIP_RPATH TRUE) - - macro(get_header_dir_recurse HEADER_DIR_LIST) -@@ -46,5 +46,5 @@ target_link_directories(hikptool PRIVATE ${CMAKE_INSTALL_PREFIX}/lib) - target_link_libraries(hikptool PRIVATE KPTDEV_SO) - target_link_options(hikptool PRIVATE - -Wl,-z,relro,-z,now -Wl,-z,noexecstack -fPIE -pie -- -g -lpthread -ldl -lm -lrt -T ${CMAKE_CURRENT_SOURCE_DIR}/hikp_register.ld) -+ -s -lpthread -ldl -lm -lrt -T ${CMAKE_CURRENT_SOURCE_DIR}/hikp_register.ld) - install(TARGETS hikptool RUNTIME DESTINATION bin OPTIONAL) -diff --git a/libhikptdev/src/rciep/CMakeLists.txt b/libhikptdev/src/rciep/CMakeLists.txt -index b96d621..5017f5b 100644 ---- a/libhikptdev/src/rciep/CMakeLists.txt -+++ b/libhikptdev/src/rciep/CMakeLists.txt -@@ -17,5 +17,7 @@ add_library(KPTDEV_SO SHARED hikpt_rciep.c) - - target_include_directories(KPTDEV_SO PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../include) - -+target_link_options(KPTDEV_SO PRIVATE -Wl,-z,relro,-z,now -Wl,-z,noexecstack -fPIE -pie -s) -+ - set_target_properties(KPTDEV_SO PROPERTIES OUTPUT_NAME ${KPTDEV_SO_NAME} SOVERSION 1 VERSION 1.0.0) --install(TARGETS KPTDEV_SO LIBRARY DESTINATION lib OPTIONAL) -\ No newline at end of file -+install(TARGETS KPTDEV_SO LIBRARY DESTINATION lib OPTIONAL) --- -2.36.1.windows.1 - diff --git a/0026-hikptool-nic_port-cmd-add-print-arb-info-and-phy-inf.patch b/0026-hikptool-nic_port-cmd-add-print-arb-info-and-phy-inf.patch deleted file mode 100644 index c70d7c5..0000000 --- a/0026-hikptool-nic_port-cmd-add-print-arb-info-and-phy-inf.patch +++ /dev/null @@ -1,61 +0,0 @@ -From a5b22e528f0fc0332d736b428e519c6b936e9766 Mon Sep 17 00:00:00 2001 -From: veega -Date: Thu, 13 Jul 2023 12:06:13 +0800 -Subject: [PATCH] hikptool: nic_port cmd add print arb info and phy info - -Add arbitration information print in port ARB LINK INFO display area, and PHY -INFO display area for print PHY config and regs. - -Signed-off-by: veega ---- - net/nic/nic_mac/hikp_nic_port.c | 4 +++- - net/nic/nic_mac/hikp_nic_port.h | 4 ++++ - 2 files changed, 7 insertions(+), 1 deletion(-) - -diff --git a/net/nic/nic_mac/hikp_nic_port.c b/net/nic/nic_mac/hikp_nic_port.c -index 1ff3569..22a6467 100644 ---- a/net/nic/nic_mac/hikp_nic_port.c -+++ b/net/nic/nic_mac/hikp_nic_port.c -@@ -355,6 +355,7 @@ static void mac_cmd_disp_arb_info(const struct mac_cmd_arb_dfx *arb_dfx) - mac_cmd_disp_port_param("Default", &arb_dfx->default_cfg); - mac_cmd_disp_port_param("BIOS", &arb_dfx->bios_cfg); - mac_cmd_disp_port_param("TOOL", &arb_dfx->user_cfg); -+ mac_cmd_disp_port_param("ARB", &arb_dfx->arb_cfg); - mac_cmd_disp_port_param("Final", &arb_dfx->port_cfg); - } - -@@ -443,7 +444,8 @@ static void mac_cmd_port_execute(struct major_cmd_ctrl *self) - } - - port_hw = (struct mac_cmd_port_hardware *)(hw_cmd_ret->rsp_data); -- if (port_hw->port_type == 1) -+ if (port_hw->port_type == HIKP_PORT_TYPE_PHY || -+ port_hw->port_type == HIKP_PORT_TYPE_PHY_SDS) - mask |= MAC_LSPORT_PHY; - - mac_cmd_show_port_dfx(self, mask); -diff --git a/net/nic/nic_mac/hikp_nic_port.h b/net/nic/nic_mac/hikp_nic_port.h -index ac00f55..f6334d0 100644 ---- a/net/nic/nic_mac/hikp_nic_port.h -+++ b/net/nic/nic_mac/hikp_nic_port.h -@@ -95,6 +95,9 @@ enum { - #define HIKP_MAC_PHY_ABI_PAUSE HI_BIT(13) - #define HIKP_MAC_PHY_ABI_ASYM_PAUSE HI_BIT(14) - -+#define HIKP_PORT_TYPE_PHY 1 -+#define HIKP_PORT_TYPE_PHY_SDS 3 -+ - struct mac_item { - uint32_t key; - const char *name; -@@ -151,6 +154,7 @@ struct mac_cmd_arb_dfx { - struct mac_port_param bios_cfg; - struct mac_port_param user_cfg; - struct mac_port_param port_cfg; -+ struct mac_port_param arb_cfg; - }; - - #define MAC_PHY_DFX_REG_NUM 12 --- -2.36.1.windows.1 - diff --git a/0027-hikptool-add-pcie-new-dump.patch b/0027-hikptool-add-pcie-new-dump.patch deleted file mode 100644 index 05bba57..0000000 --- a/0027-hikptool-add-pcie-new-dump.patch +++ /dev/null @@ -1,399 +0,0 @@ -From fd2d8a0b59f77d6783d85ac8f1f24e1cac9261e8 Mon Sep 17 00:00:00 2001 -From: Bingquan Mou -Date: Fri, 21 Jul 2023 14:26:53 +0800 -Subject: [PATCH] hikptool: some registers are added to the PCIe module. - -To improve the DFX, some registers need to be dumped and new registers are added. - -Signed-off-by: Bingquan Mou ---- - pcie/func_lib/pcie_func/pcie_link_ltssm.c | 41 ++-- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 235 +++++++++++++++------- - pcie/func_lib/pcie_func/pcie_reg_dump.h | 5 + - 3 files changed, 189 insertions(+), 92 deletions(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.c b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -index 9c4b70c..09d3b5e 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.c -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -@@ -45,25 +45,25 @@ union ltssm_state_reg { - - union pm_state_reg { - struct { -- uint64_t pm_state : 6; /* [0:5] */ -- uint64_t pm_clock : 18; /* [6:23] */ -- uint64_t reserved1 : 8; /* [24:31] */ -- uint64_t refclk_stable_vld : 1; /* [32] */ -- uint64_t enter_l12_case : 1; /* [33] */ -- uint64_t pm_t_dl_l2_gnt_timeout : 1; /* [34] */ -- uint64_t pm_t_dl_l1_gnt_timeout : 1; /* [35] */ -- uint64_t pm_t_dl_l0s_gnt_timeout : 1; /* [36] */ -- uint64_t pm_t_dl_lastack_timeout : 1; /* [37] */ -- uint64_t pme_turn_off_vld_hold : 1; /* [38] */ -- uint64_t pm_blk_tlp_timeout : 1; /* [39] */ -- uint64_t aspm_nak_vld : 1; /* [40] */ -- uint64_t retrain_link_vld : 1; /* [41] */ -- uint64_t pending_dllp_vld : 1; /* [42] */ -- uint64_t pm_wakeup_tol0_en : 1; /* [43] */ -- uint64_t mac2pm_rx_data_vld : 1; /* [44] */ -- uint64_t dfe_req : 1; /* [45] */ -- uint64_t pm_t_dfe_time_meet : 1; /* [46] */ -- uint64_t reserved2 : 17; /* [47:63] */ -+ uint64_t pm_state : 6; /* [0:5] */ -+ uint64_t pm_clock : 18; /* [6:23] */ -+ uint64_t reserved1 : 8; /* [24:31] */ -+ uint64_t refclk_stable_vld : 1; /* [32] */ -+ uint64_t enter_l12_case : 1; /* [33] */ -+ uint64_t pm_t_dl_l2_gnt_timeout : 1; /* [34] */ -+ uint64_t pm_t_dl_l1_gnt_timeout : 1; /* [35] */ -+ uint64_t pm_t_dl_l0s_gnt_timeout : 1; /* [36] */ -+ uint64_t pm_t_dl_lastack_timeout : 1; /* [37] */ -+ uint64_t pme_turn_off_vld_hold : 1; /* [38] */ -+ uint64_t pm_blk_tlp_timeout : 1; /* [39] */ -+ uint64_t aspm_nak_vld : 1; /* [40] */ -+ uint64_t retrain_link_vld : 1; /* [41] */ -+ uint64_t pending_dllp_vld : 1; /* [42] */ -+ uint64_t pm_wakeup_tol0_en : 1; /* [43] */ -+ uint64_t mac2pm_rx_data_vld : 1; /* [44] */ -+ uint64_t dfe_req : 1; /* [45] */ -+ uint64_t pm_t_dfe_time_meet : 1; /* [46] */ -+ uint64_t reserved2 : 17; /* [47:63] */ - } bits; - uint64_t val; - }; -@@ -423,7 +423,8 @@ static int pcie_print_pm_trace(const uint64_t *pm_status, uint32_t pm_num) - pm_val.val = pm_status[i]; - pm_c = hisi_pcie_pm_string_get((uint32_t)pm_val.bits.pm_state); - Info("PCIe Base", -- "\tpm[%02u]:\t %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x 0x%06x 0x%02x %s\n", -+ "\tpm[%02u]:\t %x %x %x %x %x %x %x %x %x %x %x " -+ "%x %x %x %x 0x%06x 0x%02x %s\n", - i, - (uint32_t)pm_val.bits.pm_t_dfe_time_meet, - (uint32_t)pm_val.bits.dfe_req, -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index e10ff7e..aac3843 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -66,6 +66,8 @@ struct pcie_dumpreg_info g_reg_table_tl[] = { - {0, "TL_RX_LOC_TLP_CNT"}, - {0, "TL_RX_ERR_STATUS"}, - {0, "TL_CFGSPACE_BDF"}, -+ {0, "TL_TX_UR_CNT"}, -+ {0, "TL_RX_ERR_STATUS"}, - }; - - struct pcie_dumpreg_info g_reg_table_dl[] = { -@@ -105,6 +107,28 @@ struct pcie_dumpreg_info g_reg_table_mac[] = { - {0, "MAC_REG_FE_INT_RO"}, - {0, "MAC_REG_CE_INT_RO"}, - {0, "MAC_REG_NFE_INT_RO"}, -+ {0, "MAC_REG_EQ_FIX_LP_TX_PRESET"}, -+ {0, "MAC_REG_ESM_32G_EQ_FIX_LP_TX_PRESET"}, -+ {0, "MAC_REG_ADJ_HILINK_MODE_EN"}, -+ {0, "MAC_REG_EQ_OPT_TX_PRESET_1"}, -+ {0, "MAC_REG_LP_GEN3_TX_PRESET_P1_2"}, -+ {0, "MAC_REG_GEN3_EQ_OPT_TX_PRESET_2"}, -+ {0, "MAC_REG_GEN4_EQ_OPT_TX_PRESET_1"}, -+ {0, "MAC_REG_GEN4_EQ_OPT_TX_PRESET_2"}, -+ {0, "MAC_REG_LP_GEN4_TX_PRESET_P1_1"}, -+ {0, "MAC_REG_LP_GEN4_TX_PRESET_P1_2"}, -+ {0, "MAC_REG_DEBUG_PIPE1"}, -+ {0, "MAC_REG_DEBUG_PIPE2"}, -+ {0, "MAC_REG_DEBUG_PIPE3"}, -+ {0, "MAC_REG_DEBUG_PIPE5"}, -+ {0, "MAC_REG_DEBUG_PIPE7"}, -+ {0, "MAC_REG_DEBUG_PIPE8"}, -+ {0, "MAC_REG_DEBUG_PIPE9"}, -+ {0, "MAC_REG_DEBUG_PIPE10"}, -+ {0, "MAC_REG_DEBUG_PIPE11"}, -+ {0, "MAC_LEAVE_L0_INFO"}, -+ {0, "DFX_APB_LANE_ERROR_STATUS_0"}, -+ {0, "DFX_APB_LANE_ERROR_STATUS_1"}, - }; - - struct pcie_dumpreg_info g_reg_table_pcs[] = { -@@ -115,6 +139,8 @@ struct pcie_dumpreg_info g_reg_table_pcs[] = { - HIKP_PCIE_PCS_LANE_TBL_ENTRY(RECV_DET_OR_PWR_CHAGE), - HIKP_PCIE_PCS_LANE_TBL_ENTRY(EQEVAL_STATUS), - HIKP_PCIE_PCS_LANE_TBL_ENTRY(LANE_INTR_STATUS), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(M_PCS_RPT_REG), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(MSG_BUS_DFX), - }; - - struct pcie_dumpreg_info g_reg_table_iob_tx[] = { -@@ -141,6 +167,71 @@ struct pcie_dumpreg_info g_reg_table_iob_tx[] = { - {0, "IOB_TX_INT_SEVERITY3"}, - {0, "IOB_TX_INT_SEVERITY4"}, - {0, "IOB_TX_INT_SEVERITY5"}, -+ {0, "IOB_TX_TCS_DEC_ERR_INFO_L"}, -+ {0, "IOB_TX_TCS_DEC_ERR_INFO_H"}, -+ {0, "DFX_IOB_TX_P_CNT_0"}, -+ {0, "DFX_IOB_TX_P_CNT_1"}, -+ {0, "DFX_IOB_TX_P_CNT_2"}, -+ {0, "DFX_IOB_TX_P_CNT_3"}, -+ {0, "DFX_IOB_TX_P_CNT_4"}, -+ {0, "DFX_IOB_TX_NP_CNT_0"}, -+ {0, "DFX_IOB_TX_NP_CNT_1"}, -+ {0, "DFX_IOB_TX_NP_CNT_2"}, -+ {0, "DFX_IOB_TX_NP_CNT_3"}, -+ {0, "DFX_IOB_TX_NP_CNT_4"}, -+ {0, "DFX_IOB_TX_NP_CNT_5"}, -+ {0, "DFX_IOB_TX_NP_CNT_6"}, -+ {0, "DFX_IOB_TX_NP_CNT_7"}, -+ {0, "DFX_IOB_TX_NP_CNT_8"}, -+ {0, "DFX_IOB_TX_NP_CNT_9"}, -+ {0, "DFX_IOB_TX_NP_CNT_10"}, -+ {0, "DFX_IOB_TX_NP_CNT_11"}, -+ {0, "DFX_IOB_TX_CPL_CNT_0"}, -+ {0, "DFX_IOB_TX_CPL_CNT_1"}, -+ {0, "DFX_IOB_TX_CPL_CNT_2"}, -+ {0, "DFX_IOB_TX_REQ_CNT"}, -+ {0, "DFX_IOB_TX_STATUS0"}, -+ {0, "DFX_IOB_TX_STATUS1"}, -+ {0, "DFX_IOB_TX_STATUS2"}, -+ {0, "DFX_IOB_TX_STATUS3"}, -+ {0, "DFX_IOB_TX_STATUS4"}, -+ {0, "DFX_IOB_TX_STATUS5"}, -+ {0, "DFX_IOB_TX_ABNORMAL_CNT_0"}, -+ {0, "DFX_IOB_TX_ABNORMAL_CNT_1"}, -+ {0, "DFX_IOB_TX_ABNORMAL_CNT_2"}, -+ {0, "DFX_IOB_TX_ABNORMAL_CNT_3"}, -+ {0, "DFX_IOB_TX_ERROR0"}, -+ {0, "DFX_IOB_TX_ERROR1"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_0"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_1"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_2"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_3"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_4"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_5"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_6"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_7"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_8"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_9"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_10"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_11"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_12"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_13"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_14"}, -+ {0, "DFX_IOB_TX_TCS_NORMAL_CNT_15"}, -+ {0, "DFX_IOB_TX_TCS_P2P_CNT_0"}, -+ {0, "DFX_IOB_TX_TCS_P2P_CNT_1"}, -+ {0, "DFX_IOB_TX_TCS_P2P_CNT_2"}, -+ {0, "DFX_IOB_TX_TCS_P2P_CNT_3"}, -+ {0, "DFX_IOB_TX_TCS_P2P_CNT_4"}, -+ {0, "DFX_IOB_TX_TCS_P2P_CNT_5"}, -+ {0, "DFX_IOB_TX_TCS_P2P_CNT_6"}, -+ {0, "DFX_IOB_TX_TCS_P2P_CNT_7"}, -+ {0, "DFX_IOB_TX_TCS_ARNORAML_CNT_0"}, -+ {0, "DFX_IOB_TX_TCS_ARNORAML_CNT_1"}, -+ {0, "DFX_IOB_TX_TCS_STATUS0"}, -+ {0, "DFX_IOB_TX_TCS_STATUS1"}, -+ {0, "DFX_IOB_TX_TCS_STATUS2"}, -+ {0, "DFX_IOB_TX_TCS_IDLE"}, - }; - - struct pcie_dumpreg_info g_reg_table_iob_rx[] = { -@@ -150,6 +241,19 @@ struct pcie_dumpreg_info g_reg_table_iob_rx[] = { - {0, "IOB_RX_MSI_MSIX_CTRL_0"}, - {0, "IOB_RX_MSI_MSIX_ADDR_HIGH_0"}, - {0, "IOB_RX_MSI_MSIX_ADDR_LOW_0"}, -+ {0, "DFX_IOB_RX_CNT_RX_REQ"}, -+ {0, "DFX_IOB_RX_CNT_LOC_REQ"}, -+ {0, "DFX_IOB_RX_CNT_SEND_AM"}, -+ {0, "DFX_IOB_RX_CNT_SEND_LOC"}, -+ {0, "DFX_IOB_RX_CNT_RESP_RX"}, -+ {0, "DFX_IOB_RX_CNT_RESP_LOC"}, -+ {0, "DFX_IOB_RX_CNT_RESP_RECV"}, -+ {0, "IOB_RX_INT_STATUS"}, -+ {0, "DFX_IOB_RX_AMB_WR_CNT_0"}, -+ {0, "DFX_IOB_RX_AMB_WR_CNT_1"}, -+ {0, "DFX_IOB_RX_AMB_RD_CNT_0"}, -+ {0, "DFX_IOB_RX_AMB_RD_CNT_1"}, -+ {0, "DFX_IOB_RX_AMB_INT_NUM"}, - }; - - struct pcie_dumpreg_info g_reg_table_ap_glb[] = { -@@ -256,6 +360,30 @@ struct pcie_dumpreg_info g_reg_table_core_glb[] = { - {0, "CORE_INT_FE_MSK_2"}, - {0, "CORE_INT_FE_STATUS_2"}, - {0, "CORE_INT_FE_RO_2"}, -+ {0, "PORT07_LINK_MODE"}, -+ {0, "PORT815_LINK_MODE"}, -+}; -+ -+struct pcie_dumpreg_info g_reg_table_core_tl[] = { -+ {0, "TL_PM_AUTO_EXIT_TIME_VALUE"}, -+ {0, "TL_DFX_PM_CORE_FUNC_EN"}, -+ {0, "TL_PM_DFE_TIME_VALUE"}, -+}; -+ -+struct pcie_dumpreg_info g_reg_table_dfx_core_tl[] = { -+ {0, "TL_TX_ASYN_FIFO_ST"}, -+ {0, "TL_TX_INGRESS_CNT"}, -+ {0, "TL_TX_CTRL_EGRESS_CNT"}, -+ {0, "TL_TX_CFG_CNT"}, -+ {0, "TL_TX_MEM_RD_CNT"}, -+ {0, "TL_TX_MEM_WR_CNT"}, -+ {0, "TL_TX_IO_RD_CNT"}, -+ {0, "TL_TX_IO_WR_CNT"}, -+ {0, "TL_TX_MSG_CNT"}, -+ {0, "TL_TX_CPL_CNT"}, -+ {0, "TL_TX_ATOMIC_CNT"}, -+ {0, "TL_TX_CFG_TX_CNT"}, -+ {0, "TL_TX_GEN_CPL_CNT"}, - }; - - static int pcie_create_dumpreg_log_file(uint32_t port_id, uint32_t dump_level) -@@ -315,73 +443,33 @@ static void pcie_dumpreg_write_value_to_file(const char *reg_name, uint32_t val) - } - } - --static void pcie_dumpreg_save_glb_analysis_log(const uint32_t *data, uint32_t data_num) --{ -- uint32_t item_i, data_i; -- -- data_i = 0; -- /* IOB_TX REG */ -- for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_iob_tx) && -- data_i < data_num; item_i++, data_i++) { -- g_reg_table_iob_tx[item_i].val = data[data_i]; -- pcie_dumpreg_write_value_to_file(g_reg_table_iob_tx[item_i].name, -- g_reg_table_iob_tx[item_i].val); -- } -- /* IOB_RX REG */ -- for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_iob_rx) && -- data_i < data_num; item_i++, data_i++) { -- g_reg_table_iob_rx[item_i].val = data[data_i]; -- pcie_dumpreg_write_value_to_file(g_reg_table_iob_rx[item_i].name, -- g_reg_table_iob_rx[item_i].val); -- } -- /* AP_GLB REG */ -- for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_ap_glb) && -- data_i < data_num; item_i++, data_i++) { -- g_reg_table_ap_glb[item_i].val = data[data_i]; -- pcie_dumpreg_write_value_to_file(g_reg_table_ap_glb[item_i].name, -- g_reg_table_ap_glb[item_i].val); -- } -- /* CORE_GLB REG */ -- for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_core_glb) && -- data_i < data_num; item_i++, data_i++) { -- g_reg_table_core_glb[item_i].val = data[data_i]; -- pcie_dumpreg_write_value_to_file(g_reg_table_core_glb[item_i].name, -- g_reg_table_core_glb[item_i].val); -- } -- /* PCS REG */ -- for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_pcs) && -- data_i < data_num; item_i++, data_i++) { -- g_reg_table_pcs[item_i].val = data[data_i]; -- pcie_dumpreg_write_value_to_file(g_reg_table_pcs[item_i].name, -- g_reg_table_pcs[item_i].val); -- } --} -+struct pcie_dumpreg_table g_dump_info_glb[] = { -+ {HIKP_ARRAY_SIZE(g_reg_table_iob_tx), g_reg_table_iob_tx}, -+ {HIKP_ARRAY_SIZE(g_reg_table_iob_rx), g_reg_table_iob_rx}, -+ {HIKP_ARRAY_SIZE(g_reg_table_ap_glb), g_reg_table_ap_glb}, -+ {HIKP_ARRAY_SIZE(g_reg_table_core_glb), g_reg_table_core_glb}, -+ {HIKP_ARRAY_SIZE(g_reg_table_pcs), g_reg_table_pcs}, -+ {HIKP_ARRAY_SIZE(g_reg_table_core_tl), g_reg_table_core_tl}, -+ {HIKP_ARRAY_SIZE(g_reg_table_dfx_core_tl), g_reg_table_dfx_core_tl}, -+}; - --static void pcie_dumpreg_save_port_analysis_log(uint32_t *data, uint32_t data_num) -+struct pcie_dumpreg_table g_dump_info_port[] = { -+ {HIKP_ARRAY_SIZE(g_reg_table_tl), g_reg_table_tl}, -+ {HIKP_ARRAY_SIZE(g_reg_table_dl), g_reg_table_dl}, -+ {HIKP_ARRAY_SIZE(g_reg_table_mac), g_reg_table_mac}, -+}; -+ -+static void pcie_dumpreg_save_analysis_log(const uint32_t *data, uint32_t data_num, -+ struct pcie_dumpreg_table *table, uint32_t size) - { -- uint32_t item_i, data_i; -- -- data_i = 0; -- /* TL REG */ -- for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_tl) && -- data_i < data_num; item_i++, data_i++) { -- g_reg_table_tl[item_i].val = data[data_i]; -- pcie_dumpreg_write_value_to_file(g_reg_table_tl[item_i].name, -- g_reg_table_tl[item_i].val); -- } -- /* DL REG */ -- for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_dl) && -- data_i < data_num; item_i++, data_i++) { -- g_reg_table_dl[item_i].val = data[data_i]; -- pcie_dumpreg_write_value_to_file(g_reg_table_dl[item_i].name, -- g_reg_table_dl[item_i].val); -- } -- /* MAC REG */ -- for (item_i = 0; item_i < HIKP_ARRAY_SIZE(g_reg_table_mac) && -- data_i < data_num; item_i++, data_i++) { -- g_reg_table_mac[item_i].val = data[data_i]; -- pcie_dumpreg_write_value_to_file(g_reg_table_mac[item_i].name, -- g_reg_table_mac[item_i].val); -+ uint32_t i, j, data_i = 0; -+ -+ for (i = 0; i < size; i++) { -+ struct pcie_dumpreg_info *info = table[i].dump_info; -+ for (j = 0; j < table[i].size && data_i < data_num; j++, data_i++) { -+ info[j].val = data[data_i]; -+ pcie_dumpreg_write_value_to_file(info[j].name, info[j].val); -+ } - } - } - -@@ -420,13 +508,14 @@ static int pcie_dumpreg_save_log(uint32_t *data, uint32_t data_num, - - switch (req_data->level) { - case DUMP_GLOBAL_LEVEL: -- expect_data_num = HIKP_ARRAY_SIZE(g_reg_table_iob_tx) + -- HIKP_ARRAY_SIZE(g_reg_table_iob_rx) + HIKP_ARRAY_SIZE(g_reg_table_ap_glb) + -- HIKP_ARRAY_SIZE(g_reg_table_core_glb) + HIKP_ARRAY_SIZE(g_reg_table_pcs); -+ for (i = 0; i < HIKP_ARRAY_SIZE(g_dump_info_glb); i++) { -+ expect_data_num += g_dump_info_glb[i].size; -+ } - break; - case DUMP_PORT_LEVEL: -- expect_data_num = HIKP_ARRAY_SIZE(g_reg_table_tl) + -- HIKP_ARRAY_SIZE(g_reg_table_dl) + HIKP_ARRAY_SIZE(g_reg_table_mac); -+ for (i = 0; i < HIKP_ARRAY_SIZE(g_dump_info_port); i++) { -+ expect_data_num += g_dump_info_port[i].size; -+ } - break; - default: - Err("PCIe DUMPREG", "check dump level failed.\n"); -@@ -441,9 +530,11 @@ static int pcie_dumpreg_save_log(uint32_t *data, uint32_t data_num, - pcie_dumpreg_write_value_to_file(reg_name, data[i]); - } - } else if (req_data->level == DUMP_GLOBAL_LEVEL) { -- pcie_dumpreg_save_glb_analysis_log(data, data_num); -+ pcie_dumpreg_save_analysis_log(data, data_num, -+ g_dump_info_glb, HIKP_ARRAY_SIZE(g_dump_info_glb)); - } else { -- pcie_dumpreg_save_port_analysis_log(data, data_num); -+ pcie_dumpreg_save_analysis_log(data, data_num, -+ g_dump_info_port, HIKP_ARRAY_SIZE(g_dump_info_port)); - } - - return 0; -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.h b/pcie/func_lib/pcie_func/pcie_reg_dump.h -index 4ec1909..cbea2f6 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.h -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.h -@@ -49,6 +49,11 @@ struct pcie_dump_req_para { - uint32_t level; - }; - -+struct pcie_dumpreg_table { -+ uint32_t size; -+ struct pcie_dumpreg_info *dump_info; -+}; -+ - int pcie_dumpreg_do_dump(uint32_t port_id, uint32_t dump_level); - - #endif --- -2.33.0 - diff --git a/0028-hikptool-add-show-CDR-DFX-info-in-nic_port-cmd.patch b/0028-hikptool-add-show-CDR-DFX-info-in-nic_port-cmd.patch deleted file mode 100644 index 9de95ac..0000000 --- a/0028-hikptool-add-show-CDR-DFX-info-in-nic_port-cmd.patch +++ /dev/null @@ -1,201 +0,0 @@ -From c3a11cf422c8edfe07146395c1084fdc45d44486 Mon Sep 17 00:00:00 2001 -From: veega -Date: Wed, 26 Jul 2023 17:35:06 +0800 -Subject: [PATCH] hikptool: add show CDR DFX info in nic_port cmd - -If the port contains CDRs, the nic_port command displays the hardware information of the CDRs, which helps locate port link setup faults. - -Signed-off-by: veega ---- - net/nic/nic_mac/hikp_mac_cmd.h | 1 + - net/nic/nic_mac/hikp_nic_port.c | 72 ++++++++++++++++++++++++++++++++- - net/nic/nic_mac/hikp_nic_port.h | 49 +++++++++++++++++++--- - 3 files changed, 116 insertions(+), 6 deletions(-) - -diff --git a/net/nic/nic_mac/hikp_mac_cmd.h b/net/nic/nic_mac/hikp_mac_cmd.h -index 5f0450a..adaadf4 100644 ---- a/net/nic/nic_mac/hikp_mac_cmd.h -+++ b/net/nic/nic_mac/hikp_mac_cmd.h -@@ -30,6 +30,7 @@ enum mac_port_sub_cmd { - QUERY_PORT_ADAPT_DFX, - QUERY_PORT_PHY_DFX, - QUERY_HOT_PLUG_CARD_DFX, -+ QUERY_PORT_CDR_DFX, - }; - - enum mac_dump_reg_sub_cmd { -diff --git a/net/nic/nic_mac/hikp_nic_port.c b/net/nic/nic_mac/hikp_nic_port.c -index 22a6467..c9f46fc 100644 ---- a/net/nic/nic_mac/hikp_nic_port.c -+++ b/net/nic/nic_mac/hikp_nic_port.c -@@ -405,6 +405,73 @@ static void mac_cmd_show_hot_plug_card(struct major_cmd_ctrl *self) - free(cmd_ret); - } - -+static void mac_cmd_print_cdr_dfx(struct mac_cmd_cdr_dfx *cdr_dfx, struct mac_port_cdr_dfx *info) -+{ -+ struct mac_item type_table[] = { -+ {PORT_CDR_TYPE_A, "cdr_a"}, {PORT_CDR_TYPE_B, "cdr_b"}, -+ }; -+ struct mac_item cdr_a_mode[] = { -+ {CDR_A_MODE_2PLL, "2pll"}, {CDR_A_MODE_FASTPI, "fastpi"}, -+ }; -+ struct mac_item cdr_b_mode[] = { -+ {CDR_B_MODE_PCS, "pcs"}, {CDR_B_MODE_CDR, "cdr"}, -+ }; -+ struct mac_item status_table[] = { -+ {CDR_STATUS_NORMAL, "normal"}, {CDR_STATUS_ERROR, "error"}, -+ }; -+ const char *type_str = mac_get_str(cdr_dfx->cdr_type, -+ type_table, HIKP_ARRAY_SIZE(type_table), "unknown"); -+ const char *mode_str = "NA"; -+ -+ for (uint32_t i = 0; i < cdr_dfx->cdr_num; i++) { -+ if (cdr_dfx->cdr_type == PORT_CDR_TYPE_A) { -+ mode_str = mac_get_str(info->dfx[i].cdr_mode, cdr_a_mode, -+ HIKP_ARRAY_SIZE(cdr_a_mode), "unknown"); -+ } else if (cdr_dfx->cdr_type == PORT_CDR_TYPE_B) { -+ mode_str = mac_get_str(info->dfx[i].cdr_mode, cdr_b_mode, -+ HIKP_ARRAY_SIZE(cdr_b_mode), "unknown"); -+ } -+ printf("\t|0x%-8x%-9u%-10s%-10s%-10s\n", info->dfx[i].cdr_addr, -+ info->dfx[i].cdr_start_lane, type_str, mode_str, -+ mac_get_str(info->dfx[i].cdr_err, -+ status_table, HIKP_ARRAY_SIZE(status_table), "unknown")); -+ } -+} -+ -+static void mac_cmd_disp_cdr_info(struct mac_cmd_cdr_dfx *cdr_dfx) -+{ -+ if (!cdr_dfx->cdr_num) -+ return; -+ -+ printf("\n======================== PORT CDR INFO =======================\n"); -+ printf("direct\t|addr |lane |type |mode |status \n"); -+ printf("----------------------------------------------------------------------------\n"); -+ -+ printf("WIRE"); -+ mac_cmd_print_cdr_dfx(cdr_dfx, &cdr_dfx->wire_cdr); -+ -+ printf("HOST"); -+ mac_cmd_print_cdr_dfx(cdr_dfx, &cdr_dfx->host_cdr); -+} -+ -+static void mac_cmd_show_cdr(struct major_cmd_ctrl *self) -+{ -+ struct mac_cmd_cdr_dfx *cdr_dfx = NULL; -+ struct hikp_cmd_ret *cmd_ret = NULL; -+ int ret; -+ -+ ret = mac_cmd_get_dfx_cfg(QUERY_PORT_CDR_DFX, &cmd_ret); -+ if (ret != 0) { -+ self->err_no = -ENOSPC; -+ snprintf(self->err_str, sizeof(self->err_str), "mac get cdr dfx failed."); -+ return; -+ } -+ -+ cdr_dfx = (struct mac_cmd_cdr_dfx *)(cmd_ret->rsp_data); -+ mac_cmd_disp_cdr_info(cdr_dfx); -+ free(cmd_ret); -+} -+ - static void mac_cmd_show_port_dfx(struct major_cmd_ctrl *self, uint32_t mask) - { - struct mac_cmd_dfx_callback dfx_cb[] = { -@@ -413,6 +480,7 @@ static void mac_cmd_show_port_dfx(struct major_cmd_ctrl *self, uint32_t mask) - {MAC_LSPORT_PHY, mac_cmd_show_phy}, - {MAC_LSPORT_ARB, mac_cmd_show_arb}, - {MAC_HOT_PLUG_CARD, mac_cmd_show_hot_plug_card}, -+ {MAC_LSPORT_CDR, mac_cmd_show_cdr} - }; - size_t size = HIKP_ARRAY_SIZE(dfx_cb); - size_t i; -@@ -425,9 +493,9 @@ static void mac_cmd_show_port_dfx(struct major_cmd_ctrl *self, uint32_t mask) - - static void mac_cmd_port_execute(struct major_cmd_ctrl *self) - { -- uint32_t mask = MAC_LSPORT_LINK | MAC_LSPORT_MAC | MAC_LSPORT_ARB | MAC_HOT_PLUG_CARD; - struct mac_cmd_port_hardware *port_hw = NULL; - struct hikp_cmd_ret *hw_cmd_ret = NULL; -+ uint32_t mask; - int ret; - - if (!g_port_info.port_flag) { -@@ -443,6 +511,8 @@ static void mac_cmd_port_execute(struct major_cmd_ctrl *self) - return; - } - -+ mask = MAC_LSPORT_LINK | MAC_LSPORT_MAC | -+ MAC_LSPORT_ARB | MAC_HOT_PLUG_CARD | MAC_LSPORT_CDR; - port_hw = (struct mac_cmd_port_hardware *)(hw_cmd_ret->rsp_data); - if (port_hw->port_type == HIKP_PORT_TYPE_PHY || - port_hw->port_type == HIKP_PORT_TYPE_PHY_SDS) -diff --git a/net/nic/nic_mac/hikp_nic_port.h b/net/nic/nic_mac/hikp_nic_port.h -index f6334d0..42ab3f9 100644 ---- a/net/nic/nic_mac/hikp_nic_port.h -+++ b/net/nic/nic_mac/hikp_nic_port.h -@@ -16,11 +16,12 @@ - - #include "hikp_net_lib.h" - --#define MAC_LSPORT_LINK HI_BIT(0) --#define MAC_LSPORT_MAC HI_BIT(1) --#define MAC_LSPORT_PHY HI_BIT(2) --#define MAC_LSPORT_ARB HI_BIT(3) --#define MAC_HOT_PLUG_CARD HI_BIT(4) -+#define MAC_LSPORT_LINK HI_BIT(0) -+#define MAC_LSPORT_MAC HI_BIT(1) -+#define MAC_LSPORT_PHY HI_BIT(2) -+#define MAC_LSPORT_ARB HI_BIT(3) -+#define MAC_HOT_PLUG_CARD HI_BIT(4) -+#define MAC_LSPORT_CDR HI_BIT(5) - - enum { - PORT_CFG_NOT_SET = 0, -@@ -186,6 +187,44 @@ struct mac_cmd_phy_info { - struct mac_cmd_phy_dfx phy_dfx; - }; - -+enum { -+ PORT_CDR_TYPE_A = 0, -+ PORT_CDR_TYPE_B, -+}; -+ -+enum { -+ CDR_A_MODE_2PLL = 0, -+ CDR_A_MODE_FASTPI, -+}; -+ -+enum { -+ CDR_B_MODE_PCS = 0, -+ CDR_B_MODE_CDR, -+}; -+ -+enum { -+ CDR_STATUS_NORMAL = 0, -+ CDR_STATUS_ERROR, -+}; -+ -+struct cdr_dfx_info { -+ uint8_t cdr_mode; -+ uint8_t cdr_addr; -+ uint8_t cdr_start_lane; -+ uint8_t cdr_err; /* 0:normal, 1:error */ -+}; -+ -+struct mac_port_cdr_dfx { -+ struct cdr_dfx_info dfx[2]; /* one side reserved max 2 cdr */ -+}; -+ -+struct mac_cmd_cdr_dfx { -+ uint8_t cdr_num; -+ uint8_t cdr_type; -+ struct mac_port_cdr_dfx wire_cdr; -+ struct mac_port_cdr_dfx host_cdr; -+}; -+ - struct mac_cmd_dfx_callback { - uint32_t mask; - void (*show_dfx)(struct major_cmd_ctrl *self); --- -2.36.1.windows.1 diff --git a/0029-hikptool-add-new-cmd-support-query-ncsi-dfx-info.patch b/0029-hikptool-add-new-cmd-support-query-ncsi-dfx-info.patch deleted file mode 100644 index 4696e03..0000000 --- a/0029-hikptool-add-new-cmd-support-query-ncsi-dfx-info.patch +++ /dev/null @@ -1,227 +0,0 @@ -From 1ba7b82d8f933550dd1552143b77d077b7e4f40a Mon Sep 17 00:00:00 2001 -From: veega -Date: Wed, 9 Aug 2023 20:04:27 +0800 -Subject: [PATCH] hikptool: add new cmd support query ncsi dfx info - -Add nic_ncsi cmd for query nic port number of NCSI packets processed by software. - -Signed-off-by: veega ---- - net/hikp_net_lib.h | 5 ++ - net/nic/nic_ncsi/hikp_nic_ncsi.c | 116 +++++++++++++++++++++++++++++++ - net/nic/nic_ncsi/hikp_nic_ncsi.h | 57 +++++++++++++++ - 3 files changed, 178 insertions(+) - create mode 100644 net/nic/nic_ncsi/hikp_nic_ncsi.c - create mode 100644 net/nic/nic_ncsi/hikp_nic_ncsi.h - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index af0a51d..ed984ce 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -78,6 +78,7 @@ enum nic_cmd_type { - GET_FD_INFO_CMD, - GET_FEC_INFO_CMD, - GET_GRO_INFO_CMD, -+ GET_NCSI_INFO_CMD, - }; - - enum roh_cmd_type { -@@ -107,6 +108,10 @@ enum ub_cmd_type { - GET_UB_BASIC_INFO_CMD, - }; - -+enum nic_get_ncsi_sub_cmd { -+ NIC_NCSI_GET_DFX_INFO, -+}; -+ - #define HIKP_MAX_PF_NUM 8 - #define HIKP_NIC_MAX_FUNC_NUM 256 - -diff --git a/net/nic/nic_ncsi/hikp_nic_ncsi.c b/net/nic/nic_ncsi/hikp_nic_ncsi.c -new file mode 100644 -index 0000000..d09e16f ---- /dev/null -+++ b/net/nic/nic_ncsi/hikp_nic_ncsi.c -@@ -0,0 +1,116 @@ -+/* -+ * Copyright (c) 2022 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include "tool_cmd.h" -+#include "hikp_net_lib.h" -+#include "hikptdev_plug.h" -+#include "hikp_nic_ncsi.h" -+ -+static struct nic_ncsi_cmd_info g_ncsi_cmd_info = {0}; -+ -+static void nic_ncsi_cmd_print_dfx_info(struct nic_ncsi_cmd_resp *ncsi_info) -+{ -+ printf("port ncsi: %s\n", ncsi_info->ncsi_en ? "enable" : "disable"); -+ if (!ncsi_info->ncsi_en) -+ return; /* ncsi not enable do not print dfx info */ -+ -+ printf("processing packet statistics\n"); -+ printf("\tncsi_control_total: %u\n", ncsi_info->ncsi_dfx.ncsi_control_total); -+ printf("\tncsi_eth_to_ub_total: %u\n", ncsi_info->ncsi_dfx.ncsi_eth_to_ub_total); -+ printf("\tncsi_ub_to_eth_total: %u\n", ncsi_info->ncsi_dfx.ncsi_ub_to_eth_total); -+ printf("\tncsi_control_good: %u\n", ncsi_info->ncsi_dfx.ncsi_control_good); -+ printf("\tncsi_eth_to_ub_good: %u\n", ncsi_info->ncsi_dfx.ncsi_eth_to_ub_good); -+ printf("\tncsi_ub_to_eth_good: %u\n", ncsi_info->ncsi_dfx.ncsi_ub_to_eth_good); -+ -+ printf("\tncsi_eth_to_ub_arp: %u\n", ncsi_info->ncsi_dfx.ncsi_eth_to_ub_arp); -+ printf("\tncsi_eth_to_ub_free_arp: %u\n", ncsi_info->ncsi_dfx.ncsi_eth_to_ub_free_arp); -+ printf("\tncsi_eth_to_ub_ipv6_ra: %u\n", ncsi_info->ncsi_dfx.ncsi_eth_to_ub_ipv6_ra); -+ printf("\tncsi_eth_to_ub_dhcpv4: %u\n", ncsi_info->ncsi_dfx.ncsi_eth_to_ub_dhcpv4); -+ printf("\tncsi_eth_to_ub_dhcpv6: %u\n", ncsi_info->ncsi_dfx.ncsi_eth_to_ub_dhcpv6); -+ printf("\tncsi_eth_to_ub_lldp: %u\n", ncsi_info->ncsi_dfx.ncsi_eth_to_ub_lldp); -+ -+ printf("\tncsi_ub_to_eth_ipv4: %u\n", ncsi_info->ncsi_dfx.ncsi_ub_to_eth_ipv4); -+ printf("\tncsi_ub_to_eth_ipv6: %u\n", ncsi_info->ncsi_dfx.ncsi_ub_to_eth_ipv6); -+ printf("\tncsi_ub_to_eth_ipnotify: %u\n", ncsi_info->ncsi_dfx.ncsi_ub_to_eth_ipnotify); -+ printf("\tncsi_ub_to_eth_dhcpv4: %u\n", ncsi_info->ncsi_dfx.ncsi_ub_to_eth_dhcpv4); -+ printf("\tncsi_ub_to_eth_dhcpv6: %u\n", ncsi_info->ncsi_dfx.ncsi_ub_to_eth_dhcpv6); -+ printf("\tncsi_ub_to_eth_lldp: %u\n", ncsi_info->ncsi_dfx.ncsi_ub_to_eth_lldp); -+} -+ -+static void nic_ncsi_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ struct hikp_cmd_ret *cmd_resp = NULL; -+ struct hikp_cmd_header req_header = {0}; -+ struct nic_ncsi_cmd_req ncsi_req = {0}; -+ -+ if (!g_ncsi_cmd_info.port_flag) { -+ self->err_no = -EINVAL; -+ snprintf(self->err_str, sizeof(self->err_str), "Need port id."); -+ return; -+ } -+ -+ memcpy(&ncsi_req.bdf, &g_ncsi_cmd_info.target.bdf, sizeof(ncsi_req.bdf)); -+ hikp_cmd_init(&req_header, NIC_MOD, GET_NCSI_INFO_CMD, NIC_NCSI_GET_DFX_INFO); -+ cmd_resp = hikp_cmd_alloc(&req_header, &ncsi_req, sizeof(ncsi_req)); -+ self->err_no = hikp_rsp_normal_check(cmd_resp); -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), "Get ncsi dfx info failed."); -+ goto ERR_OUT; -+ } -+ -+ nic_ncsi_cmd_print_dfx_info((struct nic_ncsi_cmd_resp *)cmd_resp->rsp_data); -+ -+ERR_OUT: -+ free(cmd_resp); -+ cmd_resp = NULL; -+} -+ -+static int nic_ncsi_cmd_get_port_info(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_ncsi_cmd_info.target); -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ return self->err_no; -+ } -+ g_ncsi_cmd_info.port_flag = true; -+ -+ return 0; -+} -+ -+static int nic_ncsi_cmd_show_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. eth0~3 or 0000:35:00.0"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static void cmd_nic_get_ncsi_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ g_ncsi_cmd_info.port_flag = false; -+ major_cmd->option_count = 0; -+ major_cmd->execute = nic_ncsi_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, nic_ncsi_cmd_show_help); -+ cmd_option_register("-i", "--interface", true, nic_ncsi_cmd_get_port_info); -+} -+ -+HIKP_CMD_DECLARE("nic_ncsi", "query nic port ncsi information", cmd_nic_get_ncsi_init); -diff --git a/net/nic/nic_ncsi/hikp_nic_ncsi.h b/net/nic/nic_ncsi/hikp_nic_ncsi.h -new file mode 100644 -index 0000000..a391d20 ---- /dev/null -+++ b/net/nic/nic_ncsi/hikp_nic_ncsi.h -@@ -0,0 +1,57 @@ -+/* -+ * Copyright (c) 2022 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_NIC_NCSI_H -+#define HIKP_NIC_NCSI_H -+ -+#include "hikp_net_lib.h" -+ -+struct nic_ncsi_dfx_info { -+ uint16_t ncsi_control_total; -+ uint16_t ncsi_eth_to_ub_total; -+ uint16_t ncsi_ub_to_eth_total; -+ uint16_t ncsi_control_good; -+ uint16_t ncsi_eth_to_ub_good; -+ uint16_t ncsi_ub_to_eth_good; -+ uint16_t ncsi_eth_to_ub_arp; -+ uint16_t ncsi_eth_to_ub_free_arp; -+ uint16_t ncsi_eth_to_ub_ipv6_ra; -+ uint16_t ncsi_eth_to_ub_dhcpv4; -+ uint16_t ncsi_eth_to_ub_dhcpv6; -+ uint16_t ncsi_eth_to_ub_lldp; -+ uint16_t ncsi_ub_to_eth_ipv4; -+ uint16_t ncsi_ub_to_eth_ipv6; -+ uint16_t ncsi_ub_to_eth_ipnotify; -+ uint16_t ncsi_ub_to_eth_dhcpv4; -+ uint16_t ncsi_ub_to_eth_dhcpv6; -+ uint16_t ncsi_ub_to_eth_lldp; -+}; -+ -+struct nic_ncsi_cmd_resp { -+ uint8_t ncsi_en; -+ uint8_t rsv0[3]; -+ struct nic_ncsi_dfx_info ncsi_dfx; -+ uint32_t rsv1[50]; /* max resp data: 240 Bytes */ -+}; -+ -+struct nic_ncsi_cmd_req { -+ struct bdf_t bdf; -+ uint32_t rsv0[30]; /* max req data: 128 Bytes */ -+}; -+ -+struct nic_ncsi_cmd_info { -+ struct tool_target target; -+ bool port_flag; -+}; -+ -+#endif /* HIKP_NIC_NCSI_H */ --- -2.36.1.windows.1 - diff --git a/0030-hikptool-Don-t-show-gen5.patch b/0030-hikptool-Don-t-show-gen5.patch deleted file mode 100644 index d7640e3..0000000 --- a/0030-hikptool-Don-t-show-gen5.patch +++ /dev/null @@ -1,30 +0,0 @@ -From cd294fef2bb22262bb43d912cb2eedea7c986f77 Mon Sep 17 00:00:00 2001 -From: Bingquan Mou -Date: Sat, 26 Aug 2023 11:10:51 +0800 -Subject: [PATCH] hikptool: fix don`t show gen5 problem - -The mac_rate field does not support displaying the GEN5 rate. -Therefore, the rxl0s_st field is added to determine the rate together with the mac_rate field. - -Signed-off-by: Bingquan Mou ---- - pcie/func_lib/pcie_func/pcie_link_ltssm.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.c b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -index 09d3b5e..156f4be 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.c -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -@@ -213,7 +213,8 @@ static int pcie_print_ltssm_trace(const uint64_t *ltssm_input, uint32_t ltssm_nu - (uint32_t)ltssm_val.bits.any_change_pipe_req, - (uint32_t)ltssm_val.bits.rxl0s_st, - (uint32_t)ltssm_val.bits.train_bit_map1, -- (uint32_t)ltssm_val.bits.mac_rate, -+ (((uint32_t)ltssm_val.bits.rxl0s_st) << 2) | -+ ((uint32_t)ltssm_val.bits.mac_rate), - (uint32_t)ltssm_val.bits.duration_counter, - (uint32_t)ltssm_val.bits.ltssm_state, - ltssm_c); --- -2.33.0 - diff --git a/0031-hikptool-RDMA-Fix-the-missing-bank-ID-in-roce_trp-GE.patch b/0031-hikptool-RDMA-Fix-the-missing-bank-ID-in-roce_trp-GE.patch deleted file mode 100644 index c8a4a02..0000000 --- a/0031-hikptool-RDMA-Fix-the-missing-bank-ID-in-roce_trp-GE.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 074af28f22f7e3dff9637a6366ad0a1ad1dd2852 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Wed, 30 Aug 2023 09:24:49 +0800 -Subject: hikptool/RDMA: Fix the missing bank ID in roce_trp GEN_AC - -Upstream: Yes - -Currently hikptool only accepts bank ID 0 and 1 for roce_trp GEN_AC. -The firmware then multiplies the bank ID received from hikptool by 2 -and converts it to 0 and 2. But actually there are 4 banks in GEN_AC -and each of them is independent. - -To fix the problem, both hikptool and firmware should be modified. -This patch modifies the bank ID limit form 2 to 4 in hikptool. - -Signed-off-by: Junxian Huang ---- - net/roce/roce_trp/hikp_roce_trp.c | 2 +- - net/roce/roce_trp/hikp_roce_trp.h | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index 8befb06..bf22484 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -32,7 +32,7 @@ static int hikp_roce_trp_help(struct major_cmd_ctrl *self, const char *argv) - "this is necessary param COMMON/TRP_RX/GEN_AC/PAYL"); - printf(" %s, %-25s %s\n", "-b", "--bank=", - "[option]set which bank to read. (default 0) " -- "COMMON : 0~3\n PAYL: 0~1\n GEN_AC : 0~1\n "); -+ "COMMON : 0~3\n PAYL: 0~1\n GEN_AC : 0~3\n "); - printf("\n"); - - return 0; -diff --git a/net/roce/roce_trp/hikp_roce_trp.h b/net/roce/roce_trp/hikp_roce_trp.h -index db58216..80d28af 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.h -+++ b/net/roce/roce_trp/hikp_roce_trp.h -@@ -25,7 +25,7 @@ - } - #define TRP_MAX_BANK_NUM 0x3 - #define PAYL_MAX_BANK_NUM 0x1 --#define GAC_MAX_BANK_NUM 0x1 -+#define GAC_MAX_BANK_NUM 0x3 - #define PER_TRP_DATA_NUM 2 - - struct roce_trp_req_param { --- -2.30.0 - diff --git a/0032-hikptool-fix-the-memory-leak-risk-problem.patch b/0032-hikptool-fix-the-memory-leak-risk-problem.patch deleted file mode 100644 index 6752e0b..0000000 --- a/0032-hikptool-fix-the-memory-leak-risk-problem.patch +++ /dev/null @@ -1,486 +0,0 @@ -From a5efd8daf63f13196ea38e2a2cd9e41c3d4be82b Mon Sep 17 00:00:00 2001 -From: veega -Date: Wed, 6 Sep 2023 12:01:21 +0800 -Subject: [PATCH] hikptool: fix the memory leak risk problem - -After the framework fails to apply for memory, the memory needs to be released. The framework returns a processing failure message. The module needs to exit and release the memory. - -Signed-off-by: veega ---- - net/nic/nic_dfx/hikp_nic_dfx.c | 17 +++++++++-------- - net/nic/nic_fd/hikp_nic_fd.c | 6 ++++-- - net/nic/nic_info/hikp_nic_info.c | 4 +++- - net/nic/nic_log/hikp_nic_log.c | 8 ++++---- - net/nic/nic_ppp/hikp_nic_ppp.c | 5 +++-- - net/nic/nic_qos/hikp_nic_qos.c | 5 +++-- - net/nic/nic_queue/hikp_nic_queue.c | 5 +++-- - net/nic/nic_rss/hikp_nic_rss.c | 5 +++-- - net/roce/roce_pkt/hikp_roce_pkt.c | 11 +++++++---- - net/roce/roce_scc/hikp_roce_scc.c | 11 +++++++---- - net/roce/roce_trp/hikp_roce_trp.c | 11 +++++++---- - net/roce/roce_tsp/hikp_roce_tsp.c | 11 +++++++---- - sas/sas_func/sas_analy_queue.c | 3 ++- - sas/sas_func/sas_dump_reg.c | 3 ++- - sas/sas_func/sas_read_dev.c | 3 ++- - sas/sas_func/sas_read_dqe.c | 3 ++- - sas/sas_func/sas_read_errcode.c | 3 ++- - sata/sata_func/sata_dump_reg.c | 3 ++- - serdes/hikp_serdes.c | 8 ++++---- - socip/hikp_socip_dumpreg.c | 4 +++- - 20 files changed, 79 insertions(+), 50 deletions(-) - -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.c b/net/nic/nic_dfx/hikp_nic_dfx.c -index 3584493..c734ce0 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.c -+++ b/net/nic/nic_dfx/hikp_nic_dfx.c -@@ -123,12 +123,12 @@ static int hikp_nic_get_first_blk_dfx(struct nic_dfx_rsp_head_t *rsp_head, uint3 - uint32_t *max_dfx_size, uint32_t *version) - { - struct nic_dfx_rsp_t *dfx_rsp = NULL; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - int ret; - - ret = hikp_nic_dfx_get_blk(&cmd_ret, 0, g_dfx_param.sub_cmd_code); - if (ret < 0) -- return ret; -+ goto err_out; - - dfx_rsp = (struct nic_dfx_rsp_t *)(cmd_ret->rsp_data); - *version = cmd_ret->version; -@@ -168,12 +168,12 @@ static int hikp_nic_get_blk_dfx(struct nic_dfx_rsp_head_t *rsp_head, uint32_t bl - uint32_t *reg_data, uint32_t *max_dfx_size) - { - struct nic_dfx_rsp_t *dfx_rsp = NULL; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - int ret; - - ret = hikp_nic_dfx_get_blk(&cmd_ret, blk_id, g_dfx_param.sub_cmd_code); - if (ret < 0) -- return ret; -+ goto err_out; - - dfx_rsp = (struct nic_dfx_rsp_t *)(cmd_ret->rsp_data); - *rsp_head = dfx_rsp->rsp_head; -@@ -181,16 +181,17 @@ static int hikp_nic_get_blk_dfx(struct nic_dfx_rsp_head_t *rsp_head, uint32_t bl - HIKP_ERROR_PRINT("blk%u reg_data copy size error, " - "data size: 0x%x, max size: 0x%x\n", - blk_id, rsp_head->cur_blk_size, *max_dfx_size); -- free(cmd_ret); -- cmd_ret = NULL; -- return -EINVAL; -+ ret = -EINVAL; -+ goto err_out; - } - memcpy(reg_data, dfx_rsp->reg_data, rsp_head->cur_blk_size); - *max_dfx_size -= (uint32_t)rsp_head->cur_blk_size; -+ -+err_out: - free(cmd_ret); - cmd_ret = NULL; - -- return 0; -+ return ret; - } - - static int cmd_dfx_module_select(struct major_cmd_ctrl *self, const char *argv) -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index 5a87c30..57bc94b 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -558,8 +558,10 @@ static int hikp_nic_fd_get_blk(struct hikp_cmd_header *req_header, - int ret = 0; - - cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(*req_data)); -- if (cmd_ret == NULL) -- return -EIO; -+ if (hikp_rsp_normal_check(cmd_ret)) { -+ ret = -EIO; -+ goto out; -+ } - - rsp = (struct nic_fd_rsp *)cmd_ret->rsp_data; - if (rsp->rsp_head.cur_blk_size > buf_len) { -diff --git a/net/nic/nic_info/hikp_nic_info.c b/net/nic/nic_info/hikp_nic_info.c -index 1853d95..d84ca18 100644 ---- a/net/nic/nic_info/hikp_nic_info.c -+++ b/net/nic/nic_info/hikp_nic_info.c -@@ -64,12 +64,14 @@ static int hikp_nic_get_hw_info(struct hikp_cmd_ret **cmd_ret) - static int hikp_nic_get_curr_die_info(void) - { - struct nic_info_rsp_t *info_rsp = NULL; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - int ret; - - ret = hikp_nic_get_hw_info(&cmd_ret); - if (ret != 0) { - HIKP_ERROR_PRINT("Get chip info fail.\n"); -+ free(cmd_ret); -+ cmd_ret = NULL; - return ret; - } - info_rsp = (struct nic_info_rsp_t *)(cmd_ret->rsp_data); -diff --git a/net/nic/nic_log/hikp_nic_log.c b/net/nic/nic_log/hikp_nic_log.c -index 527f9e9..5cafe4e 100644 ---- a/net/nic/nic_log/hikp_nic_log.c -+++ b/net/nic/nic_log/hikp_nic_log.c -@@ -96,13 +96,13 @@ static int hikp_nic_get_first_blk_info(uint32_t *total_blk_num, - uint32_t *cur_blk_size, uint8_t **log_data) - { - struct nic_log_rsp_data *log_rsp = NULL; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - uint32_t log_size; - int ret; - - ret = hikp_nic_get_blk_log(&cmd_ret, 0); - if (ret < 0) -- return ret; -+ goto err_out; - - log_rsp = (struct nic_log_rsp_data *)(cmd_ret->rsp_data); - log_size = (uint32_t)(log_rsp->total_blk_num * MAX_LOG_DATA_NUM * sizeof(uint32_t)); -@@ -132,12 +132,12 @@ static int hikp_nic_get_log_info(uint32_t blk_id, uint32_t *cur_blk_size, uint8_ - uint32_t max_log_size, uint32_t *blk_num) - { - struct nic_log_rsp_data *log_rsp = NULL; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - int ret; - - ret = hikp_nic_get_blk_log(&cmd_ret, blk_id); - if (ret) -- return ret; -+ goto err_out; - - log_rsp = (struct nic_log_rsp_data *)(cmd_ret->rsp_data); - *cur_blk_size = (uint32_t)log_rsp->cur_blk_size; -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index 28c867d..b71fc48 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -482,8 +482,9 @@ static int hikp_nic_ppp_get_blk(struct hikp_cmd_header *req_header, - int ret = 0; - - cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(*req_data)); -- if (cmd_ret == NULL) -- return -EIO; -+ ret = hikp_rsp_normal_check(cmd_ret); -+ if (ret) -+ goto out; - - rsp = (struct nic_ppp_rsp *)cmd_ret->rsp_data; - if (rsp->rsp_head.cur_blk_size > buf_len) { -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index 2d55e45..6c2db1d 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -143,9 +143,10 @@ static int hikp_nic_qos_get_blk(struct hikp_cmd_header *req_header, - int ret = 0; - - cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(*req_data)); -- if (cmd_ret == NULL) { -+ ret = hikp_rsp_normal_check(cmd_ret); -+ if (ret) { - HIKP_ERROR_PRINT("failed to get block-%u context.\n", req_data->block_id); -- return -EIO; -+ goto out; - } - - rsp = (struct nic_qos_rsp *)cmd_ret->rsp_data; -diff --git a/net/nic/nic_queue/hikp_nic_queue.c b/net/nic/nic_queue/hikp_nic_queue.c -index 37460c0..f229e09 100644 ---- a/net/nic/nic_queue/hikp_nic_queue.c -+++ b/net/nic/nic_queue/hikp_nic_queue.c -@@ -239,9 +239,10 @@ static int hikp_nic_queue_get_blk(struct hikp_cmd_header *req_header, - int ret = 0; - - cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(*req_data)); -- if (cmd_ret == NULL) { -+ ret = hikp_rsp_normal_check(cmd_ret); -+ if (ret) { - HIKP_ERROR_PRINT("failed to get block-%u context.\n", req_data->block_id); -- return -EIO; -+ goto out; - } - - rsp = (struct nic_queue_rsp *)cmd_ret->rsp_data; -diff --git a/net/nic/nic_rss/hikp_nic_rss.c b/net/nic/nic_rss/hikp_nic_rss.c -index b785ba4..5e4d261 100644 ---- a/net/nic/nic_rss/hikp_nic_rss.c -+++ b/net/nic/nic_rss/hikp_nic_rss.c -@@ -357,9 +357,10 @@ static int hikp_nic_rss_get_blk(struct hikp_cmd_header *req_header, - int ret = 0; - - cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(*req_data)); -- if (cmd_ret == NULL) { -+ ret = hikp_rsp_normal_check(cmd_ret); -+ if (ret) { - HIKP_ERROR_PRINT("failed to get block-%u context.\n", req_data->block_id); -- return -EIO; -+ goto out; - } - - rsp = (struct nic_rss_rsp *)cmd_ret->rsp_data; -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.c b/net/roce/roce_pkt/hikp_roce_pkt.c -index abfc526..d3bf885 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.c -+++ b/net/roce/roce_pkt/hikp_roce_pkt.c -@@ -48,15 +48,18 @@ static int hikp_roce_pkt_clear_set(struct major_cmd_ctrl *self, const char *argv - static int hikp_roce_pkt_get_data(struct hikp_cmd_ret **cmd_ret, struct roce_pkt_req_param req_data) - { - struct hikp_cmd_header req_header = { 0 }; -+ int ret; - - hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_PKT_CMD, 0); - *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (*cmd_ret == NULL) { -- printf("hikptool roce_pkt cmd_ret malloc failed\n"); -- return -EIO; -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) { -+ printf("hikptool roce_pkt get cmd data failed, ret: %d\n", ret); -+ free(*cmd_ret); -+ *cmd_ret = NULL; - } - -- return 0; -+ return ret; - } - - static void hikp_roce_pkt_print(uint32_t total_block_num, -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index 1011814..e8e166d 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -88,6 +88,7 @@ static int hikp_roce_scc_get_data(struct hikp_cmd_ret **cmd_ret, const uint32_t - { - struct roce_scc_req_param req_data = { 0 }; - struct hikp_cmd_header req_header = { 0 }; -+ int ret; - - req_data.block_id = *block_id; - req_data.bdf = g_roce_scc_param_t.target.bdf; -@@ -99,12 +100,14 @@ static int hikp_roce_scc_get_data(struct hikp_cmd_ret **cmd_ret, const uint32_t - - hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_SCC_CMD, g_roce_scc_param_t.sub_cmd); - *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (*cmd_ret == NULL) { -- printf("hikptool roce_scc cmd_ret malloc failed\n"); -- return -EIO; -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) { -+ printf("hikptool roce_scc get cmd data failed, ret: %d\n", ret); -+ free(*cmd_ret); -+ *cmd_ret = NULL; - } - -- return 0; -+ return ret; - } - - static void hikp_roce_scc_reg_data_free(uint32_t **offset, uint32_t **data) -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index bf22484..4591a47 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -112,6 +112,7 @@ static int hikp_roce_trp_get_data(struct hikp_cmd_ret **cmd_ret, const uint32_t - { - struct roce_trp_req_param req_data = { 0 }; - struct hikp_cmd_header req_header = { 0 }; -+ int ret; - - req_data.block_id = *block_id; - req_data.bdf = g_roce_trp_param_t.target.bdf; -@@ -122,12 +123,14 @@ static int hikp_roce_trp_get_data(struct hikp_cmd_ret **cmd_ret, const uint32_t - } - hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_TRP_CMD, g_roce_trp_param_t.sub_cmd); - *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (*cmd_ret == NULL) { -- printf("hikptool roce_trp cmd_ret malloc failed\n"); -- return -EIO; -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) { -+ printf("hikptool roce_trp get cmd data failed, ret: %d\n", ret); -+ free(*cmd_ret); -+ *cmd_ret = NULL; - } - -- return 0; -+ return ret; - } - - static void hikp_roce_trp_reg_data_free(uint32_t **offset, uint32_t **data) -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.c b/net/roce/roce_tsp/hikp_roce_tsp.c -index 5d06ede..ca3126b 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.c -+++ b/net/roce/roce_tsp/hikp_roce_tsp.c -@@ -122,6 +122,7 @@ static int hikp_roce_tsp_get_data(struct hikp_cmd_ret **cmd_ret, - struct roce_tsp_req_param req_data, uint32_t sub_cmd_code) - { - struct hikp_cmd_header req_header = { 0 }; -+ int ret; - - if (g_roce_tsp_param_t.sub_cmd_code == 0) { - printf("please enter module name: -m/--modlue\n"); -@@ -129,12 +130,14 @@ static int hikp_roce_tsp_get_data(struct hikp_cmd_ret **cmd_ret, - } - hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_TSP_CMD, sub_cmd_code); - *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (*cmd_ret == NULL) { -- printf("hikptool roce_tsp cmd_ret malloc failed\n"); -- return -EIO; -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) { -+ printf("hikptool roce_tsp get cmd data failed, ret: %d\n", ret); -+ free(*cmd_ret); -+ *cmd_ret = NULL; - } - -- return 0; -+ return ret; - } - - static void hikp_roce_tsp_print(uint32_t total_block_num, -diff --git a/sas/sas_func/sas_analy_queue.c b/sas/sas_func/sas_analy_queue.c -index ce886b9..8fca197 100644 ---- a/sas/sas_func/sas_analy_queue.c -+++ b/sas/sas_func/sas_analy_queue.c -@@ -40,8 +40,9 @@ static int sas_get_res(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - hikp_cmd_init(&req_header, SAS_MOD, SAS_ANACQ, ANACQ_PRT); - - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL) { -+ if (cmd_ret == NULL || cmd_ret->status != 0) { - printf("sas_analy excutes hikp_cmd_alloc err\n"); -+ free(cmd_ret); - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; -diff --git a/sas/sas_func/sas_dump_reg.c b/sas/sas_func/sas_dump_reg.c -index d012aa1..5736726 100644 ---- a/sas/sas_func/sas_dump_reg.c -+++ b/sas/sas_func/sas_dump_reg.c -@@ -32,8 +32,9 @@ static int sas_get_reg(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - - hikp_cmd_init(&req_header, SAS_MOD, SAS_DUMP, cmd->sas_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL) { -+ if (cmd_ret == NULL || cmd_ret->status != 0) { - printf("sas_dump excutes hikp_cmd_alloc err\n"); -+ free(cmd_ret); - return -1; - } - *reg_num = cmd_ret->rsp_data_num; -diff --git a/sas/sas_func/sas_read_dev.c b/sas/sas_func/sas_read_dev.c -index d01f95f..8b9b58d 100644 ---- a/sas/sas_func/sas_read_dev.c -+++ b/sas/sas_func/sas_read_dev.c -@@ -33,8 +33,9 @@ static int sas_get_dev(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - - hikp_cmd_init(&req_header, SAS_MOD, SAS_DEV, cmd->sas_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL) { -+ if (cmd_ret == NULL || cmd_ret->status != 0) { - printf("sas_dqe excutes hikp_cmd_alloc err\n"); -+ free(cmd_ret); - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; -diff --git a/sas/sas_func/sas_read_dqe.c b/sas/sas_func/sas_read_dqe.c -index 2f653df..dbd30f3 100644 ---- a/sas/sas_func/sas_read_dqe.c -+++ b/sas/sas_func/sas_read_dqe.c -@@ -33,8 +33,9 @@ static int sas_get_dqe(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - - hikp_cmd_init(&req_header, SAS_MOD, SAS_DQE, cmd->sas_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL) { -+ if (cmd_ret == NULL || cmd_ret->status != 0) { - printf("sas_dqe excutes hikp_cmd_alloc err\n"); -+ free(cmd_ret); - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; -diff --git a/sas/sas_func/sas_read_errcode.c b/sas/sas_func/sas_read_errcode.c -index 4f89bda..6c7850e 100644 ---- a/sas/sas_func/sas_read_errcode.c -+++ b/sas/sas_func/sas_read_errcode.c -@@ -31,8 +31,9 @@ static int sas_get_errcode(const struct tool_sas_cmd *cmd, uint32_t *reg_save, u - - hikp_cmd_init(&req_header, SAS_MOD, SAS_ERRCODE, cmd->sas_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL) { -+ if (cmd_ret == NULL || cmd_ret->status != 0) { - printf("sas_errcode excutes hikp_cmd_alloc err\n"); -+ free(cmd_ret); - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; -diff --git a/sata/sata_func/sata_dump_reg.c b/sata/sata_func/sata_dump_reg.c -index 86f6760..b4ff35f 100644 ---- a/sata/sata_func/sata_dump_reg.c -+++ b/sata/sata_func/sata_dump_reg.c -@@ -33,8 +33,9 @@ static int sata_get_reg(const struct tool_sata_cmd *cmd, uint32_t *reg_save, uin - - hikp_cmd_init(&req_header, SATA_MOD, SATA_DUMP, cmd->sata_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL) { -+ if (cmd_ret == NULL || cmd_ret->status != 0) { - printf("hikp_data_proc err\n"); -+ free(cmd_ret); - return -1; - } - *reg_num = cmd_ret->rsp_data_num; -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index 527fd53..320ded2 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -309,10 +309,10 @@ static void hikp_serdes_info_cmd_execute(struct major_cmd_ctrl *self) - - hikp_cmd_init(&req_header, SERDES_MOD, SERDES_KEY_INFO, g_serdes_param.sub_cmd); - cmd_ret = hikp_cmd_alloc(&req_header, &hilink_cmd, sizeof(hilink_cmd)); -- if (cmd_ret == NULL) { -+ if (cmd_ret == NULL || cmd_ret->status != 0) { - snprintf(self->err_str, sizeof(self->err_str), "hikp_cmd_alloc err."); - self->err_no = -EINVAL; -- return; -+ goto err_out; - } - out_out_header_size = sizeof(out_put.str_len) + sizeof(out_put.result_offset) + - sizeof(out_put.type) + sizeof(out_put.ret_val); -@@ -467,10 +467,10 @@ static void hikp_serdes_dump_cmd_execute(struct major_cmd_ctrl *self) - - hikp_cmd_init(&req_header, SERDES_MOD, SERDES_DUMP_REG, g_serdes_param.sub_cmd); - cmd_ret = hikp_cmd_alloc(&req_header, &hilink_cmd, sizeof(hilink_cmd)); -- if (cmd_ret == NULL) { -+ if (cmd_ret == NULL || cmd_ret->status != 0) { - self->err_no = -EINVAL; - snprintf(self->err_str, sizeof(self->err_str), "hikp_cmd_alloc err."); -- return; -+ goto err_out; - } - out_out_header_size = sizeof(out_put.str_len) + sizeof(out_put.result_offset) + - sizeof(out_put.type) + sizeof(out_put.ret_val); -diff --git a/socip/hikp_socip_dumpreg.c b/socip/hikp_socip_dumpreg.c -index 32325bb..0153dd9 100644 ---- a/socip/hikp_socip_dumpreg.c -+++ b/socip/hikp_socip_dumpreg.c -@@ -141,9 +141,11 @@ static void hikp_socip_dumpreg_execute(struct major_cmd_ctrl *self) - req_data.controller_id = param[CONTROLLER_ID_INDEX].val; - hikp_cmd_init(&req_header, SOCIP_MOD, HIKP_SOCIP_CMD_DUMPREG, param[MODULE_ID_INDEX].val); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (!cmd_ret) { -+ if (!cmd_ret || cmd_ret->status != 0) { - self->err_no = -EINVAL; - HIKP_ERROR_PRINT("hikp_cmd_alloc\n"); -+ free(cmd_ret); -+ cmd_ret = NULL; - return; - } - --- -2.36.1.windows.1 - diff --git a/0033-hikptool-add-new-cmd-support-query-fault-notify-pkt-.patch b/0033-hikptool-add-new-cmd-support-query-fault-notify-pkt-.patch deleted file mode 100644 index e24ca53..0000000 --- a/0033-hikptool-add-new-cmd-support-query-fault-notify-pkt-.patch +++ /dev/null @@ -1,223 +0,0 @@ -From b593a7e393147a0b9cf87640066d5f4932f8cd3c Mon Sep 17 00:00:00 2001 -From: Jijie Shao -Date: Thu, 7 Sep 2023 14:40:42 +0800 -Subject: [PATCH] hikptool: add new cmd support query fault notify pkt info - -Add nic_notify_pkt cmd for query fault notify pkt info - -Bugfix or Feature: Feature - -Signed-off-by: Jijie Shao ---- - net/hikp_net_lib.h | 1 + - net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c | 126 +++++++++++++++++++ - net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h | 52 ++++++++ - 3 files changed, 179 insertions(+) - create mode 100644 net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c - create mode 100644 net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index ed984ce..06ae598 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -79,6 +79,7 @@ enum nic_cmd_type { - GET_FEC_INFO_CMD, - GET_GRO_INFO_CMD, - GET_NCSI_INFO_CMD, -+ GET_NOTIFY_PKT_CMD, - }; - - enum roh_cmd_type { -diff --git a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -new file mode 100644 -index 0000000..307d336 ---- /dev/null -+++ b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -@@ -0,0 +1,126 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include "hikp_nic_notify_pkt.h" -+ -+static struct tool_target g_notify_pkt_target; -+ -+static int hikp_nic_notify_pkt_query(struct major_cmd_ctrl *self, const struct bdf_t *bdf, -+ struct nic_notify_pkt_info *info) -+{ -+ struct nic_notify_pkt_req_para req = { 0 }; -+ struct hikp_cmd_header header = { 0 }; -+ struct nic_notify_pkt_rsp *rsp; -+ struct hikp_cmd_ret *cmd_resp; -+ -+ req.bdf = *bdf; -+ hikp_cmd_init(&header, NIC_MOD, GET_NOTIFY_PKT_CMD, GET_NOTIFY_PKT_CMD); -+ cmd_resp = hikp_cmd_alloc(&header, &req, sizeof(req)); -+ self->err_no = hikp_rsp_normal_check(cmd_resp); -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), "get notify pkt failed."); -+ if (cmd_resp) -+ free(cmd_resp); -+ return self->err_no; -+ } -+ -+ rsp = (struct nic_notify_pkt_rsp *)cmd_resp->rsp_data; -+ *info = *(struct nic_notify_pkt_info *)rsp->data; -+ free(cmd_resp); -+ -+ return 0; -+} -+ -+static void hikp_nic_notify_pkt_show(const struct nic_notify_pkt_info *info) -+{ -+#define HIKP_NIC_NOFITY_PKT_DATA_PEER_LINE_MAX_CNT 16 -+ -+ uint32_t pkt_start_en = hikp_get_bit(info->cfg, HIKP_NOTIFY_PKT_CFG_START_EN); -+ uint32_t pkt_num = hikp_get_field(info->cfg, HIKP_NOTIFY_PKT_CFG_PKT_NUM_M, -+ HIKP_NOTIFY_PKT_CFG_PKT_NUM_S); -+ uint32_t pkt_en = hikp_get_bit(info->cfg, HIKP_NOTIFY_PKT_CFG_PKT_EN); -+ uint32_t i; -+ -+ printf("################ NIC notify pkt info ##################\n"); -+ printf("pkt_en : %u\n", pkt_en); -+ printf("pkt_start_en : %u\n", pkt_start_en); -+ printf("pkt_num : %u\n", pkt_num); -+ printf("pkt_ipg : %u %s\n", info->ipg, info->ipg > 1 ? -+ "clock cycles" : "clock cycle"); -+ -+ printf("pkt_data:\n"); -+ for (i = 1; i <= NIC_NOTIFY_PKT_DATA_LEN; i++) { -+ printf("%02x ", info->data[i - 1]); -+ if (i % HIKP_NIC_NOFITY_PKT_DATA_PEER_LINE_MAX_CNT == 0) -+ printf("\n"); -+ } -+ printf("####################### END ###########################\n"); -+} -+ -+static void hikp_nic_notify_pkt_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ struct bdf_t *bdf = &g_notify_pkt_target.bdf; -+ struct nic_notify_pkt_info info; -+ -+ self->err_no = hikp_nic_notify_pkt_query(self, bdf, &info); -+ if (self->err_no) -+ return; -+ -+ hikp_nic_notify_pkt_show(&info); -+} -+ -+static int hikp_nic_notify_pkt_cmd_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. eth0~7 or 0000:35:00.0"); -+ -+ return 0; -+} -+ -+static int hikp_nic_notify_pkt_get_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_notify_pkt_target); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "unknown device!"); -+ return self->err_no; -+ } -+ -+ if (g_notify_pkt_target.bdf.dev_id != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "VF does not support query!"); -+ self->err_no = -EOPNOTSUPP; -+ return self->err_no; -+ } -+ -+ return 0; -+} -+ -+static void cmd_nic_notify_pkt_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_nic_notify_pkt_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_nic_notify_pkt_cmd_help); -+ cmd_option_register("-i", "--interface", true, hikp_nic_notify_pkt_get_target); -+} -+ -+HIKP_CMD_DECLARE("nic_notify_pkt", "dump notify pkt info of nic!", cmd_nic_notify_pkt_init); -diff --git a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h -new file mode 100644 -index 0000000..8bdb795 ---- /dev/null -+++ b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h -@@ -0,0 +1,52 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_NIC_NOTIFY_PKT_H -+#define HIKP_NIC_NOTIFY_PKT_H -+ -+#include "hikp_net_lib.h" -+ -+enum nic_notify_pkt_sub_cmd_type { -+ NIC_NOTIFY_PKT_DUMP = 0, -+}; -+ -+struct nic_notify_pkt_req_para { -+ struct bdf_t bdf; -+ uint32_t block_id; -+}; -+ -+struct nic_notify_pkt_rsp_head { -+ uint8_t total_blk_num; -+ uint8_t curr_blk_size; /* real data size, not contain head size. */ -+ uint16_t rsv; -+}; -+ -+#define NIC_NOTIFY_PKT_MAX_RSP_DATA 18 -+struct nic_notify_pkt_rsp { -+ struct nic_notify_pkt_rsp_head head; -+ uint32_t data[NIC_NOTIFY_PKT_MAX_RSP_DATA]; -+}; -+ -+#define NIC_NOTIFY_PKT_DATA_LEN 64 -+struct nic_notify_pkt_info { -+ uint32_t cfg; -+ uint32_t ipg; -+ uint8_t data[NIC_NOTIFY_PKT_DATA_LEN]; -+}; -+ -+#define HIKP_NOTIFY_PKT_CFG_PKT_EN 0 -+#define HIKP_NOTIFY_PKT_CFG_START_EN 1 -+#define HIKP_NOTIFY_PKT_CFG_PKT_NUM_M GENMASK(5, 2) -+#define HIKP_NOTIFY_PKT_CFG_PKT_NUM_S 2 -+ -+#endif /* HIKP_NIC_NOTIFY_PKT_H */ --- -2.30.0 - diff --git a/0034-hikptool-add-new-cmd-to-support-query-port-fault-inf.patch b/0034-hikptool-add-new-cmd-to-support-query-port-fault-inf.patch deleted file mode 100644 index 6410e6c..0000000 --- a/0034-hikptool-add-new-cmd-to-support-query-port-fault-inf.patch +++ /dev/null @@ -1,238 +0,0 @@ -From 84d1e8a09e69ffe3809f0e4fa27d586c7ef8c706 Mon Sep 17 00:00:00 2001 -From: Jie Wang -Date: Mon, 28 Aug 2023 10:35:19 +0800 -Subject: [PATCH] hikptool: add new cmd to support query port fault info - -Add nic port fault cmd for query nic port fault status. - -Bugfix or Feature: Feature - -Signed-off-by: Jie Wang ---- - net/hikp_net_lib.h | 1 + - net/nic/nic_ft/hikp_nic_port_fault.c | 139 +++++++++++++++++++++++++++ - net/nic/nic_ft/hikp_nic_port_fault.h | 54 +++++++++++ - 3 files changed, 194 insertions(+) - create mode 100644 net/nic/nic_ft/hikp_nic_port_fault.c - create mode 100644 net/nic/nic_ft/hikp_nic_port_fault.h - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index 06ae598..cb537ff 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -80,6 +80,7 @@ enum nic_cmd_type { - GET_GRO_INFO_CMD, - GET_NCSI_INFO_CMD, - GET_NOTIFY_PKT_CMD, -+ GET_PORT_FAULT_STATUS = 0xE, - }; - - enum roh_cmd_type { -diff --git a/net/nic/nic_ft/hikp_nic_port_fault.c b/net/nic/nic_ft/hikp_nic_port_fault.c -new file mode 100644 -index 0000000..fd94214 ---- /dev/null -+++ b/net/nic/nic_ft/hikp_nic_port_fault.c -@@ -0,0 +1,139 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include "hikp_nic_port_fault.h" -+ -+static struct tool_target g_port_fault_target; -+ -+static int hikp_nic_port_fault_query(const struct bdf_t *bdf, -+ struct nic_port_fault_status *info) -+{ -+ struct nic_port_fault_req_para req = { 0 }; -+ struct hikp_cmd_header header = { 0 }; -+ struct nic_port_fault_rsp *rsp; -+ struct hikp_cmd_ret *cmd_ret; -+ -+ req.bdf = *bdf; -+ hikp_cmd_init(&header, NIC_MOD, GET_PORT_FAULT_STATUS, -+ NIC_PORT_FAULT_INFO_DUMP); -+ cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); -+ if (cmd_ret == NULL || cmd_ret->status != 0) { -+ HIKP_ERROR_PRINT("fail to get port fault, retcode: %u\n", -+ cmd_ret ? cmd_ret->status : EIO); -+ if (cmd_ret != NULL) -+ free(cmd_ret); -+ -+ return -EIO; -+ } -+ -+ rsp = (struct nic_port_fault_rsp *)cmd_ret->rsp_data; -+ *info = *(struct nic_port_fault_status *)rsp->data; -+ free(cmd_ret); -+ -+ return 0; -+} -+ -+static void hikp_nic_format_port_fault_info(struct nic_port_fault_status *info) -+{ -+ if (info->cdr_core_status > NIC_PORT_FAULT_INVALID) -+ info->cdr_core_status = NIC_PORT_FAULT_INVALID; -+ -+ if (info->cdr_flash_status > NIC_PORT_FAULT_INVALID) -+ info->cdr_flash_status = NIC_PORT_FAULT_INVALID; -+ -+ if (info->fault_9545_status > NIC_PORT_FAULT_INVALID) -+ info->fault_9545_status = NIC_PORT_FAULT_INVALID; -+ -+ if (info->hilink_ref_status > NIC_PORT_FAULT_INVALID) -+ info->hilink_ref_status = NIC_PORT_FAULT_INVALID; -+} -+ -+static void hikp_nic_port_fault_show(struct nic_port_fault_status *info) -+{ -+ const char *port_fault_info[] = { -+ "OK", -+ "Device error", -+ "Device not support", -+ "Invalid" -+ }; -+ -+ hikp_nic_format_port_fault_info(info); -+ printf("############ NIC port fault status ###############\n"); -+ printf("cdr flash : %s.\n", port_fault_info[info->cdr_flash_status]); -+ printf("cdr core : %s.\n", port_fault_info[info->cdr_core_status]); -+ printf("9545 fault: %s.\n", port_fault_info[info->fault_9545_status]); -+ printf("hilink ref: %s.\n", port_fault_info[info->hilink_ref_status]); -+ printf("#################### END #######################\n"); -+} -+ -+static void hikp_nic_port_fault_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ struct bdf_t *bdf = &g_port_fault_target.bdf; -+ struct nic_port_fault_status info; -+ int ret; -+ -+ ret = hikp_nic_port_fault_query(bdf, &info); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "fail to get fault info."); -+ self->err_no = ret; -+ return; -+ } -+ -+ hikp_nic_port_fault_show(&info); -+} -+ -+static int hikp_nic_port_fault_cmd_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. eth0~7 or 0000:35:00.0"); -+ -+ return 0; -+} -+ -+static int hikp_nic_port_fault_get_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_port_fault_target); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "unknown device!"); -+ return self->err_no; -+ } -+ -+ if (g_port_fault_target.bdf.dev_id != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "VF is not supported!"); -+ self->err_no = -EOPNOTSUPP; -+ return self->err_no; -+ } -+ -+ return 0; -+} -+ -+static void cmd_nic_port_fault_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_nic_port_fault_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_nic_port_fault_cmd_help); -+ cmd_option_register("-i", "--interface", true, hikp_nic_port_fault_get_target); -+} -+ -+HIKP_CMD_DECLARE("nic_port_fault", "dump port fault of nic!", cmd_nic_port_fault_init); -diff --git a/net/nic/nic_ft/hikp_nic_port_fault.h b/net/nic/nic_ft/hikp_nic_port_fault.h -new file mode 100644 -index 0000000..7db54f7 ---- /dev/null -+++ b/net/nic/nic_ft/hikp_nic_port_fault.h -@@ -0,0 +1,54 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_NIC_PORT_FAULT_H -+#define HIKP_NIC_PORT_FAULT_H -+ -+#include "hikp_net_lib.h" -+ -+enum nic_port_fault_sub_cmd_type { -+ NIC_PORT_FAULT_INFO_DUMP, -+}; -+ -+enum nic_port_fault_info_type { -+ NIC_PORT_FAULT_OK, -+ NIC_PORT_FAULT_ERR, -+ NIC_PORT_FAULT_NOTSUP, -+ NIC_PORT_FAULT_INVALID -+}; -+ -+struct nic_port_fault_req_para { -+ struct bdf_t bdf; -+ uint8_t block_id; -+}; -+ -+struct nic_port_fault_rsp_head { -+ uint8_t total_blk_num; -+ uint8_t curr_blk_size; -+ uint16_t rsv; -+}; -+ -+#define NIC_PORT_FAULT_MAX_RSP_DATA 1 -+struct nic_port_fault_rsp { -+ struct nic_port_fault_rsp_head head; -+ uint32_t data[NIC_PORT_FAULT_MAX_RSP_DATA]; -+}; -+ -+struct nic_port_fault_status { -+ uint8_t cdr_flash_status; -+ uint8_t fault_9545_status; -+ uint8_t cdr_core_status; -+ uint8_t hilink_ref_status; -+}; -+ -+#endif /* HIKP_NIC_PORT_FAULT_H */ --- -2.30.0 - diff --git a/0035-hikptool-support-to-query-pfc-storm-parameters.patch b/0035-hikptool-support-to-query-pfc-storm-parameters.patch deleted file mode 100644 index 5187b7c..0000000 --- a/0035-hikptool-support-to-query-pfc-storm-parameters.patch +++ /dev/null @@ -1,240 +0,0 @@ -From 134f0a4dbcc5bc7636bcc5d9553c147b0eac99aa Mon Sep 17 00:00:00 2001 -From: Peiyang Wang -Date: Mon, 11 Sep 2023 19:04:48 +0800 -Subject: [PATCH] hikptool: support to query pfc storm parameters - -Add new feature in nic_qos to support query pfc storm parameters info. - -Bugfix or Feature: Feature - -Signed-off-by: Peiyang Wang ---- - net/nic/nic_qos/hikp_nic_qos.c | 72 ++++++++++++++++++++++++++++++++-- - net/nic/nic_qos/hikp_nic_qos.h | 20 ++++++++++ - 2 files changed, 89 insertions(+), 3 deletions(-) - -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index 6c2db1d..e3f0e9c 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -17,17 +17,21 @@ - #include - - #include "hikp_nic_qos.h" -+#include "hikpt_rciep.h" - - static struct nic_qos_param g_qos_param = { 0 }; - - static void hikp_nic_qos_show_pkt_buf(const void *data); - static void hikp_nic_qos_show_dcb_info(const void *data); - static void hikp_nic_qos_show_pause_info(const void *data); -+static void hikp_nic_qos_show_pfc_storm_para(const void *data); - - static const struct qos_feature_cmd g_qos_feature_cmd[] = { - {"pkt_buf", NIC_PACKET_BUFFER_DUMP, hikp_nic_qos_show_pkt_buf}, - {"dcb", NIC_DCB_DUMP, hikp_nic_qos_show_dcb_info}, - {"pause", NIC_PAUSE_DUMP, hikp_nic_qos_show_pause_info}, -+ {"pfc_storm_para", NIC_PFC_STORM_PARA_DUMP, -+ hikp_nic_qos_show_pfc_storm_para}, - }; - - static int hikp_nic_qos_cmd_help(struct major_cmd_ctrl *self, const char *argv) -@@ -42,8 +46,12 @@ static int hikp_nic_qos_cmd_help(struct major_cmd_ctrl *self, const char *argv) - "[-g/--get ]\n" - " pkt_buf : get nic packet buffer.\n" - " dcb : get dcb information.\n" -- " pause : get pause information\n"); -- -+ " pause : get pause information\n" -+ " pfc_storm_para : get pfc storm configuration parameters\n"); -+ printf(" %s\n", -+ "[-d/--dir ]\n" -+ " tx : transmit.\n" -+ " rx : receive.\n"); - return 0; - } - -@@ -134,6 +142,22 @@ static void hikp_nic_qos_show_pause_info(const void *data) - printf("pause gap: 0x%x\n", pause->pause_gap); - } - -+static void hikp_nic_qos_show_pfc_storm_para(const void *data) -+{ -+ struct nic_pfc_storm_para *pfc_storm_para = -+ (struct nic_pfc_storm_para *)data; -+ -+ printf("PFC STORM Information:\n"); -+ printf("direction: %s\n", pfc_storm_para->dir ? "tx" : "rx"); -+ printf("enabled: %s\n", pfc_storm_para->enable ? "on" : "off"); -+ printf("period: %ums\n", pfc_storm_para->period_ms); -+ strncmp(g_qos_param.revision_id, HIKP_IEP_REVISION, -+ MAX_PCI_REVISION_LEN) ? -+ printf("check times: %u\n", pfc_storm_para->times) : -+ printf("pfc threshold: %ums\n", pfc_storm_para->times); -+ printf("recovery period: %ums\n", pfc_storm_para->recovery_period_ms); -+} -+ - static int hikp_nic_qos_get_blk(struct hikp_cmd_header *req_header, - const struct nic_qos_req_para *req_data, - void *buf, size_t buf_len, struct nic_qos_rsp_head *rsp_head) -@@ -181,6 +205,8 @@ static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const - req_data.bdf = *bdf; - - req_data.block_id = blk_id; -+ req_data.dir = g_qos_param.dir; -+ - ret = hikp_nic_qos_get_blk(req_header, &req_data, data, buf_len, &rsp_head); - if (ret != 0) - return ret; -@@ -191,6 +217,8 @@ static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const - /* Copy the remaining block content if total block number is greater than 1. */ - for (blk_id = 1; blk_id < total_blk_num; blk_id++) { - req_data.block_id = blk_id; -+ req_data.dir = g_qos_param.dir; -+ - ret = hikp_nic_qos_get_blk(req_header, &req_data, - (uint8_t *)data + total_blk_size, - buf_len - total_blk_size, &rsp_head); -@@ -204,10 +232,11 @@ static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const - - static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) - { -+ char *revision_id = g_qos_param.revision_id; - struct bdf_t *bdf = &g_qos_param.target.bdf; - union nic_qos_feature_info qos_data = {0}; -- const struct qos_feature_cmd *qos_cmd; - struct hikp_cmd_header req_header = {0}; -+ const struct qos_feature_cmd *qos_cmd; - int ret; - - if (bdf->dev_id != 0) { -@@ -223,6 +252,15 @@ static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) - return; - } - -+ if (g_qos_param.feature_idx == NIC_PFC_STORM_PARA_DUMP && -+ g_qos_param.dir == NIC_QUEUE_DIR_NONE) { -+ hikp_nic_qos_cmd_help(self, NULL); -+ snprintf(self->err_str, sizeof(self->err_str), -+ "-d/--dir param error!"); -+ self->err_no = -EINVAL; -+ return; -+ } -+ - qos_cmd = &g_qos_feature_cmd[g_qos_param.feature_idx]; - hikp_cmd_init(&req_header, NIC_MOD, GET_QOS_INFO_CMD, qos_cmd->sub_cmd_code); - ret = hikp_nic_query_qos_feature(&req_header, &g_qos_param.target.bdf, &qos_data); -@@ -233,6 +271,13 @@ static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) - return; - } - -+ memset(revision_id, 0, MAX_PCI_ID_LEN + 1); -+ ret = get_revision_id_by_bdf(bdf, revision_id); -+ // show pfc threshold as default if get revision_id error -+ if (ret) -+ strncpy(g_qos_param.revision_id, HIKP_IEP_REVISION, -+ MAX_PCI_REVISION_LEN); -+ - printf("############## NIC QOS: %s info ############\n", qos_cmd->feature_name); - qos_cmd->show(&qos_data); - printf("#################### END #######################\n"); -@@ -268,11 +313,31 @@ static int hikp_nic_cmd_qos_feature_select(struct major_cmd_ctrl *self, const ch - return self->err_no; - } - -+static int hikp_nic_cmd_qos_direct(struct major_cmd_ctrl *self, -+ const char *argv) -+{ -+ if (strcmp(argv, "rx") == 0) { -+ g_qos_param.dir = NIC_RX_QUEUE; -+ return 0; -+ } -+ if (strcmp(argv, "tx") == 0) { -+ g_qos_param.dir = NIC_TX_QUEUE; -+ return 0; -+ } -+ -+ snprintf(self->err_str, sizeof(self->err_str), -+ "-d/--dir option is invalid."); -+ self->err_no = -EINVAL; -+ -+ return self->err_no; -+} -+ - static void cmd_nic_get_qos_init(void) - { - struct major_cmd_ctrl *major_cmd = get_major_cmd(); - - g_qos_param.feature_idx = -1; -+ g_qos_param.dir = NIC_QUEUE_DIR_NONE; - - major_cmd->option_count = 0; - major_cmd->execute = hikp_nic_qos_cmd_execute; -@@ -280,6 +345,7 @@ static void cmd_nic_get_qos_init(void) - cmd_option_register("-h", "--help", false, hikp_nic_qos_cmd_help); - cmd_option_register("-i", "--interface", true, hikp_nic_cmd_get_qos_target); - cmd_option_register("-g", "--get", true, hikp_nic_cmd_qos_feature_select); -+ cmd_option_register("-d", "--dir", true, hikp_nic_cmd_qos_direct); - } - - HIKP_CMD_DECLARE("nic_qos", "show qos info of nic!", cmd_nic_get_qos_init); -diff --git a/net/nic/nic_qos/hikp_nic_qos.h b/net/nic/nic_qos/hikp_nic_qos.h -index b5481f5..d55970a 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.h -+++ b/net/nic/nic_qos/hikp_nic_qos.h -@@ -20,6 +20,7 @@ enum nic_qos_sub_cmd_type { - NIC_PACKET_BUFFER_DUMP = 0, - NIC_DCB_DUMP, - NIC_PAUSE_DUMP, -+ NIC_PFC_STORM_PARA_DUMP, - }; - - struct nic_buf_waterline { -@@ -50,6 +51,14 @@ struct nic_pfc_info { - uint8_t rsv[2]; - }; - -+struct nic_pfc_storm_para { -+ uint32_t dir; -+ uint32_t enable; -+ uint32_t period_ms; -+ uint32_t times; -+ uint32_t recovery_period_ms; -+}; -+ - struct nic_ets_info { - uint8_t prio_tc[HIKP_NIC_MAX_USER_PRIO_NUM]; - uint8_t tc_bw[HIKP_NIC_MAX_TC_NUM]; -@@ -82,6 +91,7 @@ union nic_qos_feature_info { - struct nic_pkt_buf_info pkt_buf; - struct nic_dcb_info dcb; - struct nic_pause_info pause; -+ struct nic_pfc_storm_para pfc_storm_para; - }; - - struct nic_qos_rsp_head { -@@ -99,11 +109,21 @@ struct nic_qos_rsp { - struct nic_qos_req_para { - struct bdf_t bdf; - uint8_t block_id; -+ uint8_t dir; -+ uint8_t rsv[2]; -+}; -+ -+enum nic_pfc_dir { -+ NIC_RX_QUEUE = 0, -+ NIC_TX_QUEUE, -+ NIC_QUEUE_DIR_NONE, - }; - - struct nic_qos_param { - struct tool_target target; - int feature_idx; -+ enum nic_pfc_dir dir; -+ char revision_id[MAX_PCI_ID_LEN + 1]; - }; - - #define HIKP_QOS_MAX_FEATURE_NAME_LEN 20 --- -2.33.0 - diff --git a/0036-hikptool-add-sub-cmd-nic_torus-support.patch b/0036-hikptool-add-sub-cmd-nic_torus-support.patch deleted file mode 100644 index 39ae8e1..0000000 --- a/0036-hikptool-add-sub-cmd-nic_torus-support.patch +++ /dev/null @@ -1,310 +0,0 @@ -From 01b5303ea6a533e956481a94a449e18bc86d01d2 Mon Sep 17 00:00:00 2001 -From: Hao Chen -Date: Tue, 12 Sep 2023 19:58:38 +0800 -Subject: [PATCH] hikptool: add sub cmd nic_torus support - -Add nic_torus cmd for query 1D torus setting info - -Bugfix or Feature: Feature - -Signed-off-by: Hao Chen ---- - net/hikp_net_lib.h | 1 + - net/nic/nic_torus/hikp_nic_torus.c | 189 +++++++++++++++++++++++++++++ - net/nic/nic_torus/hikp_nic_torus.h | 76 ++++++++++++ - 3 files changed, 266 insertions(+) - create mode 100644 net/nic/nic_torus/hikp_nic_torus.c - create mode 100644 net/nic/nic_torus/hikp_nic_torus.h - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index cb537ff..21b5357 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -80,6 +80,7 @@ enum nic_cmd_type { - GET_GRO_INFO_CMD, - GET_NCSI_INFO_CMD, - GET_NOTIFY_PKT_CMD, -+ GET_TORUS_INFO_CMD = 0xD, - GET_PORT_FAULT_STATUS = 0xE, - }; - -diff --git a/net/nic/nic_torus/hikp_nic_torus.c b/net/nic/nic_torus/hikp_nic_torus.c -new file mode 100644 -index 0000000..4baede6 ---- /dev/null -+++ b/net/nic/nic_torus/hikp_nic_torus.c -@@ -0,0 +1,189 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include "hikp_nic_torus.h" -+ -+static struct tool_target g_torus_target; -+ -+static int hikp_nic_torus_query(const struct bdf_t *bdf, -+ struct nic_torus_info *info) -+{ -+ struct nic_torus_req_para req = { 0 }; -+ struct hikp_cmd_header header = { 0 }; -+ struct hikp_cmd_ret *cmd_ret; -+ struct nic_torus_rsp *rsp; -+ -+ req.bdf = *bdf; -+ hikp_cmd_init(&header, NIC_MOD, GET_TORUS_INFO_CMD, NIC_TORUS_INFO_DUMP); -+ cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); -+ if (cmd_ret == NULL || cmd_ret->status != 0) { -+ HIKP_ERROR_PRINT("fail to get torus info, retcode: %u\n", -+ cmd_ret ? cmd_ret->status : EIO); -+ if (cmd_ret) -+ free(cmd_ret); -+ return -EIO; -+ } -+ -+ rsp = (struct nic_torus_rsp *)cmd_ret->rsp_data; -+ *info = *(struct nic_torus_info *)rsp->data; -+ free(cmd_ret); -+ -+ return 0; -+} -+ -+static void hikp_nic_torus_lan_prt_pair_show(const struct nic_torus_info *info) -+{ -+ uint32_t mac_id = hikp_get_field(info->lan_prt_pair, NIC_TORUS_MAC_ID_M, -+ NIC_TORUS_MAC_ID_S); -+ uint32_t uc_lan_pair_en = hikp_get_bit(info->lan_prt_pair, -+ NIC_TORUS_UC_LAN_PAIR_EN); -+ uint32_t mc_bc_lan_pair_en = hikp_get_bit(info->lan_prt_pair, -+ NIC_TORUS_MC_BC_LAN_PAIR_EN); -+ uint32_t lldp_lan_pair_en = hikp_get_bit(info->lan_prt_pair, -+ NIC_TORUS_LLDP_LAN_PAIR_EN); -+ uint32_t tc2vlanpri_mapping_en = hikp_get_bit(info->lan_prt_pair, -+ NIC_TORUS_TC2VLANPRI_MAPPING_EN); -+ uint32_t torus_lpbk_drop_en = hikp_get_bit(info->lan_prt_pair, -+ NIC_TORUS_LPBK_DROP_EN); -+ -+ printf("dst mac id: %u\n", mac_id); -+ printf("uc_lan_pair_en: %u\n", uc_lan_pair_en); -+ printf("mc_bc_lan_pair_en: %u\n", mc_bc_lan_pair_en); -+ printf("lldp_lan_pair_en: %u\n", lldp_lan_pair_en); -+ printf("tc2vlanpri_mapping_en: %u\n", tc2vlanpri_mapping_en); -+ printf("torus_lpbk_drop_en: %u\n", torus_lpbk_drop_en); -+} -+ -+static void hikp_nic_torus_lan_fwd_tc_cfg_show(const struct nic_torus_info *info) -+{ -+ uint32_t tc0_map_tc = hikp_get_field(info->lan_fwd_tc_cfg, -+ NIC_TORUS_TC0_MAP_TC_M, -+ NIC_TORUS_TC0_MAP_TC_S); -+ uint32_t tc1_map_tc = hikp_get_field(info->lan_fwd_tc_cfg, -+ NIC_TORUS_TC1_MAP_TC_M, -+ NIC_TORUS_TC1_MAP_TC_S); -+ uint32_t tc2_map_tc = hikp_get_field(info->lan_fwd_tc_cfg, -+ NIC_TORUS_TC2_MAP_TC_M, -+ NIC_TORUS_TC2_MAP_TC_S); -+ uint32_t tc3_map_tc = hikp_get_field(info->lan_fwd_tc_cfg, -+ NIC_TORUS_TC3_MAP_TC_M, -+ NIC_TORUS_TC3_MAP_TC_S); -+ -+ printf("tc0_map_tc : %u\n", tc0_map_tc); -+ printf("tc1_map_tc : %u\n", tc1_map_tc); -+ printf("tc2_map_tc : %u\n", tc2_map_tc); -+ printf("tc3_map_tc : %u\n", tc3_map_tc); -+} -+ -+static void hikp_nic_torus_switch_param_show(const struct nic_torus_info *info) -+{ -+ printf("nic_mac_anti_spoof_en: %s\n", info->nic_switch_param & -+ NIC_TORUS_MAC_ANTI_SPOOF_EN_MASK ? "enable" : "disable"); -+ printf("nic_alw_lpbk: %s\n", info->nic_switch_param & -+ NIC_TORUS_ALW_LPBK_MASK ? "enable" : "disable"); -+ printf("nic_alw_lcl_lpbk: %s\n", info->nic_switch_param & -+ NIC_TORUS_ALW_LCL_LPBK_MASK ? "enable" : "disable"); -+ printf("nic_alw_dst_ovrd: %s\n", info->nic_switch_param & -+ NIC_TORUS_ALW_DST_OVRD_MASK ? "enable" : "disable"); -+ printf("roce_mac_anti_spoof_en: %s\n", info->roce_switch_param & -+ NIC_TORUS_MAC_ANTI_SPOOF_EN_MASK ? "enable" : "disable"); -+ printf("roce_alw_lpbk: %s\n", info->roce_switch_param & -+ NIC_TORUS_ALW_LPBK_MASK ? "enable" : "disable"); -+ printf("roce_alw_lcl_lpbk: %s\n", info->roce_switch_param & -+ NIC_TORUS_ALW_LCL_LPBK_MASK ? "enable" : "disable"); -+ printf("roce_alw_dst_ovrd: %s\n", info->roce_switch_param & -+ NIC_TORUS_ALW_DST_OVRD_MASK ? "enable" : "disable"); -+} -+ -+static void hikp_nic_torus_show(const struct nic_torus_info *info) -+{ -+ printf("################ NIC TORUS info ##################\n"); -+ printf("enable: %s\n", info->enable ? "true" : "false"); -+ -+ hikp_nic_torus_lan_prt_pair_show(info); -+ -+ hikp_nic_torus_lan_fwd_tc_cfg_show(info); -+ -+ printf("ssu_pause_time_out: %uus\n", info->pause_time_out); -+ printf("ssu_pause_time_out_en: %u\n", info->pause_time_out_en); -+ printf("vlan_fe: 0x%x (for port vlan)\n", info->vlan_fe); -+ printf("ets_tcg0_mapping: 0x%x\n", info->ets_tcg0_mapping); -+ printf("ets_tcg0_mapping is showed as 0xff if ncl_config forward bit is setted to 1\n"); -+ -+ hikp_nic_torus_switch_param_show(info); -+ -+ printf("#################### END ##########################\n"); -+} -+ -+static void hikp_nic_torus_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ struct bdf_t *bdf = &g_torus_target.bdf; -+ struct nic_torus_info info; -+ int ret; -+ -+ ret = hikp_nic_torus_query(bdf, &info); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "fail to obtain torus info."); -+ self->err_no = ret; -+ return; -+ } -+ -+ hikp_nic_torus_show(&info); -+} -+ -+static int hikp_nic_torus_cmd_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. eth0~7 or 0000:35:00.0"); -+ -+ return 0; -+} -+ -+static int hikp_nic_torus_get_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_torus_target); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "unknown device!"); -+ return self->err_no; -+ } -+ -+ if (g_torus_target.bdf.dev_id != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "VF does not support query!"); -+ self->err_no = -EOPNOTSUPP; -+ return self->err_no; -+ } -+ -+ return 0; -+} -+ -+static void cmd_nic_torus_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_nic_torus_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_nic_torus_cmd_help); -+ cmd_option_register("-i", "--interface", true, hikp_nic_torus_get_target); -+} -+ -+HIKP_CMD_DECLARE("nic_torus", "dump torus info of nic!", cmd_nic_torus_init); -diff --git a/net/nic/nic_torus/hikp_nic_torus.h b/net/nic/nic_torus/hikp_nic_torus.h -new file mode 100644 -index 0000000..e6b6552 ---- /dev/null -+++ b/net/nic/nic_torus/hikp_nic_torus.h -@@ -0,0 +1,76 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_NIC_TORUS_H -+#define HIKP_NIC_TORUS_H -+ -+#include "hikp_net_lib.h" -+ -+#define NIC_TORUS_MAC_ANTI_SPOOF_EN_MASK 0x1 -+#define NIC_TORUS_ALW_LPBK_MASK 0x2 -+#define NIC_TORUS_ALW_LCL_LPBK_MASK 0x4 -+#define NIC_TORUS_ALW_DST_OVRD_MASK 0x8 -+ -+#define NIC_TORUS_UC_LAN_PAIR_EN 16 -+#define NIC_TORUS_MC_BC_LAN_PAIR_EN 17 -+#define NIC_TORUS_LLDP_LAN_PAIR_EN 18 -+#define NIC_TORUS_TC2VLANPRI_MAPPING_EN 19 -+#define NIC_TORUS_LPBK_DROP_EN 20 -+ -+#define NIC_TORUS_MAC_ID_M GENMASK(1, 0) -+#define NIC_TORUS_MAC_ID_S 0 -+ -+#define NIC_TORUS_TC0_MAP_TC_M GENMASK(2, 0) -+#define NIC_TORUS_TC0_MAP_TC_S 0 -+#define NIC_TORUS_TC1_MAP_TC_M GENMASK(8, 6) -+#define NIC_TORUS_TC1_MAP_TC_S 6 -+#define NIC_TORUS_TC2_MAP_TC_M GENMASK(14, 12) -+#define NIC_TORUS_TC2_MAP_TC_S 12 -+#define NIC_TORUS_TC3_MAP_TC_M GENMASK(20, 18) -+#define NIC_TORUS_TC3_MAP_TC_S 18 -+ -+enum nic_torus_sub_cmd_type { -+ NIC_TORUS_INFO_DUMP, -+}; -+ -+struct nic_torus_req_para { -+ struct bdf_t bdf; -+ uint8_t block_id; -+ uint8_t rsv[3]; -+}; -+ -+struct nic_torus_rsp_head { -+ uint8_t total_blk_num; -+ uint8_t curr_blk_size; /* real data size, not contain head size. */ -+ uint16_t rsv; -+}; -+ -+#define NIC_TORUS_MAX_RSP_DATA 6 -+struct nic_torus_rsp { -+ struct nic_torus_rsp_head head; -+ uint32_t data[NIC_TORUS_MAX_RSP_DATA]; -+}; -+ -+struct nic_torus_info { -+ uint32_t enable; -+ uint32_t lan_prt_pair; -+ uint32_t lan_fwd_tc_cfg; -+ uint32_t pause_time_out; -+ uint8_t pause_time_out_en; -+ uint8_t vlan_fe; -+ uint8_t nic_switch_param; -+ uint8_t roce_switch_param; -+ uint32_t ets_tcg0_mapping; -+}; -+ -+#endif /* HIKP_NIC_TORUS_H */ --- -2.30.0 - diff --git a/0037-hikptool-optimized-display-the-hot-plug-card-info-in.patch b/0037-hikptool-optimized-display-the-hot-plug-card-info-in.patch deleted file mode 100644 index a1c0542..0000000 --- a/0037-hikptool-optimized-display-the-hot-plug-card-info-in.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 16154c431d5c694707b12cdb3ab3b52207d9c44d Mon Sep 17 00:00:00 2001 -From: veega -Date: Fri, 15 Sep 2023 09:32:33 +0800 -Subject: [PATCH] hikptool: optimized display the hot-plug card info in - nic_port cmd - -A command word was added to query the port information display capability. -If a port does not support a flexible card, the card information is not displayed. - -Signed-off-by: veega ---- - net/nic/nic_mac/hikp_mac_cmd.h | 1 + - net/nic/nic_mac/hikp_nic_port.c | 81 +++++++++++++++++++++------------ - net/nic/nic_mac/hikp_nic_port.h | 17 ++++--- - 3 files changed, 65 insertions(+), 34 deletions(-) - -diff --git a/net/nic/nic_mac/hikp_mac_cmd.h b/net/nic/nic_mac/hikp_mac_cmd.h -index adaadf4..f74fd2a 100644 ---- a/net/nic/nic_mac/hikp_mac_cmd.h -+++ b/net/nic/nic_mac/hikp_mac_cmd.h -@@ -31,6 +31,7 @@ enum mac_port_sub_cmd { - QUERY_PORT_PHY_DFX, - QUERY_HOT_PLUG_CARD_DFX, - QUERY_PORT_CDR_DFX, -+ QUERY_PORT_INFO_DFX_CAP, - }; - - enum mac_dump_reg_sub_cmd { -diff --git a/net/nic/nic_mac/hikp_nic_port.c b/net/nic/nic_mac/hikp_nic_port.c -index c9f46fc..5ba6927 100644 ---- a/net/nic/nic_mac/hikp_nic_port.c -+++ b/net/nic/nic_mac/hikp_nic_port.c -@@ -361,11 +361,12 @@ static void mac_cmd_disp_arb_info(const struct mac_cmd_arb_dfx *arb_dfx) - - static void mac_cmd_disp_hot_plug_card_info(const struct cmd_hot_plug_card_info *hpc_dfx) - { -- printf("\n======================== HOT PLUG CARD INFO =======================\n"); -+ printf("\n===================== HOT PLUG CARD INFO =====================\n"); - - printf("hot plug card in position: 0x%x\n", hpc_dfx->in_pos); - printf("support type: 0x%x\n", hpc_dfx->support_type); -- printf("current type: 0x%x\n", hpc_dfx->cur_type); -+ if (hpc_dfx->in_pos) -+ printf("current type: 0x%x\n", hpc_dfx->cur_type); - printf("----------------------------------------------------------------------------\n"); - } - -@@ -491,35 +492,59 @@ static void mac_cmd_show_port_dfx(struct major_cmd_ctrl *self, uint32_t mask) - } - } - --static void mac_cmd_port_execute(struct major_cmd_ctrl *self) -+static int mac_cmd_get_port_dfx_cap(uint32_t *cap) - { - struct mac_cmd_port_hardware *port_hw = NULL; -+ struct mac_cmd_port_dfx_cap *dfx_cap = NULL; -+ struct hikp_cmd_ret *dfx_cap_resp = NULL; - struct hikp_cmd_ret *hw_cmd_ret = NULL; -- uint32_t mask; - int ret; - -- if (!g_port_info.port_flag) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), "Need port id."); -- return; -+ ret = mac_cmd_get_dfx_cfg(QUERY_PORT_INFO_DFX_CAP, &dfx_cap_resp); -+ if (ret == 0) { -+ dfx_cap = (struct mac_cmd_port_dfx_cap *)dfx_cap_resp->rsp_data; -+ *cap = dfx_cap->cap_bit_map; -+ free(dfx_cap_resp); -+ dfx_cap_resp = NULL; -+ return ret; - } - -+ /* not support get capability, so use old process */ - ret = mac_cmd_get_dfx_cfg(QUERY_PORT_HARDWARE, &hw_cmd_ret); -- if (ret != 0) { -- printf("hikp_data_proc get port hw failed.\n"); -- self->err_no = -ENOSPC; -- return; -- } -+ if (ret) -+ return ret; - -- mask = MAC_LSPORT_LINK | MAC_LSPORT_MAC | -- MAC_LSPORT_ARB | MAC_HOT_PLUG_CARD | MAC_LSPORT_CDR; -+ *cap = MAC_LSPORT_LINK | MAC_LSPORT_MAC | MAC_LSPORT_ARB | -+ MAC_HOT_PLUG_CARD | MAC_LSPORT_CDR; - port_hw = (struct mac_cmd_port_hardware *)(hw_cmd_ret->rsp_data); - if (port_hw->port_type == HIKP_PORT_TYPE_PHY || - port_hw->port_type == HIKP_PORT_TYPE_PHY_SDS) -- mask |= MAC_LSPORT_PHY; -+ *cap |= MAC_LSPORT_PHY; - -- mac_cmd_show_port_dfx(self, mask); - free(hw_cmd_ret); -+ hw_cmd_ret = NULL; -+ return ret; -+} -+ -+static void mac_cmd_port_execute(struct major_cmd_ctrl *self) -+{ -+ uint32_t dfx_cap; -+ int ret; -+ -+ if (!g_port_info.port_flag) { -+ self->err_no = -EINVAL; -+ snprintf(self->err_str, sizeof(self->err_str), "Need port id."); -+ return; -+ } -+ -+ ret = mac_cmd_get_port_dfx_cap(&dfx_cap); -+ if (ret) { -+ self->err_no = ret; -+ snprintf(self->err_str, sizeof(self->err_str), "Get DFX capability failed."); -+ return; -+ } -+ -+ mac_cmd_show_port_dfx(self, dfx_cap); - } - - static int mac_cmd_get_port_target(struct major_cmd_ctrl *self, const char *argv) -diff --git a/net/nic/nic_mac/hikp_nic_port.h b/net/nic/nic_mac/hikp_nic_port.h -index 42ab3f9..78928b3 100644 ---- a/net/nic/nic_mac/hikp_nic_port.h -+++ b/net/nic/nic_mac/hikp_nic_port.h -@@ -225,6 +225,11 @@ struct mac_cmd_cdr_dfx { - struct mac_port_cdr_dfx host_cdr; - }; - -+struct mac_cmd_port_dfx_cap { -+ uint32_t cap_bit_map; -+ uint32_t rsvd[3]; -+}; -+ - struct mac_cmd_dfx_callback { - uint32_t mask; - void (*show_dfx)(struct major_cmd_ctrl *self); --- -2.36.1.windows.1 diff --git a/0038-hikptool-Update-the-tool-version-number-to-1.1.0.patch b/0038-hikptool-Update-the-tool-version-number-to-1.1.0.patch deleted file mode 100644 index 107e8df..0000000 --- a/0038-hikptool-Update-the-tool-version-number-to-1.1.0.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 6a571cd63eab0a5b8e6496964d6e3916b793b9bf Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Fri, 20 Oct 2023 21:30:31 +0800 -Subject: [PATCH] hikptool: Update the tool version number to 1.1.0 - -Update the tool version number to 1.1.0, the first SP3 release version - -Signed-off-by: veega2022 ---- - tool_lib/tool_lib.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 6548b57..14b3db5 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.0.16" -+#define TOOL_VER "1.1.0" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.38.1.windows.1 - diff --git a/0039-hikptool-roce-Add-a-common-frame-for-hikptool-roce-r.patch b/0039-hikptool-roce-Add-a-common-frame-for-hikptool-roce-r.patch deleted file mode 100644 index b0c20fb..0000000 --- a/0039-hikptool-roce-Add-a-common-frame-for-hikptool-roce-r.patch +++ /dev/null @@ -1,386 +0,0 @@ -From 8b3b68347165b602cded484d090509426f88cc75 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Mon, 31 Jul 2023 21:19:46 +0800 -Subject: hikptool/roce: Add a common frame for hikptool roce register query - -Add a common frame for hikptool roce register query. - -Signed-off-by: Junxian Huang ---- - net/roce/roce_caep/hikp_roce_caep.h | 2 +- - .../roce_ext_common/hikp_roce_ext_common.c | 178 ++++++++++++++++++ - .../roce_ext_common/hikp_roce_ext_common.h | 52 +++++ - net/roce/roce_gmv/hikp_roce_gmv.h | 2 +- - net/roce/roce_mdb/hikp_roce_mdb.h | 2 +- - net/roce/roce_pkt/hikp_roce_pkt.h | 2 +- - net/roce/roce_qmm/hikp_roce_qmm.h | 2 +- - net/roce/roce_scc/hikp_roce_scc.h | 2 +- - net/roce/roce_timer/hikp_roce_timer.h | 2 +- - net/roce/roce_trp/hikp_roce_trp.h | 2 +- - net/roce/roce_tsp/hikp_roce_tsp.h | 2 +- - 11 files changed, 239 insertions(+), 9 deletions(-) - create mode 100644 net/roce/roce_ext_common/hikp_roce_ext_common.c - create mode 100644 net/roce/roce_ext_common/hikp_roce_ext_common.h - -diff --git a/net/roce/roce_caep/hikp_roce_caep.h b/net/roce/roce_caep/hikp_roce_caep.h -index 3c494b1..804d2df 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.h -+++ b/net/roce/roce_caep/hikp_roce_caep.h -@@ -14,7 +14,7 @@ - #ifndef __HIKP_ROCE_CAEP_H__ - #define __HIKP_ROCE_CAEP_H__ - --#include "hikp_net_lib.h" -+#include "hikp_roce_ext_common.h" - - #define ROCE_HIKP_CAEP_REG_NUM 29 - #define PER_REG_NUM 2 -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -new file mode 100644 -index 0000000..ec47dce ---- /dev/null -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -0,0 +1,178 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_roce_ext_common.h" -+ -+static void hikp_roce_ext_reg_data_free(struct reg_data *reg) -+{ -+ if (reg->offset) -+ free(reg->offset); -+ -+ if (reg->data) -+ free(reg->data); -+} -+ -+static void hikp_roce_ext_cmd_ret_free(struct hikp_cmd_ret *cmd_ret) -+{ -+ if (cmd_ret) -+ free(cmd_ret); -+} -+ -+static const struct cmd_type_info { -+ enum roce_cmd_type cmd_type; -+ const char *cmd_name; -+ uint8_t reg_array_length; -+} cmd_info_table[] = { -+ {GET_ROCEE_MDB_CMD, "MDB", ROCE_HIKP_MDB_REG_NUM_EXT}, -+ {GET_ROCEE_GMV_CMD, "GMV", ROCE_HIKP_GMV_REG_NUM_EXT}, -+ {GET_ROCEE_CAEP_CMD, "CAEP", ROCE_HIKP_CAEP_REG_NUM_EXT}, -+ {GET_ROCEE_PKT_CMD, "PKT", ROCE_HIKP_PKT_REG_NUM_EXT}, -+ {GET_ROCEE_SCC_CMD, "SCC", ROCE_HIKP_SCC_REG_NUM_EXT}, -+ {GET_ROCEE_QMM_CMD, "QMM", ROCE_HIKP_QMM_REG_NUM_EXT}, -+ {GET_ROCEE_TIMER_CMD, "TIMER", ROCE_HIKP_TIMER_REG_NUM_EXT}, -+ {GET_ROCEE_TRP_CMD, "TRP", ROCE_HIKP_TRP_REG_NUM_EXT}, -+ {GET_ROCEE_TSP_CMD, "TSP", ROCE_HIKP_TSP_REG_NUM_EXT}, -+}; -+ -+static int get_cmd_info_table_idx(enum roce_cmd_type cmd_type) -+{ -+ int array_size = sizeof(cmd_info_table) / sizeof(struct cmd_type_info); -+ int i; -+ -+ for (i = 0; i < array_size; i++) -+ if (cmd_type == cmd_info_table[i].cmd_type) -+ return i; -+ -+ return -ENOENT; -+} -+ -+static const char *get_cmd_name(enum roce_cmd_type cmd_type) -+{ -+ int idx; -+ -+ idx = get_cmd_info_table_idx(cmd_type); -+ if (idx >= 0) -+ return cmd_info_table[idx].cmd_name; -+ -+ printf("Failed to get cmd name, cmd_type = %d\n", cmd_type); -+ return NULL; -+} -+ -+static int get_cmd_reg_array_length(enum roce_cmd_type cmd_type) -+{ -+ int idx; -+ -+ idx = get_cmd_info_table_idx(cmd_type); -+ if (idx >= 0) -+ return cmd_info_table[idx].reg_array_length; -+ -+ printf("Failed to get cmd reg array length, cmd_type = %d\n", cmd_type); -+ return idx; -+} -+ -+static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, -+ uint32_t block_id, -+ struct roce_ext_head *res_head, -+ struct reg_data *reg, -+ int (*get_data)(struct hikp_cmd_ret **cmd_ret, -+ uint32_t block_id)) -+{ -+ int reg_array_length = get_cmd_reg_array_length(cmd_type); -+ const char *cmd_name = get_cmd_name(cmd_type); -+ struct roce_ext_res_param *roce_ext_res; -+ struct hikp_cmd_ret *cmd_ret; -+ size_t max_size; -+ size_t cur_size; -+ int ret; -+ -+ /* reg_array_length greater than or equal to 0 ensures that cmd_name -+ * is not NULL, so cmd_name does not need to be checked. -+ */ -+ if (reg_array_length < 0) -+ return reg_array_length; -+ -+ ret = get_data(&cmd_ret, block_id); -+ if (ret) { -+ printf("hikptool roce_%s get data failed!\n", cmd_name); -+ goto get_data_error; -+ } -+ -+ roce_ext_res = (struct roce_ext_res_param *)cmd_ret->rsp_data; -+ *res_head = roce_ext_res->head; -+ max_size = res_head->total_block_num * sizeof(uint32_t); -+ -+ if (block_id == 0) { -+ reg->offset = (uint32_t *)malloc(max_size); -+ reg->data = (uint32_t *)malloc(max_size); -+ if ((reg->offset == NULL) || (reg->data == NULL)) { -+ printf("hikptool roce_%s alloc log memmory 0x%x failed!\n", -+ cmd_name, max_size); -+ ret = -ENOMEM; -+ hikp_roce_ext_reg_data_free(reg); -+ goto get_data_error; -+ } -+ } -+ -+ cur_size = res_head->cur_block_num * sizeof(uint32_t); -+ if (cur_size > max_size) { -+ printf("hikptool roce_%s log data copy size error, data size: 0x%x, max size: 0x%x\n", -+ cmd_name, cur_size, max_size); -+ ret = -EINVAL; -+ hikp_roce_ext_reg_data_free(reg); -+ goto get_data_error; -+ } -+ -+ memcpy(reg->offset + block_id, -+ (uint32_t *)&roce_ext_res->reg_data, cur_size); -+ memcpy(reg->data + block_id, -+ (uint32_t *)&roce_ext_res->reg_data + reg_array_length, cur_size); -+ -+get_data_error: -+ hikp_roce_ext_cmd_ret_free(cmd_ret); -+ return ret; -+} -+ -+static void hikp_roce_ext_print(const char *cmd_name, uint32_t total_block_num, -+ const uint32_t *offset, const uint32_t *data) -+{ -+ int i; -+ -+ printf("**************%s INFO*************\n", cmd_name); -+ for (i = 0; i < total_block_num; i++) -+ printf("[0x%08X] : 0x%08X\n", offset[i], data[i]); -+ printf("************************************\n"); -+} -+ -+void hikp_roce_ext_execute(struct major_cmd_ctrl *self, -+ enum roce_cmd_type cmd_type, -+ int (*get_data)(struct hikp_cmd_ret **cmd_ret, -+ uint32_t block_id)) -+{ -+ uint32_t queried_block_id = 0; -+ struct roce_ext_head res_head; -+ struct reg_data reg = { 0 }; -+ -+ do { -+ self->err_no = hikp_roce_ext_get_res(cmd_type, queried_block_id, -+ &res_head, ®, get_data); -+ if (self->err_no) -+ return; -+ -+ queried_block_id += res_head.cur_block_num; -+ } while (queried_block_id < res_head.total_block_num); -+ -+ hikp_roce_ext_print(get_cmd_name(cmd_type), res_head.total_block_num, -+ reg.offset, reg.data); -+ -+ hikp_roce_ext_reg_data_free(®); -+} -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.h b/net/roce/roce_ext_common/hikp_roce_ext_common.h -new file mode 100644 -index 0000000..1e8063d ---- /dev/null -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.h -@@ -0,0 +1,52 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef __HIKP_ROCE_EXT_COMMON_H__ -+#define __HIKP_ROCE_EXT_COMMON_H__ -+ -+#include "hikp_net_lib.h" -+ -+#define ROCE_MAX_REG_NUM (NET_MAX_REQ_DATA_NUM - 1) -+ -+#define ROCE_HIKP_CAEP_REG_NUM_EXT ROCE_MAX_REG_NUM -+#define ROCE_HIKP_GMV_REG_NUM_EXT ROCE_MAX_REG_NUM -+#define ROCE_HIKP_MDB_REG_NUM_EXT ROCE_MAX_REG_NUM -+#define ROCE_HIKP_PKT_REG_NUM_EXT ROCE_MAX_REG_NUM -+#define ROCE_HIKP_QMM_REG_NUM_EXT ROCE_MAX_REG_NUM -+#define ROCE_HIKP_SCC_REG_NUM_EXT ROCE_MAX_REG_NUM -+#define ROCE_HIKP_TIMER_REG_NUM_EXT ROCE_MAX_REG_NUM -+#define ROCE_HIKP_TRP_REG_NUM_EXT ROCE_MAX_REG_NUM -+#define ROCE_HIKP_TSP_REG_NUM_EXT ROCE_MAX_REG_NUM -+ -+struct roce_ext_head { -+ uint8_t total_block_num; -+ uint8_t cur_block_num; -+ uint16_t reserved; -+}; -+ -+struct roce_ext_res_param { -+ struct roce_ext_head head; -+ uint32_t reg_data[0]; -+}; -+ -+struct reg_data { -+ uint32_t *offset; -+ uint32_t *data; -+}; -+ -+void hikp_roce_ext_execute(struct major_cmd_ctrl *self, -+ enum roce_cmd_type cmd_type, -+ int (*get_data)(struct hikp_cmd_ret **cmd_ret, -+ uint32_t block_id)); -+ -+#endif /* __HIKP_ROCE_EXT_COMMON_H__ */ -diff --git a/net/roce/roce_gmv/hikp_roce_gmv.h b/net/roce/roce_gmv/hikp_roce_gmv.h -index 30f37fb..1ef5b93 100644 ---- a/net/roce/roce_gmv/hikp_roce_gmv.h -+++ b/net/roce/roce_gmv/hikp_roce_gmv.h -@@ -14,7 +14,7 @@ - #ifndef __HIKP_ROCE_GMV_H__ - #define __HIKP_ROCE_GMV_H__ - --#include "hikp_net_lib.h" -+#include "hikp_roce_ext_common.h" - - #define ROCE_HIKP_GMV_REG_NUM 7 - #define ROCE_HIKP_GMV_REG_SWICTH 2 -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.h b/net/roce/roce_mdb/hikp_roce_mdb.h -index 8e7da03..7643dff 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.h -+++ b/net/roce/roce_mdb/hikp_roce_mdb.h -@@ -14,7 +14,7 @@ - #ifndef __HIKP_ROCE_MDB_H__ - #define __HIKP_ROCE_MDB_H__ - --#include "hikp_net_lib.h" -+#include "hikp_roce_ext_common.h" - - #define ROCE_HIKP_MDB_REG_NUM 22 - #define ROCE_HIKP_REG_SWICTH 2 -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.h b/net/roce/roce_pkt/hikp_roce_pkt.h -index 5f438b7..0200c44 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.h -+++ b/net/roce/roce_pkt/hikp_roce_pkt.h -@@ -14,7 +14,7 @@ - #ifndef __HIKP_ROCE_PKT_H__ - #define __HIKP_ROCE_PKT_H__ - --#include "hikp_net_lib.h" -+#include "hikp_roce_ext_common.h" - - #define ROCE_HIKP_PKT_REG_NUM 29 - #define PKT_PER_REG_NUM 2 -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.h b/net/roce/roce_qmm/hikp_roce_qmm.h -index 08cb5d2..0645ab3 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.h -+++ b/net/roce/roce_qmm/hikp_roce_qmm.h -@@ -14,7 +14,7 @@ - #ifndef __HIKP_ROCE_QMM_H__ - #define __HIKP_ROCE_QMM_H__ - --#include "hikp_net_lib.h" -+#include "hikp_roce_ext_common.h" - - #define ROCE_HIKP_QMM_REG_NUM 36 - #define QMM_BANK_NUM 0x7 -diff --git a/net/roce/roce_scc/hikp_roce_scc.h b/net/roce/roce_scc/hikp_roce_scc.h -index de8772e..5d37a11 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.h -+++ b/net/roce/roce_scc/hikp_roce_scc.h -@@ -14,7 +14,7 @@ - #ifndef __HIKP_ROCE_SCC_H__ - #define __HIKP_ROCE_SCC_H__ - --#include "hikp_net_lib.h" -+#include "hikp_roce_ext_common.h" - - #define ROCE_HIKP_SCC_REG_NUM 29 - #define MAX_SCC_MODULE_NAME_LEN 20 -diff --git a/net/roce/roce_timer/hikp_roce_timer.h b/net/roce/roce_timer/hikp_roce_timer.h -index a4a32b1..7f7deb6 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.h -+++ b/net/roce/roce_timer/hikp_roce_timer.h -@@ -14,7 +14,7 @@ - #ifndef __HIKP_ROCE_TIMER_H__ - #define __HIKP_ROCE_TIMER_H__ - --#include "hikp_net_lib.h" -+#include "hikp_roce_ext_common.h" - - #define ROCE_HIKP_TIMER_REG_NUM 25 - #define ROCE_TIMER_CMD_CLEAR (1 << 0) -diff --git a/net/roce/roce_trp/hikp_roce_trp.h b/net/roce/roce_trp/hikp_roce_trp.h -index 80d28af..97f1838 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.h -+++ b/net/roce/roce_trp/hikp_roce_trp.h -@@ -14,7 +14,7 @@ - #ifndef __HIKP_ROCE_TRP_H__ - #define __HIKP_ROCE_TRP_H__ - --#include "hikp_net_lib.h" -+#include "hikp_roce_ext_common.h" - - #define TRP_DIV_NUM_T 4 - #define ROCE_HIKP_TRP_REG_NUM 29 -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.h b/net/roce/roce_tsp/hikp_roce_tsp.h -index ae864ba..43d0d0d 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.h -+++ b/net/roce/roce_tsp/hikp_roce_tsp.h -@@ -14,7 +14,7 @@ - #ifndef __HIKP_ROCE_TSP_H__ - #define __HIKP_ROCE_TSP_H__ - --#include "hikp_net_lib.h" -+#include "hikp_roce_ext_common.h" - - #define ROCE_HIKP_TSP_REG_NUM 29 - #define TSP_PER_REG_NUM 2 --- -2.30.0 - diff --git a/0040-hikptool-roce-Add-roce_rst-cmd-for-reset-signal-regi.patch b/0040-hikptool-roce-Add-roce_rst-cmd-for-reset-signal-regi.patch deleted file mode 100644 index 22312d3..0000000 --- a/0040-hikptool-roce-Add-roce_rst-cmd-for-reset-signal-regi.patch +++ /dev/null @@ -1,179 +0,0 @@ -From a0ac3e3cd5e94657ee1a58c74037aa6898898c75 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Fri, 4 Aug 2023 17:25:53 +0800 -Subject: hikptool/roce: Add roce_rst cmd for reset signal registers query - -Add roce_rst cmd for reset signal registers query. - -Example: -hikptool roce_rst -i eth1 - -Signed-off-by: Junxian Huang ---- - net/hikp_net_lib.h | 1 + - .../roce_ext_common/hikp_roce_ext_common.c | 1 + - .../roce_ext_common/hikp_roce_ext_common.h | 1 + - net/roce/roce_rst/hikp_roce_rst.c | 78 +++++++++++++++++++ - net/roce/roce_rst/hikp_roce_rst.h | 29 +++++++ - 5 files changed, 110 insertions(+) - create mode 100644 net/roce/roce_rst/hikp_roce_rst.c - create mode 100644 net/roce/roce_rst/hikp_roce_rst.h - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index 21b5357..e60fc15 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -100,6 +100,7 @@ enum roce_cmd_type { - GET_ROCEE_TIMER_CMD, - GET_ROCEE_TRP_CMD, - GET_ROCEE_TSP_CMD, -+ GET_ROCEE_RST_CMD, - }; - - enum ub_cmd_type { -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index ec47dce..01dded5 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -42,6 +42,7 @@ static const struct cmd_type_info { - {GET_ROCEE_TIMER_CMD, "TIMER", ROCE_HIKP_TIMER_REG_NUM_EXT}, - {GET_ROCEE_TRP_CMD, "TRP", ROCE_HIKP_TRP_REG_NUM_EXT}, - {GET_ROCEE_TSP_CMD, "TSP", ROCE_HIKP_TSP_REG_NUM_EXT}, -+ {GET_ROCEE_RST_CMD, "RST", ROCE_HIKP_RST_REG_NUM}, - }; - - static int get_cmd_info_table_idx(enum roce_cmd_type cmd_type) -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.h b/net/roce/roce_ext_common/hikp_roce_ext_common.h -index 1e8063d..918712f 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.h -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.h -@@ -27,6 +27,7 @@ - #define ROCE_HIKP_TIMER_REG_NUM_EXT ROCE_MAX_REG_NUM - #define ROCE_HIKP_TRP_REG_NUM_EXT ROCE_MAX_REG_NUM - #define ROCE_HIKP_TSP_REG_NUM_EXT ROCE_MAX_REG_NUM -+#define ROCE_HIKP_RST_REG_NUM ROCE_MAX_REG_NUM - - struct roce_ext_head { - uint8_t total_block_num; -diff --git a/net/roce/roce_rst/hikp_roce_rst.c b/net/roce/roce_rst/hikp_roce_rst.c -new file mode 100644 -index 0000000..ad4dd0c ---- /dev/null -+++ b/net/roce/roce_rst/hikp_roce_rst.c -@@ -0,0 +1,78 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_roce_rst.h" -+ -+static struct cmd_roce_rst_param g_roce_rst_param = { 0 }; -+ -+static int hikp_roce_rst_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", "device target, e.g. eth0"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static int hikp_roce_rst_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_roce_rst_param.target)); -+ if (self->err_no) -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.\n", argv); -+ -+ return self->err_no; -+} -+ -+static int hikp_roce_rst_get_data(struct hikp_cmd_ret **cmd_ret, -+ uint32_t block_id) -+{ -+ struct hikp_cmd_header req_header = { 0 }; -+ struct roce_rst_req_param req_data; -+ uint32_t req_size; -+ int ret; -+ -+ req_data.bdf = g_roce_rst_param.target.bdf; -+ req_data.block_id = block_id; -+ -+ req_size = sizeof(struct roce_rst_req_param); -+ hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_RST_CMD, -+ g_roce_rst_param.sub_cmd); -+ *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, req_size); -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) -+ printf("hikptool roce_rst cmd_ret malloc failed, sub_cmd = %u, ret = %d.\n", -+ g_roce_rst_param.sub_cmd, ret); -+ -+ return ret; -+} -+ -+static void hikp_roce_rst_execute(struct major_cmd_ctrl *self) -+{ -+ hikp_roce_ext_execute(self, GET_ROCEE_RST_CMD, hikp_roce_rst_get_data); -+} -+ -+static void cmd_roce_rst_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_roce_rst_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_roce_rst_help); -+ cmd_option_register("-i", "--interface", true, hikp_roce_rst_target); -+} -+ -+HIKP_CMD_DECLARE("roce_rst", "get roce_rst registers information", cmd_roce_rst_init); -diff --git a/net/roce/roce_rst/hikp_roce_rst.h b/net/roce/roce_rst/hikp_roce_rst.h -new file mode 100644 -index 0000000..731effc ---- /dev/null -+++ b/net/roce/roce_rst/hikp_roce_rst.h -@@ -0,0 +1,29 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef __HIKP_ROCE_RST_H__ -+#define __HIKP_ROCE_RST_H__ -+ -+#include "hikp_roce_ext_common.h" -+ -+struct cmd_roce_rst_param { -+ struct tool_target target; -+ uint32_t sub_cmd; -+}; -+ -+struct roce_rst_req_param { -+ struct bdf_t bdf; -+ uint32_t block_id; -+}; -+ -+#endif /* __HIKP_ROCE_RST_H__ */ --- -2.30.0 - diff --git a/0041-hikptool-roce-Add-roce_global_cfg-cmd-for-global-con.patch b/0041-hikptool-roce-Add-roce_global_cfg-cmd-for-global-con.patch deleted file mode 100644 index 460cad3..0000000 --- a/0041-hikptool-roce-Add-roce_global_cfg-cmd-for-global-con.patch +++ /dev/null @@ -1,210 +0,0 @@ -From 36ba114387e6b262d5a55b397a47e63fd0e75d0a Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Wed, 2 Aug 2023 16:12:49 +0800 -Subject: hikptool/roce: Add roce_global_cfg cmd for global config registers - query - -Add roce_global_cfg cmd for global config registers query - -Example: -hikptool roce_global_cfg -i eth1 - -Signed-off-by: Junxian Huang ---- - net/hikp_net_lib.h | 1 + - .../roce_ext_common/hikp_roce_ext_common.c | 1 + - .../roce_ext_common/hikp_roce_ext_common.h | 1 + - .../roce_global_cfg/hikp_roce_global_cfg.c | 97 +++++++++++++++++++ - .../roce_global_cfg/hikp_roce_global_cfg.h | 40 ++++++++ - 5 files changed, 140 insertions(+) - create mode 100644 net/roce/roce_global_cfg/hikp_roce_global_cfg.c - create mode 100644 net/roce/roce_global_cfg/hikp_roce_global_cfg.h - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index e60fc15..bdaacb1 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -101,6 +101,7 @@ enum roce_cmd_type { - GET_ROCEE_TRP_CMD, - GET_ROCEE_TSP_CMD, - GET_ROCEE_RST_CMD, -+ GET_ROCEE_GLOBAL_CFG_CMD, - }; - - enum ub_cmd_type { -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index 01dded5..0ff07dc 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -43,6 +43,7 @@ static const struct cmd_type_info { - {GET_ROCEE_TRP_CMD, "TRP", ROCE_HIKP_TRP_REG_NUM_EXT}, - {GET_ROCEE_TSP_CMD, "TSP", ROCE_HIKP_TSP_REG_NUM_EXT}, - {GET_ROCEE_RST_CMD, "RST", ROCE_HIKP_RST_REG_NUM}, -+ {GET_ROCEE_GLOBAL_CFG_CMD, "GLOBAL_CFG", ROCE_HIKP_GLOBAL_CFG_REG_NUM}, - }; - - static int get_cmd_info_table_idx(enum roce_cmd_type cmd_type) -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.h b/net/roce/roce_ext_common/hikp_roce_ext_common.h -index 918712f..870a361 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.h -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.h -@@ -28,6 +28,7 @@ - #define ROCE_HIKP_TRP_REG_NUM_EXT ROCE_MAX_REG_NUM - #define ROCE_HIKP_TSP_REG_NUM_EXT ROCE_MAX_REG_NUM - #define ROCE_HIKP_RST_REG_NUM ROCE_MAX_REG_NUM -+#define ROCE_HIKP_GLOBAL_CFG_REG_NUM ROCE_MAX_REG_NUM - - struct roce_ext_head { - uint8_t total_block_num; -diff --git a/net/roce/roce_global_cfg/hikp_roce_global_cfg.c b/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -new file mode 100644 -index 0000000..49a4a2c ---- /dev/null -+++ b/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -@@ -0,0 +1,97 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_roce_global_cfg.h" -+ -+static struct cmd_roce_global_cfg_param g_roce_global_cfg_param = { 0 }; -+ -+static int hikp_roce_global_cfg_help(struct major_cmd_ctrl *self, -+ const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", "device target, e.g. eth0"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static int hikp_roce_global_cfg_target(struct major_cmd_ctrl *self, -+ const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_roce_global_cfg_param.target)); -+ if (self->err_no) -+ snprintf(self->err_str, sizeof(self->err_str), -+ "Unknown device %s.\n", argv); -+ -+ return self->err_no; -+} -+ -+static int hikp_roce_global_cfg_get_data(struct hikp_cmd_ret **cmd_ret, -+ uint32_t block_id) -+{ -+ struct hikp_cmd_header req_header = { 0 }; -+ struct roce_global_cfg_req_param req_data; -+ uint32_t req_size; -+ int ret; -+ -+ req_data.bdf = g_roce_global_cfg_param.target.bdf; -+ req_data.block_id = block_id; -+ -+ req_size = sizeof(struct roce_global_cfg_req_param); -+ hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_GLOBAL_CFG_CMD, -+ g_roce_global_cfg_param.sub_cmd); -+ *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, req_size); -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) -+ printf("hikptool roce_global_cfg cmd_ret malloc failed, sub_cmd = %u, ret = %d.\n", -+ g_roce_global_cfg_param.sub_cmd, ret); -+ -+ return ret; -+} -+ -+static void hikp_roce_global_cfg_execute(struct major_cmd_ctrl *self) -+{ -+ enum roce_global_cfg_cmd_type sub_cmds[] = { -+ ROCE_GLB_GENAC, -+ ROCE_GLB_TRP_BANK, -+ ROCE_GLB_TRP_RX, -+ ROCE_GLB_TPP_M, -+ ROCE_GLB_QMM, -+ ROCE_GLB_TGP_TMP, -+ ROCE_GLB_TDP_M, -+ ROCE_GLB_NICL, -+ }; -+ int i; -+ -+ for (i = 0; i < HIKP_ARRAY_SIZE(sub_cmds); i++) { -+ g_roce_global_cfg_param.sub_cmd = sub_cmds[i]; -+ hikp_roce_ext_execute(self, GET_ROCEE_GLOBAL_CFG_CMD, -+ hikp_roce_global_cfg_get_data); -+ } -+} -+ -+static void cmd_roce_global_cfg_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_roce_global_cfg_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_roce_global_cfg_help); -+ cmd_option_register("-i", "--interface", true, hikp_roce_global_cfg_target); -+} -+ -+HIKP_CMD_DECLARE("roce_global_cfg", "get roce_global_cfg registers information", cmd_roce_global_cfg_init); -diff --git a/net/roce/roce_global_cfg/hikp_roce_global_cfg.h b/net/roce/roce_global_cfg/hikp_roce_global_cfg.h -new file mode 100644 -index 0000000..66e7fb8 ---- /dev/null -+++ b/net/roce/roce_global_cfg/hikp_roce_global_cfg.h -@@ -0,0 +1,40 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef __HIKP_ROCE_GLOBAL_CFG_H__ -+#define __HIKP_ROCE_GLOBAL_CFG_H__ -+ -+#include "hikp_roce_ext_common.h" -+ -+struct cmd_roce_global_cfg_param { -+ struct tool_target target; -+ uint32_t sub_cmd; -+}; -+ -+struct roce_global_cfg_req_param { -+ struct bdf_t bdf; -+ uint32_t block_id; -+}; -+ -+enum roce_global_cfg_cmd_type { -+ ROCE_GLB_GENAC = 0, -+ ROCE_GLB_TRP_BANK, -+ ROCE_GLB_TRP_RX, -+ ROCE_GLB_TPP_M, -+ ROCE_GLB_QMM, -+ ROCE_GLB_TGP_TMP, -+ ROCE_GLB_TDP_M, -+ ROCE_GLB_NICL, -+}; -+ -+#endif /* __HIKP_ROCE_GLOBAL_CFG_H__ */ --- -2.30.0 - diff --git a/0042-hikptool-roce-Add-roce_bond-cmd-for-bond-registers-q.patch b/0042-hikptool-roce-Add-roce_bond-cmd-for-bond-registers-q.patch deleted file mode 100644 index d35e533..0000000 --- a/0042-hikptool-roce-Add-roce_bond-cmd-for-bond-registers-q.patch +++ /dev/null @@ -1,179 +0,0 @@ -From 7f0a2e3f2dff9b49ce5be8b07835fa7c791cdce1 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Wed, 2 Aug 2023 16:17:40 +0800 -Subject: hikptool/roce: Add roce_bond cmd for bond registers query - -Add roce_bond cmd for bond registers query. - -Example: -hikptool roce_bond -i eth1 - -Signed-off-by: Junxian Huang ---- - net/hikp_net_lib.h | 1 + - net/roce/roce_bond/hikp_roce_bond.c | 78 +++++++++++++++++++ - net/roce/roce_bond/hikp_roce_bond.h | 29 +++++++ - .../roce_ext_common/hikp_roce_ext_common.c | 1 + - .../roce_ext_common/hikp_roce_ext_common.h | 1 + - 5 files changed, 110 insertions(+) - create mode 100644 net/roce/roce_bond/hikp_roce_bond.c - create mode 100644 net/roce/roce_bond/hikp_roce_bond.h - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index bdaacb1..ad9e7e4 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -102,6 +102,7 @@ enum roce_cmd_type { - GET_ROCEE_TSP_CMD, - GET_ROCEE_RST_CMD, - GET_ROCEE_GLOBAL_CFG_CMD, -+ GET_ROCEE_BOND_CMD, - }; - - enum ub_cmd_type { -diff --git a/net/roce/roce_bond/hikp_roce_bond.c b/net/roce/roce_bond/hikp_roce_bond.c -new file mode 100644 -index 0000000..89f8bab ---- /dev/null -+++ b/net/roce/roce_bond/hikp_roce_bond.c -@@ -0,0 +1,78 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_roce_bond.h" -+ -+static struct cmd_roce_bond_param g_roce_bond_param = { 0 }; -+ -+static int hikp_roce_bond_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", "device target, e.g. eth0"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static int hikp_roce_bond_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_roce_bond_param.target)); -+ if (self->err_no) -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.\n", argv); -+ -+ return self->err_no; -+} -+ -+static int hikp_roce_bond_get_data(struct hikp_cmd_ret **cmd_ret, -+ uint32_t block_id) -+{ -+ struct hikp_cmd_header req_header = { 0 }; -+ struct roce_bond_req_param req_data; -+ uint32_t req_size; -+ int ret; -+ -+ req_data.bdf = g_roce_bond_param.target.bdf; -+ req_data.block_id = block_id; -+ -+ req_size = sizeof(struct roce_bond_req_param); -+ hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_BOND_CMD, -+ g_roce_bond_param.sub_cmd); -+ *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, req_size); -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) -+ printf("hikptool roce_bond cmd_ret malloc failed, sub_cmd = %u, ret = %d.\n", -+ g_roce_bond_param.sub_cmd, ret); -+ -+ return ret; -+} -+ -+static void hikp_roce_bond_execute(struct major_cmd_ctrl *self) -+{ -+ hikp_roce_ext_execute(self, GET_ROCEE_BOND_CMD, hikp_roce_bond_get_data); -+} -+ -+static void cmd_roce_bond_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_roce_bond_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_roce_bond_help); -+ cmd_option_register("-i", "--interface", true, hikp_roce_bond_target); -+} -+ -+HIKP_CMD_DECLARE("roce_bond", "get roce_bond registers information", cmd_roce_bond_init); -diff --git a/net/roce/roce_bond/hikp_roce_bond.h b/net/roce/roce_bond/hikp_roce_bond.h -new file mode 100644 -index 0000000..14bd233 ---- /dev/null -+++ b/net/roce/roce_bond/hikp_roce_bond.h -@@ -0,0 +1,29 @@ -+/* -+ * Copyright (c) 2023 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef __HIKP_ROCE_BOND_H__ -+#define __HIKP_ROCE_BOND_H__ -+ -+#include "hikp_roce_ext_common.h" -+ -+struct cmd_roce_bond_param { -+ struct tool_target target; -+ uint32_t sub_cmd; -+}; -+ -+struct roce_bond_req_param { -+ struct bdf_t bdf; -+ uint32_t block_id; -+}; -+ -+#endif /* __HIKP_ROCE_BOND_H__ */ -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index 0ff07dc..d0fae69 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -44,6 +44,7 @@ static const struct cmd_type_info { - {GET_ROCEE_TSP_CMD, "TSP", ROCE_HIKP_TSP_REG_NUM_EXT}, - {GET_ROCEE_RST_CMD, "RST", ROCE_HIKP_RST_REG_NUM}, - {GET_ROCEE_GLOBAL_CFG_CMD, "GLOBAL_CFG", ROCE_HIKP_GLOBAL_CFG_REG_NUM}, -+ {GET_ROCEE_BOND_CMD, "BOND", ROCE_HIKP_BOND_REG_NUM}, - }; - - static int get_cmd_info_table_idx(enum roce_cmd_type cmd_type) -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.h b/net/roce/roce_ext_common/hikp_roce_ext_common.h -index 870a361..a600449 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.h -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.h -@@ -29,6 +29,7 @@ - #define ROCE_HIKP_TSP_REG_NUM_EXT ROCE_MAX_REG_NUM - #define ROCE_HIKP_RST_REG_NUM ROCE_MAX_REG_NUM - #define ROCE_HIKP_GLOBAL_CFG_REG_NUM ROCE_MAX_REG_NUM -+#define ROCE_HIKP_BOND_REG_NUM ROCE_MAX_REG_NUM - - struct roce_ext_head { - uint8_t total_block_num; --- -2.30.0 - diff --git a/0043-hikptool-roce-Add-ext-query-for-roce_caep-cmd.patch b/0043-hikptool-roce-Add-ext-query-for-roce_caep-cmd.patch deleted file mode 100644 index 7ee6275..0000000 --- a/0043-hikptool-roce-Add-ext-query-for-roce_caep-cmd.patch +++ /dev/null @@ -1,174 +0,0 @@ -From 80d9d76b7d5af23e58d13569bd1898604c8e2456 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Tue, 1 Aug 2023 17:41:24 +0800 -Subject: hikptool/roce: Add ext query for roce_caep cmd - -Add ext query for roce_caep cmd. To query these ext registers, add --e to the query cmd. - -Example: -hikptool roce_caep -i eth1 -e - -Signed-off-by: Junxian Huang ---- - net/roce/roce_caep/hikp_roce_caep.c | 69 +++++++++++++++++++---------- - net/roce/roce_caep/hikp_roce_caep.h | 11 +++++ - 2 files changed, 57 insertions(+), 23 deletions(-) - -diff --git a/net/roce/roce_caep/hikp_roce_caep.c b/net/roce/roce_caep/hikp_roce_caep.c -index 69a4742..6c92ea1 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.c -+++ b/net/roce/roce_caep/hikp_roce_caep.c -@@ -22,6 +22,7 @@ static int hikp_roce_caep_help(struct major_cmd_ctrl *self, const char *argv) - printf(" Options:\n\n"); - printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); - printf(" %s, %-25s %s\n", "-i", "--interface=", "device target, e.g. eth0"); -+ printf(" %s, %-25s %s\n", "-e", "--extend", "query extend caep registers"); - printf("\n"); - - return 0; -@@ -31,7 +32,7 @@ static int hikp_roce_caep_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_roce_caep_param_t.target)); - if (self->err_no != 0) { -- snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.\n", argv); - return self->err_no; - } - -@@ -39,18 +40,28 @@ static int hikp_roce_caep_target(struct major_cmd_ctrl *self, const char *argv) - } - - static int hikp_roce_caep_get_data(struct hikp_cmd_ret **cmd_ret, -- struct roce_caep_req_param req_data) -+ uint32_t block_id) - { -+ struct roce_caep_req_param_ext req_data_ext; - struct hikp_cmd_header req_header = { 0 }; -+ uint32_t req_size; -+ int ret; - -- hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_CAEP_CMD, 0); -- *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (*cmd_ret == NULL) { -- printf("hikptool roce_caep cmd_ret malloc failed\n"); -- return -EIO; -- } -- -- return 0; -+ req_data_ext.origin_param.bdf = g_roce_caep_param_t.target.bdf; -+ req_data_ext.block_id = block_id; -+ -+ req_size = (g_roce_caep_param_t.sub_cmd == CAEP_ORIGIN) ? -+ sizeof(struct roce_caep_req_param) : -+ sizeof(struct roce_caep_req_param_ext); -+ hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_CAEP_CMD, -+ g_roce_caep_param_t.sub_cmd); -+ *cmd_ret = hikp_cmd_alloc(&req_header, &req_data_ext, req_size); -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) -+ printf("hikptool roce_caep cmd_ret malloc failed, sub_cmd = %u, ret = %d.\n", -+ g_roce_caep_param_t.sub_cmd, ret); -+ -+ return ret; - } - - static void hikp_roce_caep_print(uint32_t total_block_num, -@@ -64,29 +75,40 @@ static void hikp_roce_caep_print(uint32_t total_block_num, - printf("************************************\n"); - } - --static void hikp_roce_caep_execute(struct major_cmd_ctrl *self) -+static void hikp_roce_caep_execute_origin(struct major_cmd_ctrl *self) - { - struct roce_caep_res_param *roce_caep_res; -- struct roce_caep_req_param req_data; - struct hikp_cmd_ret *cmd_ret; -- int ret; - -- req_data.bdf = g_roce_caep_param_t.target.bdf; -- ret = hikp_roce_caep_get_data(&cmd_ret, req_data); -- if (ret < 0) { -- self->err_no = ret; -- return; -- } else if (cmd_ret->status != 0) { -- printf("hikptool roce_caep read data failed\n"); -+ self->err_no = hikp_roce_caep_get_data(&cmd_ret, 0); -+ if (self->err_no) { -+ printf("hikptool roce_caep get data failed.\n"); - goto exec_error; - } - roce_caep_res = (struct roce_caep_res_param *)cmd_ret->rsp_data; - hikp_roce_caep_print(roce_caep_res->total_block_num, -- roce_caep_res->reg_data.offset, roce_caep_res->reg_data.data); -+ roce_caep_res->reg_data.offset, -+ roce_caep_res->reg_data.data); - - exec_error: -- free(cmd_ret); -- cmd_ret = NULL; -+ if (cmd_ret) -+ free(cmd_ret); -+} -+ -+static void hikp_roce_caep_execute(struct major_cmd_ctrl *self) -+{ -+ if (g_roce_caep_param_t.sub_cmd == CAEP_ORIGIN) -+ hikp_roce_caep_execute_origin(self); -+ else -+ hikp_roce_ext_execute(self, GET_ROCEE_CAEP_CMD, -+ hikp_roce_caep_get_data); -+} -+ -+static int hikp_roce_caep_ext_set(struct major_cmd_ctrl *self, const char *argv) -+{ -+ g_roce_caep_param_t.sub_cmd = CAEP_EXT; -+ -+ return 0; - } - - static void cmd_roce_caep_init(void) -@@ -98,6 +120,7 @@ static void cmd_roce_caep_init(void) - - cmd_option_register("-h", "--help", false, hikp_roce_caep_help); - cmd_option_register("-i", "--interface", true, hikp_roce_caep_target); -+ cmd_option_register("-e", "--extend", false, hikp_roce_caep_ext_set); - } - - HIKP_CMD_DECLARE("roce_caep", "get roce_caep registers information", cmd_roce_caep_init); -diff --git a/net/roce/roce_caep/hikp_roce_caep.h b/net/roce/roce_caep/hikp_roce_caep.h -index 804d2df..547a4d6 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.h -+++ b/net/roce/roce_caep/hikp_roce_caep.h -@@ -21,12 +21,18 @@ - - struct cmd_roce_caep_param_t { - struct tool_target target; -+ uint32_t sub_cmd; - }; - - struct roce_caep_req_param { - struct bdf_t bdf; - }; - -+struct roce_caep_req_param_ext { -+ struct roce_caep_req_param origin_param; -+ uint32_t block_id; -+}; -+ - struct roce_caep_res { - uint32_t offset[ROCE_HIKP_CAEP_REG_NUM]; - uint32_t data[ROCE_HIKP_CAEP_REG_NUM]; -@@ -37,4 +43,9 @@ struct roce_caep_res_param { - struct roce_caep_res reg_data; - }; - -+enum roce_caep_cmd_type { -+ CAEP_ORIGIN = 0, -+ CAEP_EXT, -+}; -+ - #endif /* __HIKP_ROCE_CAEP_H__ */ --- -2.30.0 - diff --git a/0044-hikptool-roce-Add-ext-query-for-roce_mdb-cmd.patch b/0044-hikptool-roce-Add-ext-query-for-roce_mdb-cmd.patch deleted file mode 100644 index e167f36..0000000 --- a/0044-hikptool-roce-Add-ext-query-for-roce_mdb-cmd.patch +++ /dev/null @@ -1,210 +0,0 @@ -From b949611a7a302743916155adee01db0c73c0f8e7 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Fri, 4 Aug 2023 17:25:23 +0800 -Subject: hikptool/roce: Add ext query for roce_mdb cmd - -Add ext query for roce_mdb cmd. To query these ext registers, add --e to the query cmd. - -Example: -hikptool roce_mdb -i eth1 -e - -Signed-off-by: Junxian Huang ---- - net/roce/roce_mdb/hikp_roce_mdb.c | 83 ++++++++++++++++++++----------- - net/roce/roce_mdb/hikp_roce_mdb.h | 13 ++++- - 2 files changed, 67 insertions(+), 29 deletions(-) - -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.c b/net/roce/roce_mdb/hikp_roce_mdb.c -index 9cc07a1..04af817 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.c -+++ b/net/roce/roce_mdb/hikp_roce_mdb.c -@@ -14,7 +14,6 @@ - #include - #include "hikp_roce_mdb.h" - --#define ROCE_MDB_CMD_CLEAR HI_BIT(0) - static struct cmd_roce_mdb_param g_roce_mdb_param = { 0 }; - - static int hikp_roce_mdb_help(struct major_cmd_ctrl *self, const char *argv) -@@ -25,6 +24,7 @@ static int hikp_roce_mdb_help(struct major_cmd_ctrl *self, const char *argv) - printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); - printf(" %s, %-25s %s\n", "-i", "--interface=", "device target, e.g. eth0"); - printf(" %s, %-25s %s\n", "-c", "--clear=", "clear mdb registers"); -+ printf(" %s, %-25s %s\n", "-e", "--extend", "query extend mdb registers"); - printf("\n"); - - return 0; -@@ -34,7 +34,7 @@ static int hikp_roce_mdb_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_roce_mdb_param.target)); - if (self->err_no) { -- snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.\n", argv); - return self->err_no; - } - -@@ -43,7 +43,8 @@ static int hikp_roce_mdb_target(struct major_cmd_ctrl *self, const char *argv) - - static int hikp_roce_mdb_clear_set(struct major_cmd_ctrl *self, const char *argv) - { -- g_roce_mdb_param.reset_flag = ROCE_MDB_CMD_CLEAR; -+ g_roce_mdb_param.flag |= ROCE_MDB_CMD_CLEAR; -+ - return 0; - } - -@@ -58,53 +59,78 @@ static void hikp_roce_mdb_print(uint32_t reg_num, struct roce_mdb_rsp_data *mdb_ - printf("***********************************\n"); - } - --static int hikp_roce_mdb_show(struct major_cmd_ctrl *self) -+static int hikp_roce_mdb_get_data(struct hikp_cmd_ret **cmd_ret, -+ uint32_t block_id) - { -- struct roce_mdb_req_para req_data = { 0 }; -- struct roce_mdb_rsp_data *mdb_rsp = NULL; -+ struct roce_mdb_req_param_ext req_data_ext; - struct hikp_cmd_header req_header = { 0 }; -+ uint32_t req_size; -+ int ret; -+ -+ req_data_ext.origin_param.bdf = g_roce_mdb_param.target.bdf; -+ req_data_ext.block_id = block_id; -+ -+ req_size = (g_roce_mdb_param.flag & ROCE_MDB_CMD_EXT) ? -+ sizeof(struct roce_mdb_req_param_ext) : -+ sizeof(struct roce_mdb_req_para); -+ hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_MDB_CMD, -+ g_roce_mdb_param.sub_cmd); -+ *cmd_ret = hikp_cmd_alloc(&req_header, &req_data_ext, req_size); -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) -+ printf("hikptool roce_mdb cmd_ret malloc failed, sub_cmd = %u, ret = %d.\n", -+ g_roce_mdb_param.sub_cmd, ret); -+ -+ return ret; -+} -+ -+static void hikp_roce_mdb_execute_origin(struct major_cmd_ctrl *self) -+{ -+ struct roce_mdb_rsp_data *mdb_rsp = NULL; - struct hikp_cmd_ret *cmd_ret = NULL; - uint32_t reg_num; - int ret; - -- req_data.bdf = g_roce_mdb_param.target.bdf; -- if (g_roce_mdb_param.reset_flag) -- hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_MDB_CMD, MDB_CLEAR); -- else -- hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_MDB_CMD, MDB_SHOW); -- -- cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- ret = hikp_rsp_normal_check(cmd_ret); -- if (ret != 0) -+ self->err_no = hikp_roce_mdb_get_data(&cmd_ret, 0); -+ if (self->err_no) { -+ printf("hikptool roce_mdb get data failed\n"); - goto exec_error; -+ } - - reg_num = cmd_ret->rsp_data_num / ROCE_HIKP_REG_SWICTH; - if (reg_num != ROCE_HIKP_MDB_REG_NUM) { - printf("version might not match.\n"); -- ret = -1; -+ self->err_no = -EPROTO; - goto exec_error; - } - - mdb_rsp = (struct roce_mdb_rsp_data *)(cmd_ret->rsp_data); - hikp_roce_mdb_print(reg_num, mdb_rsp); -- ret = 0; - - exec_error: -- free(cmd_ret); -- cmd_ret = NULL; -- return ret; -+ if (cmd_ret) -+ free(cmd_ret); - } - - static void hikp_roce_mdb_execute(struct major_cmd_ctrl *self) - { -- self->err_no = hikp_roce_mdb_show(self); -- if (self->err_no) -- return; -- -- if (g_roce_mdb_param.reset_flag) -- printf("clear roce_mdb reg success.\n"); -- else -- printf("show roce_mdb reg success.\n"); -+ if (g_roce_mdb_param.flag & ROCE_MDB_CMD_EXT) { -+ g_roce_mdb_param.sub_cmd = (g_roce_mdb_param.flag & ROCE_MDB_CMD_CLEAR) ? -+ MDB_CLEAR_EXT : MDB_EXT; -+ hikp_roce_ext_execute(self, GET_ROCEE_MDB_CMD, -+ hikp_roce_mdb_get_data); -+ } else { -+ g_roce_mdb_param.sub_cmd = (g_roce_mdb_param.flag & ROCE_MDB_CMD_CLEAR) ? -+ MDB_CLEAR : MDB_SHOW; -+ hikp_roce_mdb_execute_origin(self); -+ } -+} -+ -+static int hikp_roce_mdb_ext_set(struct major_cmd_ctrl *self, const char *argv) -+{ -+ g_roce_mdb_param.flag |= ROCE_MDB_CMD_EXT; -+ -+ return 0; - } - - static void cmd_roce_mdb_init(void) -@@ -117,6 +143,7 @@ static void cmd_roce_mdb_init(void) - cmd_option_register("-h", "--help", false, hikp_roce_mdb_help); - cmd_option_register("-i", "--interface", true, hikp_roce_mdb_target); - cmd_option_register("-c", "--clear", false, hikp_roce_mdb_clear_set); -+ cmd_option_register("-e", "--extend", false, hikp_roce_mdb_ext_set); - } - - HIKP_CMD_DECLARE("roce_mdb", "get or clear roce_mdb registers information", cmd_roce_mdb_init); -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.h b/net/roce/roce_mdb/hikp_roce_mdb.h -index 7643dff..26fc549 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.h -+++ b/net/roce/roce_mdb/hikp_roce_mdb.h -@@ -19,15 +19,24 @@ - #define ROCE_HIKP_MDB_REG_NUM 22 - #define ROCE_HIKP_REG_SWICTH 2 - -+#define ROCE_MDB_CMD_CLEAR (1 << 0) -+#define ROCE_MDB_CMD_EXT (1 << 1) -+ - struct cmd_roce_mdb_param { - struct tool_target target; -- int reset_flag; -+ uint32_t sub_cmd; -+ uint8_t flag; - }; - - struct roce_mdb_req_para { - struct bdf_t bdf; - }; - -+struct roce_mdb_req_param_ext { -+ struct roce_mdb_req_para origin_param; -+ uint32_t block_id; -+}; -+ - struct roce_mdb_rsp_data { - uint32_t reg_offset[ROCE_HIKP_MDB_REG_NUM]; - uint32_t reg_data[ROCE_HIKP_MDB_REG_NUM]; -@@ -36,6 +45,8 @@ struct roce_mdb_rsp_data { - enum roce_mdb_cmd_type { - MDB_SHOW = 0x0, - MDB_CLEAR, -+ MDB_EXT, -+ MDB_CLEAR_EXT, - }; - - #endif /* __HIKP_ROCE_MDB_H__ */ --- -2.30.0 - diff --git a/0045-hikptool-roce-Add-ext-query-for-roce_qmm-cmd.patch b/0045-hikptool-roce-Add-ext-query-for-roce_qmm-cmd.patch deleted file mode 100644 index 29a344a..0000000 --- a/0045-hikptool-roce-Add-ext-query-for-roce_qmm-cmd.patch +++ /dev/null @@ -1,252 +0,0 @@ -From 87f8605c32d308938df17b29816720ca97b0a23f Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Sat, 26 Aug 2023 15:05:53 +0800 -Subject: hikptool/roce: Add ext query for roce_qmm cmd - -Add ext query for roce_qmm cmd. To query these ext registers, add --e to the query cmd. - -Example: -hikptool roce_qmm -i eth1 -e - -Signed-off-by: Junxian Huang ---- - net/roce/roce_qmm/hikp_roce_qmm.c | 137 ++++++++++++++---------------- - net/roce/roce_qmm/hikp_roce_qmm.h | 11 +++ - 2 files changed, 75 insertions(+), 73 deletions(-) - -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.c b/net/roce/roce_qmm/hikp_roce_qmm.c -index c7e0ca4..b020c6a 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.c -+++ b/net/roce/roce_qmm/hikp_roce_qmm.c -@@ -25,6 +25,7 @@ static int hikp_roce_qmm_help(struct major_cmd_ctrl *self, const char *argv) - printf(" %s, %-25s %s\n", "-i", "--interface=", "device target, e.g. eth0"); - printf(" %s, %-25s %s\n", "-b", "--bank=", - "[option]bank number, e.g. 0~7. (default 0)"); -+ printf(" %s, %-25s %s\n", "-e", "--extend", "query extend qmm registers"); - printf("\n"); - - return 0; -@@ -34,7 +35,7 @@ static int hikp_roce_qmm_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_roce_qmm_param.target)); - if (self->err_no != 0) { -- snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.\n", argv); - return self->err_no; - } - -@@ -61,6 +62,8 @@ static void hikp_roce_qmm_print(struct roce_qmm_rsp_data *qmm_rsp) - { - int index = 0; - -+ printf("**************QMM %s INFO*************\n", -+ g_roce_qmm_param.sub_name); - while (index < qmm_rsp->reg_num) { - printf("0x%08X : 0x%08X\n", qmm_rsp->qmm_content[index][0], - qmm_rsp->qmm_content[index][1]); -@@ -69,101 +72,88 @@ static void hikp_roce_qmm_print(struct roce_qmm_rsp_data *qmm_rsp) - printf("***************************************\n"); - } - --static int hikp_roce_qmm_show_cqc(struct major_cmd_ctrl *self) -+static int hikp_roce_qmm_get_data(struct hikp_cmd_ret **cmd_ret, -+ uint32_t block_id) - { -- struct roce_qmm_req_para req_data = { 0 }; -- struct roce_qmm_rsp_data *qmm_rsp = NULL; -+ struct roce_qmm_req_para_ext req_data_ext; - struct hikp_cmd_header req_header = { 0 }; -- struct hikp_cmd_ret *cmd_ret = NULL; -+ uint32_t req_size; - int ret; - -- req_data.bdf = g_roce_qmm_param.target.bdf; -+ req_data_ext.origin_param.bdf = g_roce_qmm_param.target.bdf; -+ req_data_ext.origin_param.bank_id = g_roce_qmm_param.bank_id; -+ req_data_ext.block_id = block_id; -+ -+ req_size = g_roce_qmm_param.ext_flag ? -+ sizeof(struct roce_qmm_req_para) : -+ sizeof(struct roce_qmm_req_para_ext); -+ hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_QMM_CMD, -+ g_roce_qmm_param.sub_cmd); -+ *cmd_ret = hikp_cmd_alloc(&req_header, &req_data_ext, req_size); -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) -+ printf("hikptool roce_qmm cmd_ret malloc failed, sub_cmd = %u, ret = %d.\n", -+ g_roce_qmm_param.sub_cmd, ret); - -- hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_QMM_CMD, QMM_SHOW_CQC); -- cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- ret = hikp_rsp_normal_check(cmd_ret); -- if (ret != 0) -- goto out; -- -- qmm_rsp = (struct roce_qmm_rsp_data *)(cmd_ret->rsp_data); -- printf("**************QMM CQC INFO*************\n"); -- hikp_roce_qmm_print(qmm_rsp); --out: -- free(cmd_ret); -- cmd_ret = NULL; -- return ret; --} -- --static int hikp_roce_qmm_show_qpc(struct major_cmd_ctrl *self) --{ -- struct roce_qmm_req_para req_data = { 0 }; -- struct roce_qmm_rsp_data *qmm_rsp = NULL; -- struct hikp_cmd_header req_header = { 0 }; -- struct hikp_cmd_ret *cmd_ret = NULL; -- int ret; -- -- req_data.bdf = g_roce_qmm_param.target.bdf; -- req_data.bank_id = g_roce_qmm_param.bank_id; -- -- hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_QMM_CMD, QMM_SHOW_QPC); -- cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- ret = hikp_rsp_normal_check(cmd_ret); -- if (ret != 0) -- goto out; -- -- qmm_rsp = (struct roce_qmm_rsp_data *)(cmd_ret->rsp_data); -- printf("**************QMM QPC INFO*************\n"); -- hikp_roce_qmm_print(qmm_rsp); --out: -- free(cmd_ret); -- cmd_ret = NULL; - return ret; - } - --static int hikp_roce_qmm_show_top(struct major_cmd_ctrl *self) -+static void hikp_roce_qmm_execute_origin(struct major_cmd_ctrl *self) - { -- struct roce_qmm_req_para req_data = { 0 }; -- struct roce_qmm_rsp_data *qmm_rsp = NULL; -- struct hikp_cmd_header req_header = { 0 }; -- struct hikp_cmd_ret *cmd_ret = NULL; -- int ret; -+ struct roce_qmm_rsp_data *roce_qmm_res; -+ struct hikp_cmd_ret *cmd_ret; - -- req_data.bdf = g_roce_qmm_param.target.bdf; -- -- hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_QMM_CMD, QMM_SHOW_TOP); -- cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- ret = hikp_rsp_normal_check(cmd_ret); -- if (ret != 0) -- goto out; -+ self->err_no = hikp_roce_qmm_get_data(&cmd_ret, 0); -+ if (self->err_no) { -+ printf("hikptool roce_qmm get data failed.\n"); -+ goto exec_error; -+ } -+ roce_qmm_res = (struct roce_qmm_rsp_data *)cmd_ret->rsp_data; -+ hikp_roce_qmm_print(roce_qmm_res); - -- qmm_rsp = (struct roce_qmm_rsp_data *)(cmd_ret->rsp_data); -- printf("**************QMM TOP INFO*************\n"); -- hikp_roce_qmm_print(qmm_rsp); --out: -- free(cmd_ret); -- cmd_ret = NULL; -- return ret; -+exec_error: -+ if (cmd_ret) -+ free(cmd_ret); - } - - static void hikp_roce_qmm_execute(struct major_cmd_ctrl *self) - { -- int (*func[])(struct major_cmd_ctrl *self) = { -- hikp_roce_qmm_show_cqc, hikp_roce_qmm_show_qpc, hikp_roce_qmm_show_top -+ const struct cmd_type_info { -+ enum roce_qmm_cmd_type sub_cmd; -+ enum roce_qmm_cmd_type sub_ext_cmd; -+ const char *sub_name; -+ } sub_cmd_info_table[] = { -+ {QMM_SHOW_CQC, QMM_SHOW_CQC_EXT, "CQC"}, -+ {QMM_SHOW_QPC, QMM_SHOW_QPC_EXT, "QPC"}, -+ {QMM_SHOW_TOP, QMM_SHOW_TOP_EXT, "TOP"}, - }; -- char *function[] = {"show cqc", "show qpc", "show top"}; -- int ret; - -- for (int i = 0; i < HIKP_ARRAY_SIZE(func); i++) { -- ret = func[i](self); -- if (ret != 0) { -- self->err_no = -EINVAL; -+ for (int i = 0; i < HIKP_ARRAY_SIZE(sub_cmd_info_table); i++) { -+ g_roce_qmm_param.sub_name = sub_cmd_info_table[i].sub_name; -+ if (g_roce_qmm_param.ext_flag) { -+ g_roce_qmm_param.sub_cmd = sub_cmd_info_table[i].sub_ext_cmd; -+ hikp_roce_ext_execute(self, GET_ROCEE_QMM_CMD, -+ hikp_roce_qmm_get_data); -+ } else { -+ g_roce_qmm_param.sub_cmd = sub_cmd_info_table[i].sub_cmd; -+ hikp_roce_qmm_execute_origin(self); -+ } -+ if (self->err_no) { - snprintf(self->err_str, sizeof(self->err_str), -- "roce_qmm %s function failed\n", function[i]); -+ "roce_qmm show %s function failed\n", -+ sub_cmd_info_table[i].sub_name); - break; - } - } - } - -+static int hikp_roce_qmm_ext_set(struct major_cmd_ctrl *self, const char *argv) -+{ -+ g_roce_qmm_param.ext_flag = true; -+ -+ return 0; -+} -+ - static void cmd_roce_qmm_init(void) - { - struct major_cmd_ctrl *major_cmd = get_major_cmd(); -@@ -174,6 +164,7 @@ static void cmd_roce_qmm_init(void) - cmd_option_register("-h", "--help", false, hikp_roce_qmm_help); - cmd_option_register("-i", "--interface", true, hikp_roce_qmm_target); - cmd_option_register("-b", "--bank", true, hikp_roce_qmm_bank_get); -+ cmd_option_register("-e", "--extend", false, hikp_roce_qmm_ext_set); - } - - HIKP_CMD_DECLARE("roce_qmm", "get roce_qmm registers information", cmd_roce_qmm_init); -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.h b/net/roce/roce_qmm/hikp_roce_qmm.h -index 0645ab3..06e6bcf 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.h -+++ b/net/roce/roce_qmm/hikp_roce_qmm.h -@@ -22,6 +22,9 @@ - struct cmd_roce_qmm_param_t { - struct tool_target target; - uint32_t bank_id; -+ uint32_t sub_cmd; -+ const char *sub_name; -+ bool ext_flag; - }; - - struct roce_qmm_rsp_data { -@@ -34,10 +37,18 @@ struct roce_qmm_req_para { - uint32_t bank_id; - }; - -+struct roce_qmm_req_para_ext { -+ struct roce_qmm_req_para origin_param; -+ uint32_t block_id; -+}; -+ - enum roce_qmm_cmd_type { - QMM_SHOW_CQC = 0x1, - QMM_SHOW_QPC = 0x2, - QMM_SHOW_TOP = 0x3, -+ QMM_SHOW_CQC_EXT, -+ QMM_SHOW_QPC_EXT, -+ QMM_SHOW_TOP_EXT, - }; - - #endif /* __HIKP_ROCE_QMM_H__ */ --- -2.30.0 - diff --git a/0046-hikptool-Querying-the-SerDes-Relationship-of-the-PCI.patch b/0046-hikptool-Querying-the-SerDes-Relationship-of-the-PCI.patch deleted file mode 100644 index 6646cc5..0000000 --- a/0046-hikptool-Querying-the-SerDes-Relationship-of-the-PCI.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 6747635a4423fc0844230bc66112853856b9fe97 Mon Sep 17 00:00:00 2001 -From: mou bingquan -Date: Wed, 18 Oct 2023 09:52:39 +0800 -Subject: [PATCH] hikptool : Querying the SerDes Relationship of the PCIe - -This function is used to query the macro corresponding to the -port of the PCIe. It is a type of SerDes multiplexing relationship. ---- - pcie/func_lib/pcie_func/pcie_statistics.c | 30 +++++++++++++++++++++++ - pcie/func_lib/pcie_func/pcie_statistics.h | 10 ++++++++ - 2 files changed, 40 insertions(+) - -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.c b/pcie/func_lib/pcie_func/pcie_statistics.c -index 308a142..128e7f7 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.c -+++ b/pcie/func_lib/pcie_func/pcie_statistics.c -@@ -25,6 +25,10 @@ static const char *g_global_width_name[GLOBAL_WIDTH_TABLE_SIZE] = { - "PCIE_WIDTH_X1", "PCIE_WIDTH_X2", "PCIE_WIDTH_X4", "PCIE_WIDTH_X8", "PCIE_WIDTH_X16" - }; - -+static const char *g_global_ndie_name[] = { -+ "Ndie_A", "Ndie_B" -+}; -+ - static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, uint32_t *port_num) - { - size_t rsp_data_size, expect_data_size; -@@ -58,6 +62,29 @@ static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, - return 0; - } - -+static int pcie_portid_serdes_relation(const struct pcie_macro_info *macro_info, -+ uint32_t macro_num, uint32_t ndie_id) -+{ -+ uint32_t i, j; -+ -+ if (ndie_id >= HIKP_ARRAY_SIZE(g_global_ndie_name)) { -+ Info("PCIe Base", "ndie_id [%u]: %s\n", ndie_id, "UNKNOWN_NDIE"); -+ return -1; -+ } -+ -+ if (macro_num >= MAX_MACRO_ONEPORT) { -+ Info("PCIe Base", "macro_num [%u] exceeds the maximum array length\n", macro_num); -+ return -1; -+ } -+ -+ Info("PCIe Base", "\tndie_id: %s\n", g_global_ndie_name[ndie_id]); -+ for (i = 0; i < macro_num; i++) { -+ for (j = macro_info[i].lane_s; j <= macro_info[i].lane_e; j++) -+ Info("PCIe Base", "\t\tmacro %d \t lane: %d\n", macro_info[i].id, j); -+ } -+ return 0; -+} -+ - int pcie_port_distribution_get(uint32_t chip_id) - { - struct hikp_cmd_header req_header; -@@ -86,6 +113,9 @@ int pcie_port_distribution_get(uint32_t chip_id) - } - Info("PCIe Base", "port_id[%u] %s\n", port_info->info_pair[i].port_id, - g_global_width_name[port_info->info_pair[i].port_width]); -+ pcie_portid_serdes_relation(port_info->info_pair[i].macro_info, -+ port_info->info_pair[i].macro_num, -+ port_info->info_pair[i].ndie_id); - } - free_cmd_ret: - free(cmd_ret); -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.h b/pcie/func_lib/pcie_func/pcie_statistics.h -index 2a3cc66..3e3916b 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.h -+++ b/pcie/func_lib/pcie_func/pcie_statistics.h -@@ -17,6 +17,7 @@ - #include "pcie_common_api.h" - - #define GLOBAL_WIDTH_TABLE_SIZE 5 -+#define MAX_MACRO_ONEPORT 3 - - union mac_test_cnt { - /* Define the struct bits */ -@@ -88,9 +89,18 @@ union dfx_dcrc_err_num { - unsigned int u32; - }; - -+struct pcie_macro_info { -+ uint32_t id; -+ uint32_t lane_s; -+ uint32_t lane_e; -+}; -+ - struct pcie_info_distribution_pair { - uint32_t port_id; - uint32_t port_width; -+ uint32_t ndie_id; -+ uint32_t macro_num; -+ struct pcie_macro_info macro_info[MAX_MACRO_ONEPORT]; - }; - - struct pcie_port_info { --- -2.33.0 diff --git a/0047-hikptool-Remove-the-function-of-querying-SAS-device-.patch b/0047-hikptool-Remove-the-function-of-querying-SAS-device-.patch deleted file mode 100644 index b4af52f..0000000 --- a/0047-hikptool-Remove-the-function-of-querying-SAS-device-.patch +++ /dev/null @@ -1,177 +0,0 @@ -From ba80a0dd531a4eebccb1852a65b4b7272a02c06d Mon Sep 17 00:00:00 2001 -From: Yihang Li -Date: Tue, 17 Oct 2023 18:58:27 +0800 -Subject: [PATCH] hikptool: Remove the function of querying SAS device - configurations - -Currently, SAS device information cannot be obtained. -Remove the function of querying SAS device configurations - -Signed-off-by: Yihang Li ---- - sas/sas_func/sas_common.h | 2 -- - sas/sas_func/sas_read_dev.c | 21 --------------------- - sas/user_cmd/cmd_code/sas_cmd_common.c | 10 ---------- - sas/user_cmd/cmd_code/sas_cmd_dev.c | 17 ----------------- - sas/user_cmd/cmd_code/sas_tools_include.h | 2 -- - 5 files changed, 52 deletions(-) - -diff --git a/sas/sas_func/sas_common.h b/sas/sas_func/sas_common.h -index 9464792..1bace0c 100644 ---- a/sas/sas_func/sas_common.h -+++ b/sas/sas_func/sas_common.h -@@ -22,7 +22,6 @@ - #define IPTT_ICT_STATUS 29 - #define LINK_SPEED_OFFSET 8 - #define LINK_SPEED_WIDTH 4 --#define MAX_DEVICE_NUM 2048 - - #define DWS_LOST 0 - #define RESET_PROB 1 -@@ -73,7 +72,6 @@ enum sas_errcode_cmd_type { - - enum sas_dev_cmd_type { - DEV_LINK, -- DEV_INFO, - DEV_UNKNOWN_TYPE, - }; - -diff --git a/sas/sas_func/sas_read_dev.c b/sas/sas_func/sas_read_dev.c -index 8b9b58d..3a3db07 100644 ---- a/sas/sas_func/sas_read_dev.c -+++ b/sas/sas_func/sas_read_dev.c -@@ -76,24 +76,6 @@ static void print_dev_link(const uint32_t *reg_save, uint32_t reg_num) - } - } - --static void print_dev_info(const void *reg_save, uint32_t reg_num) --{ -- volatile struct hikp_sas_itct *itct = (volatile struct hikp_sas_itct *)reg_save; -- -- printf("The device information as below:\n"); -- printf("dev_type: %d\n", itct->dw0.dev_type); -- printf("dev_valid: %d\n", itct->dw0.dev_valid); -- printf("break_reply_en: %d\n", itct->dw0.break_reply_en); -- printf("smp_timeout: %d\n", itct->dw0.smp_timeout); -- printf("tlr_en: %d\n", itct->dw0.tlr_en); -- printf("awt_continue: %d\n", itct->dw0.awt_continue); -- printf("sas_addr: 0x%llx\n", itct->sas_addr); -- printf("I_T_nexus_loss: %d\n", itct->dw2.I_T_nexus_loss); -- printf("awt_initial_value: %d\n", itct->dw2.awt_initial_value); -- printf("maximum_connect_time: %d\n", itct->dw2.maximum_connect_time); -- printf("reject_to_open_limit: %d\n", itct->dw2.reject_to_open_limit); --} -- - static void sas_print_dev(const uint32_t *reg_save, uint32_t reg_num, uint32_t cmd_type) - { - uint32_t i; -@@ -106,9 +88,6 @@ static void sas_print_dev(const uint32_t *reg_save, uint32_t reg_num, uint32_t c - case DEV_LINK: - print_dev_link(reg_save, reg_num); - break; -- case DEV_INFO: -- print_dev_info(reg_save, reg_num); -- break; - default: - printf("cmd_type is error\n"); - } -diff --git a/sas/user_cmd/cmd_code/sas_cmd_common.c b/sas/user_cmd/cmd_code/sas_cmd_common.c -index 9dca63f..358cf39 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_common.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_common.c -@@ -54,11 +54,6 @@ int sas_get_phy_id(void) - return g_sas_cmd.phy_id; - } - --int sas_get_dev_id(void) --{ -- return g_sas_cmd.dev_id; --} -- - int sas_get_que_id(void) - { - return g_sas_cmd.que_id; -@@ -84,11 +79,6 @@ int sas_set_die_id(struct major_cmd_ctrl *self, const char *argv) - return sas_set_id(self, argv, &g_sas_cmd.die_id); - } - --int sas_set_dev_id(struct major_cmd_ctrl *self, const char *argv) --{ -- return sas_set_id(self, argv, &g_sas_cmd.dev_id); --} -- - int sas_set_que_id(struct major_cmd_ctrl *self, const char *argv) - { - return sas_set_id(self, argv, &g_sas_cmd.que_id); -diff --git a/sas/user_cmd/cmd_code/sas_cmd_dev.c b/sas/user_cmd/cmd_code/sas_cmd_dev.c -index c95006b..6a5eae0 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_dev.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_dev.c -@@ -26,7 +26,6 @@ static int sas_dev_help(struct major_cmd_ctrl *self, const char *argv) - printf("\n Options:\n\n"); - printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); - printf(" %s, %-25s %s\n", "-l", "--link", "dispaly device type and speed\n"); -- printf(" %s, %-25s %s\n", "-i", "--info", "dispaly the device detail information\n"); - printf("\n"); - - return 0; -@@ -37,19 +36,6 @@ static int sas_dev_link(struct major_cmd_ctrl *self, const char *argv) - return sas_set_cmd_type(DEV_LINK); - } - --static int sas_dev_info(struct major_cmd_ctrl *self, const char *argv) --{ -- int ret; -- -- (void)sas_set_cmd_type(DEV_INFO); -- ret = sas_set_dev_id(self, argv); -- if (ret || sas_get_dev_id() >= MAX_DEVICE_NUM) { -- printf("device id is too large(>=%d)\n", MAX_DEVICE_NUM); -- return -EINVAL; -- } -- return ret; --} -- - static int sas_dev_excute_funs_call(uint32_t cmd_type) - { - if (cmd_type != SAS_UNKNOW_CMD) -@@ -63,11 +49,9 @@ static void sas_dev_execute(struct major_cmd_ctrl *self) - int ret, cmd; - const char *suc_msg[] = { - "sas_dev_link success.", -- "sas_dev_info success.", - }; - const char *err_msg[] = { - "sas_dev_link error.", -- "sas_dev_info error.", - "sas_dev failed, unknown type", - }; - -@@ -95,7 +79,6 @@ static void cmd_sas_dev_init(void) - cmd_option_register("-d", "--dieid", true, sas_set_die_id); - cmd_option_register("-h", "--help", false, sas_dev_help); - cmd_option_register("-l", "--link", false, sas_dev_link); -- cmd_option_register("-i", "--info", true, sas_dev_info); - } - - HIKP_CMD_DECLARE("sas_dev", "sas device information ", cmd_sas_dev_init); -diff --git a/sas/user_cmd/cmd_code/sas_tools_include.h b/sas/user_cmd/cmd_code/sas_tools_include.h -index a71e614..0aa7703 100644 ---- a/sas/user_cmd/cmd_code/sas_tools_include.h -+++ b/sas/user_cmd/cmd_code/sas_tools_include.h -@@ -34,13 +34,11 @@ struct tool_sas_cmd { - int sas_set_cmd_type(int cmd_type); - int sas_get_cmd_type(void); - int sas_get_phy_id(void); --int sas_get_dev_id(void); - int sas_get_que_id(void); - struct tool_sas_cmd *sas_get_cmd_p(void); - int sas_set_chip_id(struct major_cmd_ctrl *self, const char *argv); - int sas_set_phy_id(struct major_cmd_ctrl *self, const char *argv); - int sas_set_die_id(struct major_cmd_ctrl *self, const char *argv); --int sas_set_dev_id(struct major_cmd_ctrl *self, const char *argv); - int sas_set_que_id(struct major_cmd_ctrl *self, const char *argv); - int sas_set_dqe_id(struct major_cmd_ctrl *self, const char *argv); - --- -2.33.0 diff --git a/0048-hikptool-roce-Use-calloc-to-alloc-memory-for-array-i.patch b/0048-hikptool-roce-Use-calloc-to-alloc-memory-for-array-i.patch deleted file mode 100644 index 9ddbce8..0000000 --- a/0048-hikptool-roce-Use-calloc-to-alloc-memory-for-array-i.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 2abbc6020498b1c464775623de8b2db76e684d55 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Tue, 24 Oct 2023 11:16:49 +0800 -Subject: hikptool/roce: Use calloc to alloc memory for array instead of malloc - -calloc is more situable for memory allocation for array than malloc, -since the allocated memory will be set to 0. - -Fixes: 8b3b68347165 ("hikptool/roce: Add a common frame for hikptool roce register query") -Signed-off-by: Junxian Huang ---- - net/roce/roce_ext_common/hikp_roce_ext_common.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index d0fae69..d5ae64a 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -115,8 +115,8 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - max_size = res_head->total_block_num * sizeof(uint32_t); - - if (block_id == 0) { -- reg->offset = (uint32_t *)malloc(max_size); -- reg->data = (uint32_t *)malloc(max_size); -+ reg->offset = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); -+ reg->data = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - if ((reg->offset == NULL) || (reg->data == NULL)) { - printf("hikptool roce_%s alloc log memmory 0x%x failed!\n", - cmd_name, max_size); --- -2.30.0 diff --git a/0049-hikptool-roce-Fix-missing-check-of-reg-num-responsed.patch b/0049-hikptool-roce-Fix-missing-check-of-reg-num-responsed.patch deleted file mode 100644 index f12db56..0000000 --- a/0049-hikptool-roce-Fix-missing-check-of-reg-num-responsed.patch +++ /dev/null @@ -1,127 +0,0 @@ -From 679cfd5353da2165dbf5b89769bbd5b69209bc5b Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Tue, 24 Oct 2023 15:12:41 +0800 -Subject: hikptool/roce: Fix missing check of reg num responsed from FW - -If the reg num responsed from a new-version FW exceeds the array -length in the old-version hikptool, an out-of-bounds access error -will occur. So add a check to ensure the reg num is not greater -than tha array length. - -Fixes: 392c269be165 ("support querying RoCE module information") -Fixes: 87f8605c32d3 ("hikptool/roce: Add ext query for roce_qmm cmd") -Signed-off-by: Junxian Huang ---- - net/roce/roce_caep/hikp_roce_caep.c | 7 +++++++ - net/roce/roce_pkt/hikp_roce_pkt.c | 7 +++++++ - net/roce/roce_qmm/hikp_roce_qmm.c | 7 +++++++ - net/roce/roce_timer/hikp_roce_timer.c | 12 ++++++++++++ - net/roce/roce_tsp/hikp_roce_tsp.c | 6 ++++++ - 5 files changed, 39 insertions(+) - -diff --git a/net/roce/roce_caep/hikp_roce_caep.c b/net/roce/roce_caep/hikp_roce_caep.c -index 6c92ea1..126551a 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.c -+++ b/net/roce/roce_caep/hikp_roce_caep.c -@@ -85,7 +85,14 @@ static void hikp_roce_caep_execute_origin(struct major_cmd_ctrl *self) - printf("hikptool roce_caep get data failed.\n"); - goto exec_error; - } -+ - roce_caep_res = (struct roce_caep_res_param *)cmd_ret->rsp_data; -+ if (roce_caep_res->total_block_num > ROCE_HIKP_CAEP_REG_NUM) { -+ printf("version might not match, adjust the reg num to %d.\n", -+ ROCE_HIKP_CAEP_REG_NUM); -+ roce_caep_res->total_block_num = ROCE_HIKP_CAEP_REG_NUM; -+ } -+ - hikp_roce_caep_print(roce_caep_res->total_block_num, - roce_caep_res->reg_data.offset, - roce_caep_res->reg_data.data); -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.c b/net/roce/roce_pkt/hikp_roce_pkt.c -index d3bf885..e710e08 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.c -+++ b/net/roce/roce_pkt/hikp_roce_pkt.c -@@ -87,7 +87,14 @@ static void hikp_roce_pkt_execute(struct major_cmd_ctrl *self) - self->err_no = ret; - return; - } -+ - roce_pkt_res = (struct roce_pkt_res_param *)cmd_ret->rsp_data; -+ if (roce_pkt_res->total_block_num > ROCE_HIKP_PKT_REG_NUM) { -+ printf("version might not match, adjust the reg num to %d.\n", -+ ROCE_HIKP_PKT_REG_NUM); -+ roce_pkt_res->total_block_num = ROCE_HIKP_PKT_REG_NUM; -+ } -+ - hikp_roce_pkt_print(roce_pkt_res->total_block_num, - roce_pkt_res->reg_data.offset, roce_pkt_res->reg_data.data); - -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.c b/net/roce/roce_qmm/hikp_roce_qmm.c -index b020c6a..d127264 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.c -+++ b/net/roce/roce_qmm/hikp_roce_qmm.c -@@ -108,7 +108,14 @@ static void hikp_roce_qmm_execute_origin(struct major_cmd_ctrl *self) - printf("hikptool roce_qmm get data failed.\n"); - goto exec_error; - } -+ - roce_qmm_res = (struct roce_qmm_rsp_data *)cmd_ret->rsp_data; -+ if (roce_qmm_res->reg_num > ROCE_HIKP_QMM_REG_NUM) { -+ printf("version might not match, adjust the reg num to %d.\n", -+ ROCE_HIKP_QMM_REG_NUM); -+ roce_qmm_res->reg_num = ROCE_HIKP_QMM_REG_NUM; -+ } -+ - hikp_roce_qmm_print(roce_qmm_res); - - exec_error: -diff --git a/net/roce/roce_timer/hikp_roce_timer.c b/net/roce/roce_timer/hikp_roce_timer.c -index c4e979f..a78d383 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.c -+++ b/net/roce/roce_timer/hikp_roce_timer.c -@@ -76,6 +76,12 @@ static int hikp_roce_timer_show_qpc(struct major_cmd_ctrl *self) - goto out; - - timer_rsp = (struct roce_timer_rsp_data *)(cmd_ret->rsp_data); -+ if (timer_rsp->reg_num > ROCE_HIKP_TIMER_REG_NUM) { -+ printf("version might not match, adjust the reg num to %d.\n", -+ ROCE_HIKP_TIMER_REG_NUM); -+ timer_rsp->reg_num = ROCE_HIKP_TIMER_REG_NUM; -+ } -+ - printf("**************QPC TIMER INFO*************\n"); - hikp_roce_timer_print(timer_rsp); - out: -@@ -104,6 +110,12 @@ static int hikp_roce_timer_show_cqc(struct major_cmd_ctrl *self) - goto out; - - timer_rsp = (struct roce_timer_rsp_data *)(cmd_ret->rsp_data); -+ if (timer_rsp->reg_num > ROCE_HIKP_TIMER_REG_NUM) { -+ printf("version might not match, adjust the reg num to %d.\n", -+ ROCE_HIKP_TIMER_REG_NUM); -+ timer_rsp->reg_num = ROCE_HIKP_TIMER_REG_NUM; -+ } -+ - printf("**************CQC TIMER INFO*************\n"); - hikp_roce_timer_print(timer_rsp); - out: -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.c b/net/roce/roce_tsp/hikp_roce_tsp.c -index a036fae..5bb2649 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.c -+++ b/net/roce/roce_tsp/hikp_roce_tsp.c -@@ -181,6 +181,12 @@ static void hikp_roce_tsp_execute(struct major_cmd_ctrl *self) - } - - roce_tsp_res = (struct roce_tsp_res_param *)cmd_ret->rsp_data; -+ if (roce_tsp_res->total_block_num > ROCE_HIKP_TSP_REG_NUM) { -+ printf("version might not match, adjust the reg num to %d.\n", -+ ROCE_HIKP_TSP_REG_NUM); -+ roce_tsp_res->total_block_num = ROCE_HIKP_TSP_REG_NUM; -+ } -+ - hikp_roce_tsp_print(roce_tsp_res->total_block_num, - roce_tsp_res->reg_data.offset, roce_tsp_res->reg_data.data); - --- -2.30.0 \ No newline at end of file diff --git a/0050-hikptool-Change-the-unic_ppp-directory-to-ub_ppp.patch b/0050-hikptool-Change-the-unic_ppp-directory-to-ub_ppp.patch deleted file mode 100644 index 6f9d370..0000000 --- a/0050-hikptool-Change-the-unic_ppp-directory-to-ub_ppp.patch +++ /dev/null @@ -1,43 +0,0 @@ -From bb4201e589f3875351a5a7b1305254701663dc9a Mon Sep 17 00:00:00 2001 -From: JianQiang Li -Date: Wed, 25 Oct 2023 09:14:55 +0800 -Subject: [PATCH] [hikptool] Change the unic_ppp directory to ub_ppp. - -tool inclusion -category:bugfix -bugzilla:NA -CVE:NA - ----------------------------------------------------------------------- - -Change the unic_ppp directory to ub_ppp and add a blank line to the end of the hikp_unic_ppp.c file. - -Signed-off-by: Jianqiang Li ---- - net/ub/{ub_unic => ub_ppp}/hikp_unic_ppp.c | 2 +- - net/ub/{ub_unic => ub_ppp}/hikp_unic_ppp.h | 0 - 2 files changed, 1 insertion(+), 1 deletion(-) - rename net/ub/{ub_unic => ub_ppp}/hikp_unic_ppp.c (99%) - rename net/ub/{ub_unic => ub_ppp}/hikp_unic_ppp.h (100%) - -diff --git a/net/ub/ub_unic/hikp_unic_ppp.c b/net/ub/ub_ppp/hikp_unic_ppp.c -similarity index 99% -rename from net/ub/ub_unic/hikp_unic_ppp.c -rename to net/ub/ub_ppp/hikp_unic_ppp.c -index 5325b03..ccba4e0 100644 ---- a/net/ub/ub_unic/hikp_unic_ppp.c -+++ b/net/ub/ub_ppp/hikp_unic_ppp.c -@@ -465,4 +465,4 @@ static void cmd_unic_get_ppp_init(void) - cmd_option_register("-du", "--dump", true, hikp_unic_cmd_ppp_feature_select); - } - --HIKP_CMD_DECLARE("unic_ppp", "dump ppp info of unic!", cmd_unic_get_ppp_init); -\ No newline at end of file -+HIKP_CMD_DECLARE("unic_ppp", "dump ppp info of unic!", cmd_unic_get_ppp_init); -diff --git a/net/ub/ub_unic/hikp_unic_ppp.h b/net/ub/ub_ppp/hikp_unic_ppp.h -similarity index 100% -rename from net/ub/ub_unic/hikp_unic_ppp.h -rename to net/ub/ub_ppp/hikp_unic_ppp.h --- -2.21.0.windows.1 - diff --git a/0051-hikptool-roce-Fix-the-wrong-maximum-of-gmv-index.patch b/0051-hikptool-roce-Fix-the-wrong-maximum-of-gmv-index.patch deleted file mode 100644 index 1c6e632..0000000 --- a/0051-hikptool-roce-Fix-the-wrong-maximum-of-gmv-index.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 48d87bcd204c6aa226b5dbdb8c68ead8d12b1745 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Tue, 31 Oct 2023 20:51:38 +0800 -Subject: hikptool/roce: Fix the wrong maximum of gmv index - -The RoCE driver supports up to 256 gmv table entry, the allowed -gmv index of hikptool command roce_gmv should cover this range. - -Signed-off-by: Junxian Huang ---- - net/roce/roce_gmv/hikp_roce_gmv.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/roce/roce_gmv/hikp_roce_gmv.h b/net/roce/roce_gmv/hikp_roce_gmv.h -index 1ef5b93..a02b960 100644 ---- a/net/roce/roce_gmv/hikp_roce_gmv.h -+++ b/net/roce/roce_gmv/hikp_roce_gmv.h -@@ -18,7 +18,7 @@ - - #define ROCE_HIKP_GMV_REG_NUM 7 - #define ROCE_HIKP_GMV_REG_SWICTH 2 --#define ROCE_MAX_HIKPTOOL_GMV 128 -+#define ROCE_MAX_HIKPTOOL_GMV 256 - struct cmd_roce_gmv_param { - struct tool_target target; - uint32_t gmv_index; --- -2.30.0 - diff --git a/0052-hikptool-Resolved-some-centralized-code-review-comme.patch b/0052-hikptool-Resolved-some-centralized-code-review-comme.patch deleted file mode 100644 index 154d70c..0000000 --- a/0052-hikptool-Resolved-some-centralized-code-review-comme.patch +++ /dev/null @@ -1,1390 +0,0 @@ -From faccc8979f5a6e458b02c7865b9e3316b9facfd1 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 8 Nov 2023 20:43:06 +0800 -Subject: [PATCH] hikptool: Resolved some centralized code review comments. - -1. The ret variable may be a random value. -2. The unsigned variable judgment branch is redundant judgment. -3. Fix Magic Numbers. -4. The print format does not match. -5. After the pointer is released, a null value is assigned to the pointer to prevent it from being used again. -6. Delete unused variables. -7. The uint64_t print issue is rectified and PRIx64/PRIu64 is used. -8. Add 'const' to constant array. -9. Modifying File Permissions.Eliminate software privilege escalation risks. - -Signed-off-by: veega2022 ---- - cxl/func_lib/cxl_func/cxl_feature.c | 16 +++---- - cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c | 2 +- - libhikptdev/src/rciep/hikpt_rciep.c | 22 ++++----- - libhikptdev/src/rciep/hikpt_rciep.h | 2 + - net/hikp_net_lib.c | 33 +++++++------ - net/hikp_net_lib.h | 6 +-- - net/nic/nic_dfx/hikp_nic_dfx.c | 1 - - net/nic/nic_fd/hikp_nic_fd.c | 48 +++++++++---------- - net/nic/nic_fec/hikp_nic_fec.c | 7 +-- - net/nic/nic_info/hikp_nic_info.c | 9 ++-- - net/nic/nic_log/hikp_nic_log.c | 2 +- - net/nic/nic_ppp/hikp_nic_ppp.c | 27 +++++++---- - net/nic/nic_qos/hikp_nic_qos.c | 9 ++-- - net/nic/nic_queue/hikp_nic_queue.c | 3 +- - net/nic/nic_rss/hikp_nic_rss.c | 3 +- - .../roce_ext_common/hikp_roce_ext_common.c | 12 +++-- - net/roce/roce_gmv/hikp_roce_gmv.c | 8 ++-- - net/roce/roce_mdb/hikp_roce_mdb.c | 1 - - net/roce/roce_qmm/hikp_roce_qmm.c | 8 ++-- - net/roce/roce_scc/hikp_roce_scc.c | 6 +-- - net/roce/roce_timer/hikp_roce_timer.c | 2 +- - net/roce/roce_trp/hikp_roce_trp.c | 18 ++++--- - net/roce/roce_tsp/hikp_roce_tsp.c | 7 +-- - net/ub/ub_crd/hikp_ub_crd.c | 1 - - net/ub/ub_ppp/hikp_unic_ppp.c | 5 ++ - ossl/ossl_user_linux.c | 1 - - pcie/func_lib/pcie_func/pcie_link_ltssm.c | 3 +- - pcie/func_lib/pcie_func/pcie_link_ltssm.h | 1 + - pcie/func_lib/pcie_func/pcie_reg_dump.c | 4 +- - pcie/func_lib/pcie_func/pcie_statistics.c | 4 +- - sas/sas_func/sas_read_dev.c | 2 - - sas/sas_func/sas_read_dqe.c | 4 +- - sas/user_cmd/cmd_code/sas_cmd_dqe.c | 1 - - sas/user_cmd/cmd_code/sas_cmd_dump.c | 1 - - serdes/hikp_serdes.c | 4 +- - socip/hikp_socip_dumpreg.c | 1 - - tool_lib/op_logs.c | 18 ++++--- - tool_lib/tool_cmd.c | 1 - - tool_lib/tool_lib.c | 3 ++ - 39 files changed, 161 insertions(+), 145 deletions(-) - -diff --git a/cxl/func_lib/cxl_func/cxl_feature.c b/cxl/func_lib/cxl_func/cxl_feature.c -index 6de3f89..cd41b09 100644 ---- a/cxl/func_lib/cxl_func/cxl_feature.c -+++ b/cxl/func_lib/cxl_func/cxl_feature.c -@@ -77,13 +77,9 @@ static void cxl_dl_fsm_str_get(struct cxl_fsm_state_str *fsm_str_table, - { - int i = 0; - -- while (fsm_str_table[i].fsm_state >= 0) { -- if ((uint32_t)fsm_str_table[i].fsm_state != fsm_state) { -- i++; -- continue; -- } -- break; -- } -+ while (fsm_str_table[i].fsm_state >= 0 && -+ (uint32_t)fsm_str_table[i].fsm_state != fsm_state) -+ i++; - - *fsm_s = fsm_str_table[i].fsm_str; - } -@@ -95,7 +91,7 @@ static void cxl_dl_fsm_state_print(const struct cxl_data_unit *data, uint32_t da - struct cxl_fsm_state_str rrsm_state[] = { - {0x0, "retry_remote_normal"}, - {0x1, "retry_llrack"}, -- {-1, "unknow"} -+ {-1, "unknown"} - }; - struct cxl_fsm_state_str lrsm_state[] = { - {0x1, "retry_local_normal"}, -@@ -103,14 +99,14 @@ static void cxl_dl_fsm_state_print(const struct cxl_data_unit *data, uint32_t da - {0x4, "retry_phy_reinit"}, - {0x8, "retry_local_idle"}, - {0x10, "retry_abort"}, -- {-1, "unknow"} -+ {-1, "unknown"} - }; - struct cxl_fsm_state_str init_fsm_state[] = { - {0x1, "inactive"}, - {0x2, "retry"}, - {0x4, "param"}, - {0x8, "active"}, -- {-1, "unknow"} -+ {-1, "unknown"} - }; - - if (data_unit_len == 0) { -diff --git a/cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c b/cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c -index 2607705..2df9dc5 100644 ---- a/cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c -+++ b/cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c -@@ -46,7 +46,7 @@ static int cxl_port_id_set(struct major_cmd_ctrl *self, const char *argv) - - ret = string_toui(argv, &val); - if (ret) { -- printf("cpa set port id err %d\n", ret); -+ printf("cxl cpa set port id err %d\n", ret); - return ret; - } - g_cxl_cpa_cmd.port_id = val; -diff --git a/libhikptdev/src/rciep/hikpt_rciep.c b/libhikptdev/src/rciep/hikpt_rciep.c -index 5c7e82f..f673dd0 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.c -+++ b/libhikptdev/src/rciep/hikpt_rciep.c -@@ -41,7 +41,7 @@ static int hikp_memcpy_io(void *dst, size_t dst_size, void const *src, size_t sr - if (dst_size < src_size) - return -EINVAL; - -- for (i = 0; i < src_size / sizeof(uint32_t); i++) -+ for (i = 0; i < src_size / REP_DATA_BLK_SIZE; i++) - ((uint32_t *)dst)[i] = ((uint32_t *)src)[i]; - - return 0; -@@ -148,13 +148,13 @@ static int hikp_rep_init(void const *req_data, uint32_t req_size, - printf("The request data is NULL.\n"); - return -EINVAL; - } -- data_num = (req_size + (sizeof(uint32_t) - 1)) / sizeof(uint32_t); -+ data_num = (req_size + (REP_DATA_BLK_SIZE - 1)) / REP_DATA_BLK_SIZE; - if (data_num > HIKP_REQ_DATA_MAX) { -- printf("request data num(%u) exceeds max size(%u).\n", data_num, HIKP_REQ_DATA_MAX); -+ printf("request data num(%zu) exceeds max size(%u).\n", data_num, HIKP_REQ_DATA_MAX); - return -EINVAL; - } - if (data_num != 0) { -- *align_req_data = (uint32_t *)calloc(data_num, sizeof(uint32_t)); -+ *align_req_data = (uint32_t *)calloc(data_num, REP_DATA_BLK_SIZE); - if (*align_req_data == NULL) { - printf("request memory malloc failed.\n"); - return -ENOMEM; -@@ -175,12 +175,12 @@ static int hikp_req_first_round(uint32_t *req_data, uint32_t rep_num, uint32_t * - if (req_data == NULL) - return 0; - -- src_size = rep_num * sizeof(uint32_t); -+ src_size = rep_num * REP_DATA_BLK_SIZE; - dst_size = sizeof(g_hikp_req->field.data); - hikp_memclr_io(); - ret = hikp_memcpy_io((uint32_t *)(g_hikp_req->field.data), dst_size, req_data, src_size); - if (ret != 0) { -- printf("size error, dst_size:%u, src_size:%u.\n", dst_size, src_size); -+ printf("size error, dst_size:%zu, src_size:%zu.\n", dst_size, src_size); - return ret; - } - g_hikp_req->field.exe_round = 0; -@@ -209,7 +209,7 @@ static int hikp_multi_round_interact(struct hikp_cmd_ret **cmd_ret, uint32_t sta - } - - p_cmd_ret = (struct hikp_cmd_ret *)malloc(sizeof(struct hikp_cmd_ret) + -- rsp_num * sizeof(uint32_t)); -+ rsp_num * REP_DATA_BLK_SIZE); - if (p_cmd_ret == NULL) { - printf("response memory malloc fail.\n"); - return -ENOMEM; -@@ -235,8 +235,8 @@ static int hikp_multi_round_interact(struct hikp_cmd_ret **cmd_ret, uint32_t sta - } - } - src_size = (i == cycle - 1) ? -- (rsp_num - (i * HIKP_RSP_DATA_MAX)) * sizeof(uint32_t) : -- HIKP_RSP_DATA_MAX * sizeof(uint32_t); -+ (rsp_num - (i * HIKP_RSP_DATA_MAX)) * REP_DATA_BLK_SIZE : -+ HIKP_RSP_DATA_MAX * REP_DATA_BLK_SIZE; - dst_size = src_size; - (void)hikp_memcpy_io(&(p_cmd_ret->rsp_data)[i * HIKP_RSP_DATA_MAX], - dst_size, (uint32_t *)(g_hikp_rsp->field.data), src_size); -@@ -258,7 +258,7 @@ struct hikp_cmd_ret *hikp_cmd_alloc(struct hikp_cmd_header *req_header, - { - struct hikp_cmd_ret *cmd_ret = NULL; - uint32_t *p_req_data = NULL; -- uint32_t rep_num, rsp_num; -+ uint32_t rep_num; - uint32_t cpl_status = HIKP_INIT_STAT; - int ret; - -@@ -557,7 +557,7 @@ int hikp_dev_init(void) - goto out_unmap; - } - -- len = (sizeof(union hikp_space_req) - sizeof(struct iep_doorbell)) / sizeof(uint32_t); -+ len = (sizeof(union hikp_space_req) - sizeof(struct iep_doorbell)) / REP_DATA_BLK_SIZE; - for (i = 0; i < len; i++) - g_hikp_req->dw[i] = 0; - -diff --git a/libhikptdev/src/rciep/hikpt_rciep.h b/libhikptdev/src/rciep/hikpt_rciep.h -index dd08759..296d235 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.h -+++ b/libhikptdev/src/rciep/hikpt_rciep.h -@@ -42,6 +42,8 @@ - #define CPL_CHECK_GAP_US 1000 - #define WAIT_CPL_MAX_MS 8000 - -+#define REP_DATA_BLK_SIZE sizeof(uint32_t) -+ - enum { - HIKP_RESOURCE_DIR, - HIKP_CONFIG_DIR, -diff --git a/net/hikp_net_lib.c b/net/hikp_net_lib.c -index eba086e..8db4ad5 100644 ---- a/net/hikp_net_lib.c -+++ b/net/hikp_net_lib.c -@@ -23,7 +23,7 @@ - #include "tool_lib.h" - #include "hikptdev_plug.h" - --static int hikp_read_net_pci_info(const char *file_path, uint32_t len, char *content) -+static int hikp_read_net_pci_info(const char *file_path, char *content, size_t len) - { - char path[PATH_MAX + 1] = { 0 }; - int ret; -@@ -32,7 +32,7 @@ static int hikp_read_net_pci_info(const char *file_path, uint32_t len, char *con - if (file_path == NULL || content == NULL) - return -EINVAL; - -- if (len > MAX_PCI_ID_LEN) -+ if (len > MAX_PCI_ID_LEN + 1 || len < 1) - return -EINVAL; - - if (strlen(file_path) > PATH_MAX || realpath(file_path, path) == NULL) -@@ -42,12 +42,12 @@ static int hikp_read_net_pci_info(const char *file_path, uint32_t len, char *con - if (fd < 0) - return -EPERM; - -- ret = pread(fd, content, len, 0); -+ ret = pread(fd, content, len - 1, 0); - if (ret < 0) { - close(fd); - return -EIO; - } -- content[len] = '\0'; // The invoker ensures that the bounds are not crossed. -+ content[len - 1] = '\0'; // The invoker ensures that the bounds are not crossed. - close(fd); - - return 0; -@@ -191,7 +191,7 @@ static int tool_get_bdf_by_dev_name(const char *name, struct tool_target *target - int tool_check_and_get_valid_bdf_id(const char *name, struct tool_target *target) - { - if (!name || !target) -- return 0; -+ return -EINVAL; - - if (interface_is_bdf_id(name, target)) - return 0; -@@ -211,11 +211,14 @@ bool is_dev_valid_and_special(int sockfd, struct tool_target *target) - return true; - } - --int get_revision_id_by_bdf(const struct bdf_t *bdf, char *revision_id) -+int get_revision_id_by_bdf(const struct bdf_t *bdf, char *revision_id, size_t id_len) - { - char revision_dir[MAX_BUS_PCI_DIR_LEN] = { 0 }; - int ret; - -+ if (id_len < MAX_PCI_ID_LEN + 1) -+ return -EINVAL; -+ - ret = snprintf(revision_dir, sizeof(revision_dir), "%s%04x:%02x:%02x.%u%s", - HIKP_BUS_PCI_DEV_DIR, bdf->domain, bdf->bus_id, bdf->dev_id, - bdf->fun_id, HIKP_PCI_REVISION_DIR); -@@ -223,14 +226,14 @@ int get_revision_id_by_bdf(const struct bdf_t *bdf, char *revision_id) - HIKP_ERROR_PRINT("get revision dir fail.\n"); - return -EIO; - } -- ret = hikp_read_net_pci_info((const char *)revision_dir, MAX_PCI_ID_LEN, revision_id); -+ ret = hikp_read_net_pci_info((const char *)revision_dir, revision_id, id_len); - if (ret != 0) - return ret; - - return 0; - } - --static int hikp_get_dir_name_of_device(const char *path, uint32_t len, char *dir_name) -+static int hikp_get_dir_name_of_device(const char *path, size_t len, char *dir_name) - { - struct dirent *ptr; - DIR *dir = NULL; -@@ -261,12 +264,12 @@ static int hikp_get_dir_name_of_device(const char *path, uint32_t len, char *dir - return closedir(dir); - } - --int get_dev_name_by_bdf(const struct bdf_t *bdf, char *dev_name) -+int get_dev_name_by_bdf(const struct bdf_t *bdf, char *dev_name, size_t name_len) - { - char dev_name_dir[MAX_BUS_PCI_DIR_LEN] = { 0 }; - int ret; - -- if (!dev_name || !bdf) -+ if (!dev_name || !bdf || name_len < IFNAMSIZ) - return -EINVAL; - - /* if dev_name already has a value, we do not need to obtain it. */ -@@ -283,7 +286,7 @@ int get_dev_name_by_bdf(const struct bdf_t *bdf, char *dev_name) - if (!is_dir_exist(dev_name_dir)) - return -ENOENT; - -- return hikp_get_dir_name_of_device(dev_name_dir, IFNAMSIZ, dev_name); -+ return hikp_get_dir_name_of_device(dev_name_dir, name_len, dev_name); - } - - int get_vf_dev_info_by_pf_dev_name(const char *pf_dev_name, -@@ -352,7 +355,7 @@ int get_numvfs_by_bdf(const struct bdf_t *bdf, uint8_t *numvfs) - HIKP_ERROR_PRINT("get numvfs dir fail.\n"); - return -EIO; - } -- ret = hikp_read_net_pci_info((const char *)numvfs_dir, MAX_PCI_ID_LEN, numvf); -+ ret = hikp_read_net_pci_info((const char *)numvfs_dir, numvf, MAX_PCI_ID_LEN + 1); - if (ret != 0) - return ret; - -@@ -366,12 +369,12 @@ int get_numvfs_by_bdf(const struct bdf_t *bdf, uint8_t *numvfs) - return 0; - } - --void hikp_ether_format_addr(char *buf, uint16_t size, const uint8_t *mac_addr) -+void hikp_ether_format_addr(char *buf, uint16_t size, const uint8_t *mac_addr, uint8_t mac_len) - { - int len; - -- if (buf == NULL || mac_addr == NULL) { -- HIKP_WARN_PRINT("buf or mac_addr pointer is NULL.\n"); -+ if (buf == NULL || mac_addr == NULL || mac_len != HIKP_NIC_ETH_MAC_ADDR_LEN) { -+ HIKP_WARN_PRINT("buf or mac_addr pointer is NULL, or len(%u) is invalid\n", mac_len); - return; - } - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index ad9e7e4..8a0958f 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -130,12 +130,12 @@ enum nic_get_ncsi_sub_cmd { - int hikp_net_creat_sock(void); - int tool_check_and_get_valid_bdf_id(const char *name, struct tool_target *target); - bool is_dev_valid_and_special(int sockfd, struct tool_target *target); --int get_revision_id_by_bdf(const struct bdf_t *bdf, char *revision_id); --int get_dev_name_by_bdf(const struct bdf_t *bdf, char *dev_name); -+int get_revision_id_by_bdf(const struct bdf_t *bdf, char *revision_id, size_t id_len); -+int get_dev_name_by_bdf(const struct bdf_t *bdf, char *dev_name, size_t name_len); - int get_numvfs_by_bdf(const struct bdf_t *bdf, uint8_t *numvfs); - int get_vf_dev_info_by_pf_dev_name(const char *pf_dev_name, - struct tool_target *vf_target, uint8_t vf_id); - int get_pf_dev_info_by_vf_dev_name(const char *vf_dev_name, struct tool_target *pf_target); --void hikp_ether_format_addr(char *buf, uint16_t size, const uint8_t *mac_addr); -+void hikp_ether_format_addr(char *buf, uint16_t size, const uint8_t *mac_addr, uint8_t mac_len); - - #endif -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.c b/net/nic/nic_dfx/hikp_nic_dfx.c -index c734ce0..4095229 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.c -+++ b/net/nic/nic_dfx/hikp_nic_dfx.c -@@ -318,7 +318,6 @@ static void hikp_nic_dfx_cmd_execute(struct major_cmd_ctrl *self) - uint32_t max_dfx_size; - uint32_t version; - uint32_t i; -- int ret; - - if (!(g_dfx_param.flag & MODULE_SET_FLAG)) { - self->err_no = -EINVAL; -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index 57bc94b..e699bf9 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -15,7 +15,7 @@ - #include - #include - #include -- -+#include - #include "hikp_nic_fd.h" - - struct key_info { -@@ -255,13 +255,13 @@ static void hikp_nic_print_tuple(const struct key_info *tuple_key, - case OUTER_SRC_MAC: - case INNER_DST_MAC: - case INNER_SRC_MAC: -- printf("\t %s[mask=0x%llx]: ", tuple_key->key_name, mask); -+ printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); - printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *(tcam_y + 5), *(tcam_y + 4), - *(tcam_y + 3), *(tcam_y + 2), *(tcam_y + 1), *tcam_y); - break; - case OUTER_ETH_TYPE: - case INNER_ETH_TYPE: -- printf("\t %s[mask=0x%llx]: ", tuple_key->key_name, mask); -+ printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); - printf("0x%x\n", *(uint16_t *)tcam_y); - break; - case OUTER_VLAN_TAG_FST: -@@ -276,7 +276,7 @@ static void hikp_nic_print_tuple(const struct key_info *tuple_key, - case OUTER_DST_PORT: - case INNER_SRC_PORT: - case INNER_DST_PORT: -- printf("\t %s[mask=0x%llx]: ", tuple_key->key_name, mask); -+ printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); - printf("%u\n", *(uint16_t *)tcam_y); - break; - case OUTER_IP_TOS: -@@ -284,25 +284,25 @@ static void hikp_nic_print_tuple(const struct key_info *tuple_key, - case OUTER_IP_PROTO: - case INNER_IP_PROTO: - case OUTER_TUN_FLOW_ID: -- printf("\t %s[mask=0x%llx]: ", tuple_key->key_name, mask); -+ printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); - printf("0x%x\n", *tcam_y); - break; - case OUTER_SRC_IP: - case OUTER_DST_IP: - case INNER_SRC_IP: - case INNER_DST_IP: -- printf("\t %s[mask=0x%llx]: ", tuple_key->key_name, mask); -+ printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); - printf("%u.%u.%u.%u\n", *(tcam_y + 3), *(tcam_y + 2), *(tcam_y + 1), *tcam_y); - break; - case OUTER_L4_RSV: - case INNER_L4_RSV: -- printf("\t %s[mask=0x%llx]: ", tuple_key->key_name, mask); -+ printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); - printf("%u\n", *(uint32_t *)tcam_y); - break; - case OUTER_TUN_VNI: - for (i = 0; i < HIKP_NIC_FD_TUN_VNI_LEN; i++) - tun_vni |= (((uint32_t)*(tcam_y + i)) << (i * HIKP_BITS_PER_BYTE)); -- printf("\t %s[mask=0x%llx]: ", tuple_key->key_name, mask); -+ printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); - printf("0x%x\n", tun_vni); - break; - default: -@@ -407,12 +407,12 @@ static void hikp_nic_fd_print_meta_data(struct nic_fd_rule_info *rule) - meta_bytes = HIKP_DIV_ROUND_UP(active_meta_width, HIKP_BITS_PER_BYTE); - meta_data_region = active_tcam_size - meta_bytes; - if (meta_bytes > sizeof(meta_data)) { -- printf("meta data copy size error, data size: 0x%x, max size: 0x%x\n", -+ printf("meta data copy size error, data size: %u, max size: %zu\n", - meta_bytes, sizeof(meta_data)); - return; - } - memcpy(&meta_data, &key_y[meta_data_region], meta_bytes); -- printf("\t meta_data[meta_data=0x%llx]:\n", meta_data); -+ printf("\t meta_data[meta_data=0x%" PRIx64 "]:\n", meta_data); - cur_pos = meta_bytes * HIKP_BITS_PER_BYTE; - end = cur_pos - 1; - for (i = MAX_META_DATA - 1; i >= 0; i--) { -@@ -470,7 +470,7 @@ static void hikp_nic_fd_print_ad_data(struct nic_fd_rule_info *rule) - uint64_t ad_data; - - ad_data = (uint64_t)rule->ad_data_h << NIC_FD_AD_DATA_S | rule->ad_data_l; -- printf("\n\tAction[ad data: 0x%llx]:\n", ad_data); -+ printf("\n\tAction[ad data: 0x%" PRIx64 "]:\n", ad_data); - - hikp_nic_parse_ad_data(rule, &action); - -@@ -544,7 +544,7 @@ static void hikp_nic_show_fd_counter(const void *data) - printf(" idx | hit_cnt\n"); - for (i = 0; i < counter[stage_no].counter_size; i++) { - entry = &counter[stage_no].entry[i]; -- printf(" %3u | %llu\n", entry->idx, entry->value); -+ printf(" %3u | %" PRIu64 "\n", entry->idx, entry->value); - } - } - -@@ -554,7 +554,6 @@ static int hikp_nic_fd_get_blk(struct hikp_cmd_header *req_header, - { - struct hikp_cmd_ret *cmd_ret; - struct nic_fd_rsp *rsp; -- uint16_t idx; - int ret = 0; - - cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(*req_data)); -@@ -792,10 +791,13 @@ static void hikp_nic_fd_data_free(union nic_fd_feature_info *fd_data) - const struct fd_feature_cmd *fd_cmd; - - fd_cmd = &g_fd_feature_cmd[g_fd_param.feature_idx]; -- if (strcmp(fd_cmd->feature_name, NIC_FD_RULES_NAME) == 0) -+ if (strcmp(fd_cmd->feature_name, NIC_FD_RULES_NAME) == 0) { - free(fd_data->rules[stage_no].rule); -- else if (strcmp(fd_cmd->feature_name, NIC_FD_COUNTER_NAME) == 0) -+ fd_data->rules[stage_no].rule = NULL; -+ } else if (strcmp(fd_cmd->feature_name, NIC_FD_COUNTER_NAME) == 0) { - free(fd_data->counter[stage_no].entry); -+ fd_data->counter[stage_no].entry = NULL; -+ } - - free(fd_data); - } -@@ -859,31 +861,27 @@ static int hikp_nic_fd_check_input_param(struct major_cmd_ctrl *self, - - if (bdf->dev_id != 0) { - snprintf(self->err_str, sizeof(self->err_str), "VF does not support query!"); -- self->err_no = -EINVAL; -- return self->err_no; -+ return -EINVAL; - } - - if (fd_param->feature_idx == -1) { - hikp_nic_fd_cmd_help(self, NULL); - snprintf(self->err_str, sizeof(self->err_str), "-du/--dump parameter error!"); -- self->err_no = -EINVAL; -- return self->err_no; -+ return -EINVAL; - } - - fd_cmd = &g_fd_feature_cmd[g_fd_param.feature_idx]; - if (fd_param->stage_no == -1 && fd_cmd->sub_cmd_code != NIC_FD_HW_INFO_DUMP) { - snprintf(self->err_str, sizeof(self->err_str), - "please input '-st/--stage' parameter."); -- self->err_no = -EINVAL; -- return self->err_no; -+ return -EINVAL; - } - - if (fd_cmd->sub_cmd_code == NIC_FD_HW_INFO_DUMP && - (fd_param->id != -1 || fd_param->stage_no != -1)) { - snprintf(self->err_str, sizeof(self->err_str), - "no need '-id/--index' and '-st/--stage' parameter."); -- self->err_no = -EINVAL; -- return self->err_no; -+ return -EINVAL; - } - - return 0; -@@ -899,8 +897,10 @@ static void hikp_nic_fd_cmd_execute(struct major_cmd_ctrl *self) - int ret; - - ret = hikp_nic_fd_check_input_param(self, &g_fd_param); -- if (ret != 0) -+ if (ret != 0) { -+ self->err_no = ret; - return; -+ } - - ret = hikp_nic_get_fd_hw_info(bdf, &g_fd_hw_info); - if (ret != 0) { -diff --git a/net/nic/nic_fec/hikp_nic_fec.c b/net/nic/nic_fec/hikp_nic_fec.c -index 5d9025c..342b3eb 100644 ---- a/net/nic/nic_fec/hikp_nic_fec.c -+++ b/net/nic/nic_fec/hikp_nic_fec.c -@@ -15,7 +15,7 @@ - #include - #include - #include -- -+#include - #include "hikp_nic_fec.h" - - static struct tool_target g_fec_target; -@@ -40,6 +40,7 @@ static int hikp_nic_fec_err_query(const struct bdf_t *bdf, struct nic_fec_err_in - rsp = (struct nic_fec_rsp *)cmd_ret->rsp_data; - *info = *(struct nic_fec_err_info *)rsp->data; - free(cmd_ret); -+ cmd_ret = NULL; - - if (info->fec_mode >= NIC_FEC_MODE_BUTT) { - HIKP_ERROR_PRINT("unknown fec mode: %u\n", info->fec_mode); -@@ -71,7 +72,7 @@ static void hikp_nic_fec_err_show_basefec(const struct nic_fec_err_info *info) - for (total = 0, i = 0; i < lane_num; i++) - total += info->basefec.lane_corr_block_cnt[i]; - -- printf(" corrected_blocks: %llu\n", total); -+ printf(" corrected_blocks: %" PRIu64 "\n", total); - for (i = 0; i < lane_num; i++) - printf(" Lane %u: %u\n", i, info->basefec.lane_corr_block_cnt[i]); - -@@ -79,7 +80,7 @@ static void hikp_nic_fec_err_show_basefec(const struct nic_fec_err_info *info) - for (total = 0, i = 0; i < lane_num; i++) - total += info->basefec.lane_uncorr_block_cnt[i]; - -- printf(" uncorrectable_blocks: %llu\n", total); -+ printf(" uncorrectable_blocks: %" PRIu64 "\n", total); - for (i = 0; i < lane_num; i++) - printf(" Lane %u: %u\n", i, info->basefec.lane_uncorr_block_cnt[i]); - } -diff --git a/net/nic/nic_info/hikp_nic_info.c b/net/nic/nic_info/hikp_nic_info.c -index d84ca18..cd78bc7 100644 ---- a/net/nic/nic_info/hikp_nic_info.c -+++ b/net/nic/nic_info/hikp_nic_info.c -@@ -79,7 +79,8 @@ static int hikp_nic_get_curr_die_info(void) - free(cmd_ret); - cmd_ret = NULL; - -- ret = get_revision_id_by_bdf(&g_info_param.target.bdf, g_info_param.revision_id); -+ ret = get_revision_id_by_bdf(&g_info_param.target.bdf, g_info_param.revision_id, -+ sizeof(g_info_param.revision_id)); - if (ret != 0) { - HIKP_ERROR_PRINT("Getting revision fail.\n"); - return ret; -@@ -87,7 +88,8 @@ static int hikp_nic_get_curr_die_info(void) - ret = get_numvfs_by_bdf(&g_info_param.target.bdf, &g_info_param.numvfs); - if (ret != 0) - HIKP_ERROR_PRINT("Getting numvfs fail, ret = %d.\n", ret); -- ret = get_dev_name_by_bdf(&g_info_param.target.bdf, g_info_param.target.dev_name); -+ ret = get_dev_name_by_bdf(&g_info_param.target.bdf, g_info_param.target.dev_name, -+ sizeof(g_info_param.target.dev_name)); - if ((ret != 0) && (ret != -ENOENT)) { - HIKP_ERROR_PRINT("Getting dev name fail.\n"); - return ret; -@@ -258,7 +260,8 @@ static void hikp_nic_info_print_cur_vf(const struct bdf_t *bdf) - printf("Current function is vf:\n"); - printf("\t%-16s %04x:%02x:%02x.%u\n", "vf bdf id:", - bdf->domain, bdf->bus_id, bdf->dev_id, bdf->fun_id); -- ret = get_dev_name_by_bdf(&g_info_param.target.bdf, g_info_param.target.dev_name); -+ ret = get_dev_name_by_bdf(&g_info_param.target.bdf, g_info_param.target.dev_name, -+ sizeof(g_info_param.target.dev_name)); - if ((ret != 0) && (ret != -ENOENT)) { - HIKP_ERROR_PRINT("Getting dev name fail.\n"); - return; -diff --git a/net/nic/nic_log/hikp_nic_log.c b/net/nic/nic_log/hikp_nic_log.c -index 5cafe4e..893aef1 100644 ---- a/net/nic/nic_log/hikp_nic_log.c -+++ b/net/nic/nic_log/hikp_nic_log.c -@@ -113,7 +113,7 @@ static int hikp_nic_get_first_blk_info(uint32_t *total_blk_num, - } - *log_data = (uint8_t *)calloc(1, log_size); - if (*log_data == NULL) { -- HIKP_ERROR_PRINT("malloc log memory 0x%x failed.", log_size); -+ HIKP_ERROR_PRINT("calloc log memory 0x%x failed.", log_size); - ret = -ENOMEM; - goto err_out; - } -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index b71fc48..7968ac3 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -95,7 +95,7 @@ static uint16_t hikp_nic_ppp_get_abs_func_id(const struct bdf_t *bdf, int relati - static void hikp_nic_ppp_get_func_name(char *buf, uint8_t len, uint8_t id) - { - if (id > 0) -- snprintf(buf, len, "vf%d", id - 1); -+ snprintf(buf, len, "vf%u", id - 1); - else - snprintf(buf, len, "pf"); - } -@@ -145,7 +145,8 @@ static void hikp_nic_ppp_show_key_mem(struct nic_mac_tbl *tbl, bool is_key_mem) - uc_entry = &uc_tbl->entry[idx]; - if (uc_entry->idx < g_ppp_hw_res.max_key_mem_size || !is_key_mem) { - hikp_ether_format_addr(mac_str, -- HIKP_NIC_ETH_ADDR_FMT_SIZE, uc_entry->mac_addr); -+ HIKP_NIC_ETH_ADDR_FMT_SIZE, uc_entry->mac_addr, -+ HIKP_NIC_ETH_MAC_ADDR_LEN); - printf("%04u | %01u | %s | ", uc_entry->idx, uc_entry->valid, mac_str); - printf("%04u | %u | %01u | ", - uc_entry->vlan_id, uc_entry->vmdq1, uc_entry->mac_en); -@@ -161,7 +162,8 @@ static void hikp_nic_ppp_show_key_mem(struct nic_mac_tbl *tbl, bool is_key_mem) - mc_entry = &mc_tbl->entry[idx]; - if (mc_entry->idx < g_ppp_hw_res.max_key_mem_size || !is_key_mem) { - hikp_ether_format_addr(mac_str, -- HIKP_NIC_ETH_ADDR_FMT_SIZE, mc_entry->mac_addr); -+ HIKP_NIC_ETH_ADDR_FMT_SIZE, mc_entry->mac_addr, -+ HIKP_NIC_ETH_MAC_ADDR_LEN); - printf("%04u | %s | ", mc_entry->idx, mac_str); - printf("%08x:%08x:%08x:%08x:%08x:%08x:%08x:%08x", - mc_entry->function_bitmap[7], mc_entry->function_bitmap[6], -@@ -191,7 +193,7 @@ static void hikp_nic_ppp_show_func_uc_mac_addr(struct mac_vlan_uc_tbl *uc_tbl, - vf_id = hikp_get_field(uc_entry->e_vport, HIKP_NIC_VF_ID_MASK, HIKP_NIC_VF_ID_S); - if (bdf->fun_id == pf_id && vf_id == func_id) { - hikp_ether_format_addr(mac_str, HIKP_NIC_ETH_ADDR_FMT_SIZE, -- uc_entry->mac_addr); -+ uc_entry->mac_addr, HIKP_NIC_ETH_MAC_ADDR_LEN); - printf("\t%s\n", mac_str); - } - } -@@ -205,7 +207,7 @@ static void hikp_nic_ppp_show_func_mc_mac_addr(struct mac_vlan_mc_tbl *mc_tbl, - uint16_t abs_func_id; - uint8_t offset; - uint8_t idx; -- uint8_t i; -+ uint32_t i; - - abs_func_id = hikp_nic_ppp_get_abs_func_id(bdf, func_id); - idx = abs_func_id / HIKP_NIC_PPP_FUNC_BITMAP_SIZE; -@@ -218,7 +220,7 @@ static void hikp_nic_ppp_show_func_mc_mac_addr(struct mac_vlan_mc_tbl *mc_tbl, - - if (hikp_get_bit(mc_entry->function_bitmap[idx], offset) != 0) { - hikp_ether_format_addr(mac_str, HIKP_NIC_ETH_ADDR_FMT_SIZE, -- mc_entry->mac_addr); -+ mc_entry->mac_addr, HIKP_NIC_ETH_MAC_ADDR_LEN); - printf("\t%s\n", mac_str); - } - } -@@ -401,7 +403,8 @@ static void hikp_nic_ppp_show_manager_tbl(const void *data) - "| i_map | i_dir | e_type | pf_id | vf_id | q_id | drop\n"); - for (i = 0; i < tbl->entry_size; i++) { - entry = &tbl->entry[i]; -- hikp_ether_format_addr(mac_str, HIKP_NIC_ETH_ADDR_FMT_SIZE, entry->mac_addr); -+ hikp_ether_format_addr(mac_str, HIKP_NIC_ETH_ADDR_FMT_SIZE, entry->mac_addr, -+ HIKP_NIC_ETH_MAC_ADDR_LEN); - printf(" %02u | %s | %u ", entry->entry_no, mac_str, entry->mac_mask); - printf("| %04x | %u | %04u | %u ", - entry->ether_type, entry->ether_mask, entry->vlan_id, entry->vlan_mask); -@@ -489,7 +492,7 @@ static int hikp_nic_ppp_get_blk(struct hikp_cmd_header *req_header, - rsp = (struct nic_ppp_rsp *)cmd_ret->rsp_data; - if (rsp->rsp_head.cur_blk_size > buf_len) { - HIKP_ERROR_PRINT("nic_ppp block context copy size error, " -- "buffer size=%u, data size=%u.\n", -+ "buffer size=%zu, data size=%u.\n", - buf_len, rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; -@@ -791,6 +794,7 @@ static int hikp_nic_ppp_alloc_mac_tbl_entry(struct nic_mac_tbl *mac_tbl, - if (mac_tbl->mc_tbl.entry == NULL) { - HIKP_ERROR_PRINT("Fail to alloc mc_entry memory.\n"); - free(mac_tbl->uc_tbl.entry); -+ mac_tbl->uc_tbl.entry = NULL; - return -ENOMEM; - } - -@@ -813,6 +817,7 @@ static int hikp_nic_ppp_alloc_vlan_tbl_entry(struct nic_vlan_tbl *vlan_tbl, - if (vlan_tbl->vf_vlan_tbl.entry == NULL) { - HIKP_ERROR_PRINT("Fail to alloc vf_vlan_tbl_entry memory.\n"); - free(vlan_tbl->port_vlan_tbl.entry); -+ vlan_tbl->port_vlan_tbl.entry = NULL; - return -ENOMEM; - } - -@@ -872,16 +877,22 @@ static void hikp_nic_ppp_data_free(union nic_ppp_feature_info *ppp_data) - if (strcmp(ppp_cmd->feature_name, NIC_PPP_MAC_TBL_NAME) == 0) { - mac_tbl = &ppp_data->mac_tbl; - free(mac_tbl->uc_tbl.entry); -+ mac_tbl->uc_tbl.entry = NULL; - free(mac_tbl->mc_tbl.entry); -+ mac_tbl->mc_tbl.entry = NULL; - } else if (strcmp(ppp_cmd->feature_name, NIC_PPP_VLAN_TBL_NAME) == 0) { - vlan_tbl = &ppp_data->vlan_tbl; - free(vlan_tbl->vf_vlan_tbl.entry); -+ vlan_tbl->vf_vlan_tbl.entry = NULL; - free(vlan_tbl->port_vlan_tbl.entry); -+ vlan_tbl->port_vlan_tbl.entry = NULL; - } else if (strcmp(ppp_cmd->feature_name, NIC_PPP_MNG_TBL_NAME) == 0) { - mng_tbl = &ppp_data->mng_tbl; - free(mng_tbl->entry); -+ mng_tbl->entry = NULL; - } - free(ppp_data); -+ ppp_data = NULL; - } - - static int hikp_nic_ppp_check_optional_param(struct major_cmd_ctrl *self, -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index e3f0e9c..a09b4f1 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -98,12 +98,12 @@ static void hikp_nic_qos_show_dcb_info(const void *data) - printf("PFC configuration\n"); - printf(" PFC enable:"); - for (up = 0; up < HIKP_NIC_MAX_USER_PRIO_NUM; up++) -- printf(" %d", HI_BIT(up) & pfc->pfc_en ? 1 : 0); -+ printf(" %u", HI_BIT(up) & pfc->pfc_en ? 1 : 0); - - printf("\n"); - printf(" TC enable:"); - for (tc_no = 0; tc_no < HIKP_NIC_MAX_TC_NUM; tc_no++) -- printf(" %d", HI_BIT(tc_no) & pfc->hw_tc_map ? 1 : 0); -+ printf(" %u", HI_BIT(tc_no) & pfc->hw_tc_map ? 1 : 0); - - printf("\n"); - printf("ETS configuration\n"); -@@ -176,7 +176,7 @@ static int hikp_nic_qos_get_blk(struct hikp_cmd_header *req_header, - rsp = (struct nic_qos_rsp *)cmd_ret->rsp_data; - if (rsp->rsp_head.cur_blk_size > buf_len) { - HIKP_ERROR_PRINT("nic_qos block-%u copy size error, " -- "buffer size=%u, data size=%u.\n", -+ "buffer size=%zu, data size=%u.\n", - req_data->block_id, buf_len, rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; -@@ -198,7 +198,6 @@ static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const - size_t buf_len = sizeof(*data); - uint32_t total_blk_size; - uint8_t total_blk_num; -- uint8_t blk_num = 0; - uint8_t blk_id = 0; - int ret; - -@@ -272,7 +271,7 @@ static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) - } - - memset(revision_id, 0, MAX_PCI_ID_LEN + 1); -- ret = get_revision_id_by_bdf(bdf, revision_id); -+ ret = get_revision_id_by_bdf(bdf, revision_id, sizeof(g_qos_param.revision_id)); - // show pfc threshold as default if get revision_id error - if (ret) - strncpy(g_qos_param.revision_id, HIKP_IEP_REVISION, -diff --git a/net/nic/nic_queue/hikp_nic_queue.c b/net/nic/nic_queue/hikp_nic_queue.c -index f229e09..fa3b9d3 100644 ---- a/net/nic/nic_queue/hikp_nic_queue.c -+++ b/net/nic/nic_queue/hikp_nic_queue.c -@@ -248,7 +248,7 @@ static int hikp_nic_queue_get_blk(struct hikp_cmd_header *req_header, - rsp = (struct nic_queue_rsp *)cmd_ret->rsp_data; - if (rsp->rsp_head.cur_blk_size > buf_len) { - HIKP_ERROR_PRINT("nic_queue block-%u copy size error, " -- "buffer size=%u, data size=%u.\n", -+ "buffer size=%zu, data size=%u.\n", - req_data->block_id, buf_len, rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; -@@ -340,7 +340,6 @@ static bool hikp_nic_queue_check_feature_para_vaild(const struct queue_feature_c - - static void hikp_nic_queue_cmd_execute(struct major_cmd_ctrl *self) - { -- struct bdf_t *bdf = &g_queue_param.target.bdf; - const struct queue_feature_cmd *queue_cmd; - union nic_queue_feature_info *queue_data; - struct hikp_cmd_header req_header = {0}; -diff --git a/net/nic/nic_rss/hikp_nic_rss.c b/net/nic/nic_rss/hikp_nic_rss.c -index 5e4d261..ff1cfd2 100644 ---- a/net/nic/nic_rss/hikp_nic_rss.c -+++ b/net/nic/nic_rss/hikp_nic_rss.c -@@ -366,7 +366,7 @@ static int hikp_nic_rss_get_blk(struct hikp_cmd_header *req_header, - rsp = (struct nic_rss_rsp *)cmd_ret->rsp_data; - if (rsp->rsp_head.cur_blk_size > buf_len) { - HIKP_ERROR_PRINT("nic_rss block-%u copy size error, " -- "buffer size=%u, data size=%u.\n", -+ "buffer size=%zu, data size=%u.\n", - req_data->block_id, buf_len, rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; -@@ -388,7 +388,6 @@ static int hikp_nic_query_rss_feature(struct hikp_cmd_header *req_header, const - size_t buf_len = sizeof(*data); - uint32_t total_blk_size; - uint8_t total_blk_num; -- uint8_t blk_num = 0; - uint8_t blk_id = 0; - int ret; - -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index d5ae64a..3a0c1ae 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -15,11 +15,15 @@ - - static void hikp_roce_ext_reg_data_free(struct reg_data *reg) - { -- if (reg->offset) -+ if (reg->offset) { - free(reg->offset); -+ reg->offset = NULL; -+ } - -- if (reg->data) -+ if (reg->data) { - free(reg->data); -+ reg->data = NULL; -+ } - } - - static void hikp_roce_ext_cmd_ret_free(struct hikp_cmd_ret *cmd_ret) -@@ -118,7 +122,7 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - reg->offset = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - reg->data = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - if ((reg->offset == NULL) || (reg->data == NULL)) { -- printf("hikptool roce_%s alloc log memmory 0x%x failed!\n", -+ printf("hikptool roce_%s alloc log memmory 0x%zx failed!\n", - cmd_name, max_size); - ret = -ENOMEM; - hikp_roce_ext_reg_data_free(reg); -@@ -128,7 +132,7 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - - cur_size = res_head->cur_block_num * sizeof(uint32_t); - if (cur_size > max_size) { -- printf("hikptool roce_%s log data copy size error, data size: 0x%x, max size: 0x%x\n", -+ printf("hikptool roce_%s log data copy size error, data size: 0x%zx, max size: 0x%zx\n", - cmd_name, cur_size, max_size); - ret = -EINVAL; - hikp_roce_ext_reg_data_free(reg); -diff --git a/net/roce/roce_gmv/hikp_roce_gmv.c b/net/roce/roce_gmv/hikp_roce_gmv.c -index d65dc82..36ba665 100644 ---- a/net/roce/roce_gmv/hikp_roce_gmv.c -+++ b/net/roce/roce_gmv/hikp_roce_gmv.c -@@ -44,16 +44,16 @@ static int hikp_roce_gmv_target(struct major_cmd_ctrl *self, const char *argv) - static int hikp_roce_gmv_idxget(struct major_cmd_ctrl *self, const char *argv) - { - char *endptr = NULL; -- int index; -+ uint64_t index; - -- index = strtol(argv, &endptr, 0); -+ index = strtoul(argv, &endptr, 0); - if ((endptr <= argv) || (*endptr != '\0') || -- (index < 0) || (index >= ROCE_MAX_HIKPTOOL_GMV)) { -+ (index >= ROCE_MAX_HIKPTOOL_GMV)) { - snprintf(self->err_str, sizeof(self->err_str), "Invalid gmv_index."); - self->err_no = -EINVAL; - return -EINVAL; - } -- g_roce_gmv_param.gmv_index = index; -+ g_roce_gmv_param.gmv_index = (uint32_t)index; - - return 0; - } -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.c b/net/roce/roce_mdb/hikp_roce_mdb.c -index 04af817..374f100 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.c -+++ b/net/roce/roce_mdb/hikp_roce_mdb.c -@@ -89,7 +89,6 @@ static void hikp_roce_mdb_execute_origin(struct major_cmd_ctrl *self) - struct roce_mdb_rsp_data *mdb_rsp = NULL; - struct hikp_cmd_ret *cmd_ret = NULL; - uint32_t reg_num; -- int ret; - - self->err_no = hikp_roce_mdb_get_data(&cmd_ret, 0); - if (self->err_no) { -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.c b/net/roce/roce_qmm/hikp_roce_qmm.c -index d127264..e440b82 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.c -+++ b/net/roce/roce_qmm/hikp_roce_qmm.c -@@ -45,16 +45,16 @@ static int hikp_roce_qmm_target(struct major_cmd_ctrl *self, const char *argv) - static int hikp_roce_qmm_bank_get(struct major_cmd_ctrl *self, const char *argv) - { - char *endptr = NULL; -- int bank_num; -+ uint64_t bank_num; - -- bank_num = strtol(argv, &endptr, 0); -- if ((endptr <= argv) || (*endptr != '\0') || bank_num > QMM_BANK_NUM || bank_num < 0) { -+ bank_num = strtoul(argv, &endptr, 0); -+ if ((endptr <= argv) || (*endptr != '\0') || bank_num > QMM_BANK_NUM) { - snprintf(self->err_str, sizeof(self->err_str), "Invalid bank number!\n"); - self->err_no = -EINVAL; - return -EINVAL; - } - -- g_roce_qmm_param.bank_id = bank_num; -+ g_roce_qmm_param.bank_id = (uint32_t)bank_num; - return 0; - } - -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index e8e166d..fe08873 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -150,7 +150,7 @@ static int hikp_roce_scc_get_total_data_num(struct roce_scc_head *res_head, - *offset = (uint32_t *)calloc(1, max_size); - *data = (uint32_t *)calloc(1, max_size); - if ((*offset == NULL) || (*data == NULL)) { -- printf("hikptool roce_scc alloc log memmory 0x%x failed\n", max_size); -+ printf("hikptool roce_scc alloc log memmory 0x%zx failed\n", max_size); - ret = -ENOMEM; - goto get_data_error; - } -@@ -158,7 +158,7 @@ static int hikp_roce_scc_get_total_data_num(struct roce_scc_head *res_head, - cur_size = roce_scc_res->head.cur_block_num * sizeof(uint32_t); - if (cur_size > max_size) { - printf("hikptool roce_scc log data copy size error, " -- "data size: 0x%x, max size: 0x%x\n", cur_size, max_size); -+ "data size: 0x%zx, max size: 0x%zx\n", cur_size, max_size); - ret = -EINVAL; - goto get_data_error; - } -@@ -194,7 +194,7 @@ static int hikp_roce_scc_get_next_data(struct roce_scc_head *res_head, - if (cur_size > data_size) { - hikp_roce_scc_cmd_ret_free(&cmd_ret); - printf("hikptool roce_scc next log data copy size error, " -- "data size: 0x%x, max size: 0x%x\n", cur_size, data_size); -+ "data size: 0x%zx, max size: 0x%zx\n", cur_size, data_size); - return -EINVAL; - } - memcpy(*offset, roce_scc_res->reg_data.offset, cur_size); -diff --git a/net/roce/roce_timer/hikp_roce_timer.c b/net/roce/roce_timer/hikp_roce_timer.c -index a78d383..05ad3e1 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.c -+++ b/net/roce/roce_timer/hikp_roce_timer.c -@@ -149,7 +149,7 @@ static void hikp_roce_timer_execute(struct major_cmd_ctrl *self) - int (*func[])(struct major_cmd_ctrl *self) = { - hikp_roce_timer_show_cqc, hikp_roce_timer_show_qpc - }; -- char *function[] = {"show cqc", "show qpc"}; -+ const char *function[] = {"show cqc", "show qpc"}; - int i = 0; - int ret; - -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index 4591a47..fad3317 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -85,20 +85,17 @@ static int hikp_roce_trp_bank_get(struct major_cmd_ctrl *self, const char *argv) - - static int hikp_roce_trp_bank_check(void) - { -- uint32_t temp; -- -- temp = g_roce_trp_param_t.bank_id; - switch (g_roce_trp_param_t.sub_cmd) { - case (COMMON): -- if (temp > TRP_MAX_BANK_NUM || temp < 0) -+ if (g_roce_trp_param_t.bank_id > TRP_MAX_BANK_NUM) - return -EINVAL; - break; - case (PAYL): -- if (temp > PAYL_MAX_BANK_NUM || temp < 0) -+ if (g_roce_trp_param_t.bank_id > PAYL_MAX_BANK_NUM) - return -EINVAL; - break; - case (GEN_AC): -- if (temp > GAC_MAX_BANK_NUM || temp < 0) -+ if (g_roce_trp_param_t.bank_id > GAC_MAX_BANK_NUM) - return -EINVAL; - break; - default: -@@ -173,7 +170,8 @@ static int hikp_roce_trp_get_total_data_num(struct roce_trp_head *res_head, - *offset = (uint32_t *)calloc(1, max_size); - *data = (uint32_t *)calloc(1, max_size); - if ((*offset == NULL) || (*data == NULL)) { -- printf("hikptool roce_trp alloc log memmory 0x%x failed\n", max_size); -+ printf("hikptool roce_trp alloc log memmory 0x%zx failed\n", max_size); -+ hikp_roce_trp_reg_data_free(offset, data); - ret = -ENOMEM; - goto get_data_error; - } -@@ -181,7 +179,8 @@ static int hikp_roce_trp_get_total_data_num(struct roce_trp_head *res_head, - cur_size = roce_trp_res->head.cur_block_num * sizeof(uint32_t); - if (cur_size > max_size) { - printf("hikptool roce_trp log data copy size error, " -- "data size: 0x%x, max size: 0x%x\n", cur_size, max_size); -+ "data size: 0x%zx, max size: 0x%zx\n", cur_size, max_size); -+ hikp_roce_trp_reg_data_free(offset, data); - ret = -EINVAL; - goto get_data_error; - } -@@ -218,7 +217,7 @@ static int hikp_roce_trp_get_next_data(struct roce_trp_head *res_head, - if (cur_size > data_size) { - hikp_roce_trp_cmd_ret_free(&cmd_ret); - printf("hikptool roce_trp next log data copy size error, " -- "data size: 0x%x, max size: 0x%x\n", cur_size, data_size); -+ "data size: 0x%zx, max size: 0x%zx\n", cur_size, data_size); - return -EINVAL; - } - memcpy(*offset, roce_trp_res->reg_data.offset, cur_size); -@@ -268,7 +267,6 @@ static void hikp_roce_trp_execute(struct major_cmd_ctrl *self) - if (self->err_no) { - snprintf(self->err_str, sizeof(self->err_str), - "get the first roce_trp block dfx fail."); -- hikp_roce_trp_reg_data_free(&offset, &data); - return; - } - total_block_num = res_head.total_block_num; -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.c b/net/roce/roce_tsp/hikp_roce_tsp.c -index 9469e4d..5bb2649 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.c -+++ b/net/roce/roce_tsp/hikp_roce_tsp.c -@@ -84,16 +84,13 @@ static int hikp_roce_tsp_bank_get(struct major_cmd_ctrl *self, const char *argv) - - static int hikp_roce_tsp_bank_check(void) - { -- uint32_t temp; -- -- temp = g_roce_tsp_param_t.bank_id; - switch (g_roce_tsp_param_t.sub_cmd_code) { - case (COMMON): -- if ((temp > MAX_TSP_BANK_NUM) || temp < 0) -+ if (g_roce_tsp_param_t.bank_id > MAX_TSP_BANK_NUM) - return -EINVAL; - break; - case (TGP_TMP): -- if ((temp > MAX_TGP_TMP_BANK_NUM) || temp < 0) -+ if (g_roce_tsp_param_t.bank_id > MAX_TGP_TMP_BANK_NUM) - return -EINVAL; - break; - default: -diff --git a/net/ub/ub_crd/hikp_ub_crd.c b/net/ub/ub_crd/hikp_ub_crd.c -index e207ea2..0e47b5b 100644 ---- a/net/ub/ub_crd/hikp_ub_crd.c -+++ b/net/ub/ub_crd/hikp_ub_crd.c -@@ -64,7 +64,6 @@ static int hikp_ub_query_crd(void) - struct hikp_cmd_ret *cmd_ret = NULL; - struct ub_crd_rsp *crd_rsp = NULL; - int offset; -- int ret; - - char const *init_crds[][2] = { - {"CFG_REMOTE_ICRD", "CFG_REMOTE_LCRD"}, -diff --git a/net/ub/ub_ppp/hikp_unic_ppp.c b/net/ub/ub_ppp/hikp_unic_ppp.c -index ccba4e0..bf0c026 100644 ---- a/net/ub/ub_ppp/hikp_unic_ppp.c -+++ b/net/ub/ub_ppp/hikp_unic_ppp.c -@@ -191,6 +191,7 @@ static int hikp_unic_ppp_alloc_guid_tbl_entry(const struct hikp_unic_ppp_hw_reso - if (guid_tbl->mc_tbl.entry == NULL) { - HIKP_ERROR_PRINT("fail to alloc mc_guid_entry_table memory.\n"); - free(guid_tbl->uc_tbl.entry); -+ guid_tbl->uc_tbl.entry = NULL; - return -ENOMEM; - } - -@@ -399,13 +400,17 @@ static void hikp_unic_ppp_data_free(union unic_ppp_feature_info *unic_ppp_data) - if (g_unic_ppp_param.feature_idx == UNIC_PPP_IP_FEATURE_IDX) { - ip_tbl = &unic_ppp_data->ip_tbl; - free(ip_tbl->entry); -+ ip_tbl->entry = NULL; - } else if (g_unic_ppp_param.feature_idx == UNIC_PPP_GUID_FEATURE_IDX) { - guid_tbl = &unic_ppp_data->guid_tbl; - free(guid_tbl->uc_tbl.entry); -+ guid_tbl->uc_tbl.entry = NULL; - free(guid_tbl->mc_tbl.entry); -+ guid_tbl->mc_tbl.entry = NULL; - } - - free(unic_ppp_data); -+ unic_ppp_data = NULL; - } - - static void hikp_unic_ppp_cmd_execute(struct major_cmd_ctrl *self) -diff --git a/ossl/ossl_user_linux.c b/ossl/ossl_user_linux.c -index 8266a19..9dee61c 100644 ---- a/ossl/ossl_user_linux.c -+++ b/ossl/ossl_user_linux.c -@@ -47,7 +47,6 @@ int uda_realpath(const char *file_dir, char *format_dir) - - int uda_fcntl(const char *lock_file, uint32_t operation, int *fd) - { -- uint32_t f_opt = 0; - int fd_t = 0; - int ret; - -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.c b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -index 9697529..66226e0 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.c -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -@@ -213,7 +213,7 @@ static int pcie_print_ltssm_trace(const uint64_t *ltssm_input, uint32_t ltssm_nu - (uint32_t)ltssm_val.bits.any_change_pipe_req, - (uint32_t)ltssm_val.bits.rxl0s_st, - (uint32_t)ltssm_val.bits.train_bit_map1, -- (((uint32_t)ltssm_val.bits.rxl0s_st) << 2) | -+ (((uint32_t)ltssm_val.bits.rxl0s_st) << GEN5_BIT_OFFEST) | - ((uint32_t)ltssm_val.bits.mac_rate), - (uint32_t)ltssm_val.bits.duration_counter, - (uint32_t)ltssm_val.bits.ltssm_state, -@@ -271,7 +271,6 @@ int pcie_ltssm_trace_clear(uint32_t port_id) - - int pcie_ltssm_link_status_get(uint32_t port_id) - { -- uint32_t i; - union pcie_link_info reg_val; - struct hikp_cmd_header req_header; - struct hikp_cmd_ret *cmd_ret; -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.h b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -index 8f3502b..cc51501 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.h -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -@@ -19,6 +19,7 @@ - #define TRACE_STR_NUM 0x20 - #define TRACER_DEPTH 65 - #define PM_TRACE_STR_NUM 0x28 -+#define GEN5_BIT_OFFEST 2 - - struct pcie_ltssm_num_string { - int ltssm; -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index aac3843..b8c2241 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -405,7 +405,7 @@ static int pcie_create_dumpreg_log_file(uint32_t port_id, uint32_t dump_level) - - (void)remove((const char *)file_name); - /* Add write permission to the file */ -- fd_file = open(file_name, O_RDWR | O_SYNC | O_CREAT, 0640); -+ fd_file = open(file_name, O_RDWR | O_SYNC | O_CREAT, 0600); - if (fd_file < 0) { - Err("PCIe DUMPREG", "open %s failed.\n", file_name); - return -EPERM; -@@ -419,7 +419,7 @@ static int pcie_close_dumpreg_log_file(void) - { - int ret; - -- ret = fchmod(g_pcie_dumpreg_fd, 0440); -+ ret = fchmod(g_pcie_dumpreg_fd, 0400); - close(g_pcie_dumpreg_fd); - /* Revoke write permission of file */ - g_pcie_dumpreg_fd = -1; -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.c b/pcie/func_lib/pcie_func/pcie_statistics.c -index 40e5645..ed42cec 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.c -+++ b/pcie/func_lib/pcie_func/pcie_statistics.c -@@ -63,7 +63,7 @@ static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, - } - - static int pcie_portid_serdes_relation(const struct pcie_macro_info *macro_info, -- uint32_t macro_num, uint32_t ndie_id) -+ uint32_t macro_num, uint32_t ndie_id) - { - uint32_t i, j; - -@@ -90,7 +90,7 @@ int pcie_port_distribution_get(uint32_t chip_id) - struct hikp_cmd_header req_header; - struct hikp_cmd_ret *cmd_ret; - struct pcie_info_req_para req_data = { 0 }; -- uint32_t src_size, dst_size, pair_num; -+ uint32_t pair_num; - struct pcie_port_info *port_info; - uint32_t i; - int ret; -diff --git a/sas/sas_func/sas_read_dev.c b/sas/sas_func/sas_read_dev.c -index 3a3db07..670e2d4 100644 ---- a/sas/sas_func/sas_read_dev.c -+++ b/sas/sas_func/sas_read_dev.c -@@ -78,8 +78,6 @@ static void print_dev_link(const uint32_t *reg_save, uint32_t reg_num) - - static void sas_print_dev(const uint32_t *reg_save, uint32_t reg_num, uint32_t cmd_type) - { -- uint32_t i; -- - if (reg_num == 0) { - printf("SAS device is failed\n"); - return; -diff --git a/sas/sas_func/sas_read_dqe.c b/sas/sas_func/sas_read_dqe.c -index dbd30f3..7d49c0a 100644 ---- a/sas/sas_func/sas_read_dqe.c -+++ b/sas/sas_func/sas_read_dqe.c -@@ -57,7 +57,7 @@ static void print_dqe_info(const void *reg_save, uint32_t reg_num) - printf("TLR_Ctrl: %u\n", dqe->dw0.TLR_Ctrl); - printf("Phy_ID: %u\n", dqe->dw0.Phy_ID); - printf("Force_Phy: %u\n", dqe->dw0.Force_Phy); -- printf("PORT: 0x%llx\n", dqe->dw0.PORT); -+ printf("PORT: 0x%x\n", dqe->dw0.PORT); - printf("PRI: %u\n", dqe->dw0.PRI); - printf("CMD: %u\n", dqe->dw0.CMD); - -@@ -68,7 +68,7 @@ static void print_dqe_info(const void *reg_save, uint32_t reg_num) - printf("Reset: %u\n", dqe->dw1.Reset); - printf("PIR_Present: %u\n", dqe->dw1.PIR_Present); - printf("Enable_Transport_Layer_Retry: %u\n", dqe->dw1.Enable_Transport_Layer_Retry); -- printf("Verify_Data_Transfer_Length: 0x%llx\n", dqe->dw1.Verify_Data_Transfer_Length); -+ printf("Verify_Data_Transfer_Length: 0x%x\n", dqe->dw1.Verify_Data_Transfer_Length); - printf("Frame_Type: %u\n", dqe->dw1.Frame_Type); - printf("Device_ID: %u\n", dqe->dw1.Device_ID); - -diff --git a/sas/user_cmd/cmd_code/sas_cmd_dqe.c b/sas/user_cmd/cmd_code/sas_cmd_dqe.c -index 4a9547a..26bf0eb 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_dqe.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_dqe.c -@@ -44,7 +44,6 @@ static int sas_dqe_info(struct major_cmd_ctrl *self, const char *argv) - static int sas_set_queue_id(struct major_cmd_ctrl *self, const char *argv) - { - int ret; -- uint32_t val = 0; - - ret = sas_set_que_id(self, argv); - if (ret || sas_get_que_id() >= SAS_QUEUE_NUM) { -diff --git a/sas/user_cmd/cmd_code/sas_cmd_dump.c b/sas/user_cmd/cmd_code/sas_cmd_dump.c -index 4f2cfea..e7dedf0 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_dump.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_dump.c -@@ -42,7 +42,6 @@ static int sas_dump_global(struct major_cmd_ctrl *self, const char *argv) - static int sas_dump_phyx(struct major_cmd_ctrl *self, char const *argv) - { - int ret; -- uint32_t val = 0; - - (void)sas_set_cmd_type(DUMP_PHYX); - ret = sas_set_phy_id(self, argv); -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index 320ded2..4afcb9b 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -322,7 +322,7 @@ static void hikp_serdes_info_cmd_execute(struct major_cmd_ctrl *self) - SERDES_OUTPUT_MAX_SIZE) { - self->err_no = -EINVAL; - snprintf(self->err_str, sizeof(self->err_str), -- "serdes_info rsp_data data copy size error, data size:0x%x max size:0x%x.", -+ "serdes_info rsp_data data copy size error, data size:0x%zx max size:0x%x.", - (cmd_ret->rsp_data_num * sizeof(uint32_t) - out_out_header_size), - SERDES_OUTPUT_MAX_SIZE); - goto err_out; -@@ -480,7 +480,7 @@ static void hikp_serdes_dump_cmd_execute(struct major_cmd_ctrl *self) - SERDES_OUTPUT_MAX_SIZE) { - self->err_no = -EINVAL; - snprintf(self->err_str, sizeof(self->err_str), -- "serdes_dump rsp_data data copy size error, data size:0x%x max size:0x%x.", -+ "serdes_dump rsp_data data copy size error, data size:0x%zx max size:0x%x.", - (cmd_ret->rsp_data_num * sizeof(uint32_t) - out_out_header_size), - SERDES_OUTPUT_MAX_SIZE); - goto err_out; -diff --git a/socip/hikp_socip_dumpreg.c b/socip/hikp_socip_dumpreg.c -index 0153dd9..7b11523 100644 ---- a/socip/hikp_socip_dumpreg.c -+++ b/socip/hikp_socip_dumpreg.c -@@ -108,7 +108,6 @@ static bool check_socip_dumpreg_param(void) - static void dump_reg_info(const uint32_t *reg_data, uint32_t data_num) - { - #define ONE_LINE_PRINT_DATA_NUM 4 -- struct dump_reg_param_t *param = &g_dump_reg_param[0]; - uint32_t i; - - for (i = 0; i < data_num; i++) { -diff --git a/tool_lib/op_logs.c b/tool_lib/op_logs.c -index d91ddb0..f57f5fd 100644 ---- a/tool_lib/op_logs.c -+++ b/tool_lib/op_logs.c -@@ -29,7 +29,6 @@ static void op_log_write(const char *log_data) - { - size_t w_size; - FILE *fd; -- int ret; - - if (strlen(g_op_log) == 0) - return; -@@ -108,8 +107,6 @@ static int op_log_add_time_to_log(char *log_base, int *offset, uint32_t flag) - struct timeval tv; - struct tm ptm; - int len = 0; -- long usec; -- long sec; - int ret; - - (void)gettimeofday(&tv, NULL); -@@ -118,12 +115,18 @@ static int op_log_add_time_to_log(char *log_base, int *offset, uint32_t flag) - g_tv = tv; - len = (int)strftime(log_base + *offset, (OP_LOG_FILE_W_MAXSIZE + 1 - *offset), - OP_LOG_TIME_TEMP, &ptm); -+ if ((*offset + len) >= (OP_LOG_FILE_W_MAXSIZE + 1)) -+ return -ENOMEM; -+ - ret = snprintf(log_base + *offset + len, - (OP_LOG_FILE_W_MAXSIZE + 1 - *offset - len), OP_LOG_SEC_TIME_TEMP, - tv.tv_sec + tv.tv_usec / OP_LOG_SEC_AND_MICROSEC_TRANS); -- } else if (flag == LOG_FLAG_ONLY_TIME) { -+ } else { - len = (int)strftime(log_base + *offset, (OP_LOG_FILE_W_MAXSIZE + 1 - *offset), - OP_LOG_RESULT_TIME_TEMP, &ptm); -+ if ((*offset + len) >= (OP_LOG_FILE_W_MAXSIZE + 1)) -+ return -ENOMEM; -+ - ret = snprintf(log_base + *offset + len, - (OP_LOG_FILE_W_MAXSIZE + 1 - *offset - len), - OP_LOG_SEC_TIME_TEMP, -@@ -157,7 +160,6 @@ static int op_log_file_rollback(const char *op_log_backup, const char *log_dir) - char rollback_log[OP_LOG_FILE_W_MAXSIZE + 1] = {0}; - int offset = 0; - int ret; -- int len; - - ret = file_rollback(g_op_log, op_log_backup, OP_LOG_FILE_MAX_SIZE); - if (ret) { -@@ -280,10 +282,14 @@ void op_log_record_input(const int argc, const char **argv) - - arg = input_str; - for (i = 0; i < argc; i++) { -- snprintf(arg, (sizeof(input_str) - (arg - input_str)), "%s ", argv[i]); -+ ret = snprintf(arg, (sizeof(input_str) - (arg - input_str)), "%s ", argv[i]); -+ if (ret < 0 || ret >= (sizeof(input_str) - (arg - input_str))) -+ return; -+ - arg = arg + strlen(argv[i]) + 1; - } - input_str[strlen(input_str) - 1] = 0; -+ - arr_size = HIKP_ARRAY_SIZE(log_info); - for (i = 0; i < arr_size; i++) { - ret = snprintf(g_input_buf + offset, (OP_LOG_FILE_W_MAXSIZE + 1 - offset), -diff --git a/tool_lib/tool_cmd.c b/tool_lib/tool_cmd.c -index 43a3b61..db54f0f 100644 ---- a/tool_lib/tool_cmd.c -+++ b/tool_lib/tool_cmd.c -@@ -186,7 +186,6 @@ void command_parse_and_excute(const int argc, const char **argv) - { - struct major_cmd_ctrl *major_cmd = get_major_cmd(); - int lock_fd; -- int check; - int ret; - - major_cmd->err_no = check_command_length(argc, argv); -diff --git a/tool_lib/tool_lib.c b/tool_lib/tool_lib.c -index ad4bb68..180418f 100644 ---- a/tool_lib/tool_lib.c -+++ b/tool_lib/tool_lib.c -@@ -337,6 +337,9 @@ bool tool_can_print(uint32_t interval, uint32_t burst, uint32_t *print_num, uint - { - uint64_t cur_time; - -+ if (!print_num || !last_time) -+ return false; -+ - cur_time = (uint64_t)time(NULL); - if ((*last_time + interval) == cur_time) - *print_num = 0; --- -2.42.0.windows.2 - diff --git a/0053-hikptool-roce-Fix-the-infinite-loop-due-to-compatibi.patch b/0053-hikptool-roce-Fix-the-infinite-loop-due-to-compatibi.patch deleted file mode 100644 index 27662ab..0000000 --- a/0053-hikptool-roce-Fix-the-infinite-loop-due-to-compatibi.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 15e5379c7a1e041d8ea384f55c6cf77698646ac7 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Tue, 7 Nov 2023 15:59:27 +0800 -Subject: hikptool/roce: Fix the infinite loop due to compatibility issue - -When a new-version hikptool sends a subcmd of caep ext registers to -an old-version FW which doesn't support the query of ext registers -yet, due to the lack of subcmd check in old-version FW, there will -be no error and register data will still be responsed to hikptool. - -In the new-version hikptool, a do-while loop is used to implement a -multi-round query, and the loop variable is updated based on the -cur_block_num responsed from FW. Since there is no error reported, -the new-version hikptool will parse the old-version data based on the -new-version data structure. This may cause the parsed cur_block_num -remains 0, and the loop becomes infinite. - -To fix this problem, add a check of the responsed cur_block_num. -If it's 0, return with an error code. - -Fixes: 8b3b68347165 ("hikptool/roce: Add a common frame for hikptool roce register query") -Signed-off-by: Junxian Huang ---- - net/roce/roce_ext_common/hikp_roce_ext_common.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index 3a0c1ae..5bc3ce6 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -131,7 +131,7 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - } - - cur_size = res_head->cur_block_num * sizeof(uint32_t); -- if (cur_size > max_size) { -+ if (!cur_size || cur_size > max_size) { - printf("hikptool roce_%s log data copy size error, data size: 0x%zx, max size: 0x%zx\n", - cmd_name, cur_size, max_size); - ret = -EINVAL; --- -2.30.0 - diff --git a/0054-hikptool-roh-fix-the-display-information-for-roh-mac.patch b/0054-hikptool-roh-fix-the-display-information-for-roh-mac.patch deleted file mode 100644 index 0aa1080..0000000 --- a/0054-hikptool-roh-fix-the-display-information-for-roh-mac.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 93c9cd4501edc9fc487af78ea4fd4c0f37bc4dc1 Mon Sep 17 00:00:00 2001 -From: Ke Chen -Date: Fri, 15 Dec 2023 10:20:53 +0800 -Subject: [PATCH] hikptool/roh: fix the display information for roh mac mib - statistics - -Add a prompt head information "ROH MAC MIB INFO" - -Fixes: 99d48570419c ("support querying the RoH module information") -Signed-off-by: Ke Chen ---- - net/roh/hikp_roh_show_mib.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/net/roh/hikp_roh_show_mib.c b/net/roh/hikp_roh_show_mib.c -index 425a0e6..7267fe5 100644 ---- a/net/roh/hikp_roh_show_mib.c -+++ b/net/roh/hikp_roh_show_mib.c -@@ -232,6 +232,7 @@ static void hikp_roh_show_mib_in_multi_rounds(struct major_cmd_ctrl *self) - return; - } - -+ printf("**************ROH MAC MIB INFO*************\n"); - for (int i = 0; i < total_round; i++) { - ret = hikp_roh_fill_pmu_cnt(i); - if (ret != 0) { -@@ -239,6 +240,7 @@ static void hikp_roh_show_mib_in_multi_rounds(struct major_cmd_ctrl *self) - return; - } - } -+ printf("*****************************************\n"); - } - - static void hikp_roh_show_mib_execute(struct major_cmd_ctrl *self) --- -2.30.0 - diff --git a/0055-hikptool-augument-serdes-relationship-of-the-PCIe.patch b/0055-hikptool-augument-serdes-relationship-of-the-PCIe.patch deleted file mode 100644 index 5e8fe6a..0000000 --- a/0055-hikptool-augument-serdes-relationship-of-the-PCIe.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 51382f799643371ecfbe2e311923e9ebfac436ea Mon Sep 17 00:00:00 2001 -From: moubingquan -Date: Tue, 19 Dec 2023 11:09:35 +0800 -Subject: [PATCH] hikptool : augument serdes relationship of the PCIe - -The Ndie infomation is missing when different chips are adapted. -Add two Ndie to ensure that die information is properly printed. - -Fixes: 1d2a0bb9cddc ("hikptool : Querying the SerDes Relationship of the PCIe") -Signed-off-by: moubingquan ---- - pcie/func_lib/pcie_func/pcie_statistics.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.c b/pcie/func_lib/pcie_func/pcie_statistics.c -index 5dff720..d2661a4 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.c -+++ b/pcie/func_lib/pcie_func/pcie_statistics.c -@@ -26,7 +26,7 @@ static const char *g_global_width_name[GLOBAL_WIDTH_TABLE_SIZE] = { - }; - - static const char *g_global_ndie_name[] = { -- "Ndie_A", "Ndie_B" -+ "Ndie_A", "Ndie_B", "Ndie_C", "Ndie_D" - }; - - static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, uint32_t *port_num) --- -2.33.0 - diff --git a/0056-hikptool-Supported-parsing-the-optical-module-that-u.patch b/0056-hikptool-Supported-parsing-the-optical-module-that-u.patch deleted file mode 100644 index 5394d90..0000000 --- a/0056-hikptool-Supported-parsing-the-optical-module-that-u.patch +++ /dev/null @@ -1,484 +0,0 @@ -From 32a3a456b701d9b82742bba5371d8d828c6fe309 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 4 Jan 2024 14:54:29 +0800 -Subject: [PATCH] hikptool: Supported parsing the optical module that use the - CMIS protocol - -Added support dump and parse optical modules -whose Identifier Values are 0x18, 0x1A, 0x1E, 0x1F, and 0x20. - -Signed-off-by: veega2022 ---- - net/nic/nic_mac/hikp_nic_xsfp.c | 250 ++++++++++++++++++++++++++++++++ - net/nic/nic_mac/hikp_nic_xsfp.h | 159 ++++++++++++++++++++ - 2 files changed, 409 insertions(+) - -diff --git a/net/nic/nic_mac/hikp_nic_xsfp.c b/net/nic/nic_mac/hikp_nic_xsfp.c -index d97a506..70ed589 100644 ---- a/net/nic/nic_mac/hikp_nic_xsfp.c -+++ b/net/nic/nic_mac/hikp_nic_xsfp.c -@@ -55,6 +55,108 @@ static struct sff_ext_comp g_sff_ext_spec_comp[] = { - {0x4A, "50GBASE-ER"}, - }; - -+static struct sff_host_media_id g_sff_host_ids[] = { -+ {0x0, "Undefined", 0x0, "Undefined"}, -+ {0x1, "1000BASE-CX", 0x1, "NRZ"}, -+ {0xC, "100GAUI-4 C2M", 0x4, "NRZ"}, -+ {0xD, "100GAUI-2 C2M", 0x2, "PAM4"}, -+ {0x4B, "100GAUI-1-S C2M", 0x1, "PAM4"}, -+ {0x4C, "100GAUI-1-L C2M", 0x1, "PAM4"}, -+ {0xE, "200GAUI-8 C2M", 0x8, "NRZ"}, -+ {0xF, "200GAUI-4 C2M", 0x4, "PAM4"}, -+ {0x4D, "200GAUI-2-S C2M", 0x2, "PAM4"}, -+ {0x4E, "200GAUI-2-L C2M", 0x2, "PAM4"}, -+ {0x11, "400GAUI-8 C2M", 0x8, "PAM4"}, -+ {0x4F, "400GAUI-4-S C2M", 0x4, "PAM4"}, -+ {0x50, "400GAUI-4-L C2M", 0x4, "PAM4"}, -+ {0x13, "10GBASE-CX4", 0x4, "NRZ"}, -+ {0x14, "25GBASE-CR CA-25G-L", 0x1, "NRZ"}, -+ {0x15, "25GBASE-CR or 25GBASE-CR-SCA-25G-S", 0x1, "NRZ"}, -+ {0x16, "25GBASE-CR or 25GBASE-CR-SCA-25G-N", 0x1, "NRZ"}, -+ {0x17, "40GBASE-CR4", 0x4, "NRZ"}, -+ {0x43, "50GBASE-CR2 with RS(528,514)FEC", 0x2, "NRZ"}, -+ {0x44, "50GBASE-CR2 with BASE-R, Fire code FEC", 0x2, "NRZ"}, -+ {0x45, "50GBASE-CR2 with no FEC", 0x2, "NRZ"}, -+ {0x18, "50GBASE-CR", 0x1, "PAM4"}, -+ {0x1A, "100GBASE-CR4", 0x4, "NRZ"}, -+ {0x1B, "100GBASE-CR2", 0x2, "PAM4"}, -+ {0x46, "100GBASE-CR1", 0x1, "PAM4"}, -+ {0x1C, "200GBASE-CR4", 0x4, "PAM4"}, -+ {0x47, "200GBASE-CR2", 0x2, "PAM4"}, -+ {0x1D, "400G CR8", 0x8, "PAM4"}, -+ {0x48, "400GBASE-CR4", 0x4, "PAM4"}, -+}; -+ -+static struct sff_host_media_id g_mmf_media_ids[] = { -+ {0x0, "Undefined", 0x0, "Undefined"}, -+ {0x2, "10GBASE-SR", 0x1, "NRZ"}, -+ {0x3, "25GBASE-SR", 0x1, "NRZ"}, -+ {0x4, "40GBASE-SR4", 0x4, "NRZ"}, -+ {0x5, "40GE SWDM4 MSA", 0x4, "NRZ"}, -+ {0x7, "50GBASE-SR", 0x1, "PAM4"}, -+ {0x9, "100GBASE-SR4", 0x4, "NRZ"}, -+ {0xA, "100GE SWDM4 MSA", 0x4, "NRZ"}, -+ {0xC, "100GBASE-SR2", 0x2, "PAM4"}, -+ {0xD, "100GBASE-SR1", 0x1, "PAM4"}, -+ {0x1D, "100GBASE-VR1", 0x1, "PAM4"}, -+ {0xE, "200GBASE-SR4", 0x4, "PAM4"}, -+ {0x1B, "200GBASE-SR2", 0x2, "PAM4"}, -+ {0x1E, "200GBASE-VR2", 0x2, "PAM4"}, -+ {0x10, "400GBASE-SR8", 0x8, "PAM4"}, -+ {0x11, "400GBASE-SR4", 0x4, "PAM4"}, -+ {0x1F, "400GBASE-VR4", 0x4, "PAM4"}, -+}; -+ -+static struct sff_host_media_id g_smf_media_ids[] = { -+ {0x0, "Undefined", 0x0, "Undefined"}, -+ {0x4, "10GBASE-LR", 0x1, "NRZ"}, -+ {0x5, "10GBASE-ER", 0x1, "NRZ"}, -+ {0x4E, "10GBASE-BR", 0x1, "NRZ"}, -+ {0x6, "10G-ZR", 0x1, "NRZ"}, -+ {0x7, "25GBASE-LR", 0x1, "NRZ"}, -+ {0x8, "25GBASE-ER", 0x1, "NRZ"}, -+ {0x4F, "25GBASE-BR", 0x1, "NRZ"}, -+ {0x9, "40GBASE-LR4", 0x4, "NRZ"}, -+ {0xB, "50GBASE-FR", 0x1, "PAM4"}, -+ {0xC, "50GBASE-LR", 0x1, "PAM4"}, -+ {0x40, "50GBASE-ER", 0x1, "PAM4"}, -+ {0x50, "50GBASE-BR", 0x1, "PAM4"}, -+ {0xD, "100GBASE-LR4", 0x4, "NRZ"}, -+ {0xE, "100GBASE-ER4", 0x4, "NRZ"}, -+ {0xF, "100G PSM4 MSA", 0x4, "NRZ"}, -+ {0x34, "100G CWDM4-OCP", 0x4, "NRZ"}, -+ {0x10, "100G CWDM4 MSA", 0x4, "NRZ"}, -+ {0x11, "100G 4WDM-10 MSA", 0x4, "NRZ"}, -+ {0x12, "100G 4WDM-20 MSA", 0x4, "NRZ"}, -+ {0x13, "100G 4WDM-40 MSA", 0x4, "NRZ"}, -+ {0x14, "100GBASE-DR", 0x1, "PAM4"}, -+ {0x17, "200GBASE-DR4", 0x4, "PAM4"}, -+ {0x18, "200GBASE-FR4", 0x4, "PAM4"}, -+ {0x19, "200GBASE-LR4", 0x4, "PAM4"}, -+ {0x41, "200GBASE-ER4", 0x4, "PAM4"}, -+ {0x1A, "400GBASE-FR8", 0x8, "PAM4"}, -+ {0x1B, "400GBASE-LR8", 0x8, "PAM4"}, -+ {0x42, "400GBASE-ER8", 0x8, "PAM4"}, -+ {0x1C, "400GBASE-DR4", 0x4, "PAM4"}, -+ {0x55, "400GBASE-DR4-2", 0x4, "PAM4"}, -+ {0x43, "400GBASE-LR4-6", 0x4, "PAM4"}, -+}; -+ -+static struct sff_media_cable_id g_passive_cable_ids[] = { -+ {0x0, "Undefined"}, -+ {0x1, "Copper cable"}, -+ {0xBF, "Passive Loopback module"}, -+}; -+ -+static struct sff_media_cable_id g_active_cable_ids[] = { -+ {0x0, "Undefined"}, -+ {0x1, "Active Cable assembly"}, -+ {0x2, "Active Cable assembly"}, -+ {0x3, "Active Cable assembly"}, -+ {0x4, "Active Cable assembly"}, -+ {0xBF, "Active Loopback module"}, -+}; -+ - static int hikp_xsfp_get_cmd_data(struct hikp_cmd_ret **cmd_resp, uint32_t sub_cmd, uint32_t blk_id) - { - struct hikp_xsfp_req req = {0}; -@@ -320,6 +422,148 @@ static void hikp_show_qsfp_info(const uint8_t *data, uint32_t size) - printf("--------------------------------------------------------------\n"); - } - -+static void cmis_print_media_optical(const struct cmis_app_desc *desc, -+ struct sff_host_media_id *ids, size_t len) -+{ -+ for (uint8_t i = 0; i < len; i++) { -+ if (desc->media_id == ids[i].id) { -+ printf("%s(%s)\n", ids[i].int_spec, ids[i].modulation); -+ return; -+ } -+ } -+ printf("0x%x\n", desc->media_id); -+} -+ -+static void cmis_print_media_cable(const struct cmis_app_desc *desc, -+ struct sff_media_cable_id *ids, size_t len) -+{ -+ for (uint8_t i = 0; i < len; i++) { -+ if (desc->media_id == ids[i].id) { -+ printf("%s\n", ids[i].app_name); -+ return; -+ } -+ } -+ printf("0x%x\n", desc->media_id); -+} -+ -+static void cmis_print_host_int_spec(const struct cmis_app_desc *desc) -+{ -+ size_t size = HIKP_ARRAY_SIZE(g_sff_host_ids); -+ -+ for (uint8_t i = 0; i < size; i++) { -+ if (desc->host_id == g_sff_host_ids[i].id) { -+ printf("%s(%s) | ", -+ g_sff_host_ids[i].int_spec, g_sff_host_ids[i].modulation); -+ return; -+ } -+ } -+ -+ printf("0x%x | ", desc->host_id); -+} -+ -+static void cmis_print_host_and_media_int(const struct cmis_page_info *info, uint8_t app_id) -+{ -+ const struct cmis_app_desc *desc = &info->page0_lower.apps[app_id]; -+ uint8_t media_type = info->page0_lower.media_type; -+ -+ printf("%s %-9u: %s", "app_descriptor", app_id, "host and media int: "); -+ cmis_print_host_int_spec(desc); -+ -+ switch (media_type) { -+ case OPT_MMF: -+ cmis_print_media_optical(desc, g_mmf_media_ids, HIKP_ARRAY_SIZE(g_mmf_media_ids)); -+ break; -+ case OPT_SMF: -+ cmis_print_media_optical(desc, g_smf_media_ids, HIKP_ARRAY_SIZE(g_smf_media_ids)); -+ break; -+ case PASSIVE_COPPER: -+ cmis_print_media_cable(desc, g_passive_cable_ids, -+ HIKP_ARRAY_SIZE(g_passive_cable_ids)); -+ break; -+ case ACTIVE_CABLE: -+ cmis_print_media_cable(desc, g_active_cable_ids, -+ HIKP_ARRAY_SIZE(g_active_cable_ids)); -+ break; -+ default: -+ printf("0x%x\n", desc->media_id); -+ break; -+ } -+} -+ -+static void cmis_print_application_desc(const struct cmis_page_info *info) -+{ -+ for (uint8_t i = 0; i < CMIS_LOW_MEM_APP_DESC_NUM; i++) { -+ /* Undefined or unused, not print */ -+ if ((info->page0_lower.apps[i].host_id == 0xFF) || -+ (!info->page0_lower.apps[i].host_id && !info->page0_lower.apps[i].media_id)) -+ continue; -+ -+ cmis_print_host_and_media_int(info, i); -+ } -+} -+ -+static void cmis_print_base_id_info(const struct cmis_page_info *info) -+{ -+ /* page00h reg 202: bit6-7 */ -+ float cab_len_mul[] = {0.1f, 1.0f, 10.0f, 100.0f}; -+ /* page01h reg 132: bit6-7 */ -+ float smf_len_mul[] = {0.1f, 1.0f, 10.0f, 1.0f}; -+ const char *type[MEDIA_TYPE_RSVD] = { -+ "Undefined", "MMF Optical Interfaces", "SMF Optical Interfaces", -+ "Passive Copper Cables", "Active Cables", "BASE-T" -+ }; -+ -+ printf("%-24s: 0x%02x\n", "identifier", info->page0_lower.identifier); -+ printf("%-24s: 0x%02x\n", "connector", info->page0_upper.connector_type); -+ -+ if (info->page0_lower.media_type >= MEDIA_TYPE_RSVD) -+ printf("%-24s: 0x%02x\n", "media_type", info->page0_lower.media_type); -+ else -+ printf("%-24s: %s\n", "media_type", type[info->page0_lower.media_type]); -+ -+ printf("%-24s: %0.2f (m)\n", "cable_len", (float)info->page0_upper.cab_base_len * -+ cab_len_mul[info->page0_upper.len_multiplier]); -+ printf("%-24s: %0.2f (km)\n", "smf_len_km", -+ (float)info->page1.smf_len * smf_len_mul[info->page1.smf_len_multip]); -+ printf("%-24s: %u (m)\n", "om5_len", info->page1.om5_len * 0x2); -+ printf("%-24s: %u (m)\n", "om4_len", info->page1.om4_len * 0x2); -+ printf("%-24s: %u (m)\n", "om3_len", info->page1.om3_len * 0x2); -+ printf("%-24s: %u (m)\n", "om2_len", info->page1.om2_len); -+ printf("%-24s: %u (nm)\n", "wavelength", -+ (((uint16_t)info->page1.nominal_wave_len[0] << 8U) | -+ (uint16_t)info->page1.nominal_wave_len[1]) / CMIS_WAVE_LEN_DIV); -+ printf("%-24s: %u (nm)\n", "wavelength_tolerance", -+ (((uint16_t)info->page1.wave_len_tolerance[0] << 8U) | -+ (uint16_t)info->page1.wave_len_tolerance[1]) / CMIS_TOL_WAVE_LEN_DIV); -+ printf("%-24s: 0x%02x\n", "media_technology", info->page0_upper.media_int_tech); -+ xsfp_print_data("vendor_name", VEND_NAME_LEN, info->page0_upper.vend_name, PRINT_ASCII); -+ xsfp_print_data("vendor_oui", VEND_OUI_LEN, info->page0_upper.vend_oui, PRINT_HEX); -+ xsfp_print_data("vendor_pn", VEND_PN_LEN, info->page0_upper.vend_pn, PRINT_ASCII); -+ xsfp_print_data("vendor_rev", CMIS_VEND_REV_LEN, info->page0_upper.vend_rev, PRINT_ASCII); -+ xsfp_print_data("vendor_sn", VEND_SN_LEN, info->page0_upper.vend_sn, PRINT_ASCII); -+ xsfp_print_data("vendor_date_code", VEND_DATE_CODE_LEN, -+ info->page0_upper.date_code, PRINT_ASCII); -+ -+ cmis_print_application_desc(info); -+} -+ -+static void cmis_print_dom_info(const struct cmis_page_info *info) -+{ -+ if (!info->page0_lower.mem_model && info->page1.temp_mon_supp) -+ printf("%-24s: %d.%02u\n", "temperature", (int8_t)info->page0_lower.module_temp[0], -+ info->page0_lower.module_temp[1]); -+} -+ -+static void hikp_show_cmis_info(const uint8_t *data, uint32_t size) -+{ -+ struct cmis_page_info *cmis_data = (struct cmis_page_info *)data; -+ -+ printf("------------------------show cmis info------------------------\n"); -+ cmis_print_base_id_info(cmis_data); -+ cmis_print_dom_info(cmis_data); -+ printf("--------------------------------------------------------------\n"); -+} -+ - static void hikp_xsfp_parse_info(const uint8_t *data, uint32_t size) - { - if (data[SFF_ID_OFFSET] == ID_SFP) { -@@ -328,6 +572,12 @@ static void hikp_xsfp_parse_info(const uint8_t *data, uint32_t size) - data[SFF_ID_OFFSET] == ID_QSFP_PLUS || - data[SFF_ID_OFFSET] == ID_QSFP28) { - hikp_show_qsfp_info(data, size); -+ } else if (data[SFF_ID_OFFSET] == ID_QSFP_DD || -+ data[SFF_ID_OFFSET] == ID_SFP_DD || -+ data[SFF_ID_OFFSET] == ID_QSFP_P_CMIS || -+ data[SFF_ID_OFFSET] == ID_SFP_DD_CMIS || -+ data[SFF_ID_OFFSET] == ID_SFP_P_CMIS) { -+ hikp_show_cmis_info(data, size); - } else { - /* unknown type just dump hex data */ - hikp_xsfp_dump_hex(data, size); -diff --git a/net/nic/nic_mac/hikp_nic_xsfp.h b/net/nic/nic_mac/hikp_nic_xsfp.h -index a378197..6f5e38f 100644 ---- a/net/nic/nic_mac/hikp_nic_xsfp.h -+++ b/net/nic/nic_mac/hikp_nic_xsfp.h -@@ -75,6 +75,11 @@ - #define QSFP_10GBASE_LR_MASK HI_BIT(5) - #define QSFP_10GBASE_LRM_MASK HI_BIT(6) - -+#define CMIS_WAVE_LEN_DIV 20 -+#define CMIS_TOL_WAVE_LEN_DIV 200 -+ -+#define CMIS_VEND_REV_LEN 2 -+ - enum print_type { - PRINT_ASCII = 0, - PRINT_HEX, -@@ -87,6 +92,11 @@ enum sff_id_val { - ID_QSFP = 0x0C, - ID_QSFP_PLUS = 0x0D, - ID_QSFP28 = 0x11, -+ ID_QSFP_DD = 0x18, -+ ID_SFP_DD = 0x1A, -+ ID_QSFP_P_CMIS = 0x1E, -+ ID_SFP_DD_CMIS = 0x1F, -+ ID_SFP_P_CMIS = 0x20, - }; - - struct sff_comp_info { -@@ -99,6 +109,18 @@ struct sff_ext_comp { - const char *module_cap; - }; - -+struct sff_host_media_id { -+ uint8_t id; -+ const char *int_spec; -+ uint8_t lane_cnt; -+ const char *modulation; -+}; -+ -+struct sff_media_cable_id { -+ uint8_t id; -+ const char *app_name; -+}; -+ - struct sfp_a0_page { - uint8_t identifier; /* reg 0: Identifier */ - uint8_t ext_identifier; /* reg 1: Ext. Identifier */ -@@ -358,6 +380,143 @@ struct qsfp_page0_info { - struct qsfp_page0_upper page_upper; - }; - -+enum cmis_media_type { -+ UNDEFINED = 0, -+ OPT_MMF, -+ OPT_SMF, -+ PASSIVE_COPPER, -+ ACTIVE_CABLE, -+ BASE_T, -+ MEDIA_TYPE_RSVD, -+}; -+ -+#define CMIS_LOW_MEM_APP_DESC_NUM 8 -+struct cmis_app_desc { -+ uint8_t host_id; /* host electrical interface id */ -+ uint8_t media_id; /* module media electrical interface id */ -+ uint8_t media_lane_cnt : 4, -+ host_lane_cnt : 4; /* host and media lane counts */ -+ uint8_t host_assign; /* Host Lane Assignment Options */ -+}; -+ -+struct cmis_page0_lower { -+ uint8_t identifier; /* reg 0: Identifier */ -+ uint8_t rev_compliance; /* reg 1: CMIS revision */ -+ /* reg 2: Module Management Characteristics */ -+ uint8_t rsv0 : 2, -+ mci_max_speed : 2, -+ rsv1 : 2, -+ step_cfg_only : 1, -+ mem_model : 1; -+ /* reg 3: Global Status Information */ -+ uint8_t intr_deasserted : 1, -+ module_state : 3, -+ rsv2 : 4; -+ uint8_t flags_sum[4]; /* reg 4-7: Lane-Level Flags Summary */ -+ uint8_t module_flags[6]; /* reg 8-13: Module-Level Flags */ -+ uint8_t module_temp[2]; /* reg 14-15: TempMonValue */ -+ uint8_t module_vcc[2]; /* reg 16-17: VccMonVoltage */ -+ uint8_t module_mon_val[8]; /* reg 18-25: Module-Level Mon Value */ -+ /* reg 26: Module Global Controls */ -+ uint8_t rsv3 : 3, -+ sw_reset : 1, -+ lowpwr_req_sw : 1, -+ squ_method_sel : 1, -+ lowpwr_allow_req_hw : 1, -+ bank_bc_enable : 1; -+ uint8_t rsv4[14]; /* reg 27-40: */ -+ uint8_t module_fault; /* reg 41: Module Fault Information */ -+ uint8_t rsv5[22]; /* reg 42-63: Reserved */ -+ uint8_t custom[21]; /* reg 64-84: Custom */ -+ uint8_t media_type; /* reg 85: Media Type Encodings */ -+ /* reg 86-117: Application Descriptor */ -+ struct cmis_app_desc apps[CMIS_LOW_MEM_APP_DESC_NUM]; -+ uint8_t pwd_area[8]; /* reg 118-125: Password Facilities */ -+ uint8_t bank_sel; /* reg 126: Bank Index of Page mapped to Upper Memory */ -+ uint8_t page_sel; /* reg 127: Page Index of Page mapped to Upper Memory */ -+}; -+ -+struct cmis_page0_upper { -+ uint8_t identifier_cp; /* reg 128: The Same Byte 00h:0 */ -+ uint8_t vend_name[16]; /* reg 129-144: Vendor name (ASCII) */ -+ uint8_t vend_oui[3]; /* reg 145-147: Vendor IEEE company ID */ -+ uint8_t vend_pn[16]; /* reg 148-163: Part number provided by vendor (ASCII) */ -+ /* reg 164-165: Revision level for part number provided by vendor (ASCII) */ -+ uint8_t vend_rev[2]; -+ uint8_t vend_sn[16]; /* reg 166-181: Vendor Serial Number (ASCII) */ -+ uint8_t date_code[8]; /* reg 182-189: Manufacturing Date Code (ASCII) */ -+ /* reg 190-199: Common Language Equipment Identification Code (ASCII) */ -+ uint8_t clei_code[10]; -+ uint8_t module_pwr_class; /* reg 200: Module Power Class */ -+ /* reg 201: Maximum power consumption in multiples of 0.25 W -+ * rounded up to the next whole multiple of 0.25 W -+ */ -+ uint8_t max_power; -+ /* reg 202: Cable Assembly Link Length */ -+ uint8_t cab_base_len : 6, -+ len_multiplier : 2; -+ uint8_t connector_type; /* reg 203: Media Connector Type */ -+ uint8_t copp_attenuation[6]; /* reg 204-209: Copper Cable Attenuation */ -+ uint8_t media_lanes; /* reg 210: Media Lane Information */ -+ uint8_t cable_assembly_lane; /* reg 211: Cable Assembly Lane Information */ -+ uint8_t media_int_tech; /* reg 212: Media Interface Technology */ -+ uint8_t rsv0[8]; /* reg 213-220: Reserved */ -+ uint8_t rsv1; /* reg 221: Custom1 */ -+ uint8_t page_check_sum; /* reg 222: Page Checksum over bytes 128-221 */ -+ uint8_t rsv[33]; /* reg 223-255: Custom Info (non-volatile) */ -+}; -+ -+struct cmis_page1_info { -+ uint8_t inac_fw_hw_ver[4]; /* reg 128-131: Inactive FW revision and HW revision */ -+ uint8_t smf_len : 6, /* reg 132: Base link length for SMF fiber in km */ -+ smf_len_multip : 2; /* Link length multiplier for SMF fiber */ -+ uint8_t om5_len; /* reg 133: Link length supported for OM5 fiber */ -+ uint8_t om4_len; /* reg 134: Link length supported for OM4 fiber */ -+ uint8_t om3_len; /* reg 135: Link length supported for EBW 50/125 µm fiber (OM3) */ -+ uint8_t om2_len; /* reg 136: Link length supported for 50/125 µm fiber (OM2) */ -+ uint8_t rsv0; /* reg 137: Reserved */ -+ uint8_t nominal_wave_len[2]; /* reg 138-139: NominalWavelength */ -+ uint8_t wave_len_tolerance[2]; /* reg 140-141: WavelengthTolerance */ -+ uint8_t pages_support; /* reg 142: Supported Pages Advertising */ -+ uint8_t duration_adv[2]; /* reg 143-144: Durations Advertising */ -+ uint8_t module_char[10]; /* reg 145-154: Module Characteristics Advertising */ -+ uint8_t contrl_support[2]; /* reg 155-156: Supported Controls Advertisement */ -+ uint8_t flags_support[2]; /* reg 157-158: Supported Flags Advertisement */ -+ /* reg 159: Supported Mon Advertisement */ -+ uint8_t temp_mon_supp : 1, -+ vcc_mon_supp : 1, -+ aux1_mon_supp : 1, -+ aux2_mon_supp : 1, -+ aux3_mon_supp : 1, -+ custom_mon_supp : 1, -+ rsv1 : 2; -+ /* reg 160: Supported Power Mon Advertisement */ -+ uint8_t txbias_mon_supp : 1, -+ tx_pwr_mon_supp : 1, -+ rx_pwr_mon_supp : 1, -+ txbias_curr_scal : 2, -+ rsv2 : 3; -+ /* reg 161-162: Supported Configuration and Signal Integrity Controls Advertisement */ -+ uint8_t sig_intr_support[2]; -+ uint8_t cdb_func_support[4]; /* reg 163-166: CDB Messaging Support Advertisement */ -+ uint8_t add_dura_adv[3]; /* reg 167-169: Additional Durations Advertising */ -+ uint8_t rsv3[7]; /* reg 170-175: Reserved */ -+ uint8_t media_lane_adv[15]; /* reg 176-190: Media Lane Assignment Advertising */ -+ uint8_t custom[32]; /* reg 191-222: Custom */ -+ uint8_t add_app_desc[28]; /* reg 223-250: Additional Application Descriptor Registers */ -+ uint8_t rsv4[4]; /* reg 251-254: Reserved */ -+ uint8_t page_check_sum; /* reg 255: Page Checksum */ -+}; -+ -+/* Current support max 640 bytes data */ -+struct cmis_page_info { -+ struct cmis_page0_lower page0_lower; -+ struct cmis_page0_upper page0_upper; -+ struct cmis_page1_info page1; -+ uint8_t page2_data[128]; -+ uint8_t page3_data[128]; -+}; -+ - #define XSFP_TARGET_BIT HI_BIT(0) - #define XSFP_RAW_DATA_BIT HI_BIT(1) - --- -2.33.0 - diff --git a/0057-hikptool-Fixed-an-issue-where-the-MAC-type-is-incorr.patch b/0057-hikptool-Fixed-an-issue-where-the-MAC-type-is-incorr.patch deleted file mode 100644 index 138b37e..0000000 --- a/0057-hikptool-Fixed-an-issue-where-the-MAC-type-is-incorr.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 88a34af2338c4b49d6e2af846b9b7cd0d01068d2 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Mon, 15 Jan 2024 17:55:58 +0800 -Subject: [PATCH] hikptool: Fixed an issue where the MAC type is incorrectly - displayed - -Currently, only the ETH and ROH types can be displayed, add the UB -mac type to be displayed - -Fixes: e05c70e1ff25 ("support querying NIC module information") -Signed-off-by: veega2022 ---- - net/nic/nic_info/hikp_nic_info.c | 11 +++++++++-- - net/nic/nic_info/hikp_nic_info.h | 7 +++++++ - 2 files changed, 16 insertions(+), 2 deletions(-) - -diff --git a/net/nic/nic_info/hikp_nic_info.c b/net/nic/nic_info/hikp_nic_info.c -index cd78bc7..992bbf0 100644 ---- a/net/nic/nic_info/hikp_nic_info.c -+++ b/net/nic/nic_info/hikp_nic_info.c -@@ -98,6 +98,13 @@ static int hikp_nic_get_curr_die_info(void) - return 0; - } - -+static const char *hikp_nic_info_get_mac_type(uint8_t type_val) -+{ -+ const char *mac_type[MAC_TYPE_MAX] = {"ETH", "ROH", "UB"}; -+ -+ return (type_val >= MAC_TYPE_MAX) ? "UNKNOWN" : mac_type[type_val]; -+} -+ - static void hikp_nic_info_print_cur_pf(const struct bdf_t *bdf) - { - struct tool_target *pf_target = &g_info_param.target; -@@ -113,7 +120,7 @@ static void hikp_nic_info_print_cur_pf(const struct bdf_t *bdf) - bdf->domain, bdf->bus_id, bdf->dev_id, bdf->fun_id); - printf("\t%-16s %u\n", "mac id:", g_info_param.info.pf_info[pf_id].mac_id); - printf("\t%-16s %s\n", "mac type:", -- g_info_param.info.pf_info[pf_id].mac_type ? "ROH" : "ETH"); -+ hikp_nic_info_get_mac_type(g_info_param.info.pf_info[pf_id].mac_type)); - printf("\t%-16s %u\n", "func_num:", g_info_param.info.pf_info[pf_id].func_num); - printf("\t%-16s %u\n", "tqp_num:", g_info_param.info.pf_info[pf_id].tqp_num); - printf("\t%-16s 0x%x\n", "pf_cap_flag:", g_info_param.info.pf_info[pf_id].pf_cap_flag); -@@ -162,7 +169,7 @@ static void hikp_nic_info_print_cur_die(void) - - printf("\n%-16s", "mac type:"); - for (i = 0; i < g_info_param.info.pf_num; i++) -- printf("%s\t", g_info_param.info.pf_info[i].mac_type ? "ROH" : "ETH"); -+ printf("%s\t", hikp_nic_info_get_mac_type(g_info_param.info.pf_info[i].mac_type)); - - printf("\n%-16s", "func num:"); - for (i = 0; i < g_info_param.info.pf_num; i++) -diff --git a/net/nic/nic_info/hikp_nic_info.h b/net/nic/nic_info/hikp_nic_info.h -index 7419209..194146e 100644 ---- a/net/nic/nic_info/hikp_nic_info.h -+++ b/net/nic/nic_info/hikp_nic_info.h -@@ -70,4 +70,11 @@ struct nic_info_param { - bool have_interface; - }; - -+enum nic_info_mac_type { -+ MAC_TYPE_ETH = 0, -+ MAC_TYPE_ROH, -+ MAC_TYPE_UB, -+ MAC_TYPE_MAX, -+}; -+ - #endif --- -2.30.0 - diff --git a/0058-hikptool-The-nic_port-command-is-adapted-to-display-.patch b/0058-hikptool-The-nic_port-command-is-adapted-to-display-.patch deleted file mode 100644 index d9f044d..0000000 --- a/0058-hikptool-The-nic_port-command-is-adapted-to-display-.patch +++ /dev/null @@ -1,167 +0,0 @@ -From 9bdcedb5d634b438139daf6de851a0f40e8708fe Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 22 Feb 2024 10:34:09 +0800 -Subject: [PATCH] hikptool: The nic_port command is adapted to display the DFX - of the ROH MAC - -ROH MAC is different from ETH MAC. For ROH MAC, -the following DFX parameters are added: -tx link lanes, rx link lanes, pcs link, mac link, tx retry count, etc. - -For the firmware of earlier versions, -the MAC DFX of the ETH type is displayed by default. - -Signed-off-by: veega2022 ---- - net/nic/nic_mac/hikp_mac_cmd.h | 1 + - net/nic/nic_mac/hikp_nic_port.c | 63 +++++++++++++++++++++++++++++++-- - net/nic/nic_mac/hikp_nic_port.h | 25 +++++++++++++ - 3 files changed, 86 insertions(+), 3 deletions(-) - -diff --git a/net/nic/nic_mac/hikp_mac_cmd.h b/net/nic/nic_mac/hikp_mac_cmd.h -index f74fd2a..9a3f0d9 100644 ---- a/net/nic/nic_mac/hikp_mac_cmd.h -+++ b/net/nic/nic_mac/hikp_mac_cmd.h -@@ -32,6 +32,7 @@ enum mac_port_sub_cmd { - QUERY_HOT_PLUG_CARD_DFX, - QUERY_PORT_CDR_DFX, - QUERY_PORT_INFO_DFX_CAP, -+ QUERY_PORT_ROH_MAC_DFX, - }; - - enum mac_dump_reg_sub_cmd { -diff --git a/net/nic/nic_mac/hikp_nic_port.c b/net/nic/nic_mac/hikp_nic_port.c -index 5ba6927..725ef95 100644 ---- a/net/nic/nic_mac/hikp_nic_port.c -+++ b/net/nic/nic_mac/hikp_nic_port.c -@@ -174,7 +174,7 @@ static void mac_show_speed(uint32_t speed, uint32_t lanes) - printf("speed: %s_%s\n", speed_str, lanes_str); - } - --static void mac_cmd_disp_mac_info(const struct mac_cmd_mac_dfx *mac_dfx) -+static void mac_cmd_disp_eth_mac_info(const struct mac_cmd_mac_dfx *mac_dfx) - { - printf("\n========================== MAC INFO ==========================\n"); - mac_show_speed(mac_dfx->speed, mac_dfx->lanes); -@@ -192,7 +192,7 @@ static void mac_cmd_disp_mac_info(const struct mac_cmd_mac_dfx *mac_dfx) - printf("pcs_err = 0x%x\n", mac_dfx->pcs_err_cnt); - } - --static void mac_cmd_show_mac(struct major_cmd_ctrl *self) -+static void mac_cmd_show_eth_mac(struct major_cmd_ctrl *self) - { - struct mac_cmd_mac_dfx *mac_dfx = NULL; - struct hikp_cmd_ret *cmd_ret = NULL; -@@ -206,8 +206,65 @@ static void mac_cmd_show_mac(struct major_cmd_ctrl *self) - } - - mac_dfx = (struct mac_cmd_mac_dfx *)(cmd_ret->rsp_data); -- mac_cmd_disp_mac_info(mac_dfx); -+ mac_cmd_disp_eth_mac_info(mac_dfx); -+ free(cmd_ret); -+ cmd_ret = NULL; -+} -+ -+static void mac_cmd_disp_roh_mac_info(const struct mac_cmd_roh_mac_dfx *mac_dfx) -+{ -+ printf("\n========================== MAC INFO ==========================\n"); -+ mac_show_speed(mac_dfx->speed, mac_dfx->lanes); -+ mac_print_enum("fec", mac_dfx->fec, g_fec_table, HIKP_ARRAY_SIZE(g_fec_table), "unknown"); -+ mac_print_enum("sds_rate", mac_dfx->sds_rate, g_sds_rate_table, -+ HIKP_ARRAY_SIZE(g_sds_rate_table), "unknown"); -+ printf("tx_link_lanes: %u\n", mac_dfx->tx_link_lanes); -+ printf("rx_link_lanes: %u\n", mac_dfx->rx_link_lanes); -+ mac_print_link("pcs_link", mac_dfx->pcs_link); -+ mac_print_link("mac_link", mac_dfx->mac_link); -+ printf("tx_retry_cnt: %u\n", mac_dfx->tx_retry_cnt); -+} -+ -+static void mac_cmd_show_roh_mac(struct major_cmd_ctrl *self) -+{ -+ struct mac_cmd_roh_mac_dfx *mac_dfx = NULL; -+ struct hikp_cmd_ret *cmd_ret = NULL; -+ int ret; -+ -+ ret = mac_cmd_get_dfx_cfg(QUERY_PORT_ROH_MAC_DFX, &cmd_ret); -+ if (ret) { -+ snprintf(self->err_str, sizeof(self->err_str), "mac get roh mac dfx failed."); -+ self->err_no = -ENOSPC; -+ return; -+ } -+ -+ mac_dfx = (struct mac_cmd_roh_mac_dfx *)(cmd_ret->rsp_data); -+ mac_cmd_disp_roh_mac_info(mac_dfx); - free(cmd_ret); -+ cmd_ret = NULL; -+} -+ -+static void mac_cmd_show_mac(struct major_cmd_ctrl *self) -+{ -+ struct mac_cmd_port_hardware *hw = NULL; -+ struct hikp_cmd_ret *hw_cmd_ret = NULL; -+ int ret; -+ -+ ret = mac_cmd_get_dfx_cfg(QUERY_PORT_HARDWARE, &hw_cmd_ret); -+ if (ret) { -+ snprintf(self->err_str, sizeof(self->err_str), "mac get hardware dfx failed."); -+ self->err_no = -ENOSPC; -+ return; -+ } -+ -+ hw = (struct mac_cmd_port_hardware *)(hw_cmd_ret->rsp_data); -+ if (hw->cmd_mac_type == CMD_MAC_TYPE_ROH || hw->cmd_mac_type == CMD_MAC_TYPE_UB) -+ mac_cmd_show_roh_mac(self); -+ else -+ mac_cmd_show_eth_mac(self); -+ -+ free(hw_cmd_ret); -+ hw_cmd_ret = NULL; - } - - static void mac_cmd_disp_link_info(struct mac_cmd_link_dfx *link_dfx) -diff --git a/net/nic/nic_mac/hikp_nic_port.h b/net/nic/nic_mac/hikp_nic_port.h -index 78928b3..cb72ebc 100644 ---- a/net/nic/nic_mac/hikp_nic_port.h -+++ b/net/nic/nic_mac/hikp_nic_port.h -@@ -107,6 +107,9 @@ struct mac_item { - struct mac_cmd_port_hardware { - uint8_t port_type; - uint8_t media_type; -+ uint8_t cmd_mac_type : 4, -+ rsv0 : 4; -+ uint8_t rsv1; - }; - - struct mac_cmd_mac_dfx { -@@ -230,6 +233,28 @@ struct mac_cmd_port_dfx_cap { - uint32_t rsvd[3]; - }; - -+enum cmd_mac_type { -+ CMD_MAC_TYPE_ETH = 0, -+ CMD_MAC_TYPE_ROH, -+ CMD_MAC_TYPE_UB, -+ CMD_MAC_TYPE_MAX, -+}; -+ -+struct mac_cmd_roh_mac_dfx { -+ uint8_t speed; -+ uint8_t fec; -+ uint8_t lanes; -+ uint8_t sds_rate; -+ uint8_t tx_link_lanes : 4, -+ rx_link_lanes : 4; -+ uint8_t pcs_link : 1, -+ mac_link : 1, -+ rsv0 : 6; -+ uint8_t rsv1[2]; -+ uint32_t tx_retry_cnt; -+ uint32_t rsv2[4]; -+}; -+ - struct mac_cmd_dfx_callback { - uint32_t mask; - void (*show_dfx)(struct major_cmd_ctrl *self); --- -2.30.0 - diff --git a/0059-hikptool-fix-cleancode-codecheck-alarm.patch b/0059-hikptool-fix-cleancode-codecheck-alarm.patch deleted file mode 100644 index 7321cee..0000000 --- a/0059-hikptool-fix-cleancode-codecheck-alarm.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 84eb49f12133a4938805462940eaa2847492bdfb Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 28 Feb 2024 11:23:59 +0800 -Subject: [PATCH] hikptool: fix cleancode codecheck alarm - -1. invalid case style for macro definition __HIKPTDEV_PLUG_H -fix it to HIKPTDEV_PLUG_H - -2. Please do not mix signed and unsigned numbers -Modify the operator to ensure that the types on both sides are consistent. - -Signed-off-by: veega2022 ---- - libhikptdev/include/hikptdev_plug.h | 6 +++--- - tool_lib/op_logs.c | 2 +- - tool_lib/tool_lib.c | 4 ++-- - 3 files changed, 6 insertions(+), 6 deletions(-) - -diff --git a/libhikptdev/include/hikptdev_plug.h b/libhikptdev/include/hikptdev_plug.h -index 34fd783..8b242d3 100644 ---- a/libhikptdev/include/hikptdev_plug.h -+++ b/libhikptdev/include/hikptdev_plug.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKPTDEV_PLUG_H --#define __HIKPTDEV_PLUG_H -+#ifndef HIKPTDEV_PLUG_H -+#define HIKPTDEV_PLUG_H - - #include - -@@ -57,4 +57,4 @@ void hikp_dev_uninit(void); - int hikp_rsp_normal_check(const struct hikp_cmd_ret *cmd_ret); - int hikp_rsp_normal_check_with_version(const struct hikp_cmd_ret *cmd_ret, uint32_t version); - --#endif -+#endif /* HIKPTDEV_PLUG_H */ -diff --git a/tool_lib/op_logs.c b/tool_lib/op_logs.c -index f57f5fd..9fb91d8 100644 ---- a/tool_lib/op_logs.c -+++ b/tool_lib/op_logs.c -@@ -283,7 +283,7 @@ void op_log_record_input(const int argc, const char **argv) - arg = input_str; - for (i = 0; i < argc; i++) { - ret = snprintf(arg, (sizeof(input_str) - (arg - input_str)), "%s ", argv[i]); -- if (ret < 0 || ret >= (sizeof(input_str) - (arg - input_str))) -+ if (ret < 0 || ret >= (int)(sizeof(input_str) - (arg - input_str))) - return; - - arg = arg + strlen(argv[i]) + 1; -diff --git a/tool_lib/tool_lib.c b/tool_lib/tool_lib.c -index 180418f..5c1a02d 100644 ---- a/tool_lib/tool_lib.c -+++ b/tool_lib/tool_lib.c -@@ -281,9 +281,9 @@ static int get_rand_str(char *str, int length) - [TYPE_LOWERCASE] = {'a', 26}, - }; - uint32_t r[RANDOM_NUM]; -+ uint32_t type; - int fd, size; - int i, j; -- int type; - - fd = open("/dev/urandom", O_RDONLY); - if (fd < 0) { -@@ -325,7 +325,7 @@ int generate_file_name(unsigned char *file_name, - ret = snprintf((char *)file_name, file_name_len, "%s_%d_%d_%d_%d_%d_%d_%s.log", prefix, - timeinfo.tm_year + START_YEAR, timeinfo.tm_mon + 1, timeinfo.tm_mday, - timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, str_r); -- if (ret < 0 || ret >= file_name_len) { -+ if (ret < 0 || (uint32_t)ret >= file_name_len) { - HIKP_ERROR_PRINT("generate file name failed, errno is %d\n", errno); - return -errno; - } --- -2.30.0 - diff --git a/0060-hikptool-Delete-meaningless-printing.patch b/0060-hikptool-Delete-meaningless-printing.patch deleted file mode 100644 index 2bf6a3f..0000000 --- a/0060-hikptool-Delete-meaningless-printing.patch +++ /dev/null @@ -1,32 +0,0 @@ -From c28e333b43508b4037cba59a6ce8bb3912f63939 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Mon, 18 Mar 2024 17:36:40 +0800 -Subject: [PATCH] hikptool: Delete meaningless printing - -The revision IDs of different chips may be different. -Therefore, the print of revision ID mismatch is deleted. -It is normal that the revision IDs are different. - -Signed-off-by: veega2022 ---- - libhikptdev/src/rciep/hikpt_rciep.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/libhikptdev/src/rciep/hikpt_rciep.c b/libhikptdev/src/rciep/hikpt_rciep.c -index f673dd0..75ec224 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.c -+++ b/libhikptdev/src/rciep/hikpt_rciep.c -@@ -366,8 +366,8 @@ static int hikp_iep_check(const char *tmp_vendor_dir, - return ret; - - ret = hikp_iep_check_item(revision_dir, MAX_PCI_REVISION_LEN, HIKP_IEP_REVISION); -- if (ret != 0) -- printf("Revision id not match %s.\n", HIKP_IEP_REVISION); -+ if (ret != 0 && ret != -ENXIO) -+ return ret; - - return 0; - } --- -2.30.0 - diff --git a/0061-hikptool-Update-the-tool-version-number-to-1.1.1.patch b/0061-hikptool-Update-the-tool-version-number-to-1.1.1.patch deleted file mode 100644 index d595982..0000000 --- a/0061-hikptool-Update-the-tool-version-number-to-1.1.1.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 1354eaf629ac399a4f0789a0cdc460a4293ec905 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 23 Apr 2024 21:45:02 +0800 -Subject: [PATCH] hikptool: Update the tool version number to 1.1.1 - -Update the tool version number to 1.1.1 - -Signed-off-by: veega2022 ---- - tool_lib/tool_lib.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 14b3db5..72a99c6 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.1.0" -+#define TOOL_VER "1.1.1" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.42.0.windows.2 - diff --git a/0062-hikptool-The-ecam-register-is-added-to-the-PCIe-dump.patch b/0062-hikptool-The-ecam-register-is-added-to-the-PCIe-dump.patch deleted file mode 100644 index fb25a30..0000000 --- a/0062-hikptool-The-ecam-register-is-added-to-the-PCIe-dump.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 87b58805e41ccb47c313266e76219d9b0bb5f05e Mon Sep 17 00:00:00 2001 -From: moubingquan -Date: Mon, 20 May 2024 14:13:24 +0800 -Subject: [PATCH] hikptool: The ecam register is added to the PCIe dumpreg. - -The ecam register is added to facilitate fault locating. - -Updated the tool version to 1.1.2. - -Signed-off-by: moubingquan ---- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 2 ++ - tool_lib/tool_lib.h | 2 +- - 2 files changed, 3 insertions(+), 1 deletion(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index b8c2241..535807c 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -144,6 +144,8 @@ struct pcie_dumpreg_info g_reg_table_pcs[] = { - }; - - struct pcie_dumpreg_info g_reg_table_iob_tx[] = { -+ {0, "IOB_TX_ECAM_CONTROL0"}, -+ {0, "IOB_TX_ECAM_CONTROL1"}, - {0, "IOB_TX_ECAM_BASE_ADDR_L"}, - {0, "IOB_TX_ECAM_BASE_ADDR_H"}, - {0, "IOB_TX_CXL_BASE_BUS_0"}, -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 72a99c6..644a08e 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.1.1" -+#define TOOL_VER "1.1.2" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.45.0.windows.1 - diff --git a/0063-hikptool-roce-Print-names-of-registers-for-gmv-mdb-p.patch b/0063-hikptool-roce-Print-names-of-registers-for-gmv-mdb-p.patch deleted file mode 100644 index 15a960d..0000000 --- a/0063-hikptool-roce-Print-names-of-registers-for-gmv-mdb-p.patch +++ /dev/null @@ -1,739 +0,0 @@ -From f1664742cfa1cae3872d412b09f0c6865f553711 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Sat, 22 Jun 2024 14:01:10 +0800 -Subject: [PATCH 01/27] hikptool/roce: Print names of registers for - gmv/mdb/pkt/qmm/scc/timer/trp/tsp - -Print names of registers for gmv/mdb/pkt/qmm/scc/timer/trp/tsp to -improve usability. - -Signed-off-by: Junxian Huang ---- - net/roce/roce_gmv/hikp_roce_gmv.c | 18 +++- - net/roce/roce_mdb/hikp_roce_mdb.c | 33 +++++- - net/roce/roce_pkt/hikp_roce_pkt.c | 26 ++++- - net/roce/roce_qmm/hikp_roce_qmm.c | 80 ++++++++++++++- - net/roce/roce_scc/hikp_roce_scc.c | 116 ++++++++++++++++++++- - net/roce/roce_timer/hikp_roce_timer.c | 58 ++++++++++- - net/roce/roce_trp/hikp_roce_trp.c | 140 +++++++++++++++++++++++++- - net/roce/roce_tsp/hikp_roce_tsp.c | 84 +++++++++++++++- - 8 files changed, 541 insertions(+), 14 deletions(-) - -diff --git a/net/roce/roce_gmv/hikp_roce_gmv.c b/net/roce/roce_gmv/hikp_roce_gmv.c -index 36ba665..bc01ccf 100644 ---- a/net/roce/roce_gmv/hikp_roce_gmv.c -+++ b/net/roce/roce_gmv/hikp_roce_gmv.c -@@ -58,14 +58,28 @@ static int hikp_roce_gmv_idxget(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - -+/* DON'T change the order of this array or add entries between! */ -+static const char *g_gmv_reg_name[] = { -+ "ROCEE_VF_GMV_RO0", -+ "ROCEE_VF_GMV_RO1", -+ "ROCEE_VF_GMV_RO2", -+ "ROCEE_VF_GMV_RO3", -+ "ROCEE_VF_GMV_RO4", -+ "ROCEE_VF_GMV_RO5", -+ "ROCEE_VF_GMV_RO6", -+}; -+ - static void hikp_roce_gmv_print(uint32_t reg_num, struct roce_gmv_rsp_data *gmv_rsp) - { -+ uint8_t arr_len = HIKP_ARRAY_SIZE(g_gmv_reg_name); - uint32_t i; - - printf("*******************GMV INFO****************\n"); -- printf("addr_offset : reg_data\n"); -+ printf("%-40s[addr_offset] : reg_data\n", "reg_name"); - for (i = 0; i < reg_num; i++) -- printf("0x%08X : 0x%08X\n", gmv_rsp->reg_offset[i], gmv_rsp->reg_data[i]); -+ printf("%-40s[0x%08X] : 0x%08X\n", -+ i < arr_len ? g_gmv_reg_name[i] : "", -+ gmv_rsp->reg_offset[i], gmv_rsp->reg_data[i]); - printf("*******************************************\n"); - } - -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.c b/net/roce/roce_mdb/hikp_roce_mdb.c -index 374f100..b2b2c41 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.c -+++ b/net/roce/roce_mdb/hikp_roce_mdb.c -@@ -48,14 +48,43 @@ static int hikp_roce_mdb_clear_set(struct major_cmd_ctrl *self, const char *argv - return 0; - } - -+/* DON'T change the order of this array or add entries between! */ -+static const char *g_mdb_reg_name[] = { -+ "ROCEE_DWQE_WQE_ISSUE_CNT", -+ "ROCEE_DWQE_WQE_EXEC_CNT", -+ "ROCEE_DWQE_WQE_DROP_CNT", -+ "ROCEE_DWQE_SQDB_ISSUE_CNT", -+ "ROCEE_DWQE_SQDB_EXEC_CNT", -+ "ROCEE_MBX_ISSUE_CNT", -+ "ROCEE_MBX_EXEC_CNT", -+ "ROCEE_DB_ISSUE_CNT", -+ "ROCEE_DB_EXEC_CNT", -+ "ROCEE_EQDB_ISSUE_CNT", -+ "MDB_ALM", -+ "ROCEE_MDB_EMPTY", -+ "ROCEE_MDB_FULL", -+ "MDB_STA_0", -+ "MDB_STA_1", -+ "MDB_STA_2", -+ "MDB_MEM_INIT_DONE", -+ "ROCEE_MDB_ECC_ERR", -+ "ROCEE_MDB_ECC_ERR_INFO", -+ "MDB_STA_3", -+ "MDB_STA_4", -+ "MDB_STA_5", -+}; -+ - static void hikp_roce_mdb_print(uint32_t reg_num, struct roce_mdb_rsp_data *mdb_rsp) - { -+ uint8_t arr_len = HIKP_ARRAY_SIZE(g_mdb_reg_name); - uint32_t i; - - printf("**************MDB INFO*************\n"); -- printf("addr_offset : reg_data\n"); -+ printf("%-40s[addr_offset] : reg_data\n", "reg_name"); - for (i = 0; i < reg_num; i++) -- printf("0x%08X : 0x%08X\n", mdb_rsp->reg_offset[i], mdb_rsp->reg_data[i]); -+ printf("%-40s[0x%08X] : 0x%08X\n", -+ i < arr_len ? g_mdb_reg_name[i] : "", -+ mdb_rsp->reg_offset[i], mdb_rsp->reg_data[i]); - printf("***********************************\n"); - } - -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.c b/net/roce/roce_pkt/hikp_roce_pkt.c -index e710e08..74294c6 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.c -+++ b/net/roce/roce_pkt/hikp_roce_pkt.c -@@ -62,14 +62,38 @@ static int hikp_roce_pkt_get_data(struct hikp_cmd_ret **cmd_ret, struct roce_pkt - return ret; - } - -+/* DON'T change the order of this array or add entries between! */ -+static const char *g_pkt_reg_name[] = { -+ "ROCEE_RC_PKT_RX_CNT", -+ "ROCEE_UD_PKT_RX_CNT", -+ "ROCEE_XRC_PKT_RX_CNT", -+ "ROCEE_PKT_RX_CNT", -+ "ROCEE_ERR_PKT_RX_CNT", -+ "ROCEE_CNP_PKT_RX_CNT", -+ "TRP_RX_ERR_FLAG", -+ "RX_BUFF_CNT", -+ "ROCEE_RC_PKT_TX_CNT", -+ "ROCEE_UD_PKT_TX_CNT", -+ "ROCEE_XRC_PKT_TX_CNT", -+ "ROCEE_PKT_TX_CNT", -+ "ROCEE_ERR_PKT_TX_CNT", -+ "ROCEE_CNP_PKT_TX_CNT", -+ "TRP_GET_MPT_ERR_PKT_CNT", -+ "TRP_GET_IRRL_ERR_PKT_CNT", -+}; -+ - static void hikp_roce_pkt_print(uint32_t total_block_num, - const uint32_t *offset, const uint32_t *data) - { -+ uint8_t arr_len = HIKP_ARRAY_SIZE(g_pkt_reg_name); - uint32_t i; - - printf("**************PKT INFO*************\n"); -+ printf("%-40s[addr_offset] : reg_data\n", "reg_name"); - for (i = 0; i < total_block_num; i++) -- printf("[0x%08X] : 0x%08X\n", offset[i], data[i]); -+ printf("%-40s[0x%08X] : 0x%08X\n", -+ i < arr_len ? g_pkt_reg_name[i] : "", -+ offset[i], data[i]); - printf("***********************************\n"); - } - -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.c b/net/roce/roce_qmm/hikp_roce_qmm.c -index e440b82..fa4e18a 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.c -+++ b/net/roce/roce_qmm/hikp_roce_qmm.c -@@ -58,14 +58,90 @@ static int hikp_roce_qmm_bank_get(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - -+/* DON'T change the order of these arrays or add entries between! */ -+static const char *g_qmm_top_reg_name[] = { -+ "ROCEE_QMM_SRQC_ALM", -+ "ROCEE_QMM_MPT_ALM", -+ "ROCEE_QMM_ECC_ERR", -+ "QMM_AXI_RESP_ERR", -+ "ROCEE_LPRC_RO", -+ "ROCEE_LPRC_RC", -+ "QMM_LPRC_EMPTY_RD", -+ "QPC_DMAE_EMPTY_RD", -+ "QMM_LPRC_FULL_WR", -+ "QPC_DMAE_FULL_WR", -+ "ROCEE_QMM_QPC_ALM", -+ "ROCEE_QMM_GMV_ALM", -+}; -+ -+static const char *g_qmm_cqc_reg_name[] = { -+ "ROCEE_CQC_SRH_REQ_RO_BK0", -+ "ROCEE_CQC_SRH_REQ_RO_BK1", -+ "ROCEE_CQC_ECC_ERR", -+ "ROCEE_CQC_RESP_ERR", -+ "CQC_RW_REQ_RO_BK0", -+ "CQC_RW_REQ_RO_BK1", -+ "ROCEE_QMM_CQC_ALM", -+}; -+ -+static const char *g_qmm_qpc_reg_name[] = { -+ "QMM_QPC_SRH_CNT_0", -+ "QMM_QPC_SRH_CNT_1", -+ "ROCEE_QPC_EMPTY_RD", -+ "ROCEE_QPC_FULL_WR", -+ "ROCEE_QPC_SRH_REQ_RO_0", -+ "ROCEE_QPC_SRH_REQ_RO_1", -+ "QMM_QPC_CLR_CNT0_0", -+ "QMM_QPC_CLR_CNT1_0", -+ "QMM_QPC_CLR_CNT2_0", -+ "QMM_QPC_CLR_CNT3_0", -+ "QMM_QPC_CLR_CNT0_1", -+ "QMM_QPC_CLR_CNT1_1", -+ "QMM_QPC_CLR_CNT2_1", -+ "QMM_QPC_CLR_CNT3_1", -+ "QPC_RW_REQ_RO_0", -+ "QPC_RW_REQ_RO_1", -+ "QPC_WQE_ECC_ERR", -+}; -+ -+static const struct reg_name_info { -+ enum roce_qmm_cmd_type sub_cmd; -+ const char **reg_name; -+ uint8_t arr_len; -+} g_qmm_reg_name_info_table[] = { -+ {QMM_SHOW_CQC, g_qmm_cqc_reg_name, HIKP_ARRAY_SIZE(g_qmm_cqc_reg_name)}, -+ {QMM_SHOW_QPC, g_qmm_qpc_reg_name, HIKP_ARRAY_SIZE(g_qmm_qpc_reg_name)}, -+ {QMM_SHOW_TOP, g_qmm_top_reg_name, HIKP_ARRAY_SIZE(g_qmm_top_reg_name)}, -+}; -+ - static void hikp_roce_qmm_print(struct roce_qmm_rsp_data *qmm_rsp) - { -+ const char **reg_name; -+ uint8_t arr_len; - int index = 0; - -+ for (index = 0; index < HIKP_ARRAY_SIZE(g_qmm_reg_name_info_table); index++) { -+ if (g_qmm_reg_name_info_table[index].sub_cmd != g_roce_qmm_param.sub_cmd) -+ continue; -+ arr_len = g_qmm_reg_name_info_table[index].arr_len; -+ reg_name = g_qmm_reg_name_info_table[index].reg_name; -+ break; -+ } -+ -+ if (index == HIKP_ARRAY_SIZE(g_qmm_reg_name_info_table)) { -+ printf("can't find reg name table for roce_qmm sub_cmd %u.\n", -+ g_roce_qmm_param.sub_cmd); -+ return; -+ } -+ - printf("**************QMM %s INFO*************\n", - g_roce_qmm_param.sub_name); -+ printf("%-40s[addr_offset] : reg_data\n", "reg_name"); -+ index = 0; - while (index < qmm_rsp->reg_num) { -- printf("0x%08X : 0x%08X\n", qmm_rsp->qmm_content[index][0], -+ printf("%-40s[0x%08X] : 0x%08X\n", -+ index < arr_len ? reg_name[index] : "", -+ qmm_rsp->qmm_content[index][0], - qmm_rsp->qmm_content[index][1]); - index++; - } -@@ -125,7 +201,7 @@ exec_error: - - static void hikp_roce_qmm_execute(struct major_cmd_ctrl *self) - { -- const struct cmd_type_info { -+ static const struct cmd_type_info { - enum roce_qmm_cmd_type sub_cmd; - enum roce_qmm_cmd_type sub_ext_cmd; - const char *sub_name; -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index fe08873..76c0ca6 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -208,14 +208,128 @@ static int hikp_roce_scc_get_next_data(struct roce_scc_head *res_head, - return 0; - } - -+/* DON'T change the order of these arrays or add entries between! */ -+static const char *g_scc_common_reg_name[] = { -+ "SCC_MODE_SEL", -+ "SCC_OUTSTANDING_CTRL", -+ "SCC_FW_BASE_ADDR", -+ "SCC_MEM_START_INIT", -+ "SCC_MEM_INIT_DONE", -+ "SCC_FW_REQ_CNT", -+ "SCC_FW_RSP_CNT", -+ "SCC_FW_CNT_CTRL", -+ "SCC_GLB_OUTSTANDING", -+ "SCC_AXI_OUTSTANDING", -+ "SCC_FW_REQRSP_CNT0", -+ "SCC_FW_REQRSP_CNT1", -+ "SCC_OUTSTANDING_ID", -+ "SCC_OUTSTANDING_STS", -+ "SCC_CACHEMISS_LOAD_CNT", -+ "SCC_CACHEMISS_STORE_CNT", -+ "FW_PROCESS_TIME", -+ "SCC_INT_EN", -+ "SCC_INT_SRC", -+ "SCC_ECC_1BIT_CNT", -+ "SCC_ECC_1BIT_INFO", -+ "SCC_ECC_MBIT_INFO", -+ "ECC_ERR_INJ_SEL", -+ "CTX_RDWR_ERR_INFO", -+ "SCC_FW_REQRSP_CNT2", -+ "SCC_LOAD_CAL_CFG_0", -+ "SCC_LOAD_CAL_CFG_1", -+ "SCC_LOAD_CAL_CFG_2", -+ "SCC_LOAD_CAL_CFG_3", -+ "SCC_LOAD_CAL_CFG_4", -+ "SCC_LOAD_CAL_CFG_5", -+ "SCC_LOAD_CAL_CFG_6", -+ "SCC_LOAD_CAL_CFG_7", -+ "SCC_MAX_PROCESS_TIME", -+ "SCC_TIMEOUT_SET", -+ "SCC_TIMEOUT_CNT", -+ "SCC_TIME_STA_EN", -+ "SCC_INPUT_REQ_CNT", -+ "SCC_OUTPUT_RSP_CNT", -+ "SCC_INOUT_CNT_CFG", -+}; -+ -+static const char *g_scc_dcqcn_reg_name[] = { -+ "SCC_TEMP_CFG0", -+ "SCC_TEMP_CFG1", -+ "SCC_TEMP_CFG2", -+ "SCC_TEMP_CFG3", -+ "ROCEE_CNP_PKT_RX_CNT", -+ "ROCEE_CNP_PKT_TX_CNT", -+ "ROCEE_ECN_DB_CNT0", -+ "ROCEE_ECN_DB_CNT1", -+ "ROCEE_ECN_DB_CNT2", -+ "ROCEE_ECN_DB_CNT3", -+}; -+ -+static const char *g_scc_dip_reg_name[] = { -+ "SCC_TEMP_CFG0", -+ "SCC_TEMP_CFG1", -+ "SCC_TEMP_CFG2", -+ "SCC_TEMP_CFG3", -+}; -+ -+static const char *g_scc_hc3_reg_name[] = { -+ "SCC_TEMP_CFG0", -+ "SCC_TEMP_CFG1", -+ "SCC_TEMP_CFG2", -+ "SCC_TEMP_CFG3", -+}; -+ -+static const char *g_scc_ldcp_reg_name[] = { -+ "SCC_TEMP_CFG0", -+ "SCC_TEMP_CFG1", -+ "SCC_TEMP_CFG2", -+ "SCC_TEMP_CFG3", -+}; -+ -+static const char *g_scc_cfg_reg_name[] = { -+ "ROCEE_TM_CFG", -+}; -+ -+static const struct reg_name_info { -+ enum roce_scc_type sub_cmd; -+ const char **reg_name; -+ uint8_t arr_len; -+} g_scc_reg_name_info_table[] = { -+ {COMMON, g_scc_common_reg_name, HIKP_ARRAY_SIZE(g_scc_common_reg_name)}, -+ {DCQCN, g_scc_dcqcn_reg_name, HIKP_ARRAY_SIZE(g_scc_dcqcn_reg_name)}, -+ {DIP, g_scc_dip_reg_name, HIKP_ARRAY_SIZE(g_scc_dip_reg_name)}, -+ {HC3, g_scc_hc3_reg_name, HIKP_ARRAY_SIZE(g_scc_hc3_reg_name)}, -+ {LDCP, g_scc_ldcp_reg_name, HIKP_ARRAY_SIZE(g_scc_ldcp_reg_name)}, -+ {CFG, g_scc_cfg_reg_name, HIKP_ARRAY_SIZE(g_scc_cfg_reg_name)}, -+}; -+ - static void hikp_roce_scc_print(uint8_t total_block_num, - const uint32_t *offset, const uint32_t *data) - { -+ const char **reg_name; -+ uint8_t arr_len; - uint32_t i; - -+ for (i = 0; i < HIKP_ARRAY_SIZE(g_scc_reg_name_info_table); i++) { -+ if (g_scc_reg_name_info_table[i].sub_cmd != g_roce_scc_param_t.sub_cmd) -+ continue; -+ arr_len = g_scc_reg_name_info_table[i].arr_len; -+ reg_name = g_scc_reg_name_info_table[i].reg_name; -+ break; -+ } -+ -+ if (i == HIKP_ARRAY_SIZE(g_scc_reg_name_info_table)) { -+ printf("can't find reg name table for roce_scc sub_cmd %u.\n", -+ g_roce_scc_param_t.sub_cmd); -+ return; -+ } -+ - printf("**************SCC INFO*************\n"); -+ printf("%-40s[addr_offset] : reg_data\n", "reg_name"); - for (i = 0; i < total_block_num; i++) -- printf("[0x%08X] : 0x%08X\n", offset[i], data[i]); -+ printf("%-40s[0x%08X] : 0x%08X\n", -+ i < arr_len ? reg_name[i] : "", -+ offset[i], data[i]); - printf("***********************************\n"); - } - -diff --git a/net/roce/roce_timer/hikp_roce_timer.c b/net/roce/roce_timer/hikp_roce_timer.c -index 05ad3e1..a36257e 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.c -+++ b/net/roce/roce_timer/hikp_roce_timer.c -@@ -44,12 +44,62 @@ static int hikp_roce_timer_clear_set(struct major_cmd_ctrl *self, const char *ar - return 0; - } - --static void hikp_roce_timer_print(struct roce_timer_rsp_data *timer_rsp) -+/* DON'T change the order of these arrays or add entries between! */ -+static const char *g_timer_qpc_reg_name[] = { -+ "QPC_AXI_ERR", -+ "QPC_SEARCH_CNT", -+ "QPC_DB_SEND_CNT", -+ "FIFO_FILL0", -+ "FIFO_FILL1", -+ "FIFO_FILL2", -+ "FIFO_OVER_FLOW", -+ "QPC_START_CNT", -+ "QPC_DB_SEND_NUM_CNT", -+ "ROCEE_TIMER_QPC_ECC_ERR", -+ "ROCEE_TIMER_QPC_ECC_ERR_INFO", -+ "START_TYPE_ERR_CNT", -+}; -+ -+static const char *g_timer_cqc_reg_name[] = { -+ "TIMER_MEM_INIT_DONE", -+ "CQC_AXI_ERR", -+ "CQC_SEARCH_CNT", -+ "CQC_DB_SEND_CNT", -+ "CQC_FIFO_FILL0", -+ "CQC_FIFO_FILL1", -+ "CQC_FIFO_FILL2", -+ "CQC_START_CNT", -+ "CQC_DB_SEND_NUM_CNT", -+ "FLR_DONE_STATE", -+ "ZERO_ADDR_ACC", -+ "ROCEE_TIMER_CQC_ECC_ERR", -+ "ROCEE_TIMER_CQC_ECC_ERR_INFO", -+ "TIMER_STA_0", -+ "CQC_LOSE_DB_CNT", -+ "TIMER_TDP_DONE_CNT", -+ "CQC_PAGE_OVER_CNT", -+}; -+ -+static void hikp_roce_timer_print(struct roce_timer_rsp_data *timer_rsp, -+ enum roce_timer_cmd_type cmd_type) - { -+ const char **reg_name; -+ uint8_t arr_len; - int index = 0; - -+ if (cmd_type == TIMER_SHOW_QPC) { -+ reg_name = g_timer_qpc_reg_name; -+ arr_len = HIKP_ARRAY_SIZE(g_timer_qpc_reg_name); -+ } else { -+ reg_name = g_timer_cqc_reg_name; -+ arr_len = HIKP_ARRAY_SIZE(g_timer_cqc_reg_name); -+ } -+ -+ printf("%-40s[addr_offset] : reg_data\n", "reg_name"); - while (index < timer_rsp->reg_num) { -- printf("0x%08X : 0x%08X\n", timer_rsp->timer_content[index][0], -+ printf("%-40s[0x%08X] : 0x%08X\n", -+ index < arr_len ? reg_name[index] : "", -+ timer_rsp->timer_content[index][0], - timer_rsp->timer_content[index][1]); - index++; - } -@@ -83,7 +133,7 @@ static int hikp_roce_timer_show_qpc(struct major_cmd_ctrl *self) - } - - printf("**************QPC TIMER INFO*************\n"); -- hikp_roce_timer_print(timer_rsp); -+ hikp_roce_timer_print(timer_rsp, TIMER_SHOW_QPC); - out: - free(cmd_ret); - cmd_ret = NULL; -@@ -117,7 +167,7 @@ static int hikp_roce_timer_show_cqc(struct major_cmd_ctrl *self) - } - - printf("**************CQC TIMER INFO*************\n"); -- hikp_roce_timer_print(timer_rsp); -+ hikp_roce_timer_print(timer_rsp, TIMER_SHOW_CQC); - out: - free(cmd_ret); - cmd_ret = NULL; -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index fad3317..61f0511 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -231,14 +231,152 @@ static int hikp_roce_trp_get_next_data(struct roce_trp_head *res_head, - return 0; - } - -+/* DON'T change the order of these arrays or add entries between! */ -+static const char *g_trp_common_reg_name[] = { -+ "GEN_AC_QP_FIFO_FULL", -+ "GEN_AC_QP_FIFO_EMPTY", -+ "GEN_AC_QP_INNER_STA_0", -+ "GEN_AC_QP_INNER_STA_1", -+ "GEN_AC_QP_ALM", -+ "GEN_AC_QP_TSP_CQE_CNT", -+ "TRP_GET_PBL_FULL", -+ "TRP_GET_PBL_EMPTY", -+ "TRP_GET_PBL_INNER_ALM", -+ "TRP_GET_PBL_INNER_STA", -+ "TRP_GET_MPT_FSM", -+ "TRP_GET_MPT_EMPTY", -+ "TRP_GET_MPT_INNER_ALM", -+ "TRP_GET_MPT_INNER_STA", -+ "TRP_GET_SGE_FSM", -+ "TRP_GET_SGE_EMPTY", -+ "TRP_GET_SGE_INNER_ALM", -+ "TRP_GET_SGE_INNER_STA", -+ "TRP_GET_BA_EMPTY", -+ "TRP_GET_BA_INNER_ALM", -+ "TRP_GET_BA_INNER_STA", -+ "TRP_DMAECMD_EMPTY_0", -+ "TRP_DMAECMD_EMPTY_1", -+ "TRP_DMAECMD_FULL", -+ "TRP_GET_IRRL_FSM", -+ "TRP_GET_IRRL_FULL", -+ "TRP_GET_IRRL_EMPTY", -+ "TRP_GET_IRRL_INNER_ALM", -+ "TRP_GET_IRRL_INNER_STA", -+ "TRP_GET_QPC_FSM", -+ "TRP_GET_QPC_INNER_ALM", -+ "TRP_GET_QPC_INNER_STA", -+ "ROCEE_TRP_ECC_ERR_INFO", -+ "ROCEE_TRP_ECC1B", -+ "ROCEE_TRP_ECC2B", -+ "ROCEE_TRP_FUN_RST_DFX", -+ "TRP_GET_MPT_ERR_FLG", -+ "TRP_GET_IRRL_ERR_FLG", -+ "TRP_GET_QPC_ERR_FLG", -+ "ROCEE_ECN_DB_CNT", -+ "GEN_AC_QP_TSP_AE_CNT", -+ "GEN_AC_QP_MDB_CQE_CNT", -+ "GEN_AC_QP_LPRC_CQE_CNT", -+ "TRP_CNP_CNT", -+ "TRP_SGE_ERR_DROP_LEN", -+ "TRP_SGE_AXI_CNT", -+}; -+ -+static const char *g_trp_trp_rx_reg_name[] = { -+ "TRP_RX_CHECK_EN", -+ "TRP_RX_WR_PAYL_AXI_ERR", -+ "ROCEE_TRP_RX_STA", -+ "RX_FIFO_FULL", -+ "RX_FIFO_EMPTY_0", -+ "RX_FIFO_EMPTY_1", -+ "HEAD_BUFF_ECC", -+ "HEAD_BUFF_ECC_ADDR", -+ "TRP_RX_FIFO_EMPTY_0", -+ "TRP_RX_FIFO_EMPTY_1", -+ "TRP_RX_FIFO_EMPTY_2", -+ "TRP_RX_FIFO_EMPTY_3", -+}; -+ -+static const char *g_trp_gen_ac_reg_name[] = { -+ "GEN_AC_CQ_FIFO_FULL", -+ "GEN_AC_CQ_FIFO_EMPTY", -+ "GEN_AC_CQ_INNER_STA", -+ "GEN_AC_CQ_ALM", -+ "GEN_AC_CQ_CQE_CNT_0", -+ "GEN_AC_CQ_CQE_CNT_1", -+ "GEN_AC_CQ_CQE_CNT_2", -+ "GEN_AC_CQ_CQE_CNT_3", -+ "ROCEE_GENAC_ECC_ERR_INFO", -+ "ROCEE_GENAC_ECC1B", -+ "ROCEE_GENAC_ECC2B", -+ "GEN_AC_DMAECMD_STA", -+ "GEN_AC_DMAECMD_ALM", -+ "SWQE_LINK_STA", -+ "SWQE_LINK_ALM", -+ "GEN_AC_CQ_MAIN_STA_0", -+ "GEN_AC_CQ_MAIN_ALM", -+ "GEN_AC_CQ_MAIN_STA_1", -+ "POE_DFX_0", -+ "POE_DFX_1", -+ "POE_DFX_2", -+}; -+ -+static const char *g_trp_payl_reg_name[] = { -+ "ROCEE_EXT_ATOMIC_DFX_0", -+ "ROCEE_EXT_ATOMIC_DFX_1", -+ "ROCEE_EXT_ATOMIC_DFX_2", -+ "ROCEE_EXT_ATOMIC_DFX_3", -+ "ATOMIC_DFX_0", -+ "ATOMIC_DFX_1", -+ "ATOMIC_DFX_2", -+ "WR_PAYL_DFX_1", -+ "PAYL_BUFF_DFX_0", -+ "PAYL_BUFF_DFX_1", -+ "PAYL_BUFF_DFX_2", -+ "PAYL_BUFF_DFX_3", -+ "PAYL_BUFF_DFX_4", -+ "WR_PAYL_DFX_RC", -+ "WR_PAYL_DFX_RO", -+ "WR_PAYL_1_OST_NUM", -+}; -+ -+static const struct reg_name_info { -+ enum roce_trp_type sub_cmd; -+ const char **reg_name; -+ uint8_t arr_len; -+} g_trp_reg_name_info_table[] = { -+ {COMMON, g_trp_common_reg_name, HIKP_ARRAY_SIZE(g_trp_common_reg_name)}, -+ {TRP_RX, g_trp_trp_rx_reg_name, HIKP_ARRAY_SIZE(g_trp_trp_rx_reg_name)}, -+ {GEN_AC, g_trp_gen_ac_reg_name, HIKP_ARRAY_SIZE(g_trp_gen_ac_reg_name)}, -+ {PAYL, g_trp_payl_reg_name, HIKP_ARRAY_SIZE(g_trp_payl_reg_name)}, -+}; -+ - static void hikp_roce_trp_print(uint8_t total_block_num, - const uint32_t *offset, const uint32_t *data) - { -+ const char **reg_name; -+ uint8_t arr_len; - uint32_t i; - -+ for (i = 0; i < HIKP_ARRAY_SIZE(g_trp_reg_name_info_table); i++) { -+ if (g_trp_reg_name_info_table[i].sub_cmd != g_roce_trp_param_t.sub_cmd) -+ continue; -+ arr_len = g_trp_reg_name_info_table[i].arr_len; -+ reg_name = g_trp_reg_name_info_table[i].reg_name; -+ break; -+ } -+ -+ if (i == HIKP_ARRAY_SIZE(g_trp_reg_name_info_table)) { -+ printf("can't find reg name table for roce_trp sub_cmd %u.\n", -+ g_roce_trp_param_t.sub_cmd); -+ return; -+ } -+ - printf("**************TRP INFO*************\n"); -+ printf("%-40s[addr_offset] : reg_data\n", "reg_name"); - for (i = 0; i < total_block_num; i++) -- printf("[0x%08X] : 0x%08X\n", offset[i], data[i]); -+ printf("%-40s[0x%08X] : 0x%08X\n", -+ i < arr_len ? reg_name[i] : "", -+ offset[i], data[i]); - printf("***********************************\n"); - } - -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.c b/net/roce/roce_tsp/hikp_roce_tsp.c -index 5bb2649..b16f0a4 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.c -+++ b/net/roce/roce_tsp/hikp_roce_tsp.c -@@ -137,14 +137,96 @@ static int hikp_roce_tsp_get_data(struct hikp_cmd_ret **cmd_ret, - return ret; - } - -+/* DON'T change the order of these arrays or add entries between! */ -+static const char *g_tsp_common_reg_name[] = { -+ "ROCEE_TPP_ECC_ERR", -+ "ROCEE_TWP_STA", -+ "ROCEE_TWP_ALM", -+ "ROCEE_TWP_STA1", -+ "TSP_INDRECT_RW_STA", -+ "TSP_INDRECT_RD_CTRL", -+ "TSP_INDRECT_RD_DATA", -+ "ROCEE_TSP_OVF", -+}; -+ -+static const char *g_tsp_tdp_reg_name[] = { -+ "TDP_M_MEM_INIT_DONE", -+ "TDP_M_ECC1B", -+ "TDP_M_ECC2B", -+ "TDP_M_ECC_ERR_INFO", -+ "TDP_M_ALM", -+ "ROCEE_TDP_CNT_CFG0", -+ "ROCEE_TDP_CNT_CFG1", -+ "ROCEE_TDP_IN_CNT_ENB", -+ "ROCEE_TDP_TWP_CNT0_CFG", -+ "ROCEE_TDP_TWP_CNT1_CFG", -+ "ROCEE_TDP_TRP_CNT", -+ "ROCEE_TDP_MDB_CNT", -+ "ROCEE_TDP_LP_CNT", -+ "ROCEE_TDP_QMM_CNT", -+ "ROCEE_TDP_TWP_CNT0", -+ "ROCEE_TDP_TWP_CNT1", -+ "TDP_V_ECC1B", -+ "TDP_V_ECC2B", -+ "TDP_V_ECC_ERR_INFO", -+ "TDP_V_ALM", -+ "TDP_V_STA", -+ "ROCEE_TSP_OOO_ERR", -+ "TDP_M_STA", -+ "TDP_M_STA1", -+}; -+ -+static const char *g_tsp_tgp_tmp_reg_name[] = { -+ "ROCEE_TGP_ALM0", -+ "ROCEE_TGP_ALM1", -+ "ROCEE_TGP_STA0", -+ "ROCEE_TGP_STA1", -+ "TGP_INDRECT_RD_CTRL", -+ "TGP_INDRECT_RD_STA", -+ "TGP_INDRECT_RD_DATA", -+ "ROCEE_TMP_ALM0", -+ "ROCEE_TMP_ALM1", -+ "ROCEE_TMP_STA0", -+ "ROCEE_TMP_STA1", -+}; -+ -+static const struct reg_name_info { -+ enum roce_tsp_sub_cmd_code sub_cmd; -+ const char **reg_name; -+ uint8_t arr_len; -+} g_tsp_reg_name_info_table[] = { -+ {COMMON, g_tsp_common_reg_name, HIKP_ARRAY_SIZE(g_tsp_common_reg_name)}, -+ {TDP, g_tsp_tdp_reg_name, HIKP_ARRAY_SIZE(g_tsp_tdp_reg_name)}, -+ {TGP_TMP, g_tsp_tgp_tmp_reg_name, HIKP_ARRAY_SIZE(g_tsp_tgp_tmp_reg_name)}, -+}; -+ - static void hikp_roce_tsp_print(uint32_t total_block_num, - const uint32_t *offset, const uint32_t *data) - { -+ const char **reg_name; -+ uint8_t arr_len; - uint32_t i; - -+ for (i = 0; i < HIKP_ARRAY_SIZE(g_tsp_reg_name_info_table); i++) { -+ if (g_tsp_reg_name_info_table[i].sub_cmd != g_roce_tsp_param_t.sub_cmd_code) -+ continue; -+ arr_len = g_tsp_reg_name_info_table[i].arr_len; -+ reg_name = g_tsp_reg_name_info_table[i].reg_name; -+ break; -+ } -+ -+ if (i == HIKP_ARRAY_SIZE(g_tsp_reg_name_info_table)) { -+ printf("can't find reg name table for roce_tsp sub_cmd %u.\n", -+ g_roce_tsp_param_t.sub_cmd_code); -+ return; -+ } -+ - printf("**************TSP INFO*************\n"); -+ printf("%-40s[addr_offset] : reg_data\n", "reg_name"); - for (i = 0; i < total_block_num; i++) -- printf("[0x%08X] : 0x%08X\n", offset[i], data[i]); -+ printf("%-40s[0x%08X] : 0x%08X\n", -+ i < arr_len ? reg_name[i] : "", -+ offset[i], data[i]); - printf("***********************************\n"); - } - --- -2.45.0.windows.1 - diff --git a/0064-hikptool-roce-Support-exposing-names-of-extend-regis.patch b/0064-hikptool-roce-Support-exposing-names-of-extend-regis.patch deleted file mode 100644 index 081b142..0000000 --- a/0064-hikptool-roce-Support-exposing-names-of-extend-regis.patch +++ /dev/null @@ -1,354 +0,0 @@ -From 217cdce3822eb68343807b80a3bc3c9b1530f9bb Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Sat, 22 Jun 2024 16:23:52 +0800 -Subject: [PATCH 02/27] hikptool/roce: Support exposing names of extend - registers - -Add support for exposing names of extend registers through the common -frame. To use this feature, the new-added input param reg_name should -be set inside the get_data() callback of each sub modules. For now only -mdb and qmm are supported. - -Signed-off-by: Junxian Huang ---- - net/roce/roce_bond/hikp_roce_bond.c | 3 +- - net/roce/roce_caep/hikp_roce_caep.c | 5 +- - .../roce_ext_common/hikp_roce_ext_common.c | 43 ++++++++------ - .../roce_ext_common/hikp_roce_ext_common.h | 14 ++++- - .../roce_global_cfg/hikp_roce_global_cfg.c | 3 +- - net/roce/roce_mdb/hikp_roce_mdb.c | 20 ++++++- - net/roce/roce_qmm/hikp_roce_qmm.c | 57 ++++++++++++++++++- - net/roce/roce_rst/hikp_roce_rst.c | 3 +- - 8 files changed, 121 insertions(+), 27 deletions(-) - -diff --git a/net/roce/roce_bond/hikp_roce_bond.c b/net/roce/roce_bond/hikp_roce_bond.c -index 89f8bab..8434a0b 100644 ---- a/net/roce/roce_bond/hikp_roce_bond.c -+++ b/net/roce/roce_bond/hikp_roce_bond.c -@@ -37,7 +37,8 @@ static int hikp_roce_bond_target(struct major_cmd_ctrl *self, const char *argv) - } - - static int hikp_roce_bond_get_data(struct hikp_cmd_ret **cmd_ret, -- uint32_t block_id) -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name) - { - struct hikp_cmd_header req_header = { 0 }; - struct roce_bond_req_param req_data; -diff --git a/net/roce/roce_caep/hikp_roce_caep.c b/net/roce/roce_caep/hikp_roce_caep.c -index 126551a..0453bc4 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.c -+++ b/net/roce/roce_caep/hikp_roce_caep.c -@@ -40,7 +40,8 @@ static int hikp_roce_caep_target(struct major_cmd_ctrl *self, const char *argv) - } - - static int hikp_roce_caep_get_data(struct hikp_cmd_ret **cmd_ret, -- uint32_t block_id) -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name) - { - struct roce_caep_req_param_ext req_data_ext; - struct hikp_cmd_header req_header = { 0 }; -@@ -80,7 +81,7 @@ static void hikp_roce_caep_execute_origin(struct major_cmd_ctrl *self) - struct roce_caep_res_param *roce_caep_res; - struct hikp_cmd_ret *cmd_ret; - -- self->err_no = hikp_roce_caep_get_data(&cmd_ret, 0); -+ self->err_no = hikp_roce_caep_get_data(&cmd_ret, 0, NULL); - if (self->err_no) { - printf("hikptool roce_caep get data failed.\n"); - goto exec_error; -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index 5bc3ce6..c22303f 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -89,14 +89,17 @@ static int get_cmd_reg_array_length(enum roce_cmd_type cmd_type) - - static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - uint32_t block_id, -- struct roce_ext_head *res_head, -- struct reg_data *reg, -+ struct roce_ext_res_output *output, - int (*get_data)(struct hikp_cmd_ret **cmd_ret, -- uint32_t block_id)) -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name)) - { - int reg_array_length = get_cmd_reg_array_length(cmd_type); -+ struct roce_ext_reg_name *reg_name = &output->reg_name; -+ struct roce_ext_head *res_head = &output->res_head; - const char *cmd_name = get_cmd_name(cmd_type); - struct roce_ext_res_param *roce_ext_res; -+ struct reg_data *reg = &output->reg; - struct hikp_cmd_ret *cmd_ret; - size_t max_size; - size_t cur_size; -@@ -108,7 +111,7 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - if (reg_array_length < 0) - return reg_array_length; - -- ret = get_data(&cmd_ret, block_id); -+ ret = get_data(&cmd_ret, block_id, reg_name); - if (ret) { - printf("hikptool roce_%s get data failed!\n", cmd_name); - goto get_data_error; -@@ -149,37 +152,45 @@ get_data_error: - return ret; - } - --static void hikp_roce_ext_print(const char *cmd_name, uint32_t total_block_num, -- const uint32_t *offset, const uint32_t *data) -+static void hikp_roce_ext_print(enum roce_cmd_type cmd_type, -+ struct roce_ext_res_output *output) - { -+ uint32_t total_block_num = output->res_head.total_block_num; -+ const char **reg_name = output->reg_name.reg_name; -+ const char *cmd_name = get_cmd_name(cmd_type); -+ uint8_t arr_len = output->reg_name.arr_len; -+ uint32_t *offset = output->reg.offset; -+ uint32_t *data = output->reg.data; - int i; - - printf("**************%s INFO*************\n", cmd_name); -+ printf("%-40s[addr_offset] : reg_data\n", "reg_name"); - for (i = 0; i < total_block_num; i++) -- printf("[0x%08X] : 0x%08X\n", offset[i], data[i]); -+ printf("%-40s[0x%08X] : 0x%08X\n", -+ i < arr_len ? reg_name[i] : "", -+ offset[i], data[i]); - printf("************************************\n"); - } - - void hikp_roce_ext_execute(struct major_cmd_ctrl *self, - enum roce_cmd_type cmd_type, - int (*get_data)(struct hikp_cmd_ret **cmd_ret, -- uint32_t block_id)) -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name)) - { -+ struct roce_ext_res_output output = { 0 }; - uint32_t queried_block_id = 0; -- struct roce_ext_head res_head; -- struct reg_data reg = { 0 }; - - do { - self->err_no = hikp_roce_ext_get_res(cmd_type, queried_block_id, -- &res_head, ®, get_data); -+ &output, get_data); - if (self->err_no) - return; - -- queried_block_id += res_head.cur_block_num; -- } while (queried_block_id < res_head.total_block_num); -+ queried_block_id += output.res_head.cur_block_num; -+ } while (queried_block_id < output.res_head.total_block_num); - -- hikp_roce_ext_print(get_cmd_name(cmd_type), res_head.total_block_num, -- reg.offset, reg.data); -+ hikp_roce_ext_print(cmd_type, &output); - -- hikp_roce_ext_reg_data_free(®); -+ hikp_roce_ext_reg_data_free(&output.reg); - } -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.h b/net/roce/roce_ext_common/hikp_roce_ext_common.h -index a600449..4930bed 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.h -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.h -@@ -47,9 +47,21 @@ struct reg_data { - uint32_t *data; - }; - -+struct roce_ext_reg_name { -+ const char **reg_name; -+ uint8_t arr_len; -+}; -+ -+struct roce_ext_res_output { -+ struct roce_ext_head res_head; -+ struct reg_data reg; -+ struct roce_ext_reg_name reg_name; -+}; -+ - void hikp_roce_ext_execute(struct major_cmd_ctrl *self, - enum roce_cmd_type cmd_type, - int (*get_data)(struct hikp_cmd_ret **cmd_ret, -- uint32_t block_id)); -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name)); - - #endif /* __HIKP_ROCE_EXT_COMMON_H__ */ -diff --git a/net/roce/roce_global_cfg/hikp_roce_global_cfg.c b/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -index 49a4a2c..18df065 100644 ---- a/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -+++ b/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -@@ -40,7 +40,8 @@ static int hikp_roce_global_cfg_target(struct major_cmd_ctrl *self, - } - - static int hikp_roce_global_cfg_get_data(struct hikp_cmd_ret **cmd_ret, -- uint32_t block_id) -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name) - { - struct hikp_cmd_header req_header = { 0 }; - struct roce_global_cfg_req_param req_data; -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.c b/net/roce/roce_mdb/hikp_roce_mdb.c -index b2b2c41..e811bec 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.c -+++ b/net/roce/roce_mdb/hikp_roce_mdb.c -@@ -74,6 +74,16 @@ static const char *g_mdb_reg_name[] = { - "MDB_STA_5", - }; - -+static const char *g_mdb_ext_reg_name[] = { -+ "ROCEE_EQDB_EXEC_CNT", -+ "MDB_STA_6", -+ "MDB_DFX_CNT_0", -+ "MDB_DFX_CNT_1", -+ "MDB_DFX_CNT_2", -+ "MDB_DFX_CNT_3", -+ "MDB_DFX_CNT_4", -+}; -+ - static void hikp_roce_mdb_print(uint32_t reg_num, struct roce_mdb_rsp_data *mdb_rsp) - { - uint8_t arr_len = HIKP_ARRAY_SIZE(g_mdb_reg_name); -@@ -89,13 +99,19 @@ static void hikp_roce_mdb_print(uint32_t reg_num, struct roce_mdb_rsp_data *mdb_ - } - - static int hikp_roce_mdb_get_data(struct hikp_cmd_ret **cmd_ret, -- uint32_t block_id) -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name) - { - struct roce_mdb_req_param_ext req_data_ext; - struct hikp_cmd_header req_header = { 0 }; - uint32_t req_size; - int ret; - -+ if (reg_name) { -+ reg_name->reg_name = g_mdb_ext_reg_name; -+ reg_name->arr_len = HIKP_ARRAY_SIZE(g_mdb_ext_reg_name); -+ } -+ - req_data_ext.origin_param.bdf = g_roce_mdb_param.target.bdf; - req_data_ext.block_id = block_id; - -@@ -119,7 +135,7 @@ static void hikp_roce_mdb_execute_origin(struct major_cmd_ctrl *self) - struct hikp_cmd_ret *cmd_ret = NULL; - uint32_t reg_num; - -- self->err_no = hikp_roce_mdb_get_data(&cmd_ret, 0); -+ self->err_no = hikp_roce_mdb_get_data(&cmd_ret, 0, NULL); - if (self->err_no) { - printf("hikptool roce_mdb get data failed\n"); - goto exec_error; -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.c b/net/roce/roce_qmm/hikp_roce_qmm.c -index fa4e18a..9189f88 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.c -+++ b/net/roce/roce_qmm/hikp_roce_qmm.c -@@ -104,6 +104,40 @@ static const char *g_qmm_qpc_reg_name[] = { - "QPC_WQE_ECC_ERR", - }; - -+static const char *g_qmm_top_ext_reg_name[] = { -+ "ROCEE_QMM_SRQC_CACHE_RO", -+ "ROCEE_QMM_SRQC_DMAE_RO", -+ "ROCEE_QMM_SRQC_SRH_DFX", -+ "ROCEE_QMM_SRQC_SRH_REQ_RO", -+ "ROCEE_QMM_SRQC_RW_REQ_RO", -+ "ROCEE_QMM_MPT_CACHE_RO", -+ "ROCEE_QMM_MPT_DMAE_RO", -+ "ROCEE_QMM_MPT_SRH_DFX", -+ "ROCEE_QMM_MPT_SRH_REQ_RO", -+ "QPC_DMAE_INTF_RO", -+}; -+ -+static const char *g_qmm_cqc_ext_reg_name[] = { -+ "ROCEE_CQC_SRH_DFX_BK0", -+ "ROCEE_CQC_SRH_DFX_BK1", -+ "ROCEE_CQC_EMPTY_RD", -+ "ROCEE_CQC_FULL_WR", -+ "ROCEE_CQC_CACHE_RO_BK0", -+ "ROCEE_CQC_CACHE_RO_BK1", -+ "ROCEE_CQC_DMAE_RO", -+}; -+ -+static const char *g_qmm_qpc_ext_reg_name[] = { -+ "ROCEE_QPC_SRH_DFX_0", -+ "ROCEE_QPC_SRH_DFX_1", -+ "ROCEE_QPC_SRH_REQ_RO_0", -+ "ROCEE_QPC_SRH_REQ_RO_1", -+ "ROCEE_QMM_QPC_CACHE_RO_0", -+ "ROCEE_QMM_QPC_CACHE_RO_0", -+ "QMM_WQE_CACHE_RO", -+ "IRRL_CACHE_RO", -+}; -+ - static const struct reg_name_info { - enum roce_qmm_cmd_type sub_cmd; - const char **reg_name; -@@ -112,6 +146,9 @@ static const struct reg_name_info { - {QMM_SHOW_CQC, g_qmm_cqc_reg_name, HIKP_ARRAY_SIZE(g_qmm_cqc_reg_name)}, - {QMM_SHOW_QPC, g_qmm_qpc_reg_name, HIKP_ARRAY_SIZE(g_qmm_qpc_reg_name)}, - {QMM_SHOW_TOP, g_qmm_top_reg_name, HIKP_ARRAY_SIZE(g_qmm_top_reg_name)}, -+ {QMM_SHOW_CQC_EXT, g_qmm_cqc_ext_reg_name, HIKP_ARRAY_SIZE(g_qmm_cqc_ext_reg_name)}, -+ {QMM_SHOW_QPC_EXT, g_qmm_qpc_ext_reg_name, HIKP_ARRAY_SIZE(g_qmm_qpc_ext_reg_name)}, -+ {QMM_SHOW_TOP_EXT, g_qmm_top_ext_reg_name, HIKP_ARRAY_SIZE(g_qmm_top_ext_reg_name)}, - }; - - static void hikp_roce_qmm_print(struct roce_qmm_rsp_data *qmm_rsp) -@@ -149,12 +186,26 @@ static void hikp_roce_qmm_print(struct roce_qmm_rsp_data *qmm_rsp) - } - - static int hikp_roce_qmm_get_data(struct hikp_cmd_ret **cmd_ret, -- uint32_t block_id) -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name) - { - struct roce_qmm_req_para_ext req_data_ext; - struct hikp_cmd_header req_header = { 0 }; - uint32_t req_size; -- int ret; -+ int ret, i; -+ -+ if (reg_name) { -+ for (i = 0; i < HIKP_ARRAY_SIZE(g_qmm_reg_name_info_table); i++) { -+ if (g_qmm_reg_name_info_table[i].sub_cmd != g_roce_qmm_param.sub_cmd) -+ continue; -+ reg_name->arr_len = g_qmm_reg_name_info_table[i].arr_len; -+ reg_name->reg_name = g_qmm_reg_name_info_table[i].reg_name; -+ break; -+ } -+ -+ if (i == HIKP_ARRAY_SIZE(g_qmm_reg_name_info_table)) -+ return -EINVAL; -+ } - - req_data_ext.origin_param.bdf = g_roce_qmm_param.target.bdf; - req_data_ext.origin_param.bank_id = g_roce_qmm_param.bank_id; -@@ -179,7 +230,7 @@ static void hikp_roce_qmm_execute_origin(struct major_cmd_ctrl *self) - struct roce_qmm_rsp_data *roce_qmm_res; - struct hikp_cmd_ret *cmd_ret; - -- self->err_no = hikp_roce_qmm_get_data(&cmd_ret, 0); -+ self->err_no = hikp_roce_qmm_get_data(&cmd_ret, 0, NULL); - if (self->err_no) { - printf("hikptool roce_qmm get data failed.\n"); - goto exec_error; -diff --git a/net/roce/roce_rst/hikp_roce_rst.c b/net/roce/roce_rst/hikp_roce_rst.c -index ad4dd0c..570e7f4 100644 ---- a/net/roce/roce_rst/hikp_roce_rst.c -+++ b/net/roce/roce_rst/hikp_roce_rst.c -@@ -37,7 +37,8 @@ static int hikp_roce_rst_target(struct major_cmd_ctrl *self, const char *argv) - } - - static int hikp_roce_rst_get_data(struct hikp_cmd_ret **cmd_ret, -- uint32_t block_id) -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name) - { - struct hikp_cmd_header req_header = { 0 }; - struct roce_rst_req_param req_data; --- -2.45.0.windows.1 - diff --git a/0065-hikptool-roce-Fix-the-validation-check-of-cur_block_.patch b/0065-hikptool-roce-Fix-the-validation-check-of-cur_block_.patch deleted file mode 100644 index 50861bd..0000000 --- a/0065-hikptool-roce-Fix-the-validation-check-of-cur_block_.patch +++ /dev/null @@ -1,70 +0,0 @@ -From a5846b63d1f987242bd33a563c15d91dbdcd8273 Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Mon, 5 Aug 2024 19:39:12 +0800 -Subject: [PATCH 03/27] hikptool/roce: Fix the validation check of - cur_block_num - -hikp_roce_ext_get_res() will be called multiple times within a loop, -and each time the remaining space of register array will become less. -So the cur_block_num from FW should be check against remaining block -number, but not the total one. - -Fixes: 8b3b68347165 ("hikptool/roce: Add a common frame for hikptool roce register query") -Signed-off-by: Junxian Huang ---- - net/roce/roce_ext_common/hikp_roce_ext_common.c | 15 ++++++++------- - 1 file changed, 8 insertions(+), 7 deletions(-) - -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index c22303f..e90720c 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -101,7 +101,7 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - struct roce_ext_res_param *roce_ext_res; - struct reg_data *reg = &output->reg; - struct hikp_cmd_ret *cmd_ret; -- size_t max_size; -+ uint32_t remain_block; - size_t cur_size; - int ret; - -@@ -119,29 +119,30 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - - roce_ext_res = (struct roce_ext_res_param *)cmd_ret->rsp_data; - *res_head = roce_ext_res->head; -- max_size = res_head->total_block_num * sizeof(uint32_t); - - if (block_id == 0) { - reg->offset = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - reg->data = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - if ((reg->offset == NULL) || (reg->data == NULL)) { - printf("hikptool roce_%s alloc log memmory 0x%zx failed!\n", -- cmd_name, max_size); -+ cmd_name, res_head->total_block_num * sizeof(uint32_t)); - ret = -ENOMEM; - hikp_roce_ext_reg_data_free(reg); - goto get_data_error; - } - } - -- cur_size = res_head->cur_block_num * sizeof(uint32_t); -- if (!cur_size || cur_size > max_size) { -- printf("hikptool roce_%s log data copy size error, data size: 0x%zx, max size: 0x%zx\n", -- cmd_name, cur_size, max_size); -+ remain_block = res_head->total_block_num - block_id; -+ if (!res_head->cur_block_num || res_head->cur_block_num > remain_block) { -+ printf("hikptool roce_%s block size error, cur: %u, total: %u, remain: %u.\n", -+ cmd_name, res_head->cur_block_num, -+ res_head->total_block_num, remain_block); - ret = -EINVAL; - hikp_roce_ext_reg_data_free(reg); - goto get_data_error; - } - -+ cur_size = res_head->cur_block_num * sizeof(uint32_t); - memcpy(reg->offset + block_id, - (uint32_t *)&roce_ext_res->reg_data, cur_size); - memcpy(reg->data + block_id, --- -2.45.0.windows.1 - diff --git a/0066-hikptool-roce-Fix-redundant-update-of-total_block_nu.patch b/0066-hikptool-roce-Fix-redundant-update-of-total_block_nu.patch deleted file mode 100644 index 23137e9..0000000 --- a/0066-hikptool-roce-Fix-redundant-update-of-total_block_nu.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 53a9e2244b16196681e96a1cbaf9e23eef22f56d Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Mon, 5 Aug 2024 19:47:31 +0800 -Subject: [PATCH 04/27] hikptool/roce: Fix redundant update of total_block_num - -total_block_num needs to be updated only in the first loop of query, -and should stay constant from then on. Otherwise there may be -out-of-bound accessing problems if subsequent update value from FW -is larger than the first one, with which the memory of the register -array is allocated. - -Fixes: 8b3b68347165 ("hikptool/roce: Add a common frame for hikptool roce register query") -Signed-off-by: Junxian Huang ---- - net/roce/roce_ext_common/hikp_roce_ext_common.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index e90720c..049b64a 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -118,9 +118,10 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - } - - roce_ext_res = (struct roce_ext_res_param *)cmd_ret->rsp_data; -- *res_head = roce_ext_res->head; -+ res_head->cur_block_num = roce_ext_res->head.cur_block_num; - - if (block_id == 0) { -+ res_head->total_block_num = roce_ext_res->head.total_block_num; - reg->offset = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - reg->data = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - if ((reg->offset == NULL) || (reg->data == NULL)) { --- -2.45.0.windows.1 - diff --git a/0067-hikptool-roce-Add-check-for-total_block_num-from-FW.patch b/0067-hikptool-roce-Add-check-for-total_block_num-from-FW.patch deleted file mode 100644 index b46a7cc..0000000 --- a/0067-hikptool-roce-Add-check-for-total_block_num-from-FW.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 31b9eb2f181ff9275ccbba787a8c1f991a70f69d Mon Sep 17 00:00:00 2001 -From: Junxian Huang -Date: Mon, 5 Aug 2024 19:59:19 +0800 -Subject: [PATCH 05/27] hikptool/roce: Add check for total_block_num from FW - -total_block_num is used to allocate memory for register array. -Check whether it is 0 to prevent calloc() error. - -Fixes: 8b3b68347165 ("hikptool/roce: Add a common frame for hikptool roce register query") -Signed-off-by: Junxian Huang ---- - net/roce/roce_ext_common/hikp_roce_ext_common.c | 6 ++++++ - net/roce/roce_scc/hikp_roce_scc.c | 6 ++++++ - net/roce/roce_trp/hikp_roce_trp.c | 6 ++++++ - 3 files changed, 18 insertions(+) - -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index 049b64a..bc3b883 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -122,6 +122,12 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - - if (block_id == 0) { - res_head->total_block_num = roce_ext_res->head.total_block_num; -+ if (!res_head->total_block_num) { -+ printf("hikptool roce_%s total_block_num error!\n", -+ cmd_name); -+ ret = -EINVAL; -+ goto get_data_error; -+ } - reg->offset = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - reg->data = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - if ((reg->offset == NULL) || (reg->data == NULL)) { -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index 76c0ca6..0ecb8cf 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -146,6 +146,12 @@ static int hikp_roce_scc_get_total_data_num(struct roce_scc_head *res_head, - } - - roce_scc_res = (struct roce_scc_res_param *)cmd_ret->rsp_data; -+ if (!roce_scc_res->head.total_block_num) { -+ printf("hikptool roce_scc total_block_num error!\n"); -+ ret = -EINVAL; -+ goto get_data_error; -+ } -+ - max_size = roce_scc_res->head.total_block_num * sizeof(uint32_t); - *offset = (uint32_t *)calloc(1, max_size); - *data = (uint32_t *)calloc(1, max_size); -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index 61f0511..486bbe3 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -166,6 +166,12 @@ static int hikp_roce_trp_get_total_data_num(struct roce_trp_head *res_head, - } - - roce_trp_res = (struct roce_trp_res_param *)cmd_ret->rsp_data; -+ if (!roce_trp_res->head.total_block_num) { -+ printf("hikptool roce_trp total_block_num error!\n"); -+ ret = -EINVAL; -+ goto get_data_error; -+ } -+ - max_size = roce_trp_res->head.total_block_num * sizeof(uint32_t); - *offset = (uint32_t *)calloc(1, max_size); - *data = (uint32_t *)calloc(1, max_size); --- -2.45.0.windows.1 - diff --git a/0068-hikptool-Resolve-the-review-problems-found-in-the-R-.patch b/0068-hikptool-Resolve-the-review-problems-found-in-the-R-.patch deleted file mode 100644 index 9e663f7..0000000 --- a/0068-hikptool-Resolve-the-review-problems-found-in-the-R-.patch +++ /dev/null @@ -1,1376 +0,0 @@ -From 023d3890ce1ba9bd9b4ce5f2f1f2a60a8219e015 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 12 Nov 2024 17:58:25 +0800 -Subject: [PATCH 06/27] hikptool: Resolve the review problems found in the R&D - self-check. - -Code review comments are rectified. - -Signed-off-by: veega2022 ---- - cxl/func_lib/cxl_func/cxl_feature.c | 12 ++- - cxl/func_lib/cxl_func/cxl_feature.h | 1 + - hikp_init_main.c | 3 +- - libhikptdev/src/rciep/hikpt_rciep.c | 12 ++- - libhikptdev/src/rciep/hikpt_rciep.h | 1 + - net/nic/nic_mac/hikp_nic_xsfp.c | 8 ++ - net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c | 2 +- - net/nic/nic_ppp/hikp_nic_ppp.c | 8 +- - net/ub/ub_bp/hikp_ub_bp.c | 3 +- - net/ub/ub_crd/hikp_ub_crd.c | 6 +- - net/ub/ub_dfx/hikp_ub_dfx.c | 26 +++--- - net/ub/ub_ppp/hikp_unic_ppp.c | 54 +++++++++--- - net/ub/ub_ppp/hikp_unic_ppp.h | 2 +- - ossl/ossl_user_linux.c | 4 +- - pcie/func_lib/osal/os_common.c | 29 ------- - pcie/func_lib/osal/os_common.h | 22 ++--- - pcie/func_lib/pcie_func/pcie_link_ltssm.c | 87 +++++++++----------- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 24 +++--- - pcie/func_lib/pcie_func/pcie_reg_read.c | 6 +- - pcie/func_lib/pcie_func/pcie_statistics.c | 54 ++++++------ - pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c | 2 +- - sas/sas_func/sas_analy_queue.c | 6 +- - sas/sas_func/sas_analy_queue.h | 2 + - sas/sas_func/sas_common.h | 4 + - sas/sas_func/sas_dump_reg.c | 2 +- - sas/sas_func/sas_read_dev.c | 4 +- - sas/sas_func/sas_read_dqe.c | 4 +- - sas/sas_func/sas_read_errcode.c | 16 ++-- - sata/sata_func/sata_dump_reg.c | 2 +- - tool_lib/op_logs.c | 14 ++-- - tool_lib/tool_lib.c | 12 +-- - 31 files changed, 226 insertions(+), 206 deletions(-) - delete mode 100644 pcie/func_lib/osal/os_common.c - -diff --git a/cxl/func_lib/cxl_func/cxl_feature.c b/cxl/func_lib/cxl_func/cxl_feature.c -index cd41b09..12fadbd 100644 ---- a/cxl/func_lib/cxl_func/cxl_feature.c -+++ b/cxl/func_lib/cxl_func/cxl_feature.c -@@ -342,7 +342,7 @@ int cxl_reg_show_execute(uint32_t port_id, uint32_t mode_code, uint32_t cmd_type - uint32_t i; - size_t data_unit_len; - struct hikp_cmd_header req_header; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - struct cxl_cmd_paras_in req_para; - struct cxl_out_data *data_head = NULL; - struct cxl_data_unit *data_unit_buf = NULL; -@@ -359,8 +359,14 @@ int cxl_reg_show_execute(uint32_t port_id, uint32_t mode_code, uint32_t cmd_type - return ret; - } - -+ if (cmd_ret->rsp_data_num < CXL_DATA_OFFSET) { -+ printf("cxl_cmd mode_code: %u cmd_type: %u," -+ "The value of rsp data num is less than 2, rsp data num: %u\n", -+ mode_code, cmd_type, cmd_ret->rsp_data_num); -+ free(cmd_ret); -+ return -EINVAL; -+ } - data_head = (struct cxl_out_data *)cmd_ret->rsp_data; -- data_unit_buf = (struct cxl_data_unit *)(cmd_ret->rsp_data + data_head->data_offset); - data_unit_len = data_head->length / sizeof(struct cxl_data_unit); - - ret = cxl_data_unit_buf_check(data_head->data_offset, data_unit_len, cmd_ret->rsp_data_num); -@@ -369,6 +375,8 @@ int cxl_reg_show_execute(uint32_t port_id, uint32_t mode_code, uint32_t cmd_type - return ret; - } - -+ data_unit_buf = (struct cxl_data_unit *)(cmd_ret->rsp_data + data_head->data_offset); -+ - for (i = 0; i < (sizeof(g_prtf) / sizeof((g_prtf)[0])); i++) { - if (mode_code == g_prtf[i].mode_code && - cmd_type == g_prtf[i].cmd_type && g_prtf[i].cxl_prt_handle) { -diff --git a/cxl/func_lib/cxl_func/cxl_feature.h b/cxl/func_lib/cxl_func/cxl_feature.h -index 4d30ebe..3ac6f75 100644 ---- a/cxl/func_lib/cxl_func/cxl_feature.h -+++ b/cxl/func_lib/cxl_func/cxl_feature.h -@@ -28,6 +28,7 @@ - #define CXL_HDM_CNT_EACH_PORT 2 - #define CXL_DATA_UNIT_SIZE 2 // reg addr + data - #define CXL_MEM_HEADER_LOG_UNIT 4 -+#define CXL_DATA_OFFSET 2 - - enum cxl_cmd_type { - CXL_CPA = 0, -diff --git a/hikp_init_main.c b/hikp_init_main.c -index 4629b40..e159ad9 100644 ---- a/hikp_init_main.c -+++ b/hikp_init_main.c -@@ -92,7 +92,8 @@ static int parse_and_init_cmd(const char *arg) - if (strnlen(cmd_ptr->name, MAX_CMD_LEN) != strnlen(arg, MAX_CMD_LEN)) - continue; - -- if (strncmp(arg, cmd_ptr->name, strnlen(cmd_ptr->name, MAX_CMD_LEN - 1) + 1) == 0) { -+ if ((strncmp(arg, cmd_ptr->name, -+ strnlen(cmd_ptr->name, MAX_CMD_LEN - 1) + 1) == 0) && cmd_ptr->cmd_init) { - g_tool.p_major_cmd.cmd_ptr = cmd_ptr; - cmd_ptr->cmd_init(); - return 0; -diff --git a/libhikptdev/src/rciep/hikpt_rciep.c b/libhikptdev/src/rciep/hikpt_rciep.c -index 75ec224..0210f3d 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.c -+++ b/libhikptdev/src/rciep/hikpt_rciep.c -@@ -208,8 +208,11 @@ static int hikp_multi_round_interact(struct hikp_cmd_ret **cmd_ret, uint32_t sta - return -EINVAL; - } - -- p_cmd_ret = (struct hikp_cmd_ret *)malloc(sizeof(struct hikp_cmd_ret) + -- rsp_num * REP_DATA_BLK_SIZE); -+ /* By default, the memory is applied for based on the supported maximum length. -+ * The memory buffer is converted into the corresponding data structure inside the module. -+ */ -+ p_cmd_ret = (struct hikp_cmd_ret *)calloc(1, -+ (sizeof(struct hikp_cmd_ret) + HIKP_RSP_DATA_SIZE_MAX)); - if (p_cmd_ret == NULL) { - printf("response memory malloc fail.\n"); - return -ENOMEM; -@@ -509,7 +512,8 @@ out_free_iep: - static void hikp_munmap(void) - { - g_unmap_flag = 1; -- munmap((void *)g_hikp_req, sizeof(union hikp_space_req)); -+ if (munmap((void *)g_hikp_req, sizeof(union hikp_space_req)) == -1) -+ printf("failed to munmap, errno %d.\n", errno); - g_hikp_req = NULL; - g_hikp_rsp = NULL; - } -@@ -538,7 +542,7 @@ int hikp_dev_init(void) - - g_hikp_req = (union hikp_space_req *)mmap(0, sizeof(union hikp_space_req), - PROT_READ | PROT_WRITE, MAP_SHARED, g_iep_fd, 0); -- if (!g_hikp_req) { -+ if (g_hikp_req == MAP_FAILED) { - printf("failed to mmap %s.\n", iep); - ret = -errno; - goto out_close_fd; -diff --git a/libhikptdev/src/rciep/hikpt_rciep.h b/libhikptdev/src/rciep/hikpt_rciep.h -index 296d235..c64e4dd 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.h -+++ b/libhikptdev/src/rciep/hikpt_rciep.h -@@ -43,6 +43,7 @@ - #define WAIT_CPL_MAX_MS 8000 - - #define REP_DATA_BLK_SIZE sizeof(uint32_t) -+#define HIKP_RSP_DATA_SIZE_MAX (HIKP_RSP_ALL_DATA_MAX * REP_DATA_BLK_SIZE) - - enum { - HIKP_RESOURCE_DIR, -diff --git a/net/nic/nic_mac/hikp_nic_xsfp.c b/net/nic/nic_mac/hikp_nic_xsfp.c -index 70ed589..a1294a8 100644 ---- a/net/nic/nic_mac/hikp_nic_xsfp.c -+++ b/net/nic/nic_mac/hikp_nic_xsfp.c -@@ -602,6 +602,14 @@ static int hikp_xsfp_get_raw_data(uint8_t *buf, uint32_t size, uint32_t blk_num) - return ret; - } - -+ if (cmd_resp->rsp_data_num == 0) { -+ HIKP_ERROR_PRINT("get eeprom data rsp_data_num %u error\n", -+ cmd_resp->rsp_data_num); -+ free(cmd_resp); -+ cmd_resp = NULL; -+ return -EINVAL; -+ } -+ - len = HIKP_MIN(left_size, (cmd_resp->rsp_data_num * sizeof(uint32_t))); - memcpy(buf + offset, (uint8_t *)(cmd_resp->rsp_data), len); - left_size -= len; -diff --git a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -index 307d336..56b8257 100644 ---- a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -+++ b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -@@ -74,7 +74,7 @@ static void hikp_nic_notify_pkt_show(const struct nic_notify_pkt_info *info) - static void hikp_nic_notify_pkt_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_notify_pkt_target.bdf; -- struct nic_notify_pkt_info info; -+ struct nic_notify_pkt_info info = {0}; - - self->err_no = hikp_nic_notify_pkt_query(self, bdf, &info); - if (self->err_no) -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index 7968ac3..4dbe8d6 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -129,9 +129,9 @@ static void hikp_nic_ppp_get_overflow_mac(struct nic_mac_tbl *of_tbl, struct nic - - static void hikp_nic_ppp_show_key_mem(struct nic_mac_tbl *tbl, bool is_key_mem) - { -+ char mac_str[HIKP_NIC_ETH_ADDR_FMT_SIZE] = {0}; - struct mac_vlan_uc_tbl *uc_tbl = &tbl->uc_tbl; - struct mac_vlan_mc_tbl *mc_tbl = &tbl->mc_tbl; -- char mac_str[HIKP_NIC_ETH_ADDR_FMT_SIZE]; - struct mac_vlan_uc_entry *uc_entry; - struct mac_vlan_mc_entry *mc_entry; - uint32_t idx; -@@ -178,7 +178,7 @@ static void hikp_nic_ppp_show_key_mem(struct nic_mac_tbl *tbl, bool is_key_mem) - static void hikp_nic_ppp_show_func_uc_mac_addr(struct mac_vlan_uc_tbl *uc_tbl, - const struct bdf_t *bdf, uint16_t func_id) - { -- char mac_str[HIKP_NIC_ETH_ADDR_FMT_SIZE]; -+ char mac_str[HIKP_NIC_ETH_ADDR_FMT_SIZE] = {0}; - struct mac_vlan_uc_entry *uc_entry; - uint8_t pf_id; - uint8_t vf_id; -@@ -202,7 +202,7 @@ static void hikp_nic_ppp_show_func_uc_mac_addr(struct mac_vlan_uc_tbl *uc_tbl, - static void hikp_nic_ppp_show_func_mc_mac_addr(struct mac_vlan_mc_tbl *mc_tbl, - const struct bdf_t *bdf, uint16_t func_id) - { -- char mac_str[HIKP_NIC_ETH_ADDR_FMT_SIZE]; -+ char mac_str[HIKP_NIC_ETH_ADDR_FMT_SIZE] = {0}; - struct mac_vlan_mc_entry *mc_entry; - uint16_t abs_func_id; - uint8_t offset; -@@ -394,7 +394,7 @@ static void hikp_nic_ppp_show_vlan_tbl(const void *data) - static void hikp_nic_ppp_show_manager_tbl(const void *data) - { - struct nic_mng_tbl *tbl = (struct nic_mng_tbl *)data; -- char mac_str[HIKP_NIC_ETH_ADDR_FMT_SIZE]; -+ char mac_str[HIKP_NIC_ETH_ADDR_FMT_SIZE] = {0}; - struct manager_entry *entry; - uint32_t i; - -diff --git a/net/ub/ub_bp/hikp_ub_bp.c b/net/ub/ub_bp/hikp_ub_bp.c -index 70a9a4b..f5f50ff 100644 ---- a/net/ub/ub_bp/hikp_ub_bp.c -+++ b/net/ub/ub_bp/hikp_ub_bp.c -@@ -41,7 +41,7 @@ static void hikp_ub_bp_info_show(const struct ub_bp_rsp *info) - { - int bp_val_offset; - -- printf("%-28s : %u\n", "mac id", info->mac_id); -+ printf("%-28s : %hhu\n", "mac id", info->mac_id); - printf("%-28s : ", "back pressure status"); - - for (bp_val_offset = MAX_VL_NUM; bp_val_offset >= 0; bp_val_offset--) { -@@ -50,7 +50,6 @@ static void hikp_ub_bp_info_show(const struct ub_bp_rsp *info) - printf("\n"); - } - -- - static int hikp_ub_query_bp(const struct bdf_t *bdf) - { - struct hikp_cmd_header header = { 0 }; -diff --git a/net/ub/ub_crd/hikp_ub_crd.c b/net/ub/ub_crd/hikp_ub_crd.c -index 0e47b5b..91e1cb7 100644 ---- a/net/ub/ub_crd/hikp_ub_crd.c -+++ b/net/ub/ub_crd/hikp_ub_crd.c -@@ -37,8 +37,8 @@ static int hikp_ub_crd_target(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - --static int hikp_ub_show_crd(uint32_t off, struct ub_crd_rsp *crd_rsp, uint32_t num_rows, -- char const *crds[][2]) -+static uint32_t hikp_ub_show_crd(uint32_t off, struct ub_crd_rsp *crd_rsp, uint32_t num_rows, -+ char const *crds[][2]) - { - int reg_index; - int i; -@@ -63,7 +63,7 @@ static int hikp_ub_query_crd(void) - struct ub_crd_req_para req_data = { 0 }; - struct hikp_cmd_ret *cmd_ret = NULL; - struct ub_crd_rsp *crd_rsp = NULL; -- int offset; -+ uint32_t offset; - - char const *init_crds[][2] = { - {"CFG_REMOTE_ICRD", "CFG_REMOTE_LCRD"}, -diff --git a/net/ub/ub_dfx/hikp_ub_dfx.c b/net/ub/ub_dfx/hikp_ub_dfx.c -index c50f555..00205fe 100644 ---- a/net/ub/ub_dfx/hikp_ub_dfx.c -+++ b/net/ub/ub_dfx/hikp_ub_dfx.c -@@ -13,6 +13,7 @@ - - #include "tool_cmd.h" - #include "hikp_net_lib.h" -+#include "hikpt_rciep.h" - #include "hikp_ub_dfx.h" - - struct ub_dfx_param g_ub_dfx_param = { 0 }; -@@ -100,6 +101,7 @@ static int hikp_ub_get_first_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t - { - struct ub_dfx_rsp *dfx_rsp = NULL; - struct hikp_cmd_ret *cmd_ret; -+ uint32_t rsp_data_size; - int ret; - - ret = hikp_ub_dfx_get_blk_data(&cmd_ret, 0, g_ub_dfx_param.sub_cmd_code); -@@ -122,11 +124,13 @@ static int hikp_ub_get_first_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t - goto err_out; - } - -- if (rsp_head->cur_blk_size > *max_dfx_size) { -+ rsp_data_size = cmd_ret->rsp_data_num * REP_DATA_BLK_SIZE; -+ if (rsp_data_size - sizeof(dfx_rsp->rsp_head) < rsp_head->cur_blk_size || -+ *max_dfx_size < rsp_head->cur_blk_size) { -+ HIKP_ERROR_PRINT("blk0 reg_data copy size error, rsp data size: %u, data size: %hhu, max size: %u\n", -+ rsp_data_size, rsp_head->cur_blk_size, *max_dfx_size); - free(*reg_data); - *reg_data = NULL; -- HIKP_ERROR_PRINT("blk0 reg_data copy size error, data size: 0x%x, max size: 0x%x\n", -- rsp_head->cur_blk_size, *max_dfx_size); - ret = -EINVAL; - goto err_out; - } -@@ -145,6 +149,7 @@ static int hikp_ub_get_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t blk_id - { - struct ub_dfx_rsp *dfx_rsp = NULL; - struct hikp_cmd_ret *cmd_ret; -+ uint32_t rsp_data_size; - int ret; - - ret = hikp_ub_dfx_get_blk_data(&cmd_ret, blk_id, g_ub_dfx_param.sub_cmd_code); -@@ -153,10 +158,11 @@ static int hikp_ub_get_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t blk_id - - dfx_rsp = (struct ub_dfx_rsp *)(cmd_ret->rsp_data); - *rsp_head = dfx_rsp->rsp_head; -- if (rsp_head->cur_blk_size > *max_dfx_size) { -- HIKP_ERROR_PRINT("blk%u reg_data copy size error, " -- "data size: 0x%x, max size: 0x%x\n", -- blk_id, rsp_head->cur_blk_size, *max_dfx_size); -+ rsp_data_size = cmd_ret->rsp_data_num * REP_DATA_BLK_SIZE; -+ if (rsp_data_size - sizeof(dfx_rsp->rsp_head) < rsp_head->cur_blk_size || -+ rsp_head->cur_blk_size > *max_dfx_size) { -+ HIKP_ERROR_PRINT("blk%u reg_data copy size error, rsp data size: %u, data size: %hhu, max size: %u\n", -+ blk_id, rsp_data_size, rsp_head->cur_blk_size, *max_dfx_size); - ret = -EINVAL; - goto err_out; - } -@@ -194,7 +200,7 @@ static void hikp_ub_dfx_print_type_head(uint8_t type_id, uint8_t *last_type_id) - if (is_type_found(type_id, &index)) - printf("type name: %s\n\n", g_dfx_type_parse[index].type_name); - else -- HIKP_WARN_PRINT("type name: unknown type, type id is %u\n\n", type_id); -+ HIKP_WARN_PRINT("type name: unknown type, type id is %hhu\n\n", type_id); - - *last_type_id = type_id; - } -@@ -244,7 +250,7 @@ static void hikp_ub_dfx_print(const struct ub_dfx_rsp_head *rsp_head, uint32_t * - for (i = 0; i < rsp_head->total_type_num; i++) { - type_head = (struct ub_dfx_type_head *)ptr; - if (type_head->type_id == INCORRECT_REG_TYPE) { -- HIKP_ERROR_PRINT("No.%u type is incorrect reg type\n", i + 1u); -+ HIKP_ERROR_PRINT("No.%u type is incorrect reg type\n", (uint32_t)(i + 1u)); - break; - } - hikp_ub_dfx_print_type_head(type_head->type_id, &last_type_id); -@@ -254,7 +260,7 @@ static void hikp_ub_dfx_print(const struct ub_dfx_rsp_head *rsp_head, uint32_t * - } else if (type_head->bit_width == WIDTH_64_BIT) { - hikp_ub_dfx_print_b64((uint32_t)type_head->reg_num, ptr); - } else { -- HIKP_ERROR_PRINT("type%u's bit width error.\n", type_head->type_id); -+ HIKP_ERROR_PRINT("type%hhu's bit width error.\n", type_head->type_id); - break; - } - ptr += (uint32_t)type_head->reg_num * WORD_NUM_PER_REG; -diff --git a/net/ub/ub_ppp/hikp_unic_ppp.c b/net/ub/ub_ppp/hikp_unic_ppp.c -index bf0c026..2164f04 100644 ---- a/net/ub/ub_ppp/hikp_unic_ppp.c -+++ b/net/ub/ub_ppp/hikp_unic_ppp.c -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include "hikpt_rciep.h" - #include "hikp_unic_ppp.h" - - static struct hikp_unic_ppp_hw_resources g_unic_ppp_hw_res = { 0 }; -@@ -86,6 +87,7 @@ static int hikp_unic_ppp_get_blk(struct hikp_cmd_header *req_header, - { - struct hikp_cmd_ret *cmd_ret; - struct unic_ppp_rsp *rsp; -+ uint32_t rsp_data_size; - int ret = 0; - - cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(*req_data)); -@@ -95,10 +97,11 @@ static int hikp_unic_ppp_get_blk(struct hikp_cmd_header *req_header, - } - - rsp = (struct unic_ppp_rsp *)cmd_ret->rsp_data; -- if (rsp->rsp_head.cur_blk_size > buf_len) { -- HIKP_ERROR_PRINT("unic_ppp block context copy size error, " -- "buffer size=%llu, data size=%u.\n", -- buf_len, rsp->rsp_head.cur_blk_size); -+ rsp_data_size = cmd_ret->rsp_data_num * REP_DATA_BLK_SIZE; -+ if (rsp_data_size - sizeof(rsp->rsp_head) < rsp->rsp_head.cur_blk_size || -+ buf_len < rsp->rsp_head.cur_blk_size) { -+ HIKP_ERROR_PRINT("block context copy size error, data size: %u, buffer size: %zu, blk size: %hhu.\n", -+ rsp_data_size, buf_len, rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; - } -@@ -123,17 +126,24 @@ static int hikp_unic_query_ppp_by_blkid(struct hikp_cmd_header *req_header, cons - req_data.block_id = blk_id; - ret = hikp_unic_ppp_get_blk(req_header, &req_data, data, len, &rsp_head); - if (ret != 0) { -- HIKP_ERROR_PRINT("Fail to get block-%u context.\n", blk_id); -+ HIKP_ERROR_PRINT("Fail to get block-%hhu context.\n", blk_id); - return ret; - } - total_blk_size = rsp_head.cur_blk_size; - - for (blk_id = 1; blk_id < rsp_head.total_blk_num; blk_id++) { - req_data.block_id = blk_id; -+ if (len < total_blk_size) { -+ HIKP_ERROR_PRINT("block-%hhu invalid total blk size, " -+ "len: %zu, total blk size: %u", -+ blk_id, len, total_blk_size); -+ return -EINVAL; -+ } -+ - ret = hikp_unic_ppp_get_blk(req_header, &req_data, (uint8_t *)data + total_blk_size, - len - total_blk_size, &rsp_head); - if (ret != 0) { -- HIKP_ERROR_PRINT("Fail to get block-%u context.\n", blk_id); -+ HIKP_ERROR_PRINT("Fail to get block-%hhu context.\n", blk_id); - return ret; - } - total_blk_size += rsp_head.cur_blk_size; -@@ -175,7 +185,7 @@ static int hikp_unic_ppp_alloc_ip_tbl_entry(const struct hikp_unic_ppp_hw_resour - static int hikp_unic_ppp_alloc_guid_tbl_entry(const struct hikp_unic_ppp_hw_resources *hw_res, - struct unic_guid_tbl *guid_tbl) - { -- if (hw_res->uc_guid_tbl_size == 0 && hw_res->mc_guid_tbl_size == 0) { -+ if (hw_res->uc_guid_tbl_size == 0 || hw_res->mc_guid_tbl_size == 0) { - HIKP_ERROR_PRINT("guid tbl query is not supported\n"); - return -EIO; - } -@@ -243,6 +253,12 @@ static int hikp_unic_query_ppp_ip_tbl(struct hikp_cmd_header *req_header, const - max_ip_entry_size = g_unic_ppp_hw_res.ip_max_mem_size + g_unic_ppp_hw_res.ip_overflow_size; - req_data.bdf = *bdf; - while (index < max_ip_entry_size) { -+ if (max_ip_entry_size < entry_size) { -+ HIKP_ERROR_PRINT("invalid ip table entry size, max entry size: %u, entry size: %u\n", -+ max_ip_entry_size, entry_size); -+ return -EINVAL; -+ } -+ - req_data.cur_entry_idx = index; - left_buf_len = sizeof(struct unic_ip_entry) * (max_ip_entry_size - entry_size); - ret = hikp_unic_ppp_get_blk(req_header, &req_data, ip_tbl->entry + entry_size, -@@ -268,15 +284,22 @@ static int hikp_unic_query_ppp_guid_tbl(struct hikp_cmd_header *req_header, - struct unic_ppp_req_para req_data = { 0 }; - uint32_t entry_size = 0; - size_t left_buf_len = 0; -+ uint32_t guid_tbl_size; - uint32_t index = 0; - int ret = -1; - - req_data.bdf = *bdf; - req_data.is_unicast = 1; -- while (index < g_unic_ppp_hw_res.uc_guid_tbl_size) { -+ guid_tbl_size = g_unic_ppp_hw_res.uc_guid_tbl_size; -+ while (index < guid_tbl_size) { -+ if (guid_tbl_size < entry_size) { -+ HIKP_ERROR_PRINT("invalid uc guid table entry size, uc guid tbl size: %u, entry size: %u\n", -+ guid_tbl_size, entry_size); -+ return -EINVAL; -+ } -+ - req_data.cur_entry_idx = index; -- left_buf_len = sizeof(struct unic_guid_uc_entry) * -- (g_unic_ppp_hw_res.uc_guid_tbl_size - entry_size); -+ left_buf_len = sizeof(struct unic_guid_uc_entry) * (guid_tbl_size - entry_size); - ret = hikp_unic_ppp_get_blk(req_header, &req_data, - guid_tbl->uc_tbl.entry + entry_size, - left_buf_len, &unic_rsp_head); -@@ -294,11 +317,16 @@ static int hikp_unic_query_ppp_guid_tbl(struct hikp_cmd_header *req_header, - entry_size = 0; - index = 0; - req_data.is_unicast = 0; -+ guid_tbl_size = g_unic_ppp_hw_res.mc_guid_tbl_size; -+ while (index < guid_tbl_size) { -+ if (guid_tbl_size < entry_size) { -+ HIKP_ERROR_PRINT("invalid mc guid table entry size, mc guid tbl size: %u, entry size: %u\n", -+ guid_tbl_size, entry_size); -+ return -EINVAL; -+ } - -- while (index < g_unic_ppp_hw_res.mc_guid_tbl_size) { - req_data.cur_entry_idx = index; -- left_buf_len = sizeof(struct unic_guid_mc_entry) * -- (g_unic_ppp_hw_res.mc_guid_tbl_size - entry_size); -+ left_buf_len = sizeof(struct unic_guid_mc_entry) * (guid_tbl_size - entry_size); - ret = hikp_unic_ppp_get_blk(req_header, &req_data, - guid_tbl->mc_tbl.entry + entry_size, - left_buf_len, &unic_rsp_head); -diff --git a/net/ub/ub_ppp/hikp_unic_ppp.h b/net/ub/ub_ppp/hikp_unic_ppp.h -index c25fabd..0771415 100644 ---- a/net/ub/ub_ppp/hikp_unic_ppp.h -+++ b/net/ub/ub_ppp/hikp_unic_ppp.h -@@ -19,7 +19,7 @@ - #define HIKP_UNIC_IP_ADDR_FMT_SIZE 50 - #define MAX_IP_ADDR_STR_LEN 50 - #define IP_ADDR_LEN 16 --#define IP_ADDR_TBL_LEN 8 -+#define IP_ADDR_TBL_LEN 8 - - #define HIKP_UNIC_IP_ADDR_LEN 4 - #define HIKP_UNIC_GUID_BITMAP_LEN 8 -diff --git a/ossl/ossl_user_linux.c b/ossl/ossl_user_linux.c -index 9dee61c..a369c68 100644 ---- a/ossl/ossl_user_linux.c -+++ b/ossl/ossl_user_linux.c -@@ -26,7 +26,7 @@ int uda_access(const char *file_dir) - { - char path[PATH_MAX + 1] = { 0 }; - -- if (strlen(file_dir) > PATH_MAX || realpath(file_dir, path) == NULL) -+ if (file_dir == NULL || strlen(file_dir) > PATH_MAX || realpath(file_dir, path) == NULL) - return -ENOENT; - - return faccessat(AT_FDCWD, path, F_OK, AT_EACCESS) ? (-ENOENT) : 0; -@@ -53,7 +53,7 @@ int uda_fcntl(const char *lock_file, uint32_t operation, int *fd) - if ((fd == NULL) || (lock_file == NULL)) - return -EFAULT; - -- fd_t = open(lock_file, O_WRONLY | O_CREAT, 0700); -+ fd_t = open(lock_file, O_WRONLY | O_CREAT, 0600); - if (fd_t < 0) - return -errno; - -diff --git a/pcie/func_lib/osal/os_common.c b/pcie/func_lib/osal/os_common.c -deleted file mode 100644 -index 3ebf10c..0000000 ---- a/pcie/func_lib/osal/os_common.c -+++ /dev/null -@@ -1,29 +0,0 @@ --/* -- * Copyright (c) 2022 Hisilicon Technologies Co., Ltd. -- * Hikptool is licensed under Mulan PSL v2. -- * You can use this software according to the terms and conditions of the Mulan PSL v2. -- * You may obtain a copy of Mulan PSL v2 at: -- * http://license.coscl.org.cn/MulanPSL2 -- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -- * -- * See the Mulan PSL v2 for more details. -- */ -- --#include --#include --#include "os_common.h" -- --void hilog(int pri, const char *module, const char *fun, int line, const char *fmt, ...) --{ -- va_list ap; -- (void)pri; -- (void)module; -- (void)fun; -- (void)line; -- -- va_start(ap, fmt); -- (void)vprintf(fmt, ap); -- va_end(ap); --} -diff --git a/pcie/func_lib/osal/os_common.h b/pcie/func_lib/osal/os_common.h -index 480202c..de2a517 100644 ---- a/pcie/func_lib/osal/os_common.h -+++ b/pcie/func_lib/osal/os_common.h -@@ -14,28 +14,16 @@ - #ifndef _OS_COMMON_H_ - #define _OS_COMMON_H_ - --enum { -- HW_LOG_TIPS = 0, -- HW_LOG_DBG, -- HW_LOG_INFO, -- HW_LOG_WARN, -- HW_LOG_ERR --}; -- - #define LOG_PCIE "[PCIE]" - --void hilog(int pri, const char *module, const char *fun, int line, const char *fmt, ...); -- --#define Log(pri, module, fmt, args...) hilog(pri, module, __func__, __LINE__, fmt, ##args) -- --#define Err(module, fmt, args...) hilog(HW_LOG_ERR, module, __func__, __LINE__, fmt, ##args) -+#define Info(x, args...) printf(x, ##args) - --#define Warn(module, fmt, args...) hilog(HW_LOG_WARN, module, __func__, __LINE__, fmt, ##args) -+#define Err(x, args...) Info("[ ERROE ] " x, ##args) - --#define Info(module, fmt, args...) hilog(HW_LOG_INFO, module, __func__, __LINE__, fmt, ##args) -+#define Warn(x, args...) Info("[ WARN ] " x, ##args) - --#define Debug(module, fmt, args...) hilog(HW_LOG_DBG, module, __func__, __LINE__, fmt, ##args) -+#define Debug(x, args...) Info("[ DEBUG ] " x, ##args) - --#define Tips(module, fmt, args...) hilog(HW_LOG_TIPS, module, __func__, __LINE__, fmt, ##args) -+#define Tips(x, args...) Info("[ TIPS ] " x, ##args) - - #endif -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.c b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -index 66226e0..5834612 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.c -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -@@ -81,37 +81,36 @@ static int pcie_get_ltssm_trace(uint32_t port_id, uint64_t *ltssm_status, uint32 - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); - if (ret) { -- Err("PCIe Base", "pcie trace cmd_ret check failed, ret: %d.\n", ret); -+ Err("pcie trace cmd_ret check failed, ret: %d.\n", ret); - goto free_cmd_ret; - } - - if (cmd_ret->rsp_data_num == 0) { -- Err("PCIe Base", "without rsp data.\n"); -+ Err("without rsp data.\n"); - ret = -EINVAL; - goto free_cmd_ret; - } - /* 0: First uint32_t is ltssm trace num received from TF */ - *ltssm_num = cmd_ret->rsp_data[0]; -- -- if ((cmd_ret->rsp_data_num - 1) * sizeof(uint32_t) != (*ltssm_num) * sizeof(uint64_t)) { -- Err("PCIe Base", "rsp data number check failed, rsp_data_num: %u, ltssm_num: %u.\n", -- cmd_ret->rsp_data_num, *ltssm_num); -+ src_size = (*ltssm_num) * sizeof(uint64_t); -+ dst_size = TRACER_DEPTH * sizeof(uint64_t); -+ if (src_size > dst_size) { -+ Err("size check failed, %u > %u.\n", src_size, dst_size); - ret = -EINVAL; - goto free_cmd_ret; - } - -- src_size = (*ltssm_num) * sizeof(uint64_t); -- dst_size = TRACER_DEPTH * sizeof(uint64_t); -- if (src_size > dst_size) { -- Err("PCIe Base", "size check failed, %u > %u.\n", src_size, dst_size); -+ if ((cmd_ret->rsp_data_num - 1) * sizeof(uint32_t) != (*ltssm_num) * sizeof(uint64_t)) { -+ Err("rsp data number check failed, rsp_data_num: %u, ltssm_num: %u.\n", -+ cmd_ret->rsp_data_num, *ltssm_num); - ret = -EINVAL; - goto free_cmd_ret; - } -+ - memcpy(ltssm_status, (cmd_ret->rsp_data + 1), src_size); - - free_cmd_ret: - free(cmd_ret); -- - return ret; - } - -@@ -184,19 +183,17 @@ static int pcie_print_ltssm_trace(const uint64_t *ltssm_input, uint32_t ltssm_nu - union ltssm_state_reg ltssm_val; - - if (ltssm_num > TRACER_DEPTH || ltssm_num == 0) { -- Err("PCIe Base", "ltssm_num(%u) is over range or zero\n", ltssm_num); -+ Err("ltssm_num(%u) is over range or zero\n", ltssm_num); - return -EINVAL; - } -- Info("PCIe Base", "ltssm tracer:\n"); -- Info("PCIe Base", "\ttrace mode: %llx\n", *ltssm_input); -- Info("PCIe Base", -- "\tltssm[ii]: 63:48 47:32 31 30 29 28 27 26 25 24 23 22 21:" -+ Info("ltssm tracer:\n"); -+ Info("\ttrace mode: %llx\n", *ltssm_input); -+ Info("\tltssm[ii]: 63:48 47:32 31 30 29 28 27 26 25 24 23 22 21:" - "20 19:12 11:10 9:6 5:0 ltssm\n"); - for (i = 1; i < ltssm_num; i++) { - ltssm_val.val = ltssm_input[i]; - ltssm_c = hisi_pcie_ltssm_string_get((uint32_t)ltssm_val.bits.ltssm_state); -- Info("PCIe Base", -- "\tltssm[%02u]: 0x%04x %04x %x %x %x %x %x %x %x " -+ Info("\tltssm[%02u]: 0x%04x %04x %x %x %x %x %x %x %x " - "%x %x %x %x %02x %x %x %02x %s\n", - i, - (uint32_t)ltssm_val.bits.txdetrx, -@@ -239,7 +236,7 @@ int pcie_ltssm_trace_show(uint32_t port_id) - int pcie_ltssm_trace_mode_set(uint32_t port_id, uint32_t mode) - { - struct hikp_cmd_header req_header; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - struct pcie_trace_req_para req_data = { 0 }; - int ret; - -@@ -256,7 +253,7 @@ int pcie_ltssm_trace_mode_set(uint32_t port_id, uint32_t mode) - int pcie_ltssm_trace_clear(uint32_t port_id) - { - struct hikp_cmd_header req_header; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - struct pcie_trace_req_para req_data = { 0 }; - int ret; - -@@ -273,9 +270,9 @@ int pcie_ltssm_link_status_get(uint32_t port_id) - { - union pcie_link_info reg_val; - struct hikp_cmd_header req_header; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - struct pcie_trace_req_para req_data = { 0 }; -- char *ltssm_sts; -+ char *ltssm_sts = NULL; - int ret; - - req_data.port_id = port_id; -@@ -286,7 +283,7 @@ int pcie_ltssm_link_status_get(uint32_t port_id) - goto free_cmd_ret; - - if (cmd_ret->rsp_data_num == 0) { -- Err("PCIe Base", "rsp data number check failed, rsp_data_num: %u.\n", -+ Err("rsp data number check failed, rsp_data_num: %u.\n", - cmd_ret->rsp_data_num); - ret = -EINVAL; - goto free_cmd_ret; -@@ -294,12 +291,12 @@ int pcie_ltssm_link_status_get(uint32_t port_id) - reg_val.u32 = cmd_ret->rsp_data[0]; - ltssm_sts = hisi_pcie_ltssm_string_get(reg_val.bits.mac_ltssm_st); - -- Info(LOG_PCIE, "Port[%u] mac link information:\n", port_id); -- Info(LOG_PCIE, " ltssm status: %s\n", ltssm_sts); -- Info(LOG_PCIE, " speed: Gen%u\n", reg_val.bits.mac_cur_link_speed); -- Info(LOG_PCIE, " width: X%u\n", reg_val.bits.mac_cur_link_width); -- Info(LOG_PCIE, " link_up: %u\n", reg_val.bits.mac_link_up); -- Info(LOG_PCIE, " lane_reverse: %u\n", reg_val.bits.lane_reverse); -+ Info("Port[%u] mac link information:\n", port_id); -+ Info(" ltssm status: %s\n", ltssm_sts); -+ Info(" speed: Gen%u\n", reg_val.bits.mac_cur_link_speed); -+ Info(" width: X%u\n", reg_val.bits.mac_cur_link_width); -+ Info(" link_up: %u\n", reg_val.bits.mac_link_up); -+ Info(" lane_reverse: %u\n", reg_val.bits.lane_reverse); - free_cmd_ret: - free(cmd_ret); - -@@ -319,32 +316,32 @@ static int pcie_get_pm_trace(uint32_t port_id, uint64_t *pm_status, uint32_t *pm - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); - if (ret) { -- Err("PCIe Base", "pcie pm trace cmd_ret check failed, ret: %d.\n", ret); -+ Err("pcie pm trace cmd_ret check failed, ret: %d.\n", ret); - goto free_cmd_ret; - } - - if (cmd_ret->rsp_data_num == 0) { -- Err("PCIe Base", "without rsp data.\n"); -+ Err("without rsp data.\n"); - ret = -EINVAL; - goto free_cmd_ret; - } - /* 0: First uint32_t is pm trace num received from TF */ - *pm_num = cmd_ret->rsp_data[0]; -- -- if ((cmd_ret->rsp_data_num - 1) * sizeof(uint32_t) != (*pm_num) * sizeof(uint64_t)) { -- Err("PCIe Base", "rsp data number check failed, rsp_data_num: %u, pm_num: %u.\n", -- cmd_ret->rsp_data_num, *pm_num); -+ src_size = (*pm_num) * sizeof(uint64_t); -+ dst_size = TRACER_DEPTH * sizeof(uint64_t); -+ if (src_size > dst_size) { -+ Err("size check failed, %u > %u.\n", src_size, dst_size); - ret = -EINVAL; - goto free_cmd_ret; - } - -- src_size = (*pm_num) * sizeof(uint64_t); -- dst_size = TRACER_DEPTH * sizeof(uint64_t); -- if (src_size > dst_size) { -- Err("PCIe Base", "size check failed, %u > %u.\n", src_size, dst_size); -+ if ((cmd_ret->rsp_data_num - 1) * sizeof(uint32_t) != (*pm_num) * sizeof(uint64_t)) { -+ Err("rsp data number check failed, rsp_data_num: %u, pm_num: %u.\n", -+ cmd_ret->rsp_data_num, *pm_num); - ret = -EINVAL; - goto free_cmd_ret; - } -+ - memcpy(pm_status, (cmd_ret->rsp_data + 1), src_size); - - free_cmd_ret: -@@ -411,19 +408,17 @@ static int pcie_print_pm_trace(const uint64_t *pm_status, uint32_t pm_num) - union pm_state_reg pm_val; - - if (pm_num > TRACER_DEPTH || pm_num == 0) { -- Err("PCIe Base", "pm_num(%u) is over range or zero\n", pm_num); -+ Err("pm_num(%u) is over range or zero\n", pm_num); - return -EINVAL; - } -- Info("PCIe Base", "pm tracer:\n"); -- Info("PCIe Base", "\ttrace state: %llx\n", pm_status[0]); -- Info("PCIe Base", -- "\tpm[ii]: BE8: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 " -+ Info("pm tracer:\n"); -+ Info("\ttrace state: %llx\n", pm_status[0]); -+ Info("\tpm[ii]: BE8: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 " - "BD8: 23:6 5:0 : pm state\n"); - for (i = 1; i < pm_num; i++) { - pm_val.val = pm_status[i]; - pm_c = hisi_pcie_pm_string_get((uint32_t)pm_val.bits.pm_state); -- Info("PCIe Base", -- "\tpm[%02u]:\t %x %x %x %x %x %x %x %x %x %x %x " -+ Info("\tpm[%02u]:\t %x %x %x %x %x %x %x %x %x %x %x " - "%x %x %x %x 0x%06x 0x%02x %s\n", - i, - (uint32_t)pm_val.bits.pm_t_dfe_time_meet, -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index 535807c..856aebe 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -409,7 +409,7 @@ static int pcie_create_dumpreg_log_file(uint32_t port_id, uint32_t dump_level) - /* Add write permission to the file */ - fd_file = open(file_name, O_RDWR | O_SYNC | O_CREAT, 0600); - if (fd_file < 0) { -- Err("PCIe DUMPREG", "open %s failed.\n", file_name); -+ Err("open %s failed.\n", file_name); - return -EPERM; - } - g_pcie_dumpreg_fd = fd_file; -@@ -437,11 +437,11 @@ static void pcie_dumpreg_write_value_to_file(const char *reg_name, uint32_t val) - - ret = snprintf(str, sizeof(str), " %-40s : 0x%x\n", reg_name, val); - if (ret < 0 || ret >= sizeof(str)) { -- Err("PCIe DUMPREG", "pcie dumpreg write info to logfile failed.\n"); -+ Err("pcie dumpreg write info to logfile failed.\n"); - } else { - wr_ret = write(g_pcie_dumpreg_fd, str, strlen(str)); - if (wr_ret == -1) -- Err("PCIe DUMPREG", "write info to logfile failed.\n"); -+ Err("write info to logfile failed.\n"); - } - } - -@@ -485,13 +485,13 @@ static int pcie_dumpreg_write_header_to_file(uint32_t version, - ret = snprintf(str, sizeof(str), "Command Version[%u], dump_level[%u], port_id[%u]\n\n", - version, req_data->level, req_data->port_id); - if (ret < 0) { -- Err("PCIe DUMPREG", "pcie dumpreg write header to logfile failed.\n"); -+ Err("pcie dumpreg write header to logfile failed.\n"); - return -EIO; - } - - wr_ret = write(g_pcie_dumpreg_fd, str, strlen(str)); - if (wr_ret == -1) { -- Err("PCIe DUMPREG", "write header to logfile failed.\n"); -+ Err("write header to logfile failed.\n"); - return -EIO; - } - -@@ -506,7 +506,9 @@ static int pcie_dumpreg_save_log(uint32_t *data, uint32_t data_num, - uint32_t i; - int ret; - -- (void)pcie_dumpreg_write_header_to_file(version, req_data); -+ ret = pcie_dumpreg_write_header_to_file(version, req_data); -+ if (ret < 0) -+ return ret; - - switch (req_data->level) { - case DUMP_GLOBAL_LEVEL: -@@ -520,7 +522,7 @@ static int pcie_dumpreg_save_log(uint32_t *data, uint32_t data_num, - } - break; - default: -- Err("PCIe DUMPREG", "check dump level failed.\n"); -+ Err("check dump level failed.\n"); - return -EINVAL; - } - -@@ -528,7 +530,7 @@ static int pcie_dumpreg_save_log(uint32_t *data, uint32_t data_num, - for (i = 0; i < data_num; i++) { - ret = snprintf(reg_name, sizeof(reg_name), "REG_%03u", i); - if (ret < 0) -- Err("PCIe DUMPREG", "save log snprintf failed.\n"); -+ Err("save log snprintf failed.\n"); - pcie_dumpreg_write_value_to_file(reg_name, data[i]); - } - } else if (req_data->level == DUMP_GLOBAL_LEVEL) { -@@ -549,7 +551,7 @@ int pcie_dumpreg_do_dump(uint32_t port_id, uint32_t dump_level) - struct pcie_dump_req_para req_data = { 0 }; - int ret = 0; - -- Info("PCIe DUMPREG", "pcie reg dump start.\n"); -+ Info("pcie reg dump start.\n"); - - req_data.port_id = port_id; - req_data.level = dump_level; -@@ -567,11 +569,11 @@ int pcie_dumpreg_do_dump(uint32_t port_id, uint32_t dump_level) - ret = pcie_dumpreg_save_log(cmd_ret->rsp_data, - cmd_ret->rsp_data_num, cmd_ret->version, &req_data); - if (ret) { -- Err("PCIe DUMPREG", "pcie dump save log failed, ret: %d.\n", ret); -+ Err("pcie dump save log failed, ret: %d.\n", ret); - goto close_file_ret; - } - -- Info("PCIe DUMPREG", "pcie reg dump finish.\n"); -+ Info("pcie reg dump finish.\n"); - close_file_ret: - (void)pcie_close_dumpreg_log_file(); - free_cmd_ret: -diff --git a/pcie/func_lib/pcie_func/pcie_reg_read.c b/pcie/func_lib/pcie_func/pcie_reg_read.c -index b3d4643..1578056 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_read.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_read.c -@@ -66,11 +66,11 @@ int pcie_read_name2module_id(const char *module_name, uint32_t *module_id) - static int pcie_reg_read_result_show(const struct hikp_cmd_ret *cmd_ret) - { - if (cmd_ret->rsp_data_num != 1) { /* 1 uint32_t data for reg read cmd */ -- Err("PCIe REGREAD", "pcie reg read data num check failed, num: %u.\n", -+ Err("pcie reg read data num check failed, num: %u.\n", - cmd_ret->rsp_data_num); - return -EINVAL; - } -- Info("PCIe REGREAD", "RIGISTER VALUE[0x%08x].\n", cmd_ret->rsp_data[0]); -+ Info("RIGISTER VALUE[0x%08x].\n", cmd_ret->rsp_data[0]); - - return 0; - } -@@ -89,7 +89,7 @@ int pcie_reg_read(uint32_t port_id, uint32_t module_id, uint32_t offset) - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); - if (ret) { -- Err("PCIe REGREAD", "pcie reg read cmd_ret check failed, ret: %d.\n", ret); -+ Err("pcie reg read cmd_ret check failed, ret: %d.\n", ret); - goto free_cmd_ret; - } - ret = pcie_reg_read_result_show(cmd_ret); -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.c b/pcie/func_lib/pcie_func/pcie_statistics.c -index badf3d1..e2bfcb4 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.c -+++ b/pcie/func_lib/pcie_func/pcie_statistics.c -@@ -32,18 +32,18 @@ static const char *g_global_ndie_name[] = { - static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, uint32_t *port_num) - { - size_t rsp_data_size, expect_data_size; -- struct pcie_port_info *port_info; -+ struct pcie_port_info *port_info = NULL; - int ret; - - ret = hikp_rsp_normal_check(cmd_ret); - if (ret) { -- Err("PCIe Base", "port distribution cmd_ret normal check failed, ret: %d.\n", ret); -+ Err("port distribution cmd_ret normal check failed, ret: %d.\n", ret); - return ret; - } - rsp_data_size = cmd_ret->rsp_data_num * sizeof(uint32_t); - /* Check whether enough data of a port unit */ - if (rsp_data_size < sizeof(struct pcie_port_info)) { -- Err("PCIe Base", "port distribution rsp check failed, size: %u.\n", -+ Err("port distribution rsp check failed, size: %u.\n", - rsp_data_size); - return -EINVAL; - } -@@ -53,8 +53,7 @@ static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, - expect_data_size = sizeof(struct pcie_port_info) + - sizeof(struct pcie_info_distribution_pair) * (*port_num); - if (expect_data_size > rsp_data_size) { -- Err("PCIe Base", -- "port distribution data size check failed, size: %u, expect size: %u.\n", -+ Err("port distribution data size check failed, size: %u, expect size: %u.\n", - rsp_data_size, expect_data_size); - return -EINVAL; - } -@@ -68,19 +67,19 @@ static int pcie_portid_serdes_relation(const struct pcie_macro_info *macro_info, - uint32_t i, j; - - if (ndie_id >= HIKP_ARRAY_SIZE(g_global_ndie_name)) { -- Info("PCIe Base", "ndie_id [%u]: %s\n", ndie_id, "UNKNOWN_NDIE"); -+ Info("ndie_id [%u]: %s\n", ndie_id, "UNKNOWN_NDIE"); - return -1; - } - - if (macro_num >= MAX_MACRO_ONEPORT) { -- Info("PCIe Base", "macro_num [%u] exceeds the maximum array length\n", macro_num); -+ Info("macro_num [%u] exceeds the maximum array length\n", macro_num); - return -1; - } - -- Info("PCIe Base", "\tndie_id: %s\n", g_global_ndie_name[ndie_id]); -+ Info("\tndie_id: %s\n", g_global_ndie_name[ndie_id]); - for (i = 0; i < macro_num; i++) { - for (j = macro_info[i].lane_s; j <= macro_info[i].lane_e; j++) -- Info("PCIe Base", "\t\tmacro %d \t lane: %d\n", macro_info[i].id, j); -+ Info("\t\tmacro %d \t lane: %d\n", macro_info[i].id, j); - } - return 0; - } -@@ -88,10 +87,10 @@ static int pcie_portid_serdes_relation(const struct pcie_macro_info *macro_info, - int pcie_port_distribution_get(uint32_t chip_id) - { - struct hikp_cmd_header req_header; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - struct pcie_info_req_para req_data = { 0 }; - uint32_t pair_num; -- struct pcie_port_info *port_info; -+ struct pcie_port_info *port_info = NULL; - uint32_t i; - int ret; - -@@ -104,14 +103,14 @@ int pcie_port_distribution_get(uint32_t chip_id) - goto free_cmd_ret; - - port_info = (struct pcie_port_info *)cmd_ret->rsp_data; -- Info("PCIe Base", "Port Distribution Info (CHIP : 0x%x)Port_id Port_width\n", chip_id); -+ Info("Port Distribution Info (CHIP : 0x%x)Port_id Port_width\n", chip_id); - for (i = 0; i < pair_num; i++) { - if (port_info->info_pair[i].port_width >= HIKP_ARRAY_SIZE(g_global_width_name)) { -- Info("PCIe Base", "port_id[%u] %s\n", port_info->info_pair[i].port_id, -+ Info("port_id[%u] %s\n", port_info->info_pair[i].port_id, - "UNKNOWN_WIDTH"); - continue; - } -- Info("PCIe Base", "port_id[%u] %s\n", port_info->info_pair[i].port_id, -+ Info("port_id[%u] %s\n", port_info->info_pair[i].port_id, - g_global_width_name[port_info->info_pair[i].port_width]); - pcie_portid_serdes_relation(port_info->info_pair[i].macro_info, - port_info->info_pair[i].macro_num, -@@ -130,13 +129,12 @@ static int port_err_state_rsp_data_check(struct hikp_cmd_ret *cmd_ret) - - ret = hikp_rsp_normal_check(cmd_ret); - if (ret) { -- Err("PCIe Base", "error state get cmd_ret normal check failed, ret: %d.\n", ret); -+ Err("error state get cmd_ret normal check failed, ret: %d.\n", ret); - return ret; - } - rsp_data_size = cmd_ret->rsp_data_num * sizeof(uint32_t); - if (rsp_data_size < sizeof(struct pcie_err_state)) { -- Err("PCIe Base", -- "err state get rsp size check failed, rsp size: %u, expect size:%u.\n", -+ Err("err state get rsp size check failed, rsp size: %u, expect size:%u.\n", - rsp_data_size, sizeof(struct pcie_err_state)); - return -EINVAL; - } -@@ -147,9 +145,9 @@ static int port_err_state_rsp_data_check(struct hikp_cmd_ret *cmd_ret) - int pcie_error_state_get(uint32_t port_id) - { - struct hikp_cmd_header req_header; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - struct pcie_info_req_para req_data = { 0 }; -- struct pcie_err_state *state; -+ struct pcie_err_state *state = NULL; - int ret; - - req_data.interface_id = port_id; -@@ -162,17 +160,17 @@ int pcie_error_state_get(uint32_t port_id) - - state = (struct pcie_err_state *)cmd_ret->rsp_data; - -- Info("PCIe Base", "phy_lane_err_counter = %u\n", state->test_cnt.bits.phy_lane_err_counter); -- Info("PCIe Base", "symbol_unlock_counter = %u\n", -+ Info("phy_lane_err_counter = %u\n", state->test_cnt.bits.phy_lane_err_counter); -+ Info("symbol_unlock_counter = %u\n", - state->symbol_unlock_cnt.bits.symbol_unlock_counter); -- Info("PCIe Base", "mac_int_status = 0x%x\n", state->mac_int_status); -- Info("PCIe Base", "loop_back_link_data_err_cnt = %u\n", -+ Info("mac_int_status = 0x%x\n", state->mac_int_status); -+ Info("loop_back_link_data_err_cnt = %u\n", - state->loop_link_data_err_cnt.bits.loop_back_link_data_err_cnt); -- Info("PCIe Base", "pcs_rx_err_cnt = %u\n", state->rx_err_cnt.bits.pcs_rx_err_cnt); -- Info("PCIe Base", "reg_framing_err_count = %u\n", -+ Info("pcs_rx_err_cnt = %u\n", state->rx_err_cnt.bits.pcs_rx_err_cnt); -+ Info("reg_framing_err_count = %u\n", - state->framing_err_cnt.bits.reg_framing_err_count); -- Info("PCIe Base", "dl_lcrc_err_num = %u\n", state->lcrc_err_num.bits.dl_lcrc_err_num); -- Info("PCIe Base", "dl_dcrc_err_num = %u\n", state->dcrc_err_num.bits.dl_dcrc_err_num); -+ Info("dl_lcrc_err_num = %u\n", state->lcrc_err_num.bits.dl_lcrc_err_num); -+ Info("dl_dcrc_err_num = %u\n", state->dcrc_err_num.bits.dl_dcrc_err_num); - free_cmd_ret: - free(cmd_ret); - -@@ -182,7 +180,7 @@ free_cmd_ret: - int pcie_error_state_clear(uint32_t port_id) - { - struct hikp_cmd_header req_header; -- struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_ret *cmd_ret = NULL; - struct pcie_info_req_para req_data = { 0 }; - int ret; - -diff --git a/pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c b/pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c -index f6399b4..6d1c674 100644 ---- a/pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c -+++ b/pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c -@@ -60,7 +60,7 @@ static int pcie_port_set(struct major_cmd_ctrl *self, const char *argv) - - static int dump_level_set(struct major_cmd_ctrl *self, const char *argv) - { -- uint32_t val; -+ uint32_t val = 0; - int ret; - - ret = string_toui(argv, &val); -diff --git a/sas/sas_func/sas_analy_queue.c b/sas/sas_func/sas_analy_queue.c -index 8fca197..b27ba60 100644 ---- a/sas/sas_func/sas_analy_queue.c -+++ b/sas/sas_func/sas_analy_queue.c -@@ -40,7 +40,7 @@ static int sas_get_res(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - hikp_cmd_init(&req_header, SAS_MOD, SAS_ANACQ, ANACQ_PRT); - - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL || cmd_ret->status != 0) { -+ if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_analy excutes hikp_cmd_alloc err\n"); - free(cmd_ret); - return -EINVAL; -@@ -57,7 +57,7 @@ static void sas_print_prt(const uint32_t *reg_save, uint32_t reg_num) - { - uint32_t i; - -- if (reg_num == 0) { -+ if (reg_num < REG_NUM_PTR_MAX) { - printf("SAS get queue pointer is failed\n"); - return; - } -@@ -80,7 +80,7 @@ static void sas_print_dqnum(const uint32_t *reg_save, uint32_t reg_num) - - static void sas_print_cqnum(const uint32_t *reg_save, uint32_t reg_num) - { -- if (reg_num < CQ_COAL_CNT) { -+ if (reg_num < REG_NUM_CQ_MAX) { - printf("SAS get cq number is failed\n"); - return; - } -diff --git a/sas/sas_func/sas_analy_queue.h b/sas/sas_func/sas_analy_queue.h -index a6e2223..59100f4 100644 ---- a/sas/sas_func/sas_analy_queue.h -+++ b/sas/sas_func/sas_analy_queue.h -@@ -18,6 +18,8 @@ - - #define REG_NUM_DQ 2 - #define REG_NUM_CQ 2 -+#define REG_NUM_CQ_MAX 4 -+#define REG_NUM_PTR_MAX 32 - #define CQE_NUM_BYTE 0 - #define DQE_NUM_REG 2 - #define CQ_COAL 1 -diff --git a/sas/sas_func/sas_common.h b/sas/sas_func/sas_common.h -index 1bace0c..c33a2fe 100644 ---- a/sas/sas_func/sas_common.h -+++ b/sas/sas_func/sas_common.h -@@ -22,6 +22,10 @@ - #define IPTT_ICT_STATUS 29 - #define LINK_SPEED_OFFSET 8 - #define LINK_SPEED_WIDTH 4 -+#define REG_NUM_DEV_LINK_MAX 3 -+#define REG_NUM_DQE_MAX 8 -+#define REG_NUM_ERR_CODE_ALL_MAX 32 -+#define REG_NUM_ERR_CODE_MAX 8 - - #define DWS_LOST 0 - #define RESET_PROB 1 -diff --git a/sas/sas_func/sas_dump_reg.c b/sas/sas_func/sas_dump_reg.c -index 5736726..9a1da3a 100644 ---- a/sas/sas_func/sas_dump_reg.c -+++ b/sas/sas_func/sas_dump_reg.c -@@ -32,7 +32,7 @@ static int sas_get_reg(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - - hikp_cmd_init(&req_header, SAS_MOD, SAS_DUMP, cmd->sas_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL || cmd_ret->status != 0) { -+ if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_dump excutes hikp_cmd_alloc err\n"); - free(cmd_ret); - return -1; -diff --git a/sas/sas_func/sas_read_dev.c b/sas/sas_func/sas_read_dev.c -index 670e2d4..ede5d74 100644 ---- a/sas/sas_func/sas_read_dev.c -+++ b/sas/sas_func/sas_read_dev.c -@@ -33,7 +33,7 @@ static int sas_get_dev(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - - hikp_cmd_init(&req_header, SAS_MOD, SAS_DEV, cmd->sas_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL || cmd_ret->status != 0) { -+ if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_dqe excutes hikp_cmd_alloc err\n"); - free(cmd_ret); - return -EINVAL; -@@ -78,7 +78,7 @@ static void print_dev_link(const uint32_t *reg_save, uint32_t reg_num) - - static void sas_print_dev(const uint32_t *reg_save, uint32_t reg_num, uint32_t cmd_type) - { -- if (reg_num == 0) { -+ if (reg_num < REG_NUM_DEV_LINK_MAX) { - printf("SAS device is failed\n"); - return; - } -diff --git a/sas/sas_func/sas_read_dqe.c b/sas/sas_func/sas_read_dqe.c -index 7d49c0a..072c1dc 100644 ---- a/sas/sas_func/sas_read_dqe.c -+++ b/sas/sas_func/sas_read_dqe.c -@@ -33,7 +33,7 @@ static int sas_get_dqe(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - - hikp_cmd_init(&req_header, SAS_MOD, SAS_DQE, cmd->sas_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL || cmd_ret->status != 0) { -+ if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_dqe excutes hikp_cmd_alloc err\n"); - free(cmd_ret); - return -EINVAL; -@@ -105,7 +105,7 @@ int sas_dqe(const struct tool_sas_cmd *cmd) - if (ret) - return ret; - -- if (reg_num == 0) { -+ if (reg_num < REG_NUM_DQE_MAX) { - printf("SAS dqe is failed\n"); - return -EINVAL; - } -diff --git a/sas/sas_func/sas_read_errcode.c b/sas/sas_func/sas_read_errcode.c -index 6c7850e..da1157b 100644 ---- a/sas/sas_func/sas_read_errcode.c -+++ b/sas/sas_func/sas_read_errcode.c -@@ -31,7 +31,7 @@ static int sas_get_errcode(const struct tool_sas_cmd *cmd, uint32_t *reg_save, u - - hikp_cmd_init(&req_header, SAS_MOD, SAS_ERRCODE, cmd->sas_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL || cmd_ret->status != 0) { -+ if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_errcode excutes hikp_cmd_alloc err\n"); - free(cmd_ret); - return -EINVAL; -@@ -55,11 +55,12 @@ static void sas_print_errcode(uint32_t cmd_type, const uint32_t *reg_save, uint3 - "OPEN_REJ" - }; - -- if (reg_num == 0) { -- printf("SAS error code read is failed\n"); -- return; -- } - if (cmd_type == ERRCODE_ALL) { -+ if (reg_num < REG_NUM_ERR_CODE_ALL_MAX) { -+ printf("SAS error code read is failed\n"); -+ return; -+ } -+ - printf(" DWS_LOST RESET_PROB CRC_FAIL OPEN_REJ\n"); - for (i = 0; i < reg_num; i += SAS_ERR_NUM) { - printf("phy%u 0x%08x 0x%08x 0x%08x 0x%08x\n", i / SAS_ERR_NUM, -@@ -67,6 +68,11 @@ static void sas_print_errcode(uint32_t cmd_type, const uint32_t *reg_save, uint3 - reg_save[i + CRC_FAIL], reg_save[i + OPEN_REJ]); - } - } else { -+ if (reg_num < REG_NUM_ERR_CODE_MAX) { -+ printf("SAS error code read is failed\n"); -+ return; -+ } -+ - printf(" %s\n", errcode_type[cmd_type]); - for (i = 0; i < reg_num; i++) - printf("phy%u 0x%08x\n", i, reg_save[i]); -diff --git a/sata/sata_func/sata_dump_reg.c b/sata/sata_func/sata_dump_reg.c -index b4ff35f..691989e 100644 ---- a/sata/sata_func/sata_dump_reg.c -+++ b/sata/sata_func/sata_dump_reg.c -@@ -33,7 +33,7 @@ static int sata_get_reg(const struct tool_sata_cmd *cmd, uint32_t *reg_save, uin - - hikp_cmd_init(&req_header, SATA_MOD, SATA_DUMP, cmd->sata_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL || cmd_ret->status != 0) { -+ if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("hikp_data_proc err\n"); - free(cmd_ret); - return -1; -diff --git a/tool_lib/op_logs.c b/tool_lib/op_logs.c -index 9fb91d8..b6ecc48 100644 ---- a/tool_lib/op_logs.c -+++ b/tool_lib/op_logs.c -@@ -57,7 +57,7 @@ static int op_log_write_buffer(const char *log_data, const char *log_dir) - int ret; - - sigfillset(&sigset); -- sigprocmask(SIG_BLOCK, &sigset, NULL); -+ (void)sigprocmask(SIG_BLOCK, &sigset, NULL); - ret = tool_flock(OP_LOG_LOCK_NAME, UDA_FLOCK_BLOCK, &op_lock_fd, log_dir); - if (ret == -ENOENT) { - HIKP_ERROR_PRINT("Folder or file required by the operation is not exist.\n"); -@@ -73,7 +73,7 @@ static int op_log_write_buffer(const char *log_data, const char *log_dir) - op_log_write(log_data); - tool_unlock(&op_lock_fd, UDA_FLOCK_BLOCK); - g_log_info = true; -- sigprocmask(SIG_UNBLOCK, &sigset, NULL); -+ (void)sigprocmask(SIG_UNBLOCK, &sigset, NULL); - return 0; - } - -@@ -104,13 +104,13 @@ static double op_log_diff_timeval(const struct timeval *now, const struct timeva - static int op_log_add_time_to_log(char *log_base, int *offset, uint32_t flag) - { - static struct timeval g_tv; -- struct timeval tv; -- struct tm ptm; -+ struct timeval tv = {0}; -+ struct tm ptm = {0}; - int len = 0; - int ret; - - (void)gettimeofday(&tv, NULL); -- localtime_r(&tv.tv_sec, &ptm); -+ (void)localtime_r(&tv.tv_sec, &ptm); - if (flag == LOG_FLAG_DATE_TIME) { - g_tv = tv; - len = (int)strftime(log_base + *offset, (OP_LOG_FILE_W_MAXSIZE + 1 - *offset), -@@ -186,9 +186,7 @@ static int op_log_file_rollback(const char *op_log_backup, const char *log_dir) - snprintf(rollback_log + offset, - (uint32_t)(OP_LOG_FILE_W_MAXSIZE + 1 - offset), OP_LOG_ITEM_END); - -- op_log_write_buffer(rollback_log, log_dir); -- -- return ret; -+ return op_log_write_buffer(rollback_log, log_dir); - } - - static int op_log_dir_mk(const char *log_path) -diff --git a/tool_lib/tool_lib.c b/tool_lib/tool_lib.c -index 5c1a02d..4d02bdd 100644 ---- a/tool_lib/tool_lib.c -+++ b/tool_lib/tool_lib.c -@@ -21,7 +21,7 @@ int string_toui(const char *nptr, uint32_t *value) - char *endptr = NULL; - int64_t tmp_value; - -- if (nptr == NULL) -+ if (nptr == NULL || value == NULL) - return -EINVAL; - - tmp_value = strtol(nptr, &endptr, 0); -@@ -37,7 +37,7 @@ int string_toub(const char *nptr, uint8_t *value) - char *endptr = NULL; - int64_t tmp_value; - -- if (nptr == NULL) -+ if (nptr == NULL || value == NULL) - return -EINVAL; - - tmp_value = strtol(nptr, &endptr, 0); -@@ -141,14 +141,14 @@ int check_file_access(const char *file_dir) - - static uint32_t get_file_size(const char *file_dir) - { -- char format_dir[TOOL_REAL_PATH_MAX_LEN] = {0}; -+ char format_dir[PATH_MAX + 1] = {0}; - struct stat file_stat = { 0 }; - int ret; - - if (file_dir == NULL) - return 0; - -- ret = check_file_path_dir(file_dir, format_dir, TOOL_REAL_PATH_MAX_LEN); -+ ret = check_file_path_dir(file_dir, format_dir, (PATH_MAX + 1)); - if (ret) { - HIKP_ERROR_PRINT("This file path[%s] is not exist.\n", file_dir); - return 0; -@@ -313,7 +313,7 @@ int generate_file_name(unsigned char *file_name, - #define RANDOM_STR_LENGTH 7 - char str_r[RANDOM_STR_LENGTH] = {0}; - time_t time_seconds = time(0); -- struct tm timeinfo; -+ struct tm timeinfo = {0}; - int ret; - - ret = get_rand_str(str_r, RANDOM_STR_LENGTH); -@@ -321,7 +321,7 @@ int generate_file_name(unsigned char *file_name, - HIKP_ERROR_PRINT("get randrom string failed.\n"); - return ret; - } -- localtime_r(&time_seconds, &timeinfo); -+ (void)localtime_r(&time_seconds, &timeinfo); - ret = snprintf((char *)file_name, file_name_len, "%s_%d_%d_%d_%d_%d_%d_%s.log", prefix, - timeinfo.tm_year + START_YEAR, timeinfo.tm_mon + 1, timeinfo.tm_mday, - timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec, str_r); --- -2.45.0.windows.1 - diff --git a/0069-hikptool-Support-static-compilation-for-hikptool.patch b/0069-hikptool-Support-static-compilation-for-hikptool.patch deleted file mode 100644 index d8ea370..0000000 --- a/0069-hikptool-Support-static-compilation-for-hikptool.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 0f262056cdc114738a8da3947185a89d10ade581 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 12 Nov 2024 19:23:50 +0800 -Subject: [PATCH 07/27] hikptool: Support static compilation for hikptool - -Support static compilation by add the option ENABLE_STATIC, -Please refer to the following usage methods: - -``` -cmake ${src} -DENABLE_STATIC=1 -``` - -Signed-off-by: Chengchang Tang ---- - CMakeLists.txt | 14 +++++++++++++- - libhikptdev/src/rciep/CMakeLists.txt | 6 +++++- - 2 files changed, 18 insertions(+), 2 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index cbd063c..f2ffe6c 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -26,6 +26,8 @@ macro(get_header_dir_recurse HEADER_DIR_LIST) - set(${HEADER_DIR_LIST} ${DIR_LIST}) - endmacro() - -+option(ENABLE_STATIC "Make tool run as independently as possible" off) -+ - file(GLOB_RECURSE HIKPTOOL_SRC - ${CMAKE_CURRENT_SOURCE_DIR}/cxl/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/net/*.c -@@ -38,13 +40,23 @@ file(GLOB_RECURSE HIKPTOOL_SRC - ${CMAKE_CURRENT_SOURCE_DIR}/tool_lib/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/hikp_init_main.c - ) -+ - add_subdirectory(libhikptdev) - add_executable(hikptool ${HIKPTOOL_SRC}) - get_header_dir_recurse(HIKPTOOL_HEADER_DIR) - target_include_directories(hikptool PRIVATE ${HIKPTOOL_HEADER_DIR}) - target_link_directories(hikptool PRIVATE ${CMAKE_INSTALL_PREFIX}/lib) - target_link_libraries(hikptool PRIVATE KPTDEV_SO) -+if (ENABLE_STATIC) -+ # I don¡¯t know why, but once you add double quotes to these -+ # link parameters, an error will be reported. -+ set(EXT_LINK_FLAGS -static-libgcc -static-libstdc++ -static) -+ set_target_properties(hikptool PROPERTIES LINK_SEARCH_START_STATIC ON) -+ set_target_properties(hikptool PROPERTIES LINK_SEARCH_END_STATIC ON) -+else() -+ set(EXT_LINK_FLAGS "-fPIE") -+endif() - target_link_options(hikptool PRIVATE -- -Wl,-z,relro,-z,now -Wl,-z,noexecstack -fPIE -pie -+ -Wl,-z,relro,-z,now -Wl,-z,noexecstack -pie ${EXT_LINK_FLAGS} - -s -lpthread -ldl -lm -lrt -T ${CMAKE_CURRENT_SOURCE_DIR}/hikp_register.ld) - install(TARGETS hikptool RUNTIME DESTINATION bin OPTIONAL) -diff --git a/libhikptdev/src/rciep/CMakeLists.txt b/libhikptdev/src/rciep/CMakeLists.txt -index 5017f5b..e3f96c0 100644 ---- a/libhikptdev/src/rciep/CMakeLists.txt -+++ b/libhikptdev/src/rciep/CMakeLists.txt -@@ -13,7 +13,11 @@ cmake_minimum_required(VERSION 3.0.0) - - set(KPTDEV_SO_NAME hikptdev) - --add_library(KPTDEV_SO SHARED hikpt_rciep.c) -+if (ENABLE_STATIC) -+ add_library(KPTDEV_SO STATIC hikpt_rciep.c) -+else() -+ add_library(KPTDEV_SO SHARED hikpt_rciep.c) -+endif() - - target_include_directories(KPTDEV_SO PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../include) - --- -2.45.0.windows.1 - diff --git a/0070-hikptool-nic-Fix-the-Code-review-comments.patch b/0070-hikptool-nic-Fix-the-Code-review-comments.patch deleted file mode 100644 index ffc2ef0..0000000 --- a/0070-hikptool-nic-Fix-the-Code-review-comments.patch +++ /dev/null @@ -1,265 +0,0 @@ -From 2994a8d169adc6ba5b543a2f35b579e437044beb Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 6 Aug 2024 16:43:24 +0800 -Subject: [PATCH 08/27] hikptool/nic: Fix the Code review comments - -The value got from the firmware may cause the following problem. - 1. Out-of-bounds access may occur. - 2. Apply for memory of size 0. - 3. Integer overflow may happen. -This patch fixes it. - -Signed-off-by: Jie Hai ---- - net/nic/nic_ppp/hikp_nic_ppp.c | 142 +++++++++++++++++++++++++++++++-- - 1 file changed, 137 insertions(+), 5 deletions(-) - -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index 4dbe8d6..c070666 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -42,6 +42,8 @@ static int hikp_nic_query_ppp_by_entryid(struct hikp_cmd_header *req_header, - #define NIC_PPP_VLAN_TBL_NAME "vlan" - #define NIC_PPP_MNG_TBL_NAME "mng" - -+#define HIKP_PPP_MAX_MAC_ID_NUM 8 -+ - static const struct ppp_feature_cmd g_ppp_feature_cmd[] = { - {NIC_PPP_MAC_TBL_NAME, NIC_MAC_TBL_DUMP, true, - hikp_nic_query_ppp_by_entryid, hikp_nic_ppp_show_mac_tbl}, -@@ -259,6 +261,9 @@ static void hikp_nic_ppp_show_mac_tbl(const void *data) - - hikp_nic_ppp_show_key_mem((struct nic_mac_tbl *)data, true); - -+ if (g_ppp_hw_res.overflow_cam_size == 0) -+ return; -+ - of_uc_entry = (struct mac_vlan_uc_entry *)calloc(g_ppp_hw_res.overflow_cam_size, - sizeof(struct mac_vlan_uc_entry)); - if (of_uc_entry == NULL) { -@@ -326,8 +331,9 @@ static void hikp_nic_ppp_show_vf_vlan_info(const struct vf_vlan_tbl *vf_tbl, uin - offset = abs_func_id % HIKP_NIC_PPP_FUNC_BITMAP_SIZE; - hikp_nic_ppp_get_func_name(func_name, sizeof(func_name), func_id); - printf("%s_abs_func_id: %u\n", func_name, -- (uint32_t)(g_ppp_hw_res.abs_func_id_base + func_id - 1)); -+ (uint32_t)(hw_res->abs_func_id_base + func_id - 1)); - printf("%s VLAN id:\n\t", func_name); -+ - for (i = 0; i < vf_tbl->entry_size; i++) { - vf_entry = &vf_tbl->entry[i]; - if (hikp_get_bit(vf_entry->func_bitmap[idx], offset) != 0) { -@@ -490,10 +496,11 @@ static int hikp_nic_ppp_get_blk(struct hikp_cmd_header *req_header, - goto out; - - rsp = (struct nic_ppp_rsp *)cmd_ret->rsp_data; -- if (rsp->rsp_head.cur_blk_size > buf_len) { -+ if (rsp->rsp_head.cur_blk_size > buf_len || -+ rsp->rsp_head.cur_blk_size > sizeof(rsp->rsp_data)) { - HIKP_ERROR_PRINT("nic_ppp block context copy size error, " -- "buffer size=%zu, data size=%u.\n", -- buf_len, rsp->rsp_head.cur_blk_size); -+ "dst buffer size=%zu, src buffer size=%zu, data size=%u.\n", -+ buf_len, sizeof(rsp->rsp_data), rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; - } -@@ -532,6 +539,17 @@ static int hikp_nic_ppp_query_uc_mac_addr(struct hikp_cmd_header *req_header, - idx, ret); - return ret; - } -+ if (rsp_head.next_entry_idx <= idx) { -+ HIKP_ERROR_PRINT("Next entry index (%u) should be greater than current (%u).\n", -+ rsp_head.next_entry_idx, idx); -+ return -EINVAL; -+ } -+ if (entry_size + rsp_head.cur_blk_entry_cnt > max_hw_entry_size) { -+ HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ "is over the maximum entry nubmer (%u) of unicast MAC table.\n", -+ entry_size + rsp_head.cur_blk_entry_cnt, idx, max_hw_entry_size); -+ return -EINVAL; -+ } - entry_size += rsp_head.cur_blk_entry_cnt; - idx = rsp_head.next_entry_idx; - } -@@ -563,6 +581,17 @@ static int hikp_nic_ppp_query_mc_mac_addr(struct hikp_cmd_header *req_header, - idx, ret); - return ret; - } -+ if (rsp_head.next_entry_idx <= idx) { -+ HIKP_ERROR_PRINT("Next entry index (%u) should be greater than current (%u).\n", -+ rsp_head.next_entry_idx, idx); -+ return -EINVAL; -+ } -+ if (entry_size + rsp_head.cur_blk_entry_cnt > max_hw_entry_size) { -+ HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ "is over the maximum entry nubmer (%u) of multicast MAC table.\n", -+ entry_size + rsp_head.cur_blk_entry_cnt, idx, max_hw_entry_size); -+ return -EINVAL; -+ } - entry_size += rsp_head.cur_blk_entry_cnt; - idx = rsp_head.next_entry_idx; - } -@@ -623,6 +652,17 @@ static int hikp_nic_ppp_query_vf_vlan_tbl(struct hikp_cmd_header *req_header, - idx, ret); - return ret; - } -+ if (rsp_head.next_entry_idx <= idx) { -+ HIKP_ERROR_PRINT("Next entry index (%u) should be greater than current (%u).\n", -+ rsp_head.next_entry_idx, idx); -+ return -EINVAL; -+ } -+ if (entry_size + rsp_head.cur_blk_entry_cnt > hw_entry_size) { -+ HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ "is over the maximum entry nubmer (%u) of VF VLAN table.\n", -+ entry_size + rsp_head.cur_blk_entry_cnt, idx, hw_entry_size); -+ return -EINVAL; -+ } - entry_size += rsp_head.cur_blk_entry_cnt; - idx = rsp_head.next_entry_idx; - } -@@ -653,6 +693,17 @@ static int hikp_nic_ppp_query_port_vlan_tbl(struct hikp_cmd_header *req_header, - idx, ret); - return ret; - } -+ if (rsp_head.next_entry_idx <= idx) { -+ HIKP_ERROR_PRINT("Next entry index (%u) should be greater than current (%u).\n", -+ rsp_head.next_entry_idx, idx); -+ return -EINVAL; -+ } -+ if (entry_size + rsp_head.cur_blk_entry_cnt > hw_entry_size) { -+ HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ "is over the maximum entry nubmer (%u) of port VLAN table.\n", -+ entry_size + rsp_head.cur_blk_entry_cnt, idx, hw_entry_size); -+ return -EINVAL; -+ } - entry_size += rsp_head.cur_blk_entry_cnt; - idx = rsp_head.next_entry_idx; - } -@@ -704,6 +755,17 @@ static int hikp_nic_query_mng_tbl(struct hikp_cmd_header *req_header, - idx, ret); - return ret; - } -+ if (rsp_head.next_entry_idx <= idx) { -+ HIKP_ERROR_PRINT("Next entry index (%u) should be greater than current (%u).\n", -+ rsp_head.next_entry_idx, idx); -+ return -EINVAL; -+ } -+ if (entry_size + rsp_head.cur_blk_entry_cnt > g_ppp_hw_res.mng_tbl_size) { -+ HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ "is over the maximum entry nubmer (%u) of manager table.\n", -+ entry_size + rsp_head.cur_blk_entry_cnt, idx, g_ppp_hw_res.mng_tbl_size); -+ return -EINVAL; -+ } - entry_size += rsp_head.cur_blk_entry_cnt; - idx = rsp_head.next_entry_idx; - } -@@ -729,6 +791,24 @@ static int hikp_nic_query_ppp_by_entryid(struct hikp_cmd_header *req_header, - return hikp_nic_query_mng_tbl(req_header, &req_data, (struct nic_mng_tbl *)data); - } - -+static int hikp_nic_ppp_check_func_num(void *data) -+{ -+ const struct ppp_feature_cmd *ppp_cmd; -+ uint16_t func_num = 0; -+ -+ ppp_cmd = &g_ppp_feature_cmd[g_ppp_param.feature_idx]; -+ if (ppp_cmd->sub_cmd_code == NIC_PROMISCUOUS_TBL_DUMP) -+ func_num = ((struct nic_promisc_tbl *)data)->func_num; -+ else if (ppp_cmd->sub_cmd_code == NIC_VLAN_OFFLOAD_DUMP) -+ func_num = ((struct nic_vlan_offload_cfg *)data)->func_num; -+ -+ if (func_num > HIKP_NIC_MAX_FUNC_NUM) { -+ HIKP_ERROR_PRINT("Illegal function num(%u) from firmware.\n", func_num); -+ return -EINVAL; -+ } -+ return 0; -+} -+ - static int hikp_nic_query_ppp_by_blkid(struct hikp_cmd_header *req_header, const struct bdf_t *bdf, - void *data, size_t len) - { -@@ -752,6 +832,10 @@ static int hikp_nic_query_ppp_by_blkid(struct hikp_cmd_header *req_header, const - /* Copy the remaining block content if total block number is greater than 1. */ - for (blk_id = 1; blk_id < total_blk_num; blk_id++) { - req_data.block_id = blk_id; -+ if (len <= total_blk_size) { -+ HIKP_ERROR_PRINT("No enough buffer to get block-%u context.\n", blk_id); -+ return -ENOMEM; -+ } - ret = hikp_nic_ppp_get_blk(req_header, &req_data, (uint8_t *)data + total_blk_size, - len - total_blk_size, &rsp_head); - if (ret != 0) { -@@ -761,7 +845,7 @@ static int hikp_nic_query_ppp_by_blkid(struct hikp_cmd_header *req_header, const - total_blk_size += rsp_head.cur_blk_size; - } - -- return ret; -+ return hikp_nic_ppp_check_func_num(data); - } - - static int hikp_nic_ppp_get_hw_resources(const struct bdf_t *bdf, -@@ -975,6 +1059,46 @@ static int hikp_nic_check_func_id_valid(struct major_cmd_ctrl *self, - return 0; - } - -+static int hikp_nic_check_hw_res(struct hikp_nic_ppp_hw_resources *hw_res) -+{ -+ if (!g_ppp_feature_cmd[g_ppp_param.feature_idx].need_query_hw_res) -+ return 0; -+ -+ if (hw_res->max_key_mem_size == 0) { -+ HIKP_ERROR_PRINT("Max key memory size should not be zero!\n"); -+ return -EINVAL; -+ } -+ if (hw_res->port_vlan_tbl_size == 0) { -+ HIKP_ERROR_PRINT("PORT VLAN Table size should not be zero!\n"); -+ return -EINVAL; -+ } -+ if (hw_res->vf_vlan_tbl_size == 0) { -+ HIKP_ERROR_PRINT("VF VLAN Table size should not be zero!\n"); -+ return -EINVAL; -+ } -+ if (hw_res->mng_tbl_size == 0) { -+ HIKP_ERROR_PRINT("VF VLAN Table size (%u)is zero!\n"); -+ return -EINVAL; -+ } -+ if (hw_res->mac_id >= HIKP_PPP_MAX_MAC_ID_NUM) { -+ HIKP_ERROR_PRINT("MAC ID (%u) should be less than %u.\n", -+ hw_res->mac_id, HIKP_PPP_MAX_MAC_ID_NUM); -+ return -EINVAL; -+ } -+ if (hw_res->total_func_num == 0 || hw_res->total_func_num > HIKP_NIC_MAX_FUNC_NUM) { -+ HIKP_ERROR_PRINT("Total_func_num (%u)should be in [1, %u].\n", -+ hw_res->total_func_num, HIKP_NIC_MAX_FUNC_NUM); -+ return -EINVAL; -+ } -+ if (hw_res->abs_func_id_base >= HIKP_NIC_MAX_FUNC_NUM) { -+ HIKP_ERROR_PRINT("Function ID base (%u) should be less than %u.\n", -+ hw_res->abs_func_id_base, HIKP_NIC_MAX_FUNC_NUM); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ - static void hikp_nic_ppp_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_ppp_param.target.bdf; -@@ -995,6 +1119,14 @@ static void hikp_nic_ppp_cmd_execute(struct major_cmd_ctrl *self) - return; - } - -+ ret = hikp_nic_check_hw_res(&g_ppp_hw_res); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "ppp hardware resources obtained is invalid."); -+ self->err_no = ret; -+ return; -+ } -+ - ppp_cmd = &g_ppp_feature_cmd[g_ppp_param.feature_idx]; - ret = hikp_nic_check_func_id_valid(self, ppp_cmd, &g_ppp_param, &g_ppp_hw_res); - if (ret != 0) --- -2.45.0.windows.1 - diff --git a/0071-hikptool-nic-add-check-for-the-value-from-FW.patch b/0071-hikptool-nic-add-check-for-the-value-from-FW.patch deleted file mode 100644 index 8a0dbe1..0000000 --- a/0071-hikptool-nic-add-check-for-the-value-from-FW.patch +++ /dev/null @@ -1,172 +0,0 @@ -From a2514156dfd5ec10fa30e72dbc6496e0b8c87846 Mon Sep 17 00:00:00 2001 -From: Dengdui Huang -Date: Thu, 15 Aug 2024 17:29:32 +0800 -Subject: [PATCH 09/27] hikptool/nic: add check for the value from FW - -The value obtained from the firmware is unreliable, -and the software needs to verify the validity. - -Signed-off-by: Dengdui Huang ---- - net/nic/nic_fd/hikp_nic_fd.c | 44 +++++++++++++++++++++++++++--- - net/nic/nic_qos/hikp_nic_qos.c | 8 ++++-- - net/nic/nic_queue/hikp_nic_queue.c | 8 ++++-- - net/nic/nic_rss/hikp_nic_rss.c | 8 ++++-- - 4 files changed, 55 insertions(+), 13 deletions(-) - -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index e699bf9..3d6a9dc 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -550,7 +550,7 @@ static void hikp_nic_show_fd_counter(const void *data) - - static int hikp_nic_fd_get_blk(struct hikp_cmd_header *req_header, - const struct nic_fd_req_para *req_data, -- void *buf, uint32_t buf_len, struct nic_fd_rsp_head *rsp_head) -+ void *buf, size_t buf_len, struct nic_fd_rsp_head *rsp_head) - { - struct hikp_cmd_ret *cmd_ret; - struct nic_fd_rsp *rsp; -@@ -563,10 +563,12 @@ static int hikp_nic_fd_get_blk(struct hikp_cmd_header *req_header, - } - - rsp = (struct nic_fd_rsp *)cmd_ret->rsp_data; -- if (rsp->rsp_head.cur_blk_size > buf_len) { -+ if (rsp->rsp_head.cur_blk_size > buf_len || -+ rsp->rsp_head.cur_blk_size > sizeof(rsp->rsp_data)) { - HIKP_ERROR_PRINT("nic_fd block context copy size error, " -- "buffer size=%u, data size=%u.\n", -- buf_len, rsp->rsp_head.cur_blk_size); -+ "dst buffer size=%zu, src buffer size=%zu, " -+ "data size=%u.\n", buf_len, sizeof(rsp->rsp_data), -+ rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; - } -@@ -657,7 +659,19 @@ static int hikp_nic_query_fd_rules(struct hikp_cmd_header *req_header, const str - idx, ret); - return ret; - } -+ if (rsp_head.cur_blk_entry_cnt + entry_cnt > g_fd_hw_info.alloc.stage_entry_num[stage]) { -+ HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " -+ "is over the maximum entry nubmer (%u) of this stage.", -+ rsp_head.cur_blk_entry_cnt + entry_cnt, idx, -+ g_fd_hw_info.alloc.stage_entry_num[stage]); -+ return -EINVAL; -+ } - entry_cnt += rsp_head.cur_blk_entry_cnt; -+ if (rsp_head.next_entry_idx <= idx) { -+ HIKP_ERROR_PRINT("The next entry index (%u) is less than or equal with the curent(%u).\n", -+ rsp_head.next_entry_idx, idx); -+ return -EINVAL; -+ } - idx = rsp_head.next_entry_idx; - if (req_data.query_single_entry == 1) - break; -@@ -702,7 +716,19 @@ static int hikp_nic_query_fd_counter(struct hikp_cmd_header *req_header, const s - idx, ret); - return ret; - } -+ if (rsp_head.cur_blk_entry_cnt + entry_size > g_fd_hw_info.alloc.stage_counter_num[stage]) { -+ HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " -+ "is over the maximum counter nubmer (%u) of this stage.", -+ rsp_head.cur_blk_entry_cnt + entry_size, idx, -+ g_fd_hw_info.alloc.stage_counter_num[stage]); -+ return -EINVAL; -+ } - entry_size += rsp_head.cur_blk_entry_cnt; -+ if (rsp_head.next_entry_idx <= idx) { -+ HIKP_ERROR_PRINT("The next entry index (%u) is less than or equal with the curent(%u).\n", -+ rsp_head.next_entry_idx, idx); -+ return -EINVAL; -+ } - idx = rsp_head.next_entry_idx; - if (req_data.query_single_entry == 1) - break; -@@ -808,6 +834,11 @@ static int hikp_nic_check_fd_hw_info(const struct nic_fd_hw_info *hw_info, - uint16_t i; - - if (strcmp(fd_cmd->feature_name, NIC_FD_RULES_NAME) == 0) { -+ /* Stage2 does not support query. So only stage1 is verified. */ -+ if(hw_info->alloc.stage_entry_num[NIC_FD_STAGE_1] == 0) { -+ HIKP_ERROR_PRINT("The stage1's entry number is zero.\n"); -+ return -EINVAL; -+ } - if (hw_info->mode > FD_MODE_DEPTH_2K_WIDTH_200B_STAGE_2) - HIKP_WARN_PRINT("Unknown fd mode(%u), " - "unsupport for displaying meta data info.\n", -@@ -822,6 +853,11 @@ static int hikp_nic_check_fd_hw_info(const struct nic_fd_hw_info *hw_info, - return -EOPNOTSUPP; - } - } -+ } else if (strcmp(fd_cmd->feature_name, NIC_FD_COUNTER_NAME) == 0) { -+ if (hw_info->alloc.stage_counter_num[NIC_FD_STAGE_1] == 0) { -+ HIKP_ERROR_PRINT("The stage1's counter number is zero.\n"); -+ return -EINVAL; -+ } - } - - return 0; -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index a09b4f1..9e997e4 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -174,10 +174,12 @@ static int hikp_nic_qos_get_blk(struct hikp_cmd_header *req_header, - } - - rsp = (struct nic_qos_rsp *)cmd_ret->rsp_data; -- if (rsp->rsp_head.cur_blk_size > buf_len) { -+ if (rsp->rsp_head.cur_blk_size > buf_len || -+ rsp->rsp_head.cur_blk_size > sizeof(rsp->rsp_data)) { - HIKP_ERROR_PRINT("nic_qos block-%u copy size error, " -- "buffer size=%zu, data size=%u.\n", -- req_data->block_id, buf_len, rsp->rsp_head.cur_blk_size); -+ "dst buffer size=%zu, src buffer size=%zu, " -+ "data size=%u.\n", req_data->block_id, buf_len, -+ sizeof(rsp->rsp_data), rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; - } -diff --git a/net/nic/nic_queue/hikp_nic_queue.c b/net/nic/nic_queue/hikp_nic_queue.c -index fa3b9d3..c73c8f7 100644 ---- a/net/nic/nic_queue/hikp_nic_queue.c -+++ b/net/nic/nic_queue/hikp_nic_queue.c -@@ -246,10 +246,12 @@ static int hikp_nic_queue_get_blk(struct hikp_cmd_header *req_header, - } - - rsp = (struct nic_queue_rsp *)cmd_ret->rsp_data; -- if (rsp->rsp_head.cur_blk_size > buf_len) { -+ if (rsp->rsp_head.cur_blk_size > buf_len || -+ rsp->rsp_head.cur_blk_size > sizeof(rsp->rsp_data)) { - HIKP_ERROR_PRINT("nic_queue block-%u copy size error, " -- "buffer size=%zu, data size=%u.\n", -- req_data->block_id, buf_len, rsp->rsp_head.cur_blk_size); -+ "dst buffer size=%zu, src buffer size=%zu, " -+ "data size=%u.\n", req_data->block_id, buf_len, -+ sizeof(rsp->rsp_data), rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; - } -diff --git a/net/nic/nic_rss/hikp_nic_rss.c b/net/nic/nic_rss/hikp_nic_rss.c -index ff1cfd2..558f931 100644 ---- a/net/nic/nic_rss/hikp_nic_rss.c -+++ b/net/nic/nic_rss/hikp_nic_rss.c -@@ -364,10 +364,12 @@ static int hikp_nic_rss_get_blk(struct hikp_cmd_header *req_header, - } - - rsp = (struct nic_rss_rsp *)cmd_ret->rsp_data; -- if (rsp->rsp_head.cur_blk_size > buf_len) { -+ if (rsp->rsp_head.cur_blk_size > buf_len || -+ rsp->rsp_head.cur_blk_size > sizeof(rsp->rsp_data)) { - HIKP_ERROR_PRINT("nic_rss block-%u copy size error, " -- "buffer size=%zu, data size=%u.\n", -- req_data->block_id, buf_len, rsp->rsp_head.cur_blk_size); -+ "dst buffer size=%zu, src buffer size=%zu, " -+ "data size=%u.\n", req_data->block_id, buf_len, -+ sizeof(rsp->rsp_data), rsp->rsp_head.cur_blk_size); - ret = -EINVAL; - goto out; - } --- -2.45.0.windows.1 - diff --git a/0072-hikptool-nic-Fix-the-Code-review-comments-in-NIC-mod.patch b/0072-hikptool-nic-Fix-the-Code-review-comments-in-NIC-mod.patch deleted file mode 100644 index 22712a7..0000000 --- a/0072-hikptool-nic-Fix-the-Code-review-comments-in-NIC-mod.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 54d612f78a417090bc0449658426d9180b84b2e9 Mon Sep 17 00:00:00 2001 -From: Jijie Shao -Date: Wed, 14 Aug 2024 16:16:57 +0800 -Subject: [PATCH 10/27] hikptool: nic: Fix the Code review comments in NIC - modules - -Fix issue of Out-of-bounds access may occur. - -Signed-off-by: Jijie Shao ---- - net/nic/nic_dfx/hikp_nic_dfx.c | 20 +++++++++++++++++++- - net/nic/nic_mac/hikp_nic_port.c | 7 +++++++ - 2 files changed, 26 insertions(+), 1 deletion(-) - -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.c b/net/nic/nic_dfx/hikp_nic_dfx.c -index 4095229..2cc4367 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.c -+++ b/net/nic/nic_dfx/hikp_nic_dfx.c -@@ -21,6 +21,9 @@ - #include "hikp_net_lib.h" - #include "hikp_nic_dfx.h" - -+#define dfx_get_max_reg_bffer_size(rsp_head) \ -+ (uint32_t)((rsp_head)->total_blk_num * MAX_DFX_DATA_NUM * sizeof(uint32_t)) -+ - struct nic_dfx_param g_dfx_param = { 0 }; - - static const struct dfx_module_cmd g_dfx_module_parse[] = { -@@ -138,7 +141,7 @@ static int hikp_nic_get_first_blk_dfx(struct nic_dfx_rsp_head_t *rsp_head, uint3 - rsp_head->total_type_num = 0; - goto err_out; - } -- *max_dfx_size = (uint32_t)(rsp_head->total_blk_num * MAX_DFX_DATA_NUM * sizeof(uint32_t)); -+ *max_dfx_size = dfx_get_max_reg_bffer_size(rsp_head); - *reg_data = (uint32_t *)calloc(1, *max_dfx_size); - if (*reg_data == NULL) { - HIKP_ERROR_PRINT("malloc log memory 0x%x failed.\n", *max_dfx_size); -@@ -284,8 +287,23 @@ static void hikp_nic_dfx_print(const struct nic_dfx_rsp_head_t *rsp_head, uint32 - struct nic_dfx_type_head *type_head; - uint8_t last_type_id = 0; - uint32_t *ptr = reg_data; -+ uint32_t max_size; -+ uint32_t num_u32; - uint8_t i; - -+ max_size = dfx_get_max_reg_bffer_size(rsp_head); -+ for (i = 0; i < rsp_head->total_type_num; i++) { -+ type_head = (struct nic_dfx_type_head *)ptr; -+ num_u32 = type_head->reg_num * WORD_NUM_PER_REG + 1; /* including type_head */ -+ if (max_size < num_u32 * sizeof(uint32_t)) { -+ HIKP_ERROR_PRINT("register real size exceeds the max size\n"); -+ return; -+ } -+ ptr += num_u32; -+ max_size -= num_u32 * sizeof(uint32_t); -+ } -+ -+ ptr = reg_data; - printf("****************** module %s reg dump start ********************\n", - g_dfx_module_parse[g_dfx_param.module_idx].module_name); - for (i = 0; i < rsp_head->total_type_num; i++) { -diff --git a/net/nic/nic_mac/hikp_nic_port.c b/net/nic/nic_mac/hikp_nic_port.c -index 725ef95..f818001 100644 ---- a/net/nic/nic_mac/hikp_nic_port.c -+++ b/net/nic/nic_mac/hikp_nic_port.c -@@ -498,9 +498,16 @@ static void mac_cmd_print_cdr_dfx(struct mac_cmd_cdr_dfx *cdr_dfx, struct mac_po - - static void mac_cmd_disp_cdr_info(struct mac_cmd_cdr_dfx *cdr_dfx) - { -+ uint8_t cdr_max_num = HIKP_ARRAY_SIZE(cdr_dfx->wire_cdr.dfx); -+ - if (!cdr_dfx->cdr_num) - return; - -+ if (cdr_dfx->cdr_num > cdr_max_num) { -+ printf("the cdr_num(%u) exceeds %u\n", cdr_dfx->cdr_num, cdr_max_num); -+ return; -+ } -+ - printf("\n======================== PORT CDR INFO =======================\n"); - printf("direct\t|addr |lane |type |mode |status \n"); - printf("----------------------------------------------------------------------------\n"); --- -2.45.0.windows.1 - diff --git a/0073-hikptool-nic-return-real-errno-if-realpath-failed-in.patch b/0073-hikptool-nic-return-real-errno-if-realpath-failed-in.patch deleted file mode 100644 index 0c3df09..0000000 --- a/0073-hikptool-nic-return-real-errno-if-realpath-failed-in.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 0a53156f7281337ac037ea334f7011b54a6f5655 Mon Sep 17 00:00:00 2001 -From: Peiyang Wang -Date: Tue, 20 Aug 2024 16:33:35 +0800 -Subject: [PATCH 11/27] hikptool: nic: return real errno if realpath failed in - NIC module - -Return real errno if realpath failed. - -Signed-off-by: Peiyang Wang ---- - net/hikp_net_lib.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/net/hikp_net_lib.c b/net/hikp_net_lib.c -index 8db4ad5..32b278b 100644 ---- a/net/hikp_net_lib.c -+++ b/net/hikp_net_lib.c -@@ -25,7 +25,7 @@ - - static int hikp_read_net_pci_info(const char *file_path, char *content, size_t len) - { -- char path[PATH_MAX + 1] = { 0 }; -+ char path[PATH_MAX] = { 0 }; /* PATH_MAX includes the \0 so +1 is not required */ - int ret; - int fd; - -@@ -35,9 +35,12 @@ static int hikp_read_net_pci_info(const char *file_path, char *content, size_t l - if (len > MAX_PCI_ID_LEN + 1 || len < 1) - return -EINVAL; - -- if (strlen(file_path) > PATH_MAX || realpath(file_path, path) == NULL) -+ if (strlen(file_path) > PATH_MAX) - return -ENOENT; - -+ if (!realpath(file_path, path)) -+ return -errno; -+ - fd = open(path, O_RDONLY); - if (fd < 0) - return -EPERM; --- -2.45.0.windows.1 - diff --git a/0074-hikptool-nic-return-real-cmd-status-if-alloc-failed-.patch b/0074-hikptool-nic-return-real-cmd-status-if-alloc-failed-.patch deleted file mode 100644 index 98e93c2..0000000 --- a/0074-hikptool-nic-return-real-cmd-status-if-alloc-failed-.patch +++ /dev/null @@ -1,165 +0,0 @@ -From 40f0b1281cb66cbd19c7ffdab7746857a4d89409 Mon Sep 17 00:00:00 2001 -From: Peiyang Wang -Date: Tue, 20 Aug 2024 16:46:41 +0800 -Subject: [PATCH 12/27] hikptool: nic: return real cmd status if alloc failed - in NIC module - -return real cmd status if alloc failed - -Signed-off-by: Peiyang Wang ---- - net/nic/nic_fec/hikp_nic_fec.c | 11 ++++++----- - net/nic/nic_ft/hikp_nic_port_fault.c | 9 +++++---- - net/nic/nic_gro/hikp_nic_gro.c | 11 ++++++----- - net/nic/nic_torus/hikp_nic_torus.c | 9 +++++---- - 4 files changed, 22 insertions(+), 18 deletions(-) - -diff --git a/net/nic/nic_fec/hikp_nic_fec.c b/net/nic/nic_fec/hikp_nic_fec.c -index 342b3eb..edea28b 100644 ---- a/net/nic/nic_fec/hikp_nic_fec.c -+++ b/net/nic/nic_fec/hikp_nic_fec.c -@@ -22,19 +22,20 @@ static struct tool_target g_fec_target; - - static int hikp_nic_fec_err_query(const struct bdf_t *bdf, struct nic_fec_err_info *info) - { -- struct nic_fec_req_para req = { 0 }; - struct hikp_cmd_header header = { 0 }; -+ struct nic_fec_req_para req = { 0 }; - struct hikp_cmd_ret *cmd_ret; - struct nic_fec_rsp *rsp; -+ int ret; - - req.bdf = *bdf; - hikp_cmd_init(&header, NIC_MOD, GET_FEC_INFO_CMD, NIC_FEC_ERR_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- HIKP_ERROR_PRINT("fail to get fec info, retcode: %u\n", -- cmd_ret ? cmd_ret->status : EIO); -+ ret = cmd_ret ? -cmd_ret->status : -EIO; -+ HIKP_ERROR_PRINT("fail to get fec info, retcode: %d\n", ret); - free(cmd_ret); -- return -EIO; -+ return ret; - } - - rsp = (struct nic_fec_rsp *)cmd_ret->rsp_data; -@@ -111,7 +112,7 @@ static void hikp_nic_fec_err_show(const struct nic_fec_err_info *info) - static void hikp_nic_fec_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_fec_target.bdf; -- struct nic_fec_err_info info; -+ struct nic_fec_err_info info = { 0 }; - int ret; - - ret = hikp_nic_fec_err_query(bdf, &info); -diff --git a/net/nic/nic_ft/hikp_nic_port_fault.c b/net/nic/nic_ft/hikp_nic_port_fault.c -index fd94214..85fa874 100644 ---- a/net/nic/nic_ft/hikp_nic_port_fault.c -+++ b/net/nic/nic_ft/hikp_nic_port_fault.c -@@ -26,18 +26,19 @@ static int hikp_nic_port_fault_query(const struct bdf_t *bdf, - struct hikp_cmd_header header = { 0 }; - struct nic_port_fault_rsp *rsp; - struct hikp_cmd_ret *cmd_ret; -+ int ret = 0; - - req.bdf = *bdf; - hikp_cmd_init(&header, NIC_MOD, GET_PORT_FAULT_STATUS, - NIC_PORT_FAULT_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- HIKP_ERROR_PRINT("fail to get port fault, retcode: %u\n", -- cmd_ret ? cmd_ret->status : EIO); -+ ret = cmd_ret ? -cmd_ret->status : -EIO; -+ HIKP_ERROR_PRINT("fail to get port fault, retcode: %d\n", ret); - if (cmd_ret != NULL) - free(cmd_ret); - -- return -EIO; -+ return ret; - } - - rsp = (struct nic_port_fault_rsp *)cmd_ret->rsp_data; -@@ -83,7 +84,7 @@ static void hikp_nic_port_fault_show(struct nic_port_fault_status *info) - static void hikp_nic_port_fault_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_port_fault_target.bdf; -- struct nic_port_fault_status info; -+ struct nic_port_fault_status info = { 0 }; - int ret; - - ret = hikp_nic_port_fault_query(bdf, &info); -diff --git a/net/nic/nic_gro/hikp_nic_gro.c b/net/nic/nic_gro/hikp_nic_gro.c -index 84b54c8..d897f11 100644 ---- a/net/nic/nic_gro/hikp_nic_gro.c -+++ b/net/nic/nic_gro/hikp_nic_gro.c -@@ -22,19 +22,20 @@ static struct tool_target g_gro_target; - - static int hikp_nic_gro_query(const struct bdf_t *bdf, struct nic_gro_info *info) - { -- struct nic_gro_req_para req = { 0 }; - struct hikp_cmd_header header = { 0 }; -+ struct nic_gro_req_para req = { 0 }; - struct hikp_cmd_ret *cmd_ret; - struct nic_gro_rsp *rsp; -+ int ret = 0; - - req.bdf = *bdf; - hikp_cmd_init(&header, NIC_MOD, GET_GRO_INFO_CMD, NIC_GRO_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- HIKP_ERROR_PRINT("fail to get gro info, retcode: %u\n", -- cmd_ret ? cmd_ret->status : EIO); -+ ret = cmd_ret ? -cmd_ret->status : -EIO; -+ HIKP_ERROR_PRINT("fail to get gro info, retcode: %d\n", ret); - free(cmd_ret); -- return -EIO; -+ return ret; - } - - rsp = (struct nic_gro_rsp *)cmd_ret->rsp_data; -@@ -55,7 +56,7 @@ static void hikp_nic_gro_show(const struct nic_gro_info *info) - static void hikp_nic_gro_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_gro_target.bdf; -- struct nic_gro_info info; -+ struct nic_gro_info info = { 0 }; - int ret; - - ret = hikp_nic_gro_query(bdf, &info); -diff --git a/net/nic/nic_torus/hikp_nic_torus.c b/net/nic/nic_torus/hikp_nic_torus.c -index 4baede6..9483bfe 100644 ---- a/net/nic/nic_torus/hikp_nic_torus.c -+++ b/net/nic/nic_torus/hikp_nic_torus.c -@@ -27,16 +27,17 @@ static int hikp_nic_torus_query(const struct bdf_t *bdf, - struct hikp_cmd_header header = { 0 }; - struct hikp_cmd_ret *cmd_ret; - struct nic_torus_rsp *rsp; -+ int ret = 0; - - req.bdf = *bdf; - hikp_cmd_init(&header, NIC_MOD, GET_TORUS_INFO_CMD, NIC_TORUS_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- HIKP_ERROR_PRINT("fail to get torus info, retcode: %u\n", -- cmd_ret ? cmd_ret->status : EIO); -+ ret = cmd_ret ? -cmd_ret->status : -EIO; -+ HIKP_ERROR_PRINT("fail to get torus info, retcode: %d\n", ret); - if (cmd_ret) - free(cmd_ret); -- return -EIO; -+ return ret; - } - - rsp = (struct nic_torus_rsp *)cmd_ret->rsp_data; -@@ -133,7 +134,7 @@ static void hikp_nic_torus_show(const struct nic_torus_info *info) - static void hikp_nic_torus_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_torus_target.bdf; -- struct nic_torus_info info; -+ struct nic_torus_info info = { 0 }; - int ret; - - ret = hikp_nic_torus_query(bdf, &info); --- -2.45.0.windows.1 - diff --git a/0075-hikptool-nic-check-path-before-used-it-in-function-h.patch b/0075-hikptool-nic-check-path-before-used-it-in-function-h.patch deleted file mode 100644 index 0c9fd5c..0000000 --- a/0075-hikptool-nic-check-path-before-used-it-in-function-h.patch +++ /dev/null @@ -1,40 +0,0 @@ -From e6127d30663daef7cb847265006b592eebbfc152 Mon Sep 17 00:00:00 2001 -From: Peiyang Wang -Date: Tue, 20 Aug 2024 17:02:33 +0800 -Subject: [PATCH 13/27] hikptool: nic: check path before used it in function - hikp_get_dir_name_of_device - -check path before used it in hikp_get_dir_name_of_device - -Signed-off-by: Peiyang Wang ---- - net/hikp_net_lib.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/net/hikp_net_lib.c b/net/hikp_net_lib.c -index 32b278b..4e1e305 100644 ---- a/net/hikp_net_lib.c -+++ b/net/hikp_net_lib.c -@@ -238,13 +238,17 @@ int get_revision_id_by_bdf(const struct bdf_t *bdf, char *revision_id, size_t id - - static int hikp_get_dir_name_of_device(const char *path, size_t len, char *dir_name) - { -+ char file_path[PATH_MAX] = { 0 }; /* PATH_MAX includes the \0 so +1 is not required */ - struct dirent *ptr; - DIR *dir = NULL; - -- if (len > PCI_MAX_DIR_NAME_LEN) -+ if (len > PCI_MAX_DIR_NAME_LEN || strlen(path) > PATH_MAX) - return -EINVAL; - -- dir = opendir(path); -+ if (!realpath(path, file_path)) -+ return -errno; -+ -+ dir = opendir(file_path); - if (dir == NULL) { - HIKP_ERROR_PRINT("read path %s fail.\n", path); - return -EINVAL; --- -2.45.0.windows.1 - diff --git a/0076-hikptool-nic-check-strtol-if-it-failed-in-get_numvfs.patch b/0076-hikptool-nic-check-strtol-if-it-failed-in-get_numvfs.patch deleted file mode 100644 index 4e43195..0000000 --- a/0076-hikptool-nic-check-strtol-if-it-failed-in-get_numvfs.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 043c7d14e8b09bfe1b242bfcf2b0a3342e3d18da Mon Sep 17 00:00:00 2001 -From: Peiyang Wang -Date: Tue, 20 Aug 2024 17:16:53 +0800 -Subject: [PATCH 14/27] hikptool: nic: check strtol if it failed in - get_numvfs_by_bdf - -Since strtol() can legitimately return 0, LONG_MAX, or LONG_MIN (LLONG_MAX -or LLONG_MIN for strtoll()) on both success and failure. So set errno to 0 -and check it after calling. - -Signed-off-by: Peiyang Wang ---- - net/hikp_net_lib.c | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/net/hikp_net_lib.c b/net/hikp_net_lib.c -index 4e1e305..23adbdc 100644 ---- a/net/hikp_net_lib.c -+++ b/net/hikp_net_lib.c -@@ -366,7 +366,12 @@ int get_numvfs_by_bdf(const struct bdf_t *bdf, uint8_t *numvfs) - if (ret != 0) - return ret; - -+ errno = 0; - ret = (int)strtol(numvf, NULL, 0); -+ if (errno) { -+ HIKP_ERROR_PRINT("get numvfs by bdf failed, ret=%d\n", -errno); -+ return -errno; -+ } - if ((ret > UCHAR_MAX) || (ret < 0)) { - HIKP_ERROR_PRINT("get numvfs by bdf fail.\n"); - return -EINVAL; --- -2.45.0.windows.1 - diff --git a/0077-hikptool-nic-adding-NUL-at-the-end-of-the-buffer-len.patch b/0077-hikptool-nic-adding-NUL-at-the-end-of-the-buffer-len.patch deleted file mode 100644 index ed4a543..0000000 --- a/0077-hikptool-nic-adding-NUL-at-the-end-of-the-buffer-len.patch +++ /dev/null @@ -1,43 +0,0 @@ -From f24d89b76811f7b2bbfea787bb403358f960f097 Mon Sep 17 00:00:00 2001 -From: Peiyang Wang -Date: Wed, 21 Aug 2024 10:30:09 +0800 -Subject: [PATCH 15/27] hikptool: nic: adding NUL at the end of the buffer - length that is actually read. - -When pread is called, the return value may be smaller than the length that -want to read, the position of adding NUL is too much and memory might be -exposed. To avoid that case, to add NUL at the end of the buffer length -that is actually read. - -Signed-off-by: Peiyang Wang ---- - net/hikp_net_lib.c | 11 ++++++----- - 1 file changed, 6 insertions(+), 5 deletions(-) - -diff --git a/net/hikp_net_lib.c b/net/hikp_net_lib.c -index 23adbdc..fbf03bd 100644 ---- a/net/hikp_net_lib.c -+++ b/net/hikp_net_lib.c -@@ -47,13 +47,14 @@ static int hikp_read_net_pci_info(const char *file_path, char *content, size_t l - - ret = pread(fd, content, len - 1, 0); - if (ret < 0) { -- close(fd); -- return -EIO; -+ ret = -errno; -+ } else { -+ content[ret] = '\0'; // The invoker ensures that the bounds are not crossed. -+ ret = 0; - } -- content[len - 1] = '\0'; // The invoker ensures that the bounds are not crossed. -- close(fd); - -- return 0; -+ close(fd); -+ return ret; - } - - int hikp_net_creat_sock(void) --- -2.45.0.windows.1 - diff --git a/0078-hikptool-nic-avoid-array-boundary-exceeded-in-hikp_n.patch b/0078-hikptool-nic-avoid-array-boundary-exceeded-in-hikp_n.patch deleted file mode 100644 index 6187f6e..0000000 --- a/0078-hikptool-nic-avoid-array-boundary-exceeded-in-hikp_n.patch +++ /dev/null @@ -1,59 +0,0 @@ -From bc4420a4c0cb1fa85b15d671c7ebabbe534a0196 Mon Sep 17 00:00:00 2001 -From: Peiyang Wang -Date: Wed, 21 Aug 2024 10:28:27 +0800 -Subject: [PATCH 16/27] hikptool: nic: avoid array boundary exceeded in - hikp_nic_info.c - -In hikp_nic_info.c, when using pf id or die id, the value should be not -bigger than the max value. Otherwise, array boundary exceeded might be -occurred. - -Signed-off-by: Peiyang Wang ---- - net/nic/nic_info/hikp_nic_info.c | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/net/nic/nic_info/hikp_nic_info.c b/net/nic/nic_info/hikp_nic_info.c -index 992bbf0..cd07b13 100644 ---- a/net/nic/nic_info/hikp_nic_info.c -+++ b/net/nic/nic_info/hikp_nic_info.c -@@ -113,6 +113,11 @@ static void hikp_nic_info_print_cur_pf(const struct bdf_t *bdf) - uint8_t i; - int ret; - -+ if (pf_id >= HIKP_MAX_PF_NUM) { -+ HIKP_ERROR_PRINT("pf_id(%u) is invalid.\n", pf_id); -+ return; -+ } -+ - printf("Current function: pf%u\n", pf_id); - printf("\t%-16s %s\n", "pf mode:", - g_info_param.info.pf_info[pf_id].pf_mode ? "X86" : "ARM"); -@@ -148,6 +153,11 @@ static void hikp_nic_info_print_cur_die(void) - { - uint8_t i; - -+ if (g_info_param.info.pf_num > HIKP_MAX_PF_NUM) { -+ HIKP_ERROR_PRINT("pf_num(%u) is invalid.\n", g_info_param.info.pf_num); -+ return; -+ } -+ - printf("Current die(chip%u-die%u) info:\n", - g_info_param.info.chip_id, g_info_param.info.die_id); - printf("revision id: %s", g_info_param.revision_id); -@@ -186,6 +196,12 @@ static bool is_bus_id_accessed(void) - { - uint8_t i; - -+ if (g_info_param.accessed_die_num >= MAX_DIE_NUM) { -+ HIKP_ERROR_PRINT("accessed_die_num(%u) is invalid.\n", -+ g_info_param.accessed_die_num); -+ return false; -+ } -+ - for (i = 0; i < g_info_param.accessed_die_num; i++) { - if (g_info_param.accessed_bus_id[i] == g_info_param.target.bdf.bus_id) - return true; --- -2.45.0.windows.1 - diff --git a/0079-hikptool-nic-Fix-bad-usage-of-format-string.patch b/0079-hikptool-nic-Fix-bad-usage-of-format-string.patch deleted file mode 100644 index f532a66..0000000 --- a/0079-hikptool-nic-Fix-bad-usage-of-format-string.patch +++ /dev/null @@ -1,31 +0,0 @@ -From dd185f7120e3a55af2ef4fc061aa3a271a986a1d Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Thu, 29 Aug 2024 10:11:47 +0800 -Subject: [PATCH 17/27] hikptool/nic: Fix bad usage of format string - -The format string lacks parameters, which may cause -information leakage. This patch fixes it. - -Fixes: 8244390e29a3 ("hikptool/nic: Fix the Code review comments") - -Signed-off-by: Jie Hai ---- - net/nic/nic_ppp/hikp_nic_ppp.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index c070666..96f317b 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -1077,7 +1077,7 @@ static int hikp_nic_check_hw_res(struct hikp_nic_ppp_hw_resources *hw_res) - return -EINVAL; - } - if (hw_res->mng_tbl_size == 0) { -- HIKP_ERROR_PRINT("VF VLAN Table size (%u)is zero!\n"); -+ HIKP_ERROR_PRINT("Manager Table size should not be zero!\n"); - return -EINVAL; - } - if (hw_res->mac_id >= HIKP_PPP_MAX_MAC_ID_NUM) { --- -2.45.0.windows.1 - diff --git a/0080-hikptool-nic-Fix-potential-dead-loop.patch b/0080-hikptool-nic-Fix-potential-dead-loop.patch deleted file mode 100644 index aa79123..0000000 --- a/0080-hikptool-nic-Fix-potential-dead-loop.patch +++ /dev/null @@ -1,43 +0,0 @@ -From c89df2898b19f1a1503bd41c065aa163a1900b53 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Thu, 29 Aug 2024 10:08:55 +0800 -Subject: [PATCH 18/27] hikptool/nic: Fix potential dead loop - -When the loop variable range does not cover the upper bound -of the loop, an infinite loop occurs. This patch fixes it. - -Signed-off-by: Jie Hai ---- - net/nic/nic_fd/hikp_nic_fd.c | 2 +- - net/nic/nic_ppp/hikp_nic_ppp.c | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index 3d6a9dc..7125699 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -503,7 +503,7 @@ static void hikp_nic_show_fd_rules(const void *data) - struct nic_fd_rule_info *rule; - uint16_t max_key_bytes; - size_t one_rule_size; -- uint16_t i; -+ uint32_t i; - - key_cfg = &g_fd_hw_info.key_cfg[stage_no]; - stage_rules = &rules[stage_no]; -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index 96f317b..67a3be6 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -184,7 +184,7 @@ static void hikp_nic_ppp_show_func_uc_mac_addr(struct mac_vlan_uc_tbl *uc_tbl, - struct mac_vlan_uc_entry *uc_entry; - uint8_t pf_id; - uint8_t vf_id; -- uint8_t i; -+ uint32_t i; - - for (i = 0; i < uc_tbl->entry_size; i++) { - uc_entry = &uc_tbl->entry[i]; --- -2.45.0.windows.1 - diff --git a/0081-hikptool-Rectify-the-cleancode-issue.patch b/0081-hikptool-Rectify-the-cleancode-issue.patch deleted file mode 100644 index 2bfb188..0000000 --- a/0081-hikptool-Rectify-the-cleancode-issue.patch +++ /dev/null @@ -1,482 +0,0 @@ -From 90e86309519707998fa9b2b79df9734ea43f1304 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 12 Nov 2024 19:38:31 +0800 -Subject: [PATCH 19/27] hikptool: Rectify the cleancode issue. - -Rectify some cleancode alarms.Includes: -1. Add the function return value verification. -2. The logic for assigning values to output parameters of functions is optimized. -3. Use of parentheses. -4. Fix potential dead loop. -5. Fix unsigned-signed mixed use. - -Signed-off-by: veega2022 ---- - net/nic/nic_fd/hikp_nic_fd.c | 2 +- - net/nic/nic_log/hikp_nic_log.c | 7 +++-- - net/nic/nic_mac/hikp_nic_xsfp.h | 4 +-- - net/nic/nic_ppp/hikp_nic_ppp.c | 10 +++--- - .../roce_ext_common/hikp_roce_ext_common.c | 2 +- - net/roce/roce_qmm/hikp_roce_qmm.c | 2 +- - net/roce/roce_timer/hikp_roce_timer.c | 2 +- - net/roh/hikp_roh_mac.c | 24 ++++++-------- - net/roh/hikp_roh_show_bp.c | 2 +- - net/roh/hikp_roh_show_mib.c | 2 +- - net/ub/ub_crd/hikp_ub_crd.c | 4 +-- - net/ub/ub_ppp/hikp_unic_ppp.c | 4 +-- - ossl/ossl_user_linux.c | 10 +++--- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 2 +- - pcie/func_lib/pcie_func/pcie_statistics.c | 2 +- - serdes/hikp_serdes.c | 5 ++- - tool_lib/op_logs.c | 31 +++++++++++++------ - 17 files changed, 63 insertions(+), 52 deletions(-) - -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index 7125699..d4a9678 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -630,7 +630,7 @@ static int hikp_nic_query_fd_rules(struct hikp_cmd_header *req_header, const str - uint16_t max_key_bytes; - uint32_t left_buf_len; - size_t one_rule_size; -- uint16_t idx; -+ uint32_t idx; - int ret = 0; - - if (stage >= NIC_FD_STAGE_NUM) { -diff --git a/net/nic/nic_log/hikp_nic_log.c b/net/nic/nic_log/hikp_nic_log.c -index 893aef1..dc622e0 100644 ---- a/net/nic/nic_log/hikp_nic_log.c -+++ b/net/nic/nic_log/hikp_nic_log.c -@@ -106,7 +106,9 @@ static int hikp_nic_get_first_blk_info(uint32_t *total_blk_num, - - log_rsp = (struct nic_log_rsp_data *)(cmd_ret->rsp_data); - log_size = (uint32_t)(log_rsp->total_blk_num * MAX_LOG_DATA_NUM * sizeof(uint32_t)); -- if (log_size < log_rsp->cur_blk_size) { -+ if (log_rsp->cur_blk_size == 0 || -+ log_size < log_rsp->cur_blk_size || -+ log_rsp->cur_blk_size > sizeof(log_rsp->log_data)) { - HIKP_ERROR_PRINT("log size must bigger than current block size.\n"); - ret = -EINVAL; - goto err_out; -@@ -142,7 +144,8 @@ static int hikp_nic_get_log_info(uint32_t blk_id, uint32_t *cur_blk_size, uint8_ - log_rsp = (struct nic_log_rsp_data *)(cmd_ret->rsp_data); - *cur_blk_size = (uint32_t)log_rsp->cur_blk_size; - *blk_num = (uint32_t)log_rsp->total_blk_num; -- if (max_log_size < *cur_blk_size) { -+ if (max_log_size < *cur_blk_size || -+ *cur_blk_size > sizeof(log_rsp->log_data)) { - HIKP_ERROR_PRINT("log size must bigger than current block(%u) size.\n", blk_id); - ret = -EINVAL; - goto err_out; -diff --git a/net/nic/nic_mac/hikp_nic_xsfp.h b/net/nic/nic_mac/hikp_nic_xsfp.h -index 6f5e38f..a04ecdc 100644 ---- a/net/nic/nic_mac/hikp_nic_xsfp.h -+++ b/net/nic/nic_mac/hikp_nic_xsfp.h -@@ -176,7 +176,7 @@ struct sfp_a0_page { - uint8_t rsvd_dm : 1; - }; - uint8_t enhanced_options; /* reg 93: Enhanced Options */ -- uint8_t Sff_8472_compliance; /* reg 94: SFF-8472 Compliance */ -+ uint8_t sff_8472_compliance; /* reg 94: SFF-8472 Compliance */ - uint8_t cc_ext; /* reg 95: Check code for the Extended ID Fields (addresses 64 to 94) */ - - /* 96~255 */ -@@ -247,7 +247,7 @@ struct sfp_page_info { - #define QSFP_TRANS_OPTICAL_MAX 0x9 - - struct qsfp_page0_lower { -- uint8_t Identifier; /* reg 0: Identifier (1 Byte) */ -+ uint8_t identifier; /* reg 0: Identifier (1 Byte) */ - uint8_t revision_comp; /* reg 1: Revision Compliance */ - uint8_t status_indicator; /* reg 2: Status Indicators */ - uint8_t tx_rx_los; /* reg 3: Latched Tx/Rx LOS indicator */ -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index 67a3be6..3f777b3 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -519,13 +519,13 @@ out: - static int hikp_nic_ppp_query_uc_mac_addr(struct hikp_cmd_header *req_header, - struct nic_ppp_req_para *req_data, - struct mac_vlan_uc_tbl *uc_tbl, -- uint16_t max_hw_entry_size) -+ uint32_t max_hw_entry_size) - { - struct mac_vlan_uc_entry *uc_entry = uc_tbl->entry; - struct nic_ppp_rsp_head rsp_head = {0}; - uint32_t entry_size = 0; - size_t left_buf_len; -- uint16_t idx = 0; -+ uint32_t idx = 0; - int ret = 0; - - while (idx < max_hw_entry_size) { -@@ -561,13 +561,13 @@ static int hikp_nic_ppp_query_uc_mac_addr(struct hikp_cmd_header *req_header, - static int hikp_nic_ppp_query_mc_mac_addr(struct hikp_cmd_header *req_header, - struct nic_ppp_req_para *req_data, - struct mac_vlan_mc_tbl *mc_tbl, -- uint16_t max_hw_entry_size) -+ uint32_t max_hw_entry_size) - { - struct mac_vlan_mc_entry *mc_entry = mc_tbl->entry; - struct nic_ppp_rsp_head rsp_head = {0}; - uint32_t entry_size = 0; - size_t left_buf_len; -- uint16_t idx = 0; -+ uint32_t idx = 0; - int ret = 0; - - while (idx < max_hw_entry_size) { -@@ -1086,7 +1086,7 @@ static int hikp_nic_check_hw_res(struct hikp_nic_ppp_hw_resources *hw_res) - return -EINVAL; - } - if (hw_res->total_func_num == 0 || hw_res->total_func_num > HIKP_NIC_MAX_FUNC_NUM) { -- HIKP_ERROR_PRINT("Total_func_num (%u)should be in [1, %u].\n", -+ HIKP_ERROR_PRINT("Total_func_num (%u) should be in [1, %u].\n", - hw_res->total_func_num, HIKP_NIC_MAX_FUNC_NUM); - return -EINVAL; - } -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index bc3b883..cc9f509 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -169,7 +169,7 @@ static void hikp_roce_ext_print(enum roce_cmd_type cmd_type, - uint8_t arr_len = output->reg_name.arr_len; - uint32_t *offset = output->reg.offset; - uint32_t *data = output->reg.data; -- int i; -+ uint32_t i; - - printf("**************%s INFO*************\n", cmd_name); - printf("%-40s[addr_offset] : reg_data\n", "reg_name"); -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.c b/net/roce/roce_qmm/hikp_roce_qmm.c -index 9189f88..6ab2c84 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.c -+++ b/net/roce/roce_qmm/hikp_roce_qmm.c -@@ -154,8 +154,8 @@ static const struct reg_name_info { - static void hikp_roce_qmm_print(struct roce_qmm_rsp_data *qmm_rsp) - { - const char **reg_name; -+ uint32_t index = 0; - uint8_t arr_len; -- int index = 0; - - for (index = 0; index < HIKP_ARRAY_SIZE(g_qmm_reg_name_info_table); index++) { - if (g_qmm_reg_name_info_table[index].sub_cmd != g_roce_qmm_param.sub_cmd) -diff --git a/net/roce/roce_timer/hikp_roce_timer.c b/net/roce/roce_timer/hikp_roce_timer.c -index a36257e..ea35241 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.c -+++ b/net/roce/roce_timer/hikp_roce_timer.c -@@ -84,8 +84,8 @@ static void hikp_roce_timer_print(struct roce_timer_rsp_data *timer_rsp, - enum roce_timer_cmd_type cmd_type) - { - const char **reg_name; -+ uint32_t index = 0; - uint8_t arr_len; -- int index = 0; - - if (cmd_type == TIMER_SHOW_QPC) { - reg_name = g_timer_qpc_reg_name; -diff --git a/net/roh/hikp_roh_mac.c b/net/roh/hikp_roh_mac.c -index 43f954c..4a8cf7b 100644 ---- a/net/roh/hikp_roh_mac.c -+++ b/net/roh/hikp_roh_mac.c -@@ -39,34 +39,29 @@ static int hikp_roh_mac_target(struct major_cmd_ctrl *self, const char *argv) - return self->err_no; - } - --static int cmd_show_mac_type_parse(void) -+static void cmd_show_mac_type_parse(void) - { - g_roh_mac_param.flag |= CMD_SHOW_MAC_TYPE_FLAG; -- return 0; - } - --static int cmd_show_cam_parse(void) -+static void cmd_show_cam_parse(void) - { - g_roh_mac_param.flag |= CMD_SHOW_CAM_FLAG; -- return 0; - } - --static int cmd_show_credit_parse(void) -+static void cmd_show_credit_parse(void) - { - g_roh_mac_param.flag |= CMD_SHOW_CREDIT_CNT; -- return 0; - } - - static int hikp_roh_mac_show_parse(struct major_cmd_ctrl *self, const char *argv) - { -- int ret; -- - if (strncmp(argv, "cam", sizeof("cam")) == 0) { -- ret = cmd_show_cam_parse(); -+ cmd_show_cam_parse(); - } else if (strncmp(argv, "mac_type", sizeof("mac_type")) == 0) { -- ret = cmd_show_mac_type_parse(); -+ cmd_show_mac_type_parse(); - } else if (strncmp(argv, "credit", sizeof("credit")) == 0) { -- ret = cmd_show_credit_parse(); -+ cmd_show_credit_parse(); - } else { - hikp_roh_mac_help(self, NULL); - snprintf(self->err_str, sizeof(self->err_str), -@@ -74,7 +69,7 @@ static int hikp_roh_mac_show_parse(struct major_cmd_ctrl *self, const char *argv - self->err_no = -EINVAL; - return -EINVAL; - } -- return ret; -+ return 0; - } - - int hikp_roh_get_mac_type(struct major_cmd_ctrl *self, struct bdf_t bdf) -@@ -180,7 +175,7 @@ static int hikp_roh_build_cam(struct major_cmd_ctrl *self, struct cam_table_entr - - for (int i = 0; i < block_num; i++) { - req_data.bdf = g_roh_mac_param.target.bdf; -- req_data.cam_block_index = i; -+ req_data.cam_block_index = (uint32_t)i; - hikp_cmd_init(&req_header, ROH_MOD, HIKP_ROH_MAC, CMD_BUILD_CAM_TABLE); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -@@ -249,6 +244,7 @@ static int hikp_roh_query_crd(uint8_t crd_type, uint32_t num_rows, char const *c - struct roh_mac_req_para req_data = { 0 }; - struct hikp_cmd_header req_header = { 0 }; - struct hikp_cmd_ret *cmd_ret = NULL; -+ uint32_t i; - int ret; - - hikp_cmd_init(&req_header, ROH_MOD, HIKP_ROH_MAC, CMD_SHOW_CREDIT); -@@ -262,7 +258,7 @@ static int hikp_roh_query_crd(uint8_t crd_type, uint32_t num_rows, char const *c - return ret; - } - mac_rsp = (struct roh_mac_credit_data *)(cmd_ret->rsp_data); -- for (int i = 0; i < num_rows; i++) { -+ for (i = 0; i < num_rows; i++) { - union cut_reg reg; - - reg.value = (mac_rsp->cut_reg_value)[i]; -diff --git a/net/roh/hikp_roh_show_bp.c b/net/roh/hikp_roh_show_bp.c -index 73a53d8..3f3f622 100644 ---- a/net/roh/hikp_roh_show_bp.c -+++ b/net/roh/hikp_roh_show_bp.c -@@ -39,7 +39,7 @@ static int hikp_roh_show_bp_target(struct major_cmd_ctrl *self, const char *argv - - static int hikp_roh_show_bp(struct major_cmd_ctrl *self) - { -- uint8_t pfc[8] = { 0 }; -+ uint8_t pfc[BP_SIZE] = { 0 }; - uint8_t egu_tx_bp; - union bp_val res; - uint8_t flit_bp; -diff --git a/net/roh/hikp_roh_show_mib.c b/net/roh/hikp_roh_show_mib.c -index 7267fe5..91e8344 100644 ---- a/net/roh/hikp_roh_show_mib.c -+++ b/net/roh/hikp_roh_show_mib.c -@@ -184,7 +184,7 @@ static int hikp_roh_fill_pmu_cnt(int round) - - hikp_cmd_init(&req_header, ROH_MOD, HIKP_ROH_SHOW_MIB, CMD_SHOW_MIB_FILL_CNT); - req_data.bdf = roh_show_mib_param.target.bdf; -- req_data.round = round; -+ req_data.round = (uint32_t)round; - - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); -diff --git a/net/ub/ub_crd/hikp_ub_crd.c b/net/ub/ub_crd/hikp_ub_crd.c -index 91e1cb7..d564800 100644 ---- a/net/ub/ub_crd/hikp_ub_crd.c -+++ b/net/ub/ub_crd/hikp_ub_crd.c -@@ -40,8 +40,8 @@ static int hikp_ub_crd_target(struct major_cmd_ctrl *self, const char *argv) - static uint32_t hikp_ub_show_crd(uint32_t off, struct ub_crd_rsp *crd_rsp, uint32_t num_rows, - char const *crds[][2]) - { -- int reg_index; -- int i; -+ uint32_t reg_index; -+ uint32_t i; - - for (i = 0; i < num_rows; i++) { - union cut_reg reg; -diff --git a/net/ub/ub_ppp/hikp_unic_ppp.c b/net/ub/ub_ppp/hikp_unic_ppp.c -index 2164f04..105253f 100644 ---- a/net/ub/ub_ppp/hikp_unic_ppp.c -+++ b/net/ub/ub_ppp/hikp_unic_ppp.c -@@ -69,7 +69,7 @@ static int hikp_unic_cmd_ppp_feature_select(struct major_cmd_ctrl *self, const c - for (i = 0; i < feat_size; i++) { - if (strncmp(argv, g_unic_ppp_feature_cmd[i].feature_name, - HIKP_UNIC_PPP_MAX_FEATURE_NAME_LEN) == 0) { -- g_unic_ppp_param.feature_idx = i; -+ g_unic_ppp_param.feature_idx = (int)i; - return 0; - } - } -@@ -348,7 +348,7 @@ static void hikp_unic_ppp_show_ip_tbl(const void *data) - struct unic_ip_tbl *ip_tbl = (struct unic_ip_tbl *)data; - struct unic_ip_entry *entry; - uint16_t *ip_addr_tbl_str; -- int i, j; -+ uint32_t i, j; - - printf("ip_table_size = %u\n", ip_tbl->entry_size); - printf("index\t| func_id\t| ip_addr\n"); -diff --git a/ossl/ossl_user_linux.c b/ossl/ossl_user_linux.c -index a369c68..dc682dd 100644 ---- a/ossl/ossl_user_linux.c -+++ b/ossl/ossl_user_linux.c -@@ -47,7 +47,7 @@ int uda_realpath(const char *file_dir, char *format_dir) - - int uda_fcntl(const char *lock_file, uint32_t operation, int *fd) - { -- int fd_t = 0; -+ int fd_t; - int ret; - - if ((fd == NULL) || (lock_file == NULL)) -@@ -57,15 +57,17 @@ int uda_fcntl(const char *lock_file, uint32_t operation, int *fd) - if (fd_t < 0) - return -errno; - -- *fd = fd_t; -- - g_fcntl_lock.l_type = F_WRLCK; - if (operation == UDA_FLOCK_NOBLOCK) - ret = fcntl(fd_t, F_SETLK, &g_fcntl_lock); - else - ret = fcntl(fd_t, F_SETLKW, &g_fcntl_lock); -- if (ret != 0) -+ if (ret != 0) { - close(fd_t); -+ *fd = -1; /* Assignment -1 is an invalid value */ -+ } else { -+ *fd = fd_t; -+ } - - return ret; - } -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index 856aebe..58fcbea 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -559,7 +559,7 @@ int pcie_dumpreg_do_dump(uint32_t port_id, uint32_t dump_level) - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); - if (ret) { -- Err("PCIe DUMPREG", "pcie dump cmd_ret check failed, ret: %d.\n", ret); -+ Err("pcie dump cmd_ret check failed, ret: %d.\n", ret); - goto free_cmd_ret; - } - ret = pcie_create_dumpreg_log_file(port_id, dump_level); -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.c b/pcie/func_lib/pcie_func/pcie_statistics.c -index e2bfcb4..6cf7a61 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.c -+++ b/pcie/func_lib/pcie_func/pcie_statistics.c -@@ -79,7 +79,7 @@ static int pcie_portid_serdes_relation(const struct pcie_macro_info *macro_info, - Info("\tndie_id: %s\n", g_global_ndie_name[ndie_id]); - for (i = 0; i < macro_num; i++) { - for (j = macro_info[i].lane_s; j <= macro_info[i].lane_e; j++) -- Info("\t\tmacro %d \t lane: %d\n", macro_info[i].id, j); -+ Info("\t\tmacro %u \t lane: %u\n", macro_info[i].id, j); - } - return 0; - } -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index 4afcb9b..23a7946 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -11,7 +11,6 @@ - * See the Mulan PSL v2 for more details. - */ - --#include - #include - #include - #include -@@ -75,7 +74,7 @@ static int cmd_serdes_start_lane_id(struct major_cmd_ctrl *self, const char *arg - - ptr++; - macro_id = strtol(ptr, &endptr, 10); /* 10:decimal */ -- if (endptr <= ptr) -+ if ((endptr <= ptr) || (macro_id < 0) || (macro_id > UCHAR_MAX)) - goto _START_LANE_ID_ERR_PRO_; - - ptr = endptr; -@@ -87,7 +86,7 @@ static int cmd_serdes_start_lane_id(struct major_cmd_ctrl *self, const char *arg - if ((endptr <= ptr) || (*endptr != 0)) - goto _START_LANE_ID_ERR_PRO_; - -- if ((macro_id < 0) || (macro_id > UCHAR_MAX) || (ds_id < 0) || (ds_id > UCHAR_MAX)) -+ if ((ds_id < 0) || (ds_id > UCHAR_MAX)) - goto _START_LANE_ID_ERR_PRO_; - - g_serdes_param.macro_id = (uint8_t)macro_id; -diff --git a/tool_lib/op_logs.c b/tool_lib/op_logs.c -index b6ecc48..6f28ecd 100644 ---- a/tool_lib/op_logs.c -+++ b/tool_lib/op_logs.c -@@ -25,29 +25,38 @@ static bool g_record = true; - static bool g_log_info; - static char g_input_buf[OP_LOG_FILE_W_MAXSIZE + 1] = {0}; - --static void op_log_write(const char *log_data) -+static int op_log_write(const char *log_data) - { - size_t w_size; - FILE *fd; - - if (strlen(g_op_log) == 0) -- return; -+ return -EINVAL; - - if (!is_file_exist(g_op_log)) -- return; -+ return -EPERM; - - fd = fopen(g_op_log, "a"); - if (fd == NULL) { - HIKP_ERROR_PRINT("Can not open operation log file[%s], errno is %d\n", - g_op_log, errno); -- return; -+ return -errno; - } -- (void)chmod(g_op_log, 0640); -+ -+ if (chmod(g_op_log, 0640)) { -+ HIKP_ERROR_PRINT("Can not chmod log file[%s], errno is %d\n", g_op_log, errno); -+ (void)fclose(fd); -+ return -errno; -+ } -+ - w_size = fwrite((void *)log_data, 1U, strlen(log_data), fd); -- if (strlen(log_data) > ((uint32_t)w_size)) -+ if (strlen(log_data) > ((uint32_t)w_size)) { - HIKP_ERROR_PRINT("Error data size write to file, errno is %d\n", errno); -+ (void)fclose(fd); -+ return -errno; -+ } - -- (void)fclose(fd); -+ return fclose(fd); - } - - static int op_log_write_buffer(const char *log_data, const char *log_dir) -@@ -70,11 +79,13 @@ static int op_log_write_buffer(const char *log_data, const char *log_dir) - return ret; - } - -- op_log_write(log_data); -+ ret = op_log_write(log_data); -+ if (ret == 0) -+ g_log_info = true; -+ - tool_unlock(&op_lock_fd, UDA_FLOCK_BLOCK); -- g_log_info = true; - (void)sigprocmask(SIG_UNBLOCK, &sigset, NULL); -- return 0; -+ return ret; - } - - void op_log_on(void) --- -2.45.0.windows.1 - diff --git a/0082-hikptool-Modify-the-macro-definition-of-the-header-f.patch b/0082-hikptool-Modify-the-macro-definition-of-the-header-f.patch deleted file mode 100644 index da3df97..0000000 --- a/0082-hikptool-Modify-the-macro-definition-of-the-header-f.patch +++ /dev/null @@ -1,1097 +0,0 @@ -From a172993cb9084795a0cc8abdacf6e06574f88922 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 28 Aug 2024 11:44:18 +0800 -Subject: [PATCH 20/27] hikptool: Modify the macro definition of the header - file - -Modify the macro definition of the header file and -delete the underscores at the beginning. - -Signed-off-by: veega2022 ---- - cxl/func_lib/cxl_func/cxl_feature.h | 6 +++--- - cxl/usr_cmd/cmd_analysis/cxl_tool_include.h | 6 +++--- - libhikptdev/src/rciep/hikpt_rciep.h | 6 +++--- - net/hikp_net_lib.h | 6 +++--- - net/nic/nic_dfx/hikp_nic_dfx.h | 6 +++--- - net/nic/nic_info/hikp_nic_info.h | 6 +++--- - net/nic/nic_log/hikp_nic_log.h | 6 +++--- - net/nic/nic_mac/hikp_mac_cmd.h | 2 +- - net/nic/nic_mac/hikp_nic_mac_dump.h | 2 +- - net/nic/nic_mac/hikp_nic_port.h | 2 +- - net/nic/nic_mac/hikp_nic_xsfp.h | 2 +- - net/nic/nic_qos/hikp_nic_qos.c | 3 +-- - net/roce/roce_bond/hikp_roce_bond.h | 6 +++--- - net/roce/roce_caep/hikp_roce_caep.h | 6 +++--- - net/roce/roce_ext_common/hikp_roce_ext_common.h | 6 +++--- - net/roce/roce_global_cfg/hikp_roce_global_cfg.h | 6 +++--- - net/roce/roce_gmv/hikp_roce_gmv.h | 6 +++--- - net/roce/roce_mdb/hikp_roce_mdb.h | 6 +++--- - net/roce/roce_pkt/hikp_roce_pkt.h | 6 +++--- - net/roce/roce_qmm/hikp_roce_qmm.h | 6 +++--- - net/roce/roce_rst/hikp_roce_rst.h | 6 +++--- - net/roce/roce_scc/hikp_roce_scc.h | 6 +++--- - net/roce/roce_timer/hikp_roce_timer.h | 6 +++--- - net/roce/roce_trp/hikp_roce_trp.h | 6 +++--- - net/roce/roce_tsp/hikp_roce_tsp.h | 6 +++--- - net/roh/hikp_roh_cmd.h | 6 +++--- - net/roh/hikp_roh_mac.h | 6 +++--- - net/roh/hikp_roh_show_bp.h | 6 +++--- - net/roh/hikp_roh_show_mib.h | 6 +++--- - ossl/ossl_user_linux.h | 2 +- - pcie/func_lib/osal/os_common.h | 6 +++--- - pcie/func_lib/pcie_func/pcie_common.h | 6 +++--- - pcie/func_lib/pcie_func/pcie_link_ltssm.h | 6 +++--- - pcie/func_lib/pcie_func/pcie_reg_dump.h | 6 +++--- - pcie/func_lib/pcie_func/pcie_reg_read.h | 6 +++--- - pcie/func_lib/pcie_func/pcie_statistics.h | 6 +++--- - pcie/usr_cmd/cmd_analysis/pcie_tools_include.h | 6 +++--- - pcie/usr_cmd/interface/pcie_common_api.h | 6 +++--- - sas/sas_func/sas_analy_queue.h | 6 +++--- - sas/sas_func/sas_common.h | 6 +++--- - sas/sas_func/sas_dump_reg.h | 6 +++--- - sas/sas_func/sas_read_dev.h | 6 +++--- - sas/sas_func/sas_read_dqe.h | 6 +++--- - sas/sas_func/sas_read_errcode.h | 6 +++--- - sas/user_cmd/cmd_code/sas_tools_include.h | 6 +++--- - sata/sata_func/sata_common.h | 6 +++--- - sata/sata_func/sata_dump_reg.h | 6 +++--- - sata/user_cmd/cmd_code/sata_tools_include.h | 6 +++--- - serdes/hikp_serdes.h | 8 +++----- - socip/hikp_socip.h | 6 +++--- - tool_lib/tool_cmd.h | 2 +- - tool_lib/tool_lib.h | 6 +++--- - 52 files changed, 142 insertions(+), 145 deletions(-) - -diff --git a/cxl/func_lib/cxl_func/cxl_feature.h b/cxl/func_lib/cxl_func/cxl_feature.h -index 3ac6f75..339ccee 100644 ---- a/cxl/func_lib/cxl_func/cxl_feature.h -+++ b/cxl/func_lib/cxl_func/cxl_feature.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __CXL_FEATURE_H_ --#define __CXL_FEATURE_H_ -+#ifndef CXL_FEATURE_H -+#define CXL_FEATURE_H - - #include "tool_cmd.h" - -@@ -408,4 +408,4 @@ union cxl_mem_error_ctrl { - uint32_t val; - }; - --#endif -+#endif /* CXL_FEATURE_H */ -diff --git a/cxl/usr_cmd/cmd_analysis/cxl_tool_include.h b/cxl/usr_cmd/cmd_analysis/cxl_tool_include.h -index 5028056..6ba0f0d 100644 ---- a/cxl/usr_cmd/cmd_analysis/cxl_tool_include.h -+++ b/cxl/usr_cmd/cmd_analysis/cxl_tool_include.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __CXL_TOOL_INCLUDE_H_ --#define __CXL_TOOL_INCLUDE_H_ -+#ifndef CXL_TOOL_INCLUDE_H -+#define CXL_TOOL_INCLUDE_H - - #include - -@@ -21,4 +21,4 @@ struct tool_cxl_cmd { - uint32_t port_id; - }; - --#endif -+#endif /* CXL_TOOL_INCLUDE_H */ -diff --git a/libhikptdev/src/rciep/hikpt_rciep.h b/libhikptdev/src/rciep/hikpt_rciep.h -index c64e4dd..bf2a2d7 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.h -+++ b/libhikptdev/src/rciep/hikpt_rciep.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __KPT_RCIEP_H__ --#define __KPT_RCIEP_H__ -+#ifndef KPT_RCIEP_H -+#define KPT_RCIEP_H - - #include - #include "hikptdev_plug.h" -@@ -104,4 +104,4 @@ union hikp_space_req { - }; - #pragma pack() - --#endif -+#endif /* KPT_RCIEP_H */ -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index 8a0958f..7ebabfa 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -10,8 +10,8 @@ - * - * See the Mulan PSL v2 for more details. - */ --#ifndef __HIKP_NET_LIB_H__ --#define __HIKP_NET_LIB_H__ -+#ifndef HIKP_NET_LIB_H -+#define HIKP_NET_LIB_H - - #include "ossl_user_linux.h" - #include "tool_cmd.h" -@@ -138,4 +138,4 @@ int get_vf_dev_info_by_pf_dev_name(const char *pf_dev_name, - int get_pf_dev_info_by_vf_dev_name(const char *vf_dev_name, struct tool_target *pf_target); - void hikp_ether_format_addr(char *buf, uint16_t size, const uint8_t *mac_addr, uint8_t mac_len); - --#endif -+#endif /* HIKP_NET_LIB_H */ -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.h b/net/nic/nic_dfx/hikp_nic_dfx.h -index 3f23b59..d46d290 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.h -+++ b/net/nic/nic_dfx/hikp_nic_dfx.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_NIC_DFX_H__ --#define __HIKP_NIC_DFX_H__ -+#ifndef HIKP_NIC_DFX_H -+#define HIKP_NIC_DFX_H - - #include "hikp_net_lib.h" - -@@ -138,4 +138,4 @@ struct nic_dfx_rsp_t { - uint32_t reg_data[MAX_DFX_DATA_NUM]; - }; - --#endif -+#endif /* HIKP_NIC_DFX_H */ -diff --git a/net/nic/nic_info/hikp_nic_info.h b/net/nic/nic_info/hikp_nic_info.h -index 194146e..b1dd7dc 100644 ---- a/net/nic/nic_info/hikp_nic_info.h -+++ b/net/nic/nic_info/hikp_nic_info.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_NIC_INFO_H__ --#define __HIKP_NIC_INFO_H__ -+#ifndef HIKP_NIC_INFO_H -+#define HIKP_NIC_INFO_H - - #include "hikp_net_lib.h" - -@@ -77,4 +77,4 @@ enum nic_info_mac_type { - MAC_TYPE_MAX, - }; - --#endif -+#endif /* HIKP_NIC_INFO_H */ -diff --git a/net/nic/nic_log/hikp_nic_log.h b/net/nic/nic_log/hikp_nic_log.h -index ff2bb87..2998464 100644 ---- a/net/nic/nic_log/hikp_nic_log.h -+++ b/net/nic/nic_log/hikp_nic_log.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_NIC_LOG_H__ --#define __HIKP_NIC_LOG_H__ -+#ifndef HIKP_NIC_LOG_H -+#define HIKP_NIC_LOG_H - - #include "hikp_net_lib.h" - -@@ -38,4 +38,4 @@ struct log_param { - struct tool_target target; - }; - --#endif -+#endif /* HIKP_NIC_LOG_H */ -diff --git a/net/nic/nic_mac/hikp_mac_cmd.h b/net/nic/nic_mac/hikp_mac_cmd.h -index 9a3f0d9..0cd209f 100644 ---- a/net/nic/nic_mac/hikp_mac_cmd.h -+++ b/net/nic/nic_mac/hikp_mac_cmd.h -@@ -62,4 +62,4 @@ enum mac_dump_xsfp_sub_cmd { - NIC_XSFP_GET_EEPROM_DATA, - }; - --#endif -+#endif /* HIKP_MAC_CMD_H */ -diff --git a/net/nic/nic_mac/hikp_nic_mac_dump.h b/net/nic/nic_mac/hikp_nic_mac_dump.h -index f82762e..0c58ad5 100644 ---- a/net/nic/nic_mac/hikp_nic_mac_dump.h -+++ b/net/nic/nic_mac/hikp_nic_mac_dump.h -@@ -60,4 +60,4 @@ struct cmd_mac_dump { - uint32_t blk_num[MOD_ID_MAX]; - const char *module_name; - }; --#endif -+#endif /* HIKP_NIC_MAC_DUMP_H */ -diff --git a/net/nic/nic_mac/hikp_nic_port.h b/net/nic/nic_mac/hikp_nic_port.h -index cb72ebc..69ebb53 100644 ---- a/net/nic/nic_mac/hikp_nic_port.h -+++ b/net/nic/nic_mac/hikp_nic_port.h -@@ -271,4 +271,4 @@ struct cmd_hot_plug_card_info { - uint8_t cur_type; - }; - --#endif -+#endif /* HIKP_NIC_PORT_H */ -diff --git a/net/nic/nic_mac/hikp_nic_xsfp.h b/net/nic/nic_mac/hikp_nic_xsfp.h -index a04ecdc..50cbb2d 100644 ---- a/net/nic/nic_mac/hikp_nic_xsfp.h -+++ b/net/nic/nic_mac/hikp_nic_xsfp.h -@@ -549,4 +549,4 @@ struct hikp_xsfp_ctrl { - uint32_t dump_param; - }; - --#endif -+#endif /* HIKP_NIC_XSFP_H */ -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index 9e997e4..2de0972 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -15,9 +15,8 @@ - #include - #include - #include -- --#include "hikp_nic_qos.h" - #include "hikpt_rciep.h" -+#include "hikp_nic_qos.h" - - static struct nic_qos_param g_qos_param = { 0 }; - -diff --git a/net/roce/roce_bond/hikp_roce_bond.h b/net/roce/roce_bond/hikp_roce_bond.h -index 14bd233..5e18723 100644 ---- a/net/roce/roce_bond/hikp_roce_bond.h -+++ b/net/roce/roce_bond/hikp_roce_bond.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_BOND_H__ --#define __HIKP_ROCE_BOND_H__ -+#ifndef HIKP_ROCE_BOND_H -+#define HIKP_ROCE_BOND_H - - #include "hikp_roce_ext_common.h" - -@@ -26,4 +26,4 @@ struct roce_bond_req_param { - uint32_t block_id; - }; - --#endif /* __HIKP_ROCE_BOND_H__ */ -+#endif /* HIKP_ROCE_BOND_H */ -diff --git a/net/roce/roce_caep/hikp_roce_caep.h b/net/roce/roce_caep/hikp_roce_caep.h -index 547a4d6..becb332 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.h -+++ b/net/roce/roce_caep/hikp_roce_caep.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_CAEP_H__ --#define __HIKP_ROCE_CAEP_H__ -+#ifndef HIKP_ROCE_CAEP_H -+#define HIKP_ROCE_CAEP_H - - #include "hikp_roce_ext_common.h" - -@@ -48,4 +48,4 @@ enum roce_caep_cmd_type { - CAEP_EXT, - }; - --#endif /* __HIKP_ROCE_CAEP_H__ */ -+#endif /* HIKP_ROCE_CAEP_H */ -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.h b/net/roce/roce_ext_common/hikp_roce_ext_common.h -index 4930bed..8568556 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.h -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_EXT_COMMON_H__ --#define __HIKP_ROCE_EXT_COMMON_H__ -+#ifndef HIKP_ROCE_EXT_COMMON_H -+#define HIKP_ROCE_EXT_COMMON_H - - #include "hikp_net_lib.h" - -@@ -64,4 +64,4 @@ void hikp_roce_ext_execute(struct major_cmd_ctrl *self, - uint32_t block_id, - struct roce_ext_reg_name *reg_name)); - --#endif /* __HIKP_ROCE_EXT_COMMON_H__ */ -+#endif /* HIKP_ROCE_EXT_COMMON_H */ -diff --git a/net/roce/roce_global_cfg/hikp_roce_global_cfg.h b/net/roce/roce_global_cfg/hikp_roce_global_cfg.h -index 66e7fb8..aa1db92 100644 ---- a/net/roce/roce_global_cfg/hikp_roce_global_cfg.h -+++ b/net/roce/roce_global_cfg/hikp_roce_global_cfg.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_GLOBAL_CFG_H__ --#define __HIKP_ROCE_GLOBAL_CFG_H__ -+#ifndef HIKP_ROCE_GLOBAL_CFG_H -+#define HIKP_ROCE_GLOBAL_CFG_H - - #include "hikp_roce_ext_common.h" - -@@ -37,4 +37,4 @@ enum roce_global_cfg_cmd_type { - ROCE_GLB_NICL, - }; - --#endif /* __HIKP_ROCE_GLOBAL_CFG_H__ */ -+#endif /* HIKP_ROCE_GLOBAL_CFG_H */ -diff --git a/net/roce/roce_gmv/hikp_roce_gmv.h b/net/roce/roce_gmv/hikp_roce_gmv.h -index a02b960..8bc49d0 100644 ---- a/net/roce/roce_gmv/hikp_roce_gmv.h -+++ b/net/roce/roce_gmv/hikp_roce_gmv.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_GMV_H__ --#define __HIKP_ROCE_GMV_H__ -+#ifndef HIKP_ROCE_GMV_H -+#define HIKP_ROCE_GMV_H - - #include "hikp_roce_ext_common.h" - -@@ -38,4 +38,4 @@ enum roce_gmv_cmd_type { - GMV_SHOW = 0x0, - }; - --#endif /* __HIKP_ROCE_GMV_H__ */ -+#endif /* HIKP_ROCE_GMV_H */ -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.h b/net/roce/roce_mdb/hikp_roce_mdb.h -index 26fc549..e8dfcca 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.h -+++ b/net/roce/roce_mdb/hikp_roce_mdb.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_MDB_H__ --#define __HIKP_ROCE_MDB_H__ -+#ifndef HIKP_ROCE_MDB_H -+#define HIKP_ROCE_MDB_H - - #include "hikp_roce_ext_common.h" - -@@ -49,4 +49,4 @@ enum roce_mdb_cmd_type { - MDB_CLEAR_EXT, - }; - --#endif /* __HIKP_ROCE_MDB_H__ */ -+#endif /* HIKP_ROCE_MDB_H */ -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.h b/net/roce/roce_pkt/hikp_roce_pkt.h -index 0200c44..05d464e 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.h -+++ b/net/roce/roce_pkt/hikp_roce_pkt.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_PKT_H__ --#define __HIKP_ROCE_PKT_H__ -+#ifndef HIKP_ROCE_PKT_H -+#define HIKP_ROCE_PKT_H - - #include "hikp_roce_ext_common.h" - -@@ -39,4 +39,4 @@ struct roce_pkt_res_param { - struct roce_pkt_res reg_data; - }; - --#endif /* __HIKP_ROCE_PKT_H__ */ -+#endif /* HIKP_ROCE_PKT_H */ -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.h b/net/roce/roce_qmm/hikp_roce_qmm.h -index 06e6bcf..eb7722b 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.h -+++ b/net/roce/roce_qmm/hikp_roce_qmm.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_QMM_H__ --#define __HIKP_ROCE_QMM_H__ -+#ifndef HIKP_ROCE_QMM_H -+#define HIKP_ROCE_QMM_H - - #include "hikp_roce_ext_common.h" - -@@ -51,4 +51,4 @@ enum roce_qmm_cmd_type { - QMM_SHOW_TOP_EXT, - }; - --#endif /* __HIKP_ROCE_QMM_H__ */ -+#endif /* HIKP_ROCE_QMM_H */ -diff --git a/net/roce/roce_rst/hikp_roce_rst.h b/net/roce/roce_rst/hikp_roce_rst.h -index 731effc..e864b68 100644 ---- a/net/roce/roce_rst/hikp_roce_rst.h -+++ b/net/roce/roce_rst/hikp_roce_rst.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_RST_H__ --#define __HIKP_ROCE_RST_H__ -+#ifndef HIKP_ROCE_RST_H -+#define HIKP_ROCE_RST_H - - #include "hikp_roce_ext_common.h" - -@@ -26,4 +26,4 @@ struct roce_rst_req_param { - uint32_t block_id; - }; - --#endif /* __HIKP_ROCE_RST_H__ */ -+#endif /* HIKP_ROCE_RST_H */ -diff --git a/net/roce/roce_scc/hikp_roce_scc.h b/net/roce/roce_scc/hikp_roce_scc.h -index 5d37a11..9b5c0c5 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.h -+++ b/net/roce/roce_scc/hikp_roce_scc.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_SCC_H__ --#define __HIKP_ROCE_SCC_H__ -+#ifndef HIKP_ROCE_SCC_H -+#define HIKP_ROCE_SCC_H - - #include "hikp_roce_ext_common.h" - -@@ -66,4 +66,4 @@ enum roce_scc_type { - CFG, - }; - --#endif /* __HIKP_ROCE_SCC_H__ */ -+#endif /* HIKP_ROCE_SCC_H */ -diff --git a/net/roce/roce_timer/hikp_roce_timer.h b/net/roce/roce_timer/hikp_roce_timer.h -index 7f7deb6..314547e 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.h -+++ b/net/roce/roce_timer/hikp_roce_timer.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_TIMER_H__ --#define __HIKP_ROCE_TIMER_H__ -+#ifndef HIKP_ROCE_TIMER_H -+#define HIKP_ROCE_TIMER_H - - #include "hikp_roce_ext_common.h" - -@@ -40,4 +40,4 @@ struct roce_timer_rsp_data { - uint32_t timer_content[ROCE_HIKP_TIMER_REG_NUM][2]; - }; - --#endif /* __HIKP_ROCE_TIMER_H__ */ -+#endif /* HIKP_ROCE_TIMER_H */ -diff --git a/net/roce/roce_trp/hikp_roce_trp.h b/net/roce/roce_trp/hikp_roce_trp.h -index 97f1838..212d36f 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.h -+++ b/net/roce/roce_trp/hikp_roce_trp.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_TRP_H__ --#define __HIKP_ROCE_TRP_H__ -+#ifndef HIKP_ROCE_TRP_H -+#define HIKP_ROCE_TRP_H - - #include "hikp_roce_ext_common.h" - -@@ -70,4 +70,4 @@ enum roce_trp_type { - COMMON, - }; - --#endif /* __HIKP_ROCE_TRP_H__ */ -+#endif /* HIKP_ROCE_TRP_H */ -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.h b/net/roce/roce_tsp/hikp_roce_tsp.h -index 43d0d0d..a35f869 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.h -+++ b/net/roce/roce_tsp/hikp_roce_tsp.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROCE_TSP_H__ --#define __HIKP_ROCE_TSP_H__ -+#ifndef HIKP_ROCE_TSP_H -+#define HIKP_ROCE_TSP_H - - #include "hikp_roce_ext_common.h" - -@@ -61,4 +61,4 @@ enum roce_tsp_sub_cmd_code { - TGP_TMP, - }; - --#endif /* __HIKP_ROCE_TSP_H__ */ -+#endif /* HIKP_ROCE_TSP_H */ -diff --git a/net/roh/hikp_roh_cmd.h b/net/roh/hikp_roh_cmd.h -index 5aea6ac..1fb19d0 100644 ---- a/net/roh/hikp_roh_cmd.h -+++ b/net/roh/hikp_roh_cmd.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROH_CMD_H__ --#define __HIKP_ROH_CMD_H__ -+#ifndef HIKP_ROH_CMD_H -+#define HIKP_ROH_CMD_H - - #include "hikp_net_lib.h" - -@@ -35,4 +35,4 @@ enum roh_show_bp_subcmd { - }; - - int hikp_roh_get_mac_type(struct major_cmd_ctrl *self, struct bdf_t bdf); --#endif /* __HIKP_ROH_CMD_H__ */ -+#endif /* HIKP_ROH_CMD_H */ -diff --git a/net/roh/hikp_roh_mac.h b/net/roh/hikp_roh_mac.h -index 88115cf..c9037f0 100644 ---- a/net/roh/hikp_roh_mac.h -+++ b/net/roh/hikp_roh_mac.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROH_MAC_H__ --#define __HIKP_ROH_MAC_H__ -+#ifndef HIKP_ROH_MAC_H -+#define HIKP_ROH_MAC_H - - #include "tool_lib.h" - #include "hikp_net_lib.h" -@@ -104,4 +104,4 @@ struct roh_mac_credit_data { - uint32_t cut_reg_value[MAX_CRD_SIZE]; - }; - --#endif /* __HIKP_ROH_MAC_H__ */ -+#endif /* HIKP_ROH_MAC_H */ -diff --git a/net/roh/hikp_roh_show_bp.h b/net/roh/hikp_roh_show_bp.h -index e7a3894..411bd23 100644 ---- a/net/roh/hikp_roh_show_bp.h -+++ b/net/roh/hikp_roh_show_bp.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROH_SHOW_BP_H__ --#define __HIKP_ROH_SHOW_BP_H__ -+#ifndef HIKP_ROH_SHOW_BP_H -+#define HIKP_ROH_SHOW_BP_H - - #include "hikp_net_lib.h" - -@@ -47,4 +47,4 @@ struct roh_show_bp_rsp_t { - #define VERIFY_MAC_ID 2 - #define BP_SIZE 8 - --#endif /* __HIKP_ROH_SHOW_BP_H__ */ -+#endif /* HIKP_ROH_SHOW_BP_H */ -diff --git a/net/roh/hikp_roh_show_mib.h b/net/roh/hikp_roh_show_mib.h -index fc7c308..f8c4855 100644 ---- a/net/roh/hikp_roh_show_mib.h -+++ b/net/roh/hikp_roh_show_mib.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_ROH_SHOW_MIB_H__ --#define __HIKP_ROH_SHOW_MIB_H__ -+#ifndef HIKP_ROH_SHOW_MIB_H -+#define HIKP_ROH_SHOW_MIB_H - - #include "hikp_net_lib.h" - -@@ -83,4 +83,4 @@ enum target_addr { - #define ROH_CMD_SHOW_MIB (1 << 0) - #define RESPONSE_MIB_NUMBER_MAX 15 - --#endif /* __HIKP_ROH_SHOW_MIB_H__ */ -+#endif /* HIKP_ROH_SHOW_MIB_H */ -diff --git a/ossl/ossl_user_linux.h b/ossl/ossl_user_linux.h -index 16fc2d2..c2173e2 100644 ---- a/ossl/ossl_user_linux.h -+++ b/ossl/ossl_user_linux.h -@@ -69,4 +69,4 @@ int uda_unfcntl(const int *fd, const uint32_t operation); - - extern void record_syslog(const char *ident, const int priority, const char *logs); - --#endif -+#endif /* OSSL_USER_LINUX_H */ -diff --git a/pcie/func_lib/osal/os_common.h b/pcie/func_lib/osal/os_common.h -index de2a517..45ae343 100644 ---- a/pcie/func_lib/osal/os_common.h -+++ b/pcie/func_lib/osal/os_common.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef _OS_COMMON_H_ --#define _OS_COMMON_H_ -+#ifndef OS_COMMON_H -+#define OS_COMMON_H - - #define LOG_PCIE "[PCIE]" - -@@ -26,4 +26,4 @@ - - #define Tips(x, args...) Info("[ TIPS ] " x, ##args) - --#endif -+#endif /* OS_COMMON_H */ -diff --git a/pcie/func_lib/pcie_func/pcie_common.h b/pcie/func_lib/pcie_func/pcie_common.h -index 98d9e25..1a5ab3a 100644 ---- a/pcie/func_lib/pcie_func/pcie_common.h -+++ b/pcie/func_lib/pcie_func/pcie_common.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __PCIE_COMMON_H_ --#define __PCIE_COMMON_H_ -+#ifndef PCIE_COMMON_H -+#define PCIE_COMMON_H - - /* PCIe command code */ - enum pcie_cmd_type { -@@ -48,4 +48,4 @@ enum pcie_reg_read_cmd_type { - REGRD_READ = 1, - }; - --#endif -+#endif /* PCIE_COMMON_H */ -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.h b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -index cc51501..9986f7a 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.h -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __PCIE_LINK_LTSSM_H_ --#define __PCIE_LINK_LTSSM_H_ -+#ifndef PCIE_LINK_LTSSM_H -+#define PCIE_LINK_LTSSM_H - - #include "pcie_common_api.h" - -@@ -60,4 +60,4 @@ int pcie_ltssm_trace_mode_set(uint32_t port_id, uint32_t mode); - int pcie_ltssm_link_status_get(uint32_t port_id); - int pcie_pm_trace(uint32_t port_id); - --#endif -+#endif /* PCIE_LINK_LTSSM_H */ -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.h b/pcie/func_lib/pcie_func/pcie_reg_dump.h -index cbea2f6..aaf22ba 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.h -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __PCIE_REG_DUMP_H_ --#define __PCIE_REG_DUMP_H_ -+#ifndef PCIE_REG_DUMP_H -+#define PCIE_REG_DUMP_H - - #include "pcie_common_api.h" - -@@ -56,4 +56,4 @@ struct pcie_dumpreg_table { - - int pcie_dumpreg_do_dump(uint32_t port_id, uint32_t dump_level); - --#endif -+#endif /* PCIE_REG_DUMP_H */ -diff --git a/pcie/func_lib/pcie_func/pcie_reg_read.h b/pcie/func_lib/pcie_func/pcie_reg_read.h -index 05d509a..ec01083 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_read.h -+++ b/pcie/func_lib/pcie_func/pcie_reg_read.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __PCIE_REG_READ_H_ --#define __PCIE_REG_READ_H_ -+#ifndef PCIE_REG_READ_H -+#define PCIE_REG_READ_H - - #include "pcie_common_api.h" - -@@ -57,4 +57,4 @@ enum pcie_module_id_list { - int pcie_reg_read(uint32_t port_id, uint32_t module_id, uint32_t offset); - int pcie_read_name2module_id(const char *module_name, uint32_t *module_id); - --#endif -+#endif /* PCIE_REG_READ_H */ -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.h b/pcie/func_lib/pcie_func/pcie_statistics.h -index 3e3916b..c373573 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.h -+++ b/pcie/func_lib/pcie_func/pcie_statistics.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __PCIE_STATISTICS_H_ --#define __PCIE_STATISTICS_H_ -+#ifndef PCIE_STATISTICS_H -+#define PCIE_STATISTICS_H - - #include "pcie_common_api.h" - -@@ -127,4 +127,4 @@ int pcie_port_distribution_get(uint32_t chip_id); - int pcie_error_state_get(uint32_t port_id); - int pcie_error_state_clear(uint32_t port_id); - --#endif -+#endif /* PCIE_STATISTICS_H */ -diff --git a/pcie/usr_cmd/cmd_analysis/pcie_tools_include.h b/pcie/usr_cmd/cmd_analysis/pcie_tools_include.h -index 83b7349..823f8b5 100644 ---- a/pcie/usr_cmd/cmd_analysis/pcie_tools_include.h -+++ b/pcie/usr_cmd/cmd_analysis/pcie_tools_include.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __PCIE_TOOLS_INCLUDE_H_ --#define __PCIE_TOOLS_INCLUDE_H_ -+#ifndef PCIE_TOOLS_INCLUDE_H -+#define PCIE_TOOLS_INCLUDE_H - - #include "hikptdev_plug.h" - #include "tool_lib.h" -@@ -29,4 +29,4 @@ struct tool_pcie_cmd { - uint32_t read_module_val; - }; - --#endif -+#endif /* PCIE_TOOLS_INCLUDE_H */ -diff --git a/pcie/usr_cmd/interface/pcie_common_api.h b/pcie/usr_cmd/interface/pcie_common_api.h -index 08d4403..59d41ed 100644 ---- a/pcie/usr_cmd/interface/pcie_common_api.h -+++ b/pcie/usr_cmd/interface/pcie_common_api.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __PCIE_COMMON_API_H_ --#define __PCIE_COMMON_API_H_ -+#ifndef PCIE_COMMON_API_H -+#define PCIE_COMMON_API_H - - #include - #include -@@ -42,4 +42,4 @@ struct pcie_comm_api { - - struct pcie_comm_api *pcie_get_comm_api(void); - --#endif -+#endif /* PCIE_COMMON_API_H */ -diff --git a/sas/sas_func/sas_analy_queue.h b/sas/sas_func/sas_analy_queue.h -index 59100f4..7107b5c 100644 ---- a/sas/sas_func/sas_analy_queue.h -+++ b/sas/sas_func/sas_analy_queue.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SAS_ANALY_DQ_H_ --#define __SAS_ANALY_DQ_H_ -+#ifndef SAS_ANALY_DQ_H -+#define SAS_ANALY_DQ_H - - #include "sas_tools_include.h" - -@@ -35,4 +35,4 @@ struct sas_analy_para { - - int sas_analy_cmd(struct tool_sas_cmd *cmd); - --#endif -+#endif /* SAS_ANALY_DQ_H */ -diff --git a/sas/sas_func/sas_common.h b/sas/sas_func/sas_common.h -index c33a2fe..eed0fa5 100644 ---- a/sas/sas_func/sas_common.h -+++ b/sas/sas_func/sas_common.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SAS_COMMON_H_ --#define __SAS_COMMON_H_ -+#ifndef SAS_COMMON_H -+#define SAS_COMMON_H - - #define RESP_MAX_NUM 60 - #define SAS_MAX_PHY_NUM 7 -@@ -84,4 +84,4 @@ enum sas_dqe_cmd_type { - DQE_UNKNOWN_TYPE, - }; - --#endif -+#endif /* SAS_COMMON_H */ -diff --git a/sas/sas_func/sas_dump_reg.h b/sas/sas_func/sas_dump_reg.h -index 06dca72..f2c2e69 100644 ---- a/sas/sas_func/sas_dump_reg.h -+++ b/sas/sas_func/sas_dump_reg.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SAS_DUMP_REG_H_ --#define __SAS_DUMP_REG_H_ -+#ifndef SAS_DUMP_REG_H -+#define SAS_DUMP_REG_H - - #include "sas_tools_include.h" - -@@ -24,4 +24,4 @@ struct sas_dump_req_para { - - int sas_reg_dump(struct tool_sas_cmd *cmd); - --#endif -+#endif /* SAS_DUMP_REG_H */ -diff --git a/sas/sas_func/sas_read_dev.h b/sas/sas_func/sas_read_dev.h -index 47d984f..7049994 100644 ---- a/sas/sas_func/sas_read_dev.h -+++ b/sas/sas_func/sas_read_dev.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SAS_DEV_H_ --#define __SAS_DEV_H_ -+#ifndef SAS_DEV_H -+#define SAS_DEV_H - - #include "sas_tools_include.h" - -@@ -48,4 +48,4 @@ struct hikp_sas_itct { - - int sas_dev(const struct tool_sas_cmd *cmd); - --#endif -+#endif /* SAS_DEV_H */ -diff --git a/sas/sas_func/sas_read_dqe.h b/sas/sas_func/sas_read_dqe.h -index 28c0592..95e1ff3 100644 ---- a/sas/sas_func/sas_read_dqe.h -+++ b/sas/sas_func/sas_read_dqe.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SAS_DQE_H_ --#define __SAS_DQE_H_ -+#ifndef SAS_DQE_H -+#define SAS_DQE_H - - #include "sas_tools_include.h" - -@@ -82,4 +82,4 @@ struct hisi_sas_dq_info { - - int sas_dqe(const struct tool_sas_cmd *cmd); - --#endif -+#endif /* SAS_DQE_H */ -diff --git a/sas/sas_func/sas_read_errcode.h b/sas/sas_func/sas_read_errcode.h -index c597c16..3ee7f11 100644 ---- a/sas/sas_func/sas_read_errcode.h -+++ b/sas/sas_func/sas_read_errcode.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SAS_ERRCODE_REG_H_ --#define __SAS_ERRCODE_REG_H_ -+#ifndef SAS_ERRCODE_REG_H -+#define SAS_ERRCODE_REG_H - - #include "sas_tools_include.h" - -@@ -23,4 +23,4 @@ struct sas_errcode_req_para { - - int sas_errcode_read(struct tool_sas_cmd *cmd); - --#endif -+#endif /* SAS_ERRCODE_REG_H */ -diff --git a/sas/user_cmd/cmd_code/sas_tools_include.h b/sas/user_cmd/cmd_code/sas_tools_include.h -index 0aa7703..a0e4b1b 100644 ---- a/sas/user_cmd/cmd_code/sas_tools_include.h -+++ b/sas/user_cmd/cmd_code/sas_tools_include.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SAS_TOOLS_INCLUDE_H_ --#define __SAS_TOOLS_INCLUDE_H_ -+#ifndef SAS_TOOLS_INCLUDE_H -+#define SAS_TOOLS_INCLUDE_H - - #include "hikptdev_plug.h" - #include "tool_lib.h" -@@ -42,4 +42,4 @@ int sas_set_die_id(struct major_cmd_ctrl *self, const char *argv); - int sas_set_que_id(struct major_cmd_ctrl *self, const char *argv); - int sas_set_dqe_id(struct major_cmd_ctrl *self, const char *argv); - --#endif -+#endif /* SAS_TOOLS_INCLUDE_H */ -diff --git a/sata/sata_func/sata_common.h b/sata/sata_func/sata_common.h -index 82e39c0..01ea13c 100644 ---- a/sata/sata_func/sata_common.h -+++ b/sata/sata_func/sata_common.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SATA_COMMON_H_ --#define __SATA_COMMON_H_ -+#ifndef SATA_COMMON_H -+#define SATA_COMMON_H - - #define SATA_MAX_PORT_NUM 1 - #define RESP_MAX_NUM 60 -@@ -28,4 +28,4 @@ enum sata_dump_cmd_type { - DUMP_PORTX, - }; - --#endif -+#endif /* SATA_COMMON_H */ -diff --git a/sata/sata_func/sata_dump_reg.h b/sata/sata_func/sata_dump_reg.h -index 972ab71..8ea93ad 100644 ---- a/sata/sata_func/sata_dump_reg.h -+++ b/sata/sata_func/sata_dump_reg.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SATA_DUMP_REG_H_ --#define __SATA_DUMP_REG_H_ -+#ifndef SATA_DUMP_REG_H -+#define SATA_DUMP_REG_H - - #include "sata_tools_include.h" - -@@ -24,4 +24,4 @@ struct sata_dump_req_para { - - int sata_reg_dump(struct tool_sata_cmd *cmd); - --#endif -+#endif /* SATA_DUMP_REG_H */ -diff --git a/sata/user_cmd/cmd_code/sata_tools_include.h b/sata/user_cmd/cmd_code/sata_tools_include.h -index a9671a9..bafb52a 100644 ---- a/sata/user_cmd/cmd_code/sata_tools_include.h -+++ b/sata/user_cmd/cmd_code/sata_tools_include.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __SATA_TOOLS_INCLUDE_H_ --#define __SATA_TOOLS_INCLUDE_H_ -+#ifndef SATA_TOOLS_INCLUDE_H -+#define SATA_TOOLS_INCLUDE_H - - #include "hikptdev_plug.h" - #include "tool_lib.h" -@@ -26,4 +26,4 @@ struct tool_sata_cmd { - uint32_t die_id; - }; - --#endif -+#endif /* SATA_TOOLS_INCLUDE_H */ -diff --git a/serdes/hikp_serdes.h b/serdes/hikp_serdes.h -index 83c28b8..2c04e8a 100644 ---- a/serdes/hikp_serdes.h -+++ b/serdes/hikp_serdes.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __HIKP_SERDES_H__ --#define __HIKP_SERDES_H__ -+#ifndef HIKP_SERDES_H -+#define HIKP_SERDES_H - - #include - #include -@@ -21,8 +21,6 @@ - #include - #include "tool_lib.h" - --#define __SERDES_DESC(x) 1 -- - enum serdes_cmd_type_e { - SERDES_SYS_RESERVE0 = 0, - SERDES_SYS_RESERVE1 = 1, -@@ -212,4 +210,4 @@ struct hilink_brief_info { - uint32_t rsvd_1; - }; - --#endif -+#endif /* HIKP_SERDES_H */ -diff --git a/socip/hikp_socip.h b/socip/hikp_socip.h -index c98f136..8d3f31b 100644 ---- a/socip/hikp_socip.h -+++ b/socip/hikp_socip.h -@@ -10,8 +10,8 @@ - * - * See the Mulan PSL v2 for more details. - */ --#ifndef __HIKP_SOCIP_H__ --#define __HIKP_SOCIP_H__ -+#ifndef HIKP_SOCIP_H -+#define HIKP_SOCIP_H - - #include - -@@ -46,4 +46,4 @@ struct socip_dump_reg_req_data_t { - uint8_t controller_id; - }; - --#endif /* __HIKP_SOCIP_H__ */ -+#endif /* HIKP_SOCIP_H */ -diff --git a/tool_lib/tool_cmd.h b/tool_lib/tool_cmd.h -index 566b2a3..1aaaf22 100644 ---- a/tool_lib/tool_cmd.h -+++ b/tool_lib/tool_cmd.h -@@ -79,4 +79,4 @@ extern void cmd_option_register(const char *little, const char *large, uint8_t h - extern void command_parse_and_excute(const int argc, const char **argv); - extern struct major_cmd_ctrl *get_major_cmd(void); - --#endif -+#endif /* TOOL_CMD_H */ -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 644a08e..15dac74 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -11,8 +11,8 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef __TOOL_LIB_H__ --#define __TOOL_LIB_H__ -+#ifndef TOOL_LIB_H -+#define TOOL_LIB_H - - #include "ossl_user_linux.h" - -@@ -105,4 +105,4 @@ int generate_file_name(unsigned char *file_name, uint32_t file_name_len, - const unsigned char *prefix); - bool tool_can_print(uint32_t interval, uint32_t burst, uint32_t *print_num, uint64_t *last_time); - --#endif -+#endif /* TOOL_LIB_H */ --- -2.45.0.windows.1 - diff --git a/0083-hikptool-The-memory-release-interface-is-added.patch b/0083-hikptool-The-memory-release-interface-is-added.patch deleted file mode 100644 index 1444876..0000000 --- a/0083-hikptool-The-memory-release-interface-is-added.patch +++ /dev/null @@ -1,1557 +0,0 @@ -From 2dccd3b70f9b262f541147f61ffed8cd9b7a079b Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 3 Sep 2024 20:26:16 +0800 -Subject: [PATCH 21/27] hikptool: The memory release interface is added. - -The memory release interface hikp_cmd_free is -added to work with hikp_cmd_alloc. - -Signed-off-by: veega2022 ---- - cxl/func_lib/cxl_func/cxl_feature.c | 11 +++---- - libhikptdev/include/hikptdev_plug.h | 1 + - libhikptdev/src/rciep/hikpt_rciep.c | 8 +++++ - net/nic/nic_dfx/hikp_nic_dfx.c | 6 ++-- - net/nic/nic_fd/hikp_nic_fd.c | 4 +-- - net/nic/nic_fec/hikp_nic_fec.c | 7 ++-- - net/nic/nic_ft/hikp_nic_port_fault.c | 7 ++-- - net/nic/nic_gro/hikp_nic_gro.c | 6 ++-- - net/nic/nic_info/hikp_nic_info.c | 6 ++-- - net/nic/nic_log/hikp_nic_log.c | 6 ++-- - net/nic/nic_mac/hikp_nic_mac_dump.c | 8 ++--- - net/nic/nic_mac/hikp_nic_port.c | 32 ++++++++----------- - net/nic/nic_mac/hikp_nic_xsfp.c | 12 +++---- - net/nic/nic_ncsi/hikp_nic_ncsi.c | 3 +- - net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c | 5 ++- - net/nic/nic_ppp/hikp_nic_ppp.c | 15 ++++----- - net/nic/nic_qos/hikp_nic_qos.c | 2 +- - net/nic/nic_queue/hikp_nic_queue.c | 2 +- - net/nic/nic_rss/hikp_nic_rss.c | 2 +- - net/nic/nic_torus/hikp_nic_torus.c | 7 ++-- - net/roce/roce_caep/hikp_roce_caep.c | 3 +- - .../roce_ext_common/hikp_roce_ext_common.c | 8 +---- - net/roce/roce_gmv/hikp_roce_gmv.c | 3 +- - net/roce/roce_mdb/hikp_roce_mdb.c | 3 +- - net/roce/roce_pkt/hikp_roce_pkt.c | 6 ++-- - net/roce/roce_qmm/hikp_roce_qmm.c | 3 +- - net/roce/roce_scc/hikp_roce_scc.c | 17 +++------- - net/roce/roce_timer/hikp_roce_timer.c | 6 ++-- - net/roce/roce_trp/hikp_roce_trp.c | 17 +++------- - net/roce/roce_tsp/hikp_roce_tsp.c | 6 ++-- - net/roh/hikp_roh_mac.c | 26 ++++++--------- - net/roh/hikp_roh_show_bp.c | 3 +- - net/roh/hikp_roh_show_mib.c | 6 ++-- - net/ub/ub_bp/hikp_ub_bp.c | 6 ++-- - net/ub/ub_crd/hikp_ub_crd.c | 6 ++-- - net/ub/ub_dfx/hikp_ub_dfx.c | 6 ++-- - net/ub/ub_info/hikp_ub_info.c | 6 ++-- - net/ub/ub_link/hikp_ub_link.c | 6 ++-- - net/ub/ub_ppp/hikp_unic_ppp.c | 2 +- - pcie/func_lib/pcie_func/pcie_link_ltssm.c | 19 +++++------ - pcie/func_lib/pcie_func/pcie_reg_dump.c | 2 +- - pcie/func_lib/pcie_func/pcie_reg_read.c | 2 +- - pcie/func_lib/pcie_func/pcie_statistics.c | 13 ++++---- - sas/sas_func/sas_analy_queue.c | 4 +-- - sas/sas_func/sas_dump_reg.c | 4 +-- - sas/sas_func/sas_read_dev.c | 4 +-- - sas/sas_func/sas_read_dqe.c | 4 +-- - sas/sas_func/sas_read_errcode.c | 4 +-- - sata/sata_func/sata_dump_reg.c | 4 +-- - serdes/hikp_serdes.c | 4 +-- - socip/hikp_socip_dumpreg.c | 6 ++-- - 51 files changed, 144 insertions(+), 215 deletions(-) - -diff --git a/cxl/func_lib/cxl_func/cxl_feature.c b/cxl/func_lib/cxl_func/cxl_feature.c -index 12fadbd..afe3895 100644 ---- a/cxl/func_lib/cxl_func/cxl_feature.c -+++ b/cxl/func_lib/cxl_func/cxl_feature.c -@@ -354,8 +354,7 @@ int cxl_reg_show_execute(uint32_t port_id, uint32_t mode_code, uint32_t cmd_type - if (ret) { - printf("cxl_cmd mode_code: %u cmd_type: %u, hikp_get_data_proc err, ret : %d\n", - mode_code, cmd_type, ret); -- if (cmd_ret) -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -@@ -363,7 +362,7 @@ int cxl_reg_show_execute(uint32_t port_id, uint32_t mode_code, uint32_t cmd_type - printf("cxl_cmd mode_code: %u cmd_type: %u," - "The value of rsp data num is less than 2, rsp data num: %u\n", - mode_code, cmd_type, cmd_ret->rsp_data_num); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -EINVAL; - } - data_head = (struct cxl_out_data *)cmd_ret->rsp_data; -@@ -371,7 +370,7 @@ int cxl_reg_show_execute(uint32_t port_id, uint32_t mode_code, uint32_t cmd_type - - ret = cxl_data_unit_buf_check(data_head->data_offset, data_unit_len, cmd_ret->rsp_data_num); - if (ret) { -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -@@ -381,11 +380,11 @@ int cxl_reg_show_execute(uint32_t port_id, uint32_t mode_code, uint32_t cmd_type - if (mode_code == g_prtf[i].mode_code && - cmd_type == g_prtf[i].cmd_type && g_prtf[i].cxl_prt_handle) { - g_prtf[i].cxl_prt_handle(data_unit_buf, data_unit_len); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return 0; - } - } - -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -EINVAL; - } -diff --git a/libhikptdev/include/hikptdev_plug.h b/libhikptdev/include/hikptdev_plug.h -index 5ea02ca..2123935 100644 ---- a/libhikptdev/include/hikptdev_plug.h -+++ b/libhikptdev/include/hikptdev_plug.h -@@ -51,6 +51,7 @@ void hikp_cmd_init(struct hikp_cmd_header *req_header, uint32_t mod_code, uint32 - uint32_t sub_cmd_code); - struct hikp_cmd_ret *hikp_cmd_alloc(struct hikp_cmd_header *req_header, - const void *req_data, uint32_t req_size); -+void hikp_cmd_free(struct hikp_cmd_ret **cmd_ret); - int hikp_dev_init(void); - void hikp_dev_uninit(void); - int hikp_rsp_normal_check(const struct hikp_cmd_ret *cmd_ret); -diff --git a/libhikptdev/src/rciep/hikpt_rciep.c b/libhikptdev/src/rciep/hikpt_rciep.c -index 0210f3d..5a38b3b 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.c -+++ b/libhikptdev/src/rciep/hikpt_rciep.c -@@ -285,6 +285,14 @@ free_req_data: - return cmd_ret; - } - -+void hikp_cmd_free(struct hikp_cmd_ret **cmd_ret) -+{ -+ if (*cmd_ret) { -+ free(*cmd_ret); -+ *cmd_ret = NULL; -+ } -+} -+ - int hikp_rsp_normal_check(const struct hikp_cmd_ret *cmd_ret) - { - if (cmd_ret == NULL) -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.c b/net/nic/nic_dfx/hikp_nic_dfx.c -index 2cc4367..318d85f 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.c -+++ b/net/nic/nic_dfx/hikp_nic_dfx.c -@@ -161,8 +161,7 @@ static int hikp_nic_get_first_blk_dfx(struct nic_dfx_rsp_head_t *rsp_head, uint3 - - *max_dfx_size -= (uint32_t)rsp_head->cur_blk_size; - err_out: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -@@ -191,8 +190,7 @@ static int hikp_nic_get_blk_dfx(struct nic_dfx_rsp_head_t *rsp_head, uint32_t bl - *max_dfx_size -= (uint32_t)rsp_head->cur_blk_size; - - err_out: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index d4a9678..fb9333a 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -579,7 +579,7 @@ static int hikp_nic_fd_get_blk(struct hikp_cmd_header *req_header, - rsp_head->cur_blk_entry_cnt = rsp->rsp_head.cur_blk_entry_cnt; - - out: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -@@ -929,7 +929,6 @@ static void hikp_nic_fd_cmd_execute(struct major_cmd_ctrl *self) - const struct fd_feature_cmd *fd_cmd; - union nic_fd_feature_info *fd_data; - struct hikp_cmd_header req_header = {0}; -- uint8_t stage_no; - int ret; - - ret = hikp_nic_fd_check_input_param(self, &g_fd_param); -@@ -967,7 +966,6 @@ static void hikp_nic_fd_cmd_execute(struct major_cmd_ctrl *self) - /* The 'hw_info' cmd no need to input stage number, - * because it queries all stages information. - */ -- stage_no = fd_cmd->sub_cmd_code == NIC_FD_HW_INFO_DUMP ? 0 : g_fd_param.stage_no - 1; - hikp_cmd_init(&req_header, NIC_MOD, GET_FD_INFO_CMD, fd_cmd->sub_cmd_code); - ret = fd_cmd->query(&req_header, bdf, g_fd_param.stage_no - 1, fd_data, sizeof(*fd_data)); - if (ret != 0) { -diff --git a/net/nic/nic_fec/hikp_nic_fec.c b/net/nic/nic_fec/hikp_nic_fec.c -index edea28b..5a34bfd 100644 ---- a/net/nic/nic_fec/hikp_nic_fec.c -+++ b/net/nic/nic_fec/hikp_nic_fec.c -@@ -32,16 +32,15 @@ static int hikp_nic_fec_err_query(const struct bdf_t *bdf, struct nic_fec_err_in - hikp_cmd_init(&header, NIC_MOD, GET_FEC_INFO_CMD, NIC_FEC_ERR_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- ret = cmd_ret ? -cmd_ret->status : -EIO; -+ ret = cmd_ret ? (int)(-cmd_ret->status) : -EIO; - HIKP_ERROR_PRINT("fail to get fec info, retcode: %d\n", ret); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - - rsp = (struct nic_fec_rsp *)cmd_ret->rsp_data; - *info = *(struct nic_fec_err_info *)rsp->data; -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - - if (info->fec_mode >= NIC_FEC_MODE_BUTT) { - HIKP_ERROR_PRINT("unknown fec mode: %u\n", info->fec_mode); -diff --git a/net/nic/nic_ft/hikp_nic_port_fault.c b/net/nic/nic_ft/hikp_nic_port_fault.c -index 85fa874..6561e3e 100644 ---- a/net/nic/nic_ft/hikp_nic_port_fault.c -+++ b/net/nic/nic_ft/hikp_nic_port_fault.c -@@ -33,17 +33,16 @@ static int hikp_nic_port_fault_query(const struct bdf_t *bdf, - NIC_PORT_FAULT_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- ret = cmd_ret ? -cmd_ret->status : -EIO; -+ ret = cmd_ret ? (int)(-cmd_ret->status) : -EIO; - HIKP_ERROR_PRINT("fail to get port fault, retcode: %d\n", ret); -- if (cmd_ret != NULL) -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return ret; - } - - rsp = (struct nic_port_fault_rsp *)cmd_ret->rsp_data; - *info = *(struct nic_port_fault_status *)rsp->data; -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return 0; - } -diff --git a/net/nic/nic_gro/hikp_nic_gro.c b/net/nic/nic_gro/hikp_nic_gro.c -index d897f11..19395af 100644 ---- a/net/nic/nic_gro/hikp_nic_gro.c -+++ b/net/nic/nic_gro/hikp_nic_gro.c -@@ -32,15 +32,15 @@ static int hikp_nic_gro_query(const struct bdf_t *bdf, struct nic_gro_info *info - hikp_cmd_init(&header, NIC_MOD, GET_GRO_INFO_CMD, NIC_GRO_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- ret = cmd_ret ? -cmd_ret->status : -EIO; -+ ret = cmd_ret ? (int)(-cmd_ret->status) : -EIO; - HIKP_ERROR_PRINT("fail to get gro info, retcode: %d\n", ret); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - - rsp = (struct nic_gro_rsp *)cmd_ret->rsp_data; - *info = *(struct nic_gro_info *)rsp->data; -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return 0; - } -diff --git a/net/nic/nic_info/hikp_nic_info.c b/net/nic/nic_info/hikp_nic_info.c -index cd07b13..49f143f 100644 ---- a/net/nic/nic_info/hikp_nic_info.c -+++ b/net/nic/nic_info/hikp_nic_info.c -@@ -70,14 +70,12 @@ static int hikp_nic_get_curr_die_info(void) - ret = hikp_nic_get_hw_info(&cmd_ret); - if (ret != 0) { - HIKP_ERROR_PRINT("Get chip info fail.\n"); -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return ret; - } - info_rsp = (struct nic_info_rsp_t *)(cmd_ret->rsp_data); - g_info_param.info = *info_rsp; -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - - ret = get_revision_id_by_bdf(&g_info_param.target.bdf, g_info_param.revision_id, - sizeof(g_info_param.revision_id)); -diff --git a/net/nic/nic_log/hikp_nic_log.c b/net/nic/nic_log/hikp_nic_log.c -index dc622e0..f182d25 100644 ---- a/net/nic/nic_log/hikp_nic_log.c -+++ b/net/nic/nic_log/hikp_nic_log.c -@@ -124,8 +124,7 @@ static int hikp_nic_get_first_blk_info(uint32_t *total_blk_num, - *cur_blk_size = (uint32_t)log_rsp->cur_blk_size; - memcpy(*log_data, log_rsp->log_data, log_rsp->cur_blk_size); - err_out: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -@@ -152,8 +151,7 @@ static int hikp_nic_get_log_info(uint32_t blk_id, uint32_t *cur_blk_size, uint8_ - } - memcpy(log_data, log_rsp->log_data, log_rsp->cur_blk_size); - err_out: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -diff --git a/net/nic/nic_mac/hikp_nic_mac_dump.c b/net/nic/nic_mac/hikp_nic_mac_dump.c -index 3e818cd..5439c71 100644 ---- a/net/nic/nic_mac/hikp_nic_mac_dump.c -+++ b/net/nic/nic_mac/hikp_nic_mac_dump.c -@@ -40,7 +40,7 @@ static int mac_dump_module_reg(struct major_cmd_ctrl *self, uint32_t cur_blk_id, - return self->err_no; - } - if (cmd_ret->status != 0) { -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - self->err_no = -EINVAL; - return self->err_no; - } -@@ -53,7 +53,7 @@ static int mac_dump_module_reg(struct major_cmd_ctrl *self, uint32_t cur_blk_id, - rsp_data++; - } - -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return 0; - } -@@ -156,13 +156,13 @@ static int mac_cmd_get_dump_blk_num(struct major_cmd_ctrl *self) - if (cmd_ret->status != 0 || cmd_ret->rsp_data_num < MOD_ID_MAX) { - HIKP_ERROR_PRINT("nic_mac reg blk num error, rsp_num:%u\n", cmd_ret->rsp_data_num); - self->err_no = -EINVAL; -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return self->err_no; - } - - memcpy(g_dump_reg_info.blk_num, cmd_ret->rsp_data, sizeof(g_dump_reg_info.blk_num)); - -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return 0; - } -diff --git a/net/nic/nic_mac/hikp_nic_port.c b/net/nic/nic_mac/hikp_nic_port.c -index f818001..e28a040 100644 ---- a/net/nic/nic_mac/hikp_nic_port.c -+++ b/net/nic/nic_mac/hikp_nic_port.c -@@ -148,8 +148,7 @@ static int mac_cmd_get_dfx_cfg(uint32_t sub_cmd, struct hikp_cmd_ret **cmd_ret) - return -ENOSPC; - - if ((*cmd_ret)->status != 0) { -- free(*cmd_ret); -- *cmd_ret = NULL; -+ hikp_cmd_free(cmd_ret); - return -EAGAIN; - } - -@@ -207,8 +206,7 @@ static void mac_cmd_show_eth_mac(struct major_cmd_ctrl *self) - - mac_dfx = (struct mac_cmd_mac_dfx *)(cmd_ret->rsp_data); - mac_cmd_disp_eth_mac_info(mac_dfx); -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - } - - static void mac_cmd_disp_roh_mac_info(const struct mac_cmd_roh_mac_dfx *mac_dfx) -@@ -240,8 +238,7 @@ static void mac_cmd_show_roh_mac(struct major_cmd_ctrl *self) - - mac_dfx = (struct mac_cmd_roh_mac_dfx *)(cmd_ret->rsp_data); - mac_cmd_disp_roh_mac_info(mac_dfx); -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - } - - static void mac_cmd_show_mac(struct major_cmd_ctrl *self) -@@ -263,8 +260,7 @@ static void mac_cmd_show_mac(struct major_cmd_ctrl *self) - else - mac_cmd_show_eth_mac(self); - -- free(hw_cmd_ret); -- hw_cmd_ret = NULL; -+ hikp_cmd_free(&hw_cmd_ret); - } - - static void mac_cmd_disp_link_info(struct mac_cmd_link_dfx *link_dfx) -@@ -304,7 +300,7 @@ static void mac_cmd_show_link(struct major_cmd_ctrl *self) - - link_dfx = (struct mac_cmd_link_dfx *)(cmd_ret->rsp_data); - mac_cmd_disp_link_info(link_dfx); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - } - - static void mac_cmd_disp_phy_reg(const uint16_t *reg, uint32_t num) -@@ -372,13 +368,13 @@ static void mac_cmd_show_phy(struct major_cmd_ctrl *self) - if (ret != 0) { - printf("hikp_data_proc get phy dfx failed.\n"); - self->err_no = -ENOSPC; -- free(phy_cfg_ret); -+ hikp_cmd_free(&phy_cfg_ret); - return; - } - phy_dfx = (struct mac_cmd_phy_dfx *)(phy_dfx_ret->rsp_data); - mac_cmd_disp_phy_info(phy_cfg, phy_dfx); -- free(phy_cfg_ret); -- free(phy_dfx_ret); -+ hikp_cmd_free(&phy_cfg_ret); -+ hikp_cmd_free(&phy_dfx_ret); - } - - static void mac_cmd_disp_port_param(const char *label, const struct mac_port_param *port) -@@ -442,7 +438,7 @@ static void mac_cmd_show_arb(struct major_cmd_ctrl *self) - - arb_dfx = (struct mac_cmd_arb_dfx *)(cmd_ret->rsp_data); - mac_cmd_disp_arb_info(arb_dfx); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - } - - static void mac_cmd_show_hot_plug_card(struct major_cmd_ctrl *self) -@@ -460,7 +456,7 @@ static void mac_cmd_show_hot_plug_card(struct major_cmd_ctrl *self) - - hpc_dfx = (struct cmd_hot_plug_card_info *)(cmd_ret->rsp_data); - mac_cmd_disp_hot_plug_card_info(hpc_dfx); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - } - - static void mac_cmd_print_cdr_dfx(struct mac_cmd_cdr_dfx *cdr_dfx, struct mac_port_cdr_dfx *info) -@@ -534,7 +530,7 @@ static void mac_cmd_show_cdr(struct major_cmd_ctrl *self) - - cdr_dfx = (struct mac_cmd_cdr_dfx *)(cmd_ret->rsp_data); - mac_cmd_disp_cdr_info(cdr_dfx); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - } - - static void mac_cmd_show_port_dfx(struct major_cmd_ctrl *self, uint32_t mask) -@@ -568,8 +564,7 @@ static int mac_cmd_get_port_dfx_cap(uint32_t *cap) - if (ret == 0) { - dfx_cap = (struct mac_cmd_port_dfx_cap *)dfx_cap_resp->rsp_data; - *cap = dfx_cap->cap_bit_map; -- free(dfx_cap_resp); -- dfx_cap_resp = NULL; -+ hikp_cmd_free(&dfx_cap_resp); - return ret; - } - -@@ -585,8 +580,7 @@ static int mac_cmd_get_port_dfx_cap(uint32_t *cap) - port_hw->port_type == HIKP_PORT_TYPE_PHY_SDS) - *cap |= MAC_LSPORT_PHY; - -- free(hw_cmd_ret); -- hw_cmd_ret = NULL; -+ hikp_cmd_free(&hw_cmd_ret); - return ret; - } - -diff --git a/net/nic/nic_mac/hikp_nic_xsfp.c b/net/nic/nic_mac/hikp_nic_xsfp.c -index a1294a8..573837b 100644 ---- a/net/nic/nic_mac/hikp_nic_xsfp.c -+++ b/net/nic/nic_mac/hikp_nic_xsfp.c -@@ -597,16 +597,14 @@ static int hikp_xsfp_get_raw_data(uint8_t *buf, uint32_t size, uint32_t blk_num) - ret = hikp_xsfp_get_cmd_data(&cmd_resp, NIC_XSFP_GET_EEPROM_DATA, i); - if (ret != 0) { - HIKP_ERROR_PRINT("get optical module eeprom data failed\n"); -- free(cmd_resp); -- cmd_resp = NULL; -+ hikp_cmd_free(&cmd_resp); - return ret; - } - - if (cmd_resp->rsp_data_num == 0) { - HIKP_ERROR_PRINT("get eeprom data rsp_data_num %u error\n", - cmd_resp->rsp_data_num); -- free(cmd_resp); -- cmd_resp = NULL; -+ hikp_cmd_free(&cmd_resp); - return -EINVAL; - } - -@@ -616,8 +614,7 @@ static int hikp_xsfp_get_raw_data(uint8_t *buf, uint32_t size, uint32_t blk_num) - offset += len; - - /* current cmd interaction is complete, so free cmd_buf */ -- free(cmd_resp); -- cmd_resp = NULL; -+ hikp_cmd_free(&cmd_resp); - } - - return 0; -@@ -700,8 +697,7 @@ static void hikp_xsfp_get_info(struct major_cmd_ctrl *self) - hikp_xsfp_get_eeprom_data(self, info->data_size, info->total_blk_num); - - ERR_OUT: -- free(cmd_resp); -- cmd_resp = NULL; -+ hikp_cmd_free(&cmd_resp); - } - - static int hikp_xsfp_show_help(struct major_cmd_ctrl *self, const char *argv) -diff --git a/net/nic/nic_ncsi/hikp_nic_ncsi.c b/net/nic/nic_ncsi/hikp_nic_ncsi.c -index d09e16f..2e1ea11 100644 ---- a/net/nic/nic_ncsi/hikp_nic_ncsi.c -+++ b/net/nic/nic_ncsi/hikp_nic_ncsi.c -@@ -72,8 +72,7 @@ static void nic_ncsi_cmd_execute(struct major_cmd_ctrl *self) - nic_ncsi_cmd_print_dfx_info((struct nic_ncsi_cmd_resp *)cmd_resp->rsp_data); - - ERR_OUT: -- free(cmd_resp); -- cmd_resp = NULL; -+ hikp_cmd_free(&cmd_resp); - } - - static int nic_ncsi_cmd_get_port_info(struct major_cmd_ctrl *self, const char *argv) -diff --git a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -index 56b8257..5cd8bfa 100644 ---- a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -+++ b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -@@ -33,14 +33,13 @@ static int hikp_nic_notify_pkt_query(struct major_cmd_ctrl *self, const struct b - self->err_no = hikp_rsp_normal_check(cmd_resp); - if (self->err_no) { - snprintf(self->err_str, sizeof(self->err_str), "get notify pkt failed."); -- if (cmd_resp) -- free(cmd_resp); -+ hikp_cmd_free(&cmd_resp); - return self->err_no; - } - - rsp = (struct nic_notify_pkt_rsp *)cmd_resp->rsp_data; - *info = *(struct nic_notify_pkt_info *)rsp->data; -- free(cmd_resp); -+ hikp_cmd_free(&cmd_resp); - - return 0; - } -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index 3f777b3..aa63f12 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -512,7 +512,7 @@ static int hikp_nic_ppp_get_blk(struct hikp_cmd_header *req_header, - rsp_head->cur_blk_entry_cnt = rsp->rsp_head.cur_blk_entry_cnt; - - out: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -@@ -545,7 +545,7 @@ static int hikp_nic_ppp_query_uc_mac_addr(struct hikp_cmd_header *req_header, - return -EINVAL; - } - if (entry_size + rsp_head.cur_blk_entry_cnt > max_hw_entry_size) { -- HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " - "is over the maximum entry nubmer (%u) of unicast MAC table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, max_hw_entry_size); - return -EINVAL; -@@ -587,7 +587,7 @@ static int hikp_nic_ppp_query_mc_mac_addr(struct hikp_cmd_header *req_header, - return -EINVAL; - } - if (entry_size + rsp_head.cur_blk_entry_cnt > max_hw_entry_size) { -- HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " - "is over the maximum entry nubmer (%u) of multicast MAC table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, max_hw_entry_size); - return -EINVAL; -@@ -658,7 +658,7 @@ static int hikp_nic_ppp_query_vf_vlan_tbl(struct hikp_cmd_header *req_header, - return -EINVAL; - } - if (entry_size + rsp_head.cur_blk_entry_cnt > hw_entry_size) { -- HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " - "is over the maximum entry nubmer (%u) of VF VLAN table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, hw_entry_size); - return -EINVAL; -@@ -699,7 +699,7 @@ static int hikp_nic_ppp_query_port_vlan_tbl(struct hikp_cmd_header *req_header, - return -EINVAL; - } - if (entry_size + rsp_head.cur_blk_entry_cnt > hw_entry_size) { -- HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " - "is over the maximum entry nubmer (%u) of port VLAN table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, hw_entry_size); - return -EINVAL; -@@ -761,7 +761,7 @@ static int hikp_nic_query_mng_tbl(struct hikp_cmd_header *req_header, - return -EINVAL; - } - if (entry_size + rsp_head.cur_blk_entry_cnt > g_ppp_hw_res.mng_tbl_size) { -- HIKP_ERROR_PRINT("The sum of entry number (%lu) after block-%u " -+ HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " - "is over the maximum entry nubmer (%u) of manager table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, g_ppp_hw_res.mng_tbl_size); - return -EINVAL; -@@ -1044,7 +1044,6 @@ static int hikp_nic_ppp_check_input_param(struct major_cmd_ctrl *self, - } - - static int hikp_nic_check_func_id_valid(struct major_cmd_ctrl *self, -- const struct ppp_feature_cmd *ppp_cmd, - const struct nic_ppp_param *ppp_param, - const struct hikp_nic_ppp_hw_resources *hw_res) - { -@@ -1128,7 +1127,7 @@ static void hikp_nic_ppp_cmd_execute(struct major_cmd_ctrl *self) - } - - ppp_cmd = &g_ppp_feature_cmd[g_ppp_param.feature_idx]; -- ret = hikp_nic_check_func_id_valid(self, ppp_cmd, &g_ppp_param, &g_ppp_hw_res); -+ ret = hikp_nic_check_func_id_valid(self, &g_ppp_param, &g_ppp_hw_res); - if (ret != 0) - return; - -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index 2de0972..81eb0ba 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -187,7 +187,7 @@ static int hikp_nic_qos_get_blk(struct hikp_cmd_header *req_header, - rsp_head->cur_blk_size = rsp->rsp_head.cur_blk_size; - - out: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -diff --git a/net/nic/nic_queue/hikp_nic_queue.c b/net/nic/nic_queue/hikp_nic_queue.c -index c73c8f7..dafa05e 100644 ---- a/net/nic/nic_queue/hikp_nic_queue.c -+++ b/net/nic/nic_queue/hikp_nic_queue.c -@@ -260,7 +260,7 @@ static int hikp_nic_queue_get_blk(struct hikp_cmd_header *req_header, - rsp_head->cur_blk_size = rsp->rsp_head.cur_blk_size; - - out: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -diff --git a/net/nic/nic_rss/hikp_nic_rss.c b/net/nic/nic_rss/hikp_nic_rss.c -index 558f931..65336ff 100644 ---- a/net/nic/nic_rss/hikp_nic_rss.c -+++ b/net/nic/nic_rss/hikp_nic_rss.c -@@ -378,7 +378,7 @@ static int hikp_nic_rss_get_blk(struct hikp_cmd_header *req_header, - rsp_head->cur_blk_size = rsp->rsp_head.cur_blk_size; - - out: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -diff --git a/net/nic/nic_torus/hikp_nic_torus.c b/net/nic/nic_torus/hikp_nic_torus.c -index 9483bfe..5208bdc 100644 ---- a/net/nic/nic_torus/hikp_nic_torus.c -+++ b/net/nic/nic_torus/hikp_nic_torus.c -@@ -33,16 +33,15 @@ static int hikp_nic_torus_query(const struct bdf_t *bdf, - hikp_cmd_init(&header, NIC_MOD, GET_TORUS_INFO_CMD, NIC_TORUS_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- ret = cmd_ret ? -cmd_ret->status : -EIO; -+ ret = cmd_ret ? (int)(-cmd_ret->status) : -EIO; - HIKP_ERROR_PRINT("fail to get torus info, retcode: %d\n", ret); -- if (cmd_ret) -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - - rsp = (struct nic_torus_rsp *)cmd_ret->rsp_data; - *info = *(struct nic_torus_info *)rsp->data; -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return 0; - } -diff --git a/net/roce/roce_caep/hikp_roce_caep.c b/net/roce/roce_caep/hikp_roce_caep.c -index 0453bc4..a52cd54 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.c -+++ b/net/roce/roce_caep/hikp_roce_caep.c -@@ -99,8 +99,7 @@ static void hikp_roce_caep_execute_origin(struct major_cmd_ctrl *self) - roce_caep_res->reg_data.data); - - exec_error: -- if (cmd_ret) -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - } - - static void hikp_roce_caep_execute(struct major_cmd_ctrl *self) -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index cc9f509..9c844f4 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -26,12 +26,6 @@ static void hikp_roce_ext_reg_data_free(struct reg_data *reg) - } - } - --static void hikp_roce_ext_cmd_ret_free(struct hikp_cmd_ret *cmd_ret) --{ -- if (cmd_ret) -- free(cmd_ret); --} -- - static const struct cmd_type_info { - enum roce_cmd_type cmd_type; - const char *cmd_name; -@@ -156,7 +150,7 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - (uint32_t *)&roce_ext_res->reg_data + reg_array_length, cur_size); - - get_data_error: -- hikp_roce_ext_cmd_ret_free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -diff --git a/net/roce/roce_gmv/hikp_roce_gmv.c b/net/roce/roce_gmv/hikp_roce_gmv.c -index bc01ccf..1b7db32 100644 ---- a/net/roce/roce_gmv/hikp_roce_gmv.c -+++ b/net/roce/roce_gmv/hikp_roce_gmv.c -@@ -113,8 +113,7 @@ static void hikp_roce_gmv_execute(struct major_cmd_ctrl *self) - gmv_rsp = (struct roce_gmv_rsp_data *)(cmd_ret->rsp_data); - hikp_roce_gmv_print(reg_num, gmv_rsp); - exec_error: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - } - - static void cmd_roce_gmv_init(void) -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.c b/net/roce/roce_mdb/hikp_roce_mdb.c -index e811bec..a578c87 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.c -+++ b/net/roce/roce_mdb/hikp_roce_mdb.c -@@ -152,8 +152,7 @@ static void hikp_roce_mdb_execute_origin(struct major_cmd_ctrl *self) - hikp_roce_mdb_print(reg_num, mdb_rsp); - - exec_error: -- if (cmd_ret) -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - } - - static void hikp_roce_mdb_execute(struct major_cmd_ctrl *self) -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.c b/net/roce/roce_pkt/hikp_roce_pkt.c -index 74294c6..81bdae6 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.c -+++ b/net/roce/roce_pkt/hikp_roce_pkt.c -@@ -55,8 +55,7 @@ static int hikp_roce_pkt_get_data(struct hikp_cmd_ret **cmd_ret, struct roce_pkt - ret = hikp_rsp_normal_check(*cmd_ret); - if (ret) { - printf("hikptool roce_pkt get cmd data failed, ret: %d\n", ret); -- free(*cmd_ret); -- *cmd_ret = NULL; -+ hikp_cmd_free(cmd_ret); - } - - return ret; -@@ -122,8 +121,7 @@ static void hikp_roce_pkt_execute(struct major_cmd_ctrl *self) - hikp_roce_pkt_print(roce_pkt_res->total_block_num, - roce_pkt_res->reg_data.offset, roce_pkt_res->reg_data.data); - -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - } - - static void cmd_roce_pkt_init(void) -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.c b/net/roce/roce_qmm/hikp_roce_qmm.c -index 6ab2c84..8140080 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.c -+++ b/net/roce/roce_qmm/hikp_roce_qmm.c -@@ -246,8 +246,7 @@ static void hikp_roce_qmm_execute_origin(struct major_cmd_ctrl *self) - hikp_roce_qmm_print(roce_qmm_res); - - exec_error: -- if (cmd_ret) -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - } - - static void hikp_roce_qmm_execute(struct major_cmd_ctrl *self) -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index 0ecb8cf..f330e97 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -103,8 +103,7 @@ static int hikp_roce_scc_get_data(struct hikp_cmd_ret **cmd_ret, const uint32_t - ret = hikp_rsp_normal_check(*cmd_ret); - if (ret) { - printf("hikptool roce_scc get cmd data failed, ret: %d\n", ret); -- free(*cmd_ret); -- *cmd_ret = NULL; -+ hikp_cmd_free(cmd_ret); - } - - return ret; -@@ -122,14 +121,6 @@ static void hikp_roce_scc_reg_data_free(uint32_t **offset, uint32_t **data) - } - } - --static void hikp_roce_scc_cmd_ret_free(struct hikp_cmd_ret **cmd_ret) --{ -- if (*cmd_ret) { -- free(*cmd_ret); -- *cmd_ret = NULL; -- } --} -- - static int hikp_roce_scc_get_total_data_num(struct roce_scc_head *res_head, - uint32_t **offset, uint32_t **data, uint32_t *block_id) - { -@@ -176,7 +167,7 @@ static int hikp_roce_scc_get_total_data_num(struct roce_scc_head *res_head, - ret = 0; - - get_data_error: -- hikp_roce_scc_cmd_ret_free(&cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -@@ -198,7 +189,7 @@ static int hikp_roce_scc_get_next_data(struct roce_scc_head *res_head, - roce_scc_res = (struct roce_scc_res_param *)cmd_ret->rsp_data; - cur_size = roce_scc_res->head.cur_block_num * sizeof(uint32_t); - if (cur_size > data_size) { -- hikp_roce_scc_cmd_ret_free(&cmd_ret); -+ hikp_cmd_free(&cmd_ret); - printf("hikptool roce_scc next log data copy size error, " - "data size: 0x%zx, max size: 0x%zx\n", cur_size, data_size); - return -EINVAL; -@@ -209,7 +200,7 @@ static int hikp_roce_scc_get_next_data(struct roce_scc_head *res_head, - *block_id = roce_scc_res->block_id; - res_head->cur_block_num = roce_scc_res->head.cur_block_num; - res_head->total_block_num = res_head->total_block_num - roce_scc_res->head.cur_block_num; -- hikp_roce_scc_cmd_ret_free(&cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return 0; - } -diff --git a/net/roce/roce_timer/hikp_roce_timer.c b/net/roce/roce_timer/hikp_roce_timer.c -index ea35241..962127b 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.c -+++ b/net/roce/roce_timer/hikp_roce_timer.c -@@ -135,8 +135,7 @@ static int hikp_roce_timer_show_qpc(struct major_cmd_ctrl *self) - printf("**************QPC TIMER INFO*************\n"); - hikp_roce_timer_print(timer_rsp, TIMER_SHOW_QPC); - out: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -@@ -169,8 +168,7 @@ static int hikp_roce_timer_show_cqc(struct major_cmd_ctrl *self) - printf("**************CQC TIMER INFO*************\n"); - hikp_roce_timer_print(timer_rsp, TIMER_SHOW_CQC); - out: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index 486bbe3..68c4cf2 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -123,8 +123,7 @@ static int hikp_roce_trp_get_data(struct hikp_cmd_ret **cmd_ret, const uint32_t - ret = hikp_rsp_normal_check(*cmd_ret); - if (ret) { - printf("hikptool roce_trp get cmd data failed, ret: %d\n", ret); -- free(*cmd_ret); -- *cmd_ret = NULL; -+ hikp_cmd_free(cmd_ret); - } - - return ret; -@@ -142,14 +141,6 @@ static void hikp_roce_trp_reg_data_free(uint32_t **offset, uint32_t **data) - } - } - --static void hikp_roce_trp_cmd_ret_free(struct hikp_cmd_ret **cmd_ret) --{ -- if (*cmd_ret) { -- free(*cmd_ret); -- *cmd_ret = NULL; -- } --} -- - static int hikp_roce_trp_get_total_data_num(struct roce_trp_head *res_head, - uint32_t **offset, uint32_t **data, uint32_t *block_id) - { -@@ -198,7 +189,7 @@ static int hikp_roce_trp_get_total_data_num(struct roce_trp_head *res_head, - ret = 0; - - get_data_error: -- hikp_roce_trp_cmd_ret_free(&cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -@@ -221,7 +212,7 @@ static int hikp_roce_trp_get_next_data(struct roce_trp_head *res_head, - cur_size = roce_trp_res->head.cur_block_num * sizeof(uint32_t); - - if (cur_size > data_size) { -- hikp_roce_trp_cmd_ret_free(&cmd_ret); -+ hikp_cmd_free(&cmd_ret); - printf("hikptool roce_trp next log data copy size error, " - "data size: 0x%zx, max size: 0x%zx\n", cur_size, data_size); - return -EINVAL; -@@ -232,7 +223,7 @@ static int hikp_roce_trp_get_next_data(struct roce_trp_head *res_head, - *block_id = roce_trp_res->block_id; - res_head->cur_block_num = roce_trp_res->head.cur_block_num; - res_head->total_block_num = res_head->total_block_num - roce_trp_res->head.cur_block_num; -- hikp_roce_trp_cmd_ret_free(&cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return 0; - } -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.c b/net/roce/roce_tsp/hikp_roce_tsp.c -index b16f0a4..9dd7956 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.c -+++ b/net/roce/roce_tsp/hikp_roce_tsp.c -@@ -130,8 +130,7 @@ static int hikp_roce_tsp_get_data(struct hikp_cmd_ret **cmd_ret, - ret = hikp_rsp_normal_check(*cmd_ret); - if (ret) { - printf("hikptool roce_tsp get cmd data failed, ret: %d\n", ret); -- free(*cmd_ret); -- *cmd_ret = NULL; -+ hikp_cmd_free(cmd_ret); - } - - return ret; -@@ -272,8 +271,7 @@ static void hikp_roce_tsp_execute(struct major_cmd_ctrl *self) - hikp_roce_tsp_print(roce_tsp_res->total_block_num, - roce_tsp_res->reg_data.offset, roce_tsp_res->reg_data.data); - -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - } - - static void cmd_roce_tsp_init(void) -diff --git a/net/roh/hikp_roh_mac.c b/net/roh/hikp_roh_mac.c -index 4a8cf7b..aa13f92 100644 ---- a/net/roh/hikp_roh_mac.c -+++ b/net/roh/hikp_roh_mac.c -@@ -87,13 +87,12 @@ int hikp_roh_get_mac_type(struct major_cmd_ctrl *self, struct bdf_t bdf) - HIKP_ERROR_PRINT("failed to get roh info, retcode: %u\n", - cmd_ret ? cmd_ret->status : EIO); - self->err_no = -EIO; -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -EIO; - } - mac_rsp = (struct roh_mac_get_type *)(cmd_ret->rsp_data); - is_roh = mac_rsp->mac_type; -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return is_roh; - } - -@@ -145,13 +144,12 @@ static int hikp_roh_get_cam_reg_num(struct major_cmd_ctrl *self) - HIKP_ERROR_PRINT("fail to get cam reg num, retcode: %u\n", - cmd_ret ? cmd_ret->status : EIO); - self->err_no = -EIO; -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -EIO; - } - mac_rsp = (struct roh_mac_cam_reg_num *)(cmd_ret->rsp_data); - cam_reg_num = mac_rsp->cam_reg_num; -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return cam_reg_num; - } - -@@ -182,7 +180,7 @@ static int hikp_roh_build_cam(struct major_cmd_ctrl *self, struct cam_table_entr - HIKP_ERROR_PRINT("fail to get cam table info, retcode: %u\n", - cmd_ret ? cmd_ret->status : EIO); - self->err_no = -EIO; -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -EIO; - } - mac_rsp = (struct roh_mac_cam_table *)(cmd_ret->rsp_data); -@@ -198,8 +196,7 @@ static int hikp_roh_build_cam(struct major_cmd_ctrl *self, struct cam_table_entr - (unsigned long)(mac_rsp->cam_mac_high16[j])) << - ROH_MAC_CAM_OFFSET); - } -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - } - return 0; - } -@@ -222,14 +219,13 @@ static void hikp_roh_show_cam(struct major_cmd_ctrl *self) - HIKP_ERROR_PRINT("fail to get cam info, retcode: %u\n", - cmd_ret ? cmd_ret->status : EIO); - self->err_no = -EIO; -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return; - } - mac_rsp = (struct roh_mac_cam_caps *)cmd_ret->rsp_data; - convert_enable = mac_rsp->convert_enable; - cam_convert_enable = mac_rsp->cam_convert_enable; -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - - ret = hikp_roh_build_cam(self, cam_table); - if (ret != 0) -@@ -253,8 +249,7 @@ static int hikp_roh_query_crd(uint8_t crd_type, uint32_t num_rows, char const *c - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); - if (ret != 0) { -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return ret; - } - mac_rsp = (struct roh_mac_credit_data *)(cmd_ret->rsp_data); -@@ -268,8 +263,7 @@ static int hikp_roh_query_crd(uint8_t crd_type, uint32_t num_rows, char const *c - if ((strcmp(crds[i][1], "NULL") != 0) && (reg.cut)[1] != 0) - printf("%-28s : %#x\n", crds[i][1], (reg.cut)[1]); - } -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/net/roh/hikp_roh_show_bp.c b/net/roh/hikp_roh_show_bp.c -index 3f3f622..0b53eda 100644 ---- a/net/roh/hikp_roh_show_bp.c -+++ b/net/roh/hikp_roh_show_bp.c -@@ -86,8 +86,7 @@ static int hikp_roh_show_bp(struct major_cmd_ctrl *self) - printf("MAC%d_flit_bp : 0x%x\n", mac_id, flit_bp); - - out: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -diff --git a/net/roh/hikp_roh_show_mib.c b/net/roh/hikp_roh_show_mib.c -index 91e8344..5f03355 100644 ---- a/net/roh/hikp_roh_show_mib.c -+++ b/net/roh/hikp_roh_show_mib.c -@@ -189,8 +189,7 @@ static int hikp_roh_fill_pmu_cnt(int round) - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); - if (ret != 0) { -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return ret; - } - mib_rsp = (struct roh_show_mib_rsp_t *)(cmd_ret->rsp_data); -@@ -207,8 +206,7 @@ static int hikp_roh_fill_pmu_cnt(int round) - if (mac2_pmu_cnt) - printf("MAC2_%-28s : 0x%lx\n", g_roh_mac_mib_name[index], mac2_pmu_cnt); - } -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -diff --git a/net/ub/ub_bp/hikp_ub_bp.c b/net/ub/ub_bp/hikp_ub_bp.c -index f5f50ff..179aa22 100644 ---- a/net/ub/ub_bp/hikp_ub_bp.c -+++ b/net/ub/ub_bp/hikp_ub_bp.c -@@ -61,16 +61,14 @@ static int hikp_ub_query_bp(const struct bdf_t *bdf) - hikp_cmd_init(&header, UB_MOD, GET_UB_BP_INFO_CMD, UB_BP_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return -EIO; - } - - rsp = (struct ub_bp_rsp *)cmd_ret->rsp_data; - hikp_ub_bp_info_show(rsp); - -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/net/ub/ub_crd/hikp_ub_crd.c b/net/ub/ub_crd/hikp_ub_crd.c -index d564800..6d2ba21 100644 ---- a/net/ub/ub_crd/hikp_ub_crd.c -+++ b/net/ub/ub_crd/hikp_ub_crd.c -@@ -85,8 +85,7 @@ static int hikp_ub_query_crd(void) - req_data.bdf = g_ub_crd_param.target.bdf; - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return -EIO; - } - -@@ -101,8 +100,7 @@ static int hikp_ub_query_crd(void) - printf("------------------- TEMP CREDIT END --------------------\n"); - printf("********************* CREDIT CNT END *********************\n"); - -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/net/ub/ub_dfx/hikp_ub_dfx.c b/net/ub/ub_dfx/hikp_ub_dfx.c -index 00205fe..dd3a713 100644 ---- a/net/ub/ub_dfx/hikp_ub_dfx.c -+++ b/net/ub/ub_dfx/hikp_ub_dfx.c -@@ -138,8 +138,7 @@ static int hikp_ub_get_first_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t - - *max_dfx_size -= (uint32_t)rsp_head->cur_blk_size; - err_out: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -@@ -170,8 +169,7 @@ static int hikp_ub_get_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t blk_id - *max_dfx_size -= (uint32_t)rsp_head->cur_blk_size; - - err_out: -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -diff --git a/net/ub/ub_info/hikp_ub_info.c b/net/ub/ub_info/hikp_ub_info.c -index 3b354dd..d113f7c 100644 ---- a/net/ub/ub_info/hikp_ub_info.c -+++ b/net/ub/ub_info/hikp_ub_info.c -@@ -56,16 +56,14 @@ static int hikp_ub_query_basic_info(const struct bdf_t *bdf) - hikp_cmd_init(&header, UB_MOD, GET_UB_BASIC_INFO_CMD, UB_BASIC_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return -EIO; - } - - rsp = (struct ub_info_rsp *)cmd_ret->rsp_data; - hikp_ub_basic_info_show(rsp); - -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/net/ub/ub_link/hikp_ub_link.c b/net/ub/ub_link/hikp_ub_link.c -index b6353f7..1cc1879 100644 ---- a/net/ub/ub_link/hikp_ub_link.c -+++ b/net/ub/ub_link/hikp_ub_link.c -@@ -58,16 +58,14 @@ static int hikp_ub_query_link_info(const struct bdf_t *bdf) - hikp_cmd_init(&header, UB_MOD, GET_UB_LINK_INFO_CMD, UB_LINK_INFO_DUMP); - cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return -EIO; - } - - rsp = (struct ub_link_rsp *)cmd_ret->rsp_data; - hikp_ub_link_info_show(rsp); - -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/net/ub/ub_ppp/hikp_unic_ppp.c b/net/ub/ub_ppp/hikp_unic_ppp.c -index 105253f..01c1624 100644 ---- a/net/ub/ub_ppp/hikp_unic_ppp.c -+++ b/net/ub/ub_ppp/hikp_unic_ppp.c -@@ -109,7 +109,7 @@ static int hikp_unic_ppp_get_blk(struct hikp_cmd_header *req_header, - memcpy(rsp_head, &rsp->rsp_head, sizeof(struct unic_ppp_rsp_head)); - - out: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.c b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -index 5834612..1bc2edb 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.c -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include "os_common.h" - #include "pcie_common.h" - #include "hikptdev_plug.h" -@@ -95,7 +96,7 @@ static int pcie_get_ltssm_trace(uint32_t port_id, uint64_t *ltssm_status, uint32 - src_size = (*ltssm_num) * sizeof(uint64_t); - dst_size = TRACER_DEPTH * sizeof(uint64_t); - if (src_size > dst_size) { -- Err("size check failed, %u > %u.\n", src_size, dst_size); -+ Err("size check failed, %zu > %zu.\n", src_size, dst_size); - ret = -EINVAL; - goto free_cmd_ret; - } -@@ -110,7 +111,7 @@ static int pcie_get_ltssm_trace(uint32_t port_id, uint64_t *ltssm_status, uint32 - memcpy(ltssm_status, (cmd_ret->rsp_data + 1), src_size); - - free_cmd_ret: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -@@ -187,7 +188,7 @@ static int pcie_print_ltssm_trace(const uint64_t *ltssm_input, uint32_t ltssm_nu - return -EINVAL; - } - Info("ltssm tracer:\n"); -- Info("\ttrace mode: %llx\n", *ltssm_input); -+ Info("\ttrace mode: %" PRIx64 "\n", *ltssm_input); - Info("\tltssm[ii]: 63:48 47:32 31 30 29 28 27 26 25 24 23 22 21:" - "20 19:12 11:10 9:6 5:0 ltssm\n"); - for (i = 1; i < ltssm_num; i++) { -@@ -245,7 +246,7 @@ int pcie_ltssm_trace_mode_set(uint32_t port_id, uint32_t mode) - hikp_cmd_init(&req_header, PCIE_MOD, PCIE_TRACE, TRACE_MODE); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -@@ -261,7 +262,7 @@ int pcie_ltssm_trace_clear(uint32_t port_id) - hikp_cmd_init(&req_header, PCIE_MOD, PCIE_TRACE, TRACE_CLEAR); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -@@ -298,7 +299,7 @@ int pcie_ltssm_link_status_get(uint32_t port_id) - Info(" link_up: %u\n", reg_val.bits.mac_link_up); - Info(" lane_reverse: %u\n", reg_val.bits.lane_reverse); - free_cmd_ret: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -@@ -330,7 +331,7 @@ static int pcie_get_pm_trace(uint32_t port_id, uint64_t *pm_status, uint32_t *pm - src_size = (*pm_num) * sizeof(uint64_t); - dst_size = TRACER_DEPTH * sizeof(uint64_t); - if (src_size > dst_size) { -- Err("size check failed, %u > %u.\n", src_size, dst_size); -+ Err("size check failed, %zu > %zu.\n", src_size, dst_size); - ret = -EINVAL; - goto free_cmd_ret; - } -@@ -345,7 +346,7 @@ static int pcie_get_pm_trace(uint32_t port_id, uint64_t *pm_status, uint32_t *pm - memcpy(pm_status, (cmd_ret->rsp_data + 1), src_size); - - free_cmd_ret: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return ret; - } - -@@ -412,7 +413,7 @@ static int pcie_print_pm_trace(const uint64_t *pm_status, uint32_t pm_num) - return -EINVAL; - } - Info("pm tracer:\n"); -- Info("\ttrace state: %llx\n", pm_status[0]); -+ Info("\ttrace state: %" PRIx64 "\n", pm_status[0]); - Info("\tpm[ii]: BE8: 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 " - "BD8: 23:6 5:0 : pm state\n"); - for (i = 1; i < pm_num; i++) { -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index 58fcbea..9444f64 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -577,7 +577,7 @@ int pcie_dumpreg_do_dump(uint32_t port_id, uint32_t dump_level) - close_file_ret: - (void)pcie_close_dumpreg_log_file(); - free_cmd_ret: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -diff --git a/pcie/func_lib/pcie_func/pcie_reg_read.c b/pcie/func_lib/pcie_func/pcie_reg_read.c -index 1578056..c04c3d9 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_read.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_read.c -@@ -95,7 +95,7 @@ int pcie_reg_read(uint32_t port_id, uint32_t module_id, uint32_t offset) - ret = pcie_reg_read_result_show(cmd_ret); - - free_cmd_ret: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.c b/pcie/func_lib/pcie_func/pcie_statistics.c -index 6cf7a61..54d4edb 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.c -+++ b/pcie/func_lib/pcie_func/pcie_statistics.c -@@ -43,8 +43,7 @@ static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, - rsp_data_size = cmd_ret->rsp_data_num * sizeof(uint32_t); - /* Check whether enough data of a port unit */ - if (rsp_data_size < sizeof(struct pcie_port_info)) { -- Err("port distribution rsp check failed, size: %u.\n", -- rsp_data_size); -+ Err("port distribution rsp check failed, size: %zu.\n", rsp_data_size); - return -EINVAL; - } - /* Check whether enough data of n pairs */ -@@ -53,7 +52,7 @@ static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, - expect_data_size = sizeof(struct pcie_port_info) + - sizeof(struct pcie_info_distribution_pair) * (*port_num); - if (expect_data_size > rsp_data_size) { -- Err("port distribution data size check failed, size: %u, expect size: %u.\n", -+ Err("port distribution data size check failed, size: %zu, expect size: %zu.\n", - rsp_data_size, expect_data_size); - return -EINVAL; - } -@@ -117,7 +116,7 @@ int pcie_port_distribution_get(uint32_t chip_id) - port_info->info_pair[i].ndie_id); - } - free_cmd_ret: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -@@ -134,7 +133,7 @@ static int port_err_state_rsp_data_check(struct hikp_cmd_ret *cmd_ret) - } - rsp_data_size = cmd_ret->rsp_data_num * sizeof(uint32_t); - if (rsp_data_size < sizeof(struct pcie_err_state)) { -- Err("err state get rsp size check failed, rsp size: %u, expect size:%u.\n", -+ Err("err state get rsp size check failed, rsp size: %zu, expect size:%zu.\n", - rsp_data_size, sizeof(struct pcie_err_state)); - return -EINVAL; - } -@@ -172,7 +171,7 @@ int pcie_error_state_get(uint32_t port_id) - Info("dl_lcrc_err_num = %u\n", state->lcrc_err_num.bits.dl_lcrc_err_num); - Info("dl_dcrc_err_num = %u\n", state->dcrc_err_num.bits.dl_dcrc_err_num); - free_cmd_ret: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -@@ -188,7 +187,7 @@ int pcie_error_state_clear(uint32_t port_id) - hikp_cmd_init(&req_header, PCIE_MOD, PCIE_INFO, INFO_ERR_STATE_CLEAR); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - ret = hikp_rsp_normal_check(cmd_ret); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - - return ret; - } -diff --git a/sas/sas_func/sas_analy_queue.c b/sas/sas_func/sas_analy_queue.c -index b27ba60..f1d2e7e 100644 ---- a/sas/sas_func/sas_analy_queue.c -+++ b/sas/sas_func/sas_analy_queue.c -@@ -42,14 +42,14 @@ static int sas_get_res(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_analy excutes hikp_cmd_alloc err\n"); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; - for (int i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/sas/sas_func/sas_dump_reg.c b/sas/sas_func/sas_dump_reg.c -index 9a1da3a..39fa5ed 100644 ---- a/sas/sas_func/sas_dump_reg.c -+++ b/sas/sas_func/sas_dump_reg.c -@@ -34,14 +34,14 @@ static int sas_get_reg(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_dump excutes hikp_cmd_alloc err\n"); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -1; - } - *reg_num = cmd_ret->rsp_data_num; - for (int i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/sas/sas_func/sas_read_dev.c b/sas/sas_func/sas_read_dev.c -index ede5d74..b5d7e18 100644 ---- a/sas/sas_func/sas_read_dev.c -+++ b/sas/sas_func/sas_read_dev.c -@@ -35,14 +35,14 @@ static int sas_get_dev(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_dqe excutes hikp_cmd_alloc err\n"); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; - for (i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/sas/sas_func/sas_read_dqe.c b/sas/sas_func/sas_read_dqe.c -index 072c1dc..dac2546 100644 ---- a/sas/sas_func/sas_read_dqe.c -+++ b/sas/sas_func/sas_read_dqe.c -@@ -35,14 +35,14 @@ static int sas_get_dqe(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_dqe excutes hikp_cmd_alloc err\n"); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; - for (int i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/sas/sas_func/sas_read_errcode.c b/sas/sas_func/sas_read_errcode.c -index da1157b..d451a98 100644 ---- a/sas/sas_func/sas_read_errcode.c -+++ b/sas/sas_func/sas_read_errcode.c -@@ -33,14 +33,14 @@ static int sas_get_errcode(const struct tool_sas_cmd *cmd, uint32_t *reg_save, u - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("sas_errcode excutes hikp_cmd_alloc err\n"); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; - for (int i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/sata/sata_func/sata_dump_reg.c b/sata/sata_func/sata_dump_reg.c -index 691989e..d63a14b 100644 ---- a/sata/sata_func/sata_dump_reg.c -+++ b/sata/sata_func/sata_dump_reg.c -@@ -35,14 +35,14 @@ static int sata_get_reg(const struct tool_sata_cmd *cmd, uint32_t *reg_save, uin - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { - printf("hikp_data_proc err\n"); -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return -1; - } - *reg_num = cmd_ret->rsp_data_num; - for (i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - return 0; - } - -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index 23a7946..92e380e 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -342,7 +342,7 @@ static void hikp_serdes_info_cmd_execute(struct major_cmd_ctrl *self) - } - - err_out: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - } - - static void cmd_serdes_maininfo_init(void) -@@ -496,7 +496,7 @@ static void hikp_serdes_dump_cmd_execute(struct major_cmd_ctrl *self) - dump_data = (uint32_t *)out_put.out_str; - hikp_serdes_dump_print(self, dump_data, out_put.result_offset / sizeof(uint32_t)); - err_out: -- free(cmd_ret); -+ hikp_cmd_free(&cmd_ret); - } - - static void cmd_serdes_dump_init(void) -diff --git a/socip/hikp_socip_dumpreg.c b/socip/hikp_socip_dumpreg.c -index 7b11523..4b6b70c 100644 ---- a/socip/hikp_socip_dumpreg.c -+++ b/socip/hikp_socip_dumpreg.c -@@ -143,14 +143,12 @@ static void hikp_socip_dumpreg_execute(struct major_cmd_ctrl *self) - if (!cmd_ret || cmd_ret->status != 0) { - self->err_no = -EINVAL; - HIKP_ERROR_PRINT("hikp_cmd_alloc\n"); -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - return; - } - - dump_reg_info(&cmd_ret->rsp_data[0], cmd_ret->rsp_data_num); -- free(cmd_ret); -- cmd_ret = NULL; -+ hikp_cmd_free(&cmd_ret); - } - - static void cmd_socip_dump_reg_init(void) --- -2.45.0.windows.1 - diff --git a/0084-hikptool-nic-Dump-register-names-for-SSU-and-PPP-mod.patch b/0084-hikptool-nic-Dump-register-names-for-SSU-and-PPP-mod.patch deleted file mode 100644 index 1d66d5a..0000000 --- a/0084-hikptool-nic-Dump-register-names-for-SSU-and-PPP-mod.patch +++ /dev/null @@ -1,519 +0,0 @@ -From 3a36fc8f5e079656823a8093c0233500a4959ac0 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Mon, 12 Aug 2024 10:55:15 +0800 -Subject: [PATCH 22/27] hikptool/nic: Dump register names for SSU and PPP - module - -This patch supports dumping name-offset-values for registers -of SSU and PPP modules. An example is shown: - - hikptool nic_dfx -i 0000:37:00.0 -m SSU - DFX cmd version: 0x0 - - ****************** module SSU reg dump start ******* \ - ************* - ----------------------------------------------------- - type name: 32 bit running status - - name offset value - FULL_DROP_NUM 0x0350 0x00000000 - PART_DROP_NUM 0x0354 0x00000000 - ...... - ----------------------------------------------------- - type name: 64 bit common statistics - - name offset value - SSU_PPP_MAC_KEY_NUM 0x0330 0x00000000000000f7 - SSU_PPP_HOST_KEY_NUM 0x0338 0x000000000000002f - ...... - -Signed-off-by: Jie Hai ---- - net/nic/nic_dfx/hikp_nic_dfx.c | 400 ++++++++++++++++++++++++++++++++- - net/nic/nic_dfx/hikp_nic_dfx.h | 11 + - 2 files changed, 405 insertions(+), 6 deletions(-) - -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.c b/net/nic/nic_dfx/hikp_nic_dfx.c -index 318d85f..67a5fe1 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.c -+++ b/net/nic/nic_dfx/hikp_nic_dfx.c -@@ -80,6 +80,329 @@ static const struct dfx_type_parse g_dfx_type_parse[] = { - {TYPE_64_TX_PF_NORMAL_STATS, WIDTH_64_BIT, "64 bit TX pf statistics"}, - }; - -+static const struct dfx_reg_name dfx_ppp_type_32_common_drop_stats1[] = { -+ { "DROP_FROM_PRT_PKT_CNT"}, -+ { "DROP_FROM_HOST_PKT_CNT"}, -+ { "DROP_TX_VLAN_PROC_CNT"}, -+ { "DROP_MNG_CNT"}, -+ { "DROP_FD_CNT"}, -+ { "DROP_NO_DST_CNT"}, -+ { "DROP_MC_MBID_FULL_CNT"}, -+ { "DROP_SC_FILTERED"}, -+}; -+ -+static const struct dfx_reg_name dfx_ppp_type_32_common_drop_stats2[] = { -+ { "PPP_MC_DROP_PKT_CNT"}, -+ { "DROP_PT_CNT"}, -+ { "DROP_MAC_ANTI_SPOOF_CNT"}, -+ { "DROP_IG_VFV_CNT"}, -+ { "DROP_IG_PRTV_CNT"}, -+ { "DROP_CNM_PFC_PAUSE_CNT"}, -+ { "DROP_TORUS_TC_CNT"}, -+ { "DROP_TORUS_LPBK_CNT"}, -+ { "FWD_BONDING_PRT_EG_VLAN_DROP_CNT"}, -+ { "UMV_UPLINK_EG_VLAN_DROP_CNT"}, -+ { "BONDING_UPLINK_VLAN_FILTER_FAIL_CNT"}, -+ { "PROMIS_PRUNE_DROP_CNT"}, -+ { "UMV_UC_SRC_PRUNE_DROP_CNT"}, -+ { "PPP_GRO_DROP_CNT"}, -+}; -+ -+static const struct dfx_reg_name dfx_ppp_type_32_rx_normal_stats[] = { -+ { "PPP_GRO_KEY_CNT" }, -+ { "PPP_GRO_INFO_CNT" }, -+ { "PPP_GRO_OUT_CNT" }, -+ { "PPP_GRO_KEY_MATCH_DATA_CNT" }, -+ { "PPP_GRO_KEY_MATCH_TCAM_CNT" }, -+ { "PPP_GRO_INFO_MATCH_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ppp_type_64_rx_normal_stats1[] = { -+ { "GET_RX_PKT_CNT" }, -+ { "SEND_UC_PRT2HOST_PKT_CNT" }, -+ { "SEND_UC_PRT2PRT_PKT_CNT" }, -+ { "SEND_MC_FROM_PRT_CNT" }, -+ { "SSU_MC_RD_CNT" }, -+ { "SSU_MC_DROP_CNT" }, -+ { "SSU_MC_RD_PKT_CNT" }, -+ { "PPP_MC_2HOST_PKT_CNT" }, -+ { "NR_PKT_CNT" }, -+ { "RR_PKT_CNT" }, -+ { "MNG_TBL_HIT_CNT" }, -+ { "FD_TBL_HIT_CNT" }, -+ { "FD_LKUP_CNT" }, -+ { "UM_TBL_UC_HIT_CNT" }, -+ { "UM_TBL_MC_HIT_CNT" }, -+ { "UM_TBL_MC_HIT_PKT_CNT" }, -+ { "UM_TBL_VMDQ1_HIT_CNT" }, -+ { "MTA_TBL_HIT_CNT" }, -+ { "MTA_TBL_HIT_PKT_CNT" }, -+ { "FWD_BONDING_HIT_CNT" }, -+ { "GET_BMC_PKT_CNT" }, -+ { "SEND_UC_PRT2BMC_PKT_CNT" }, -+ { "SEND_UC_HOST2BMC_PKT_CNT" }, -+ { "PROMIS_TBL_HIT_CNT" }, -+ { "PROMIS_TBL_HIT_PKT_CNT" }, -+ { "GET_TUNL_PKT_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ppp_type_64_rx_normal_stats2[] = { -+ { "SEND_UC_BMC2PRT_PKT_CNT" }, -+ { "RX_DEFAULT_HOST_HIT_CNT" }, -+ { "LAN_PAIR_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ppp_type_64_tx_normal_stats1[] = { -+ { "GET_TX_PKT_CNT" }, -+ { "SEND_UC_HOST2HOST_PKT_CNT" }, -+ { "SEND_UC_HOST2PRT_PKT_CNT" }, -+ { "SEND_MC_FROM_HOST_CNT" }, -+ { "PPP_MC_2PRT_PKT_CNT" }, -+ { "NTSNOS_PKT_CNT" }, -+ { "NTUP_PKT_CNT" }, -+ { "NTLCL_PKT_CNT" }, -+ { "NTTGT_PKT_CNT" }, -+ { "RTNS_PKT_CNT" }, -+ { "RTLPBK_PKT_CNT" }, -+ { "BC_HIT_CNT" }, -+ { "SEND_UC_HOST2BMC_PKT_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ppp_type_64_tx_normal_stats2[] = { -+ { "PPP_MC_2BMC_PKT_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ppp_type_64_tx_drop_stats[] = { -+ { "PPP_TX_TAG_DROP_CNT_0" }, -+ { "PPP_TX_TAG_DROP_CNT_1" }, -+ { "PPP_TX_TAG_DROP_CNT_2" }, -+ { "PPP_TX_TAG_DROP_CNT_3" }, -+}; -+ -+static const struct dfx_reg_name dfx_ppp_type_32_running_stats[] = { -+ { "PPP_HFS_STS" }, -+ { "PPP_MC_RSLT_STS" }, -+ { "PPP_RSLT_DESCR_STS" }, -+ { "PPP_UMV_STS_0" }, -+ { "PPP_UMV_STS_1" }, -+ { "PPP_VFV_STS" }, -+}; -+ -+static const struct dfx_type_name_parse g_dfx_ppp_name_parse[] = { -+ { TYPE_32_COMM_DROP_STATS, -+ dfx_ppp_type_32_common_drop_stats1, HIKP_ARRAY_SIZE(dfx_ppp_type_32_common_drop_stats1)}, -+ { TYPE_32_COMM_DROP_STATS, -+ dfx_ppp_type_32_common_drop_stats2, HIKP_ARRAY_SIZE(dfx_ppp_type_32_common_drop_stats2)}, -+ { TYPE_32_RX_NORMAL_STATS, -+ dfx_ppp_type_32_rx_normal_stats, HIKP_ARRAY_SIZE(dfx_ppp_type_32_rx_normal_stats)}, -+ { TYPE_64_RX_NORMAL_STATS, -+ dfx_ppp_type_64_rx_normal_stats1, HIKP_ARRAY_SIZE(dfx_ppp_type_64_rx_normal_stats1)}, -+ { TYPE_64_RX_NORMAL_STATS, -+ dfx_ppp_type_64_rx_normal_stats2, HIKP_ARRAY_SIZE(dfx_ppp_type_64_rx_normal_stats2)}, -+ { TYPE_64_TX_NORMAL_STATS, -+ dfx_ppp_type_64_tx_normal_stats1, HIKP_ARRAY_SIZE(dfx_ppp_type_64_tx_normal_stats1)}, -+ { TYPE_64_TX_NORMAL_STATS, -+ dfx_ppp_type_64_tx_normal_stats2, HIKP_ARRAY_SIZE(dfx_ppp_type_64_tx_normal_stats2)}, -+ { TYPE_64_TX_DROP_STATS, -+ dfx_ppp_type_64_tx_drop_stats, HIKP_ARRAY_SIZE(dfx_ppp_type_64_tx_drop_stats)}, -+ { TYPE_32_RUNNING_STATUS, -+ dfx_ppp_type_32_running_stats, HIKP_ARRAY_SIZE(dfx_ppp_type_32_running_stats)}, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_rx_drop_stats[] = { -+ { "RX_OQ_DROP_PKT_CNT" }, -+ { "RX_OQ_GLB_DROP_PKT_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_rx_normal_stats[] = { -+ { "NCSI_RX_PACKET_IN_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_tx_drop_stats[] = { -+ { "TX_OQ_DROP_PKT_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_tx_normal_stats[] = { -+ { "NCSI_TX_PACKET_OUT_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_rx_port_drop_stats1[] = { -+ { "RX_FULL_DROP_NUM" }, -+ { "RX_PART_DROP_NUM" }, -+ { "ROCE_RX_BYPASS_5NS_DROP_NUM" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_rx_port_drop_stats2[] = { -+ { "RX_OQ_GLB_DROP_PKT_CNT_PORT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_tx_port_drop_stats1[] = { -+ { "TX_FULL_DROP_NUM" }, -+ { "TX_PART_DROP_NUM" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_tx_port_drop_stats2[] = { -+ { "TX_OQ_GLB_DROP_PKT_CNT_PORT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_running_stats[] = { -+ { "SSU_BP_STATUS_0" }, -+ { "SSU_BP_STATUS_1" }, -+ { "SSU_BP_STATUS_2" }, -+ { "SSU_BP_STATUS_3" }, -+ { "SSU_BP_STATUS_4" }, -+ { "SSU_BP_STATUS_5" }, -+ { "SSU_MAC_TX_PFC_IND" }, -+ { "MAC_SSU_RX_PFC_IND" }, -+ { "ROH_SSU_PFC" }, -+ { "SSU_ETS_PORT_STATUS" }, -+ { "SSU_ETS_TCG_STATUS" }, -+ { "BTMP_AGEING_ST" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_port_running_stats[] = { -+ { "PKT_TC_0_CURR_BUF_CNT" }, -+ { "PKT_TC_1_CURR_BUF_CNT" }, -+ { "PKT_TC_2_CURR_BUF_CNT" }, -+ { "PKT_TC_3_CURR_BUF_CNT" }, -+ { "PKT_TC_4_CURR_BUF_CNT" }, -+ { "PKT_TC_5_CURR_BUF_CNT" }, -+ { "PKT_TC_6_CURR_BUF_CNT" }, -+ { "PKT_TC_7_CURR_BUF_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_comm_stats[] = { -+ { "LO_PRI_UNICAST_CUR_CNT" }, -+ { "HI_PRI_MULTICAST_CUR_CNT" }, -+ { "LO_PRI_MULTICAST_CUR_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_comm_drop_stats[] = { -+ { "FULL_DROP_NUM" }, -+ { "PART_DROP_NUM" }, -+ { "PPP_KEY_DROP_NUM" }, -+ { "PPP_RLT_DROP_NUM" }, -+ { "MB_UNCOPY_NUM" }, -+ { "LO_PRI_UNICAST_RLT_DROP_NUM" }, -+ { "HI_PRI_MULTICAST_RLT_DROP_NUM" }, -+ { "LO_PRI_MULTICAST_RLT_DROP_NUM" }, -+ { "NIC_L2_ERR_DROP_PKT_CNT" }, -+ { "ROC_L2_ERR_DROP_PKT_CNT" }, -+ { "BANK_UNBALANCE_DROP_CNT" }, -+ { "SSU_MB_RD_RLT_DROP_CNT" }, -+ { "NCSI_FULL_DROP_NUM" }, -+ { "NCSI_PART_DROP_NUM" }, -+ { "NCSI_OQ_GLB_DROP_PKT_CNT_PORT" }, -+ { "LO_MB_DROP_FOR_CNT_MEM_EMPTY" }, -+ { "HI_MB_DROP_FOR_CNT_MEM_EMPTY" }, -+ { "SSU_OVERSIZE_DROP_NUM" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_32_comm_err_stats[] = { -+ { "SSU_ECC_1BIT_ERR_CNT" }, -+ { "SSU_ECC_MULTI_BIT_ERR_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_64_rx_port_drop_stats[] = { -+ { "RX_PACKET_IN_ERR_CNT" }, -+ { "RX_PACKET_OUT_ERR_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_64_tx_port_drop_stats[] = { -+ { "TX_PACKET_IN_ERR_CNT" }, -+ { "TX_PACKET_OUT_ERR_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_64_rx_port_normal_stats[] = { -+ { "RX_PKT_IN_CNT" }, -+ { "RX_PACKET_OUT_CNT" }, -+ { "RX_PKT_TC_0_IN_CNT" }, -+ { "RX_PKT_TC_1_IN_CNT" }, -+ { "RX_PKT_TC_2_IN_CNT" }, -+ { "RX_PKT_TC_3_IN_CNT" }, -+ { "RX_PKT_TC_4_IN_CNT" }, -+ { "RX_PKT_TC_5_IN_CNT" }, -+ { "RX_PKT_TC_6_IN_CNT" }, -+ { "RX_PKT_TC_7_IN_CNT" }, -+ { "RX_PACKET_TC_0_OUT_CNT" }, -+ { "RX_PACKET_TC_1_OUT_CNT" }, -+ { "RX_PACKET_TC_2_OUT_CNT" }, -+ { "RX_PACKET_TC_3_OUT_CNT" }, -+ { "RX_PACKET_TC_4_OUT_CNT" }, -+ { "RX_PACKET_TC_5_OUT_CNT" }, -+ { "RX_PACKET_TC_6_OUT_CNT" }, -+ { "RX_PACKET_TC_7_OUT_CNT" }, -+ { "ROC_RX_PACKET_IN_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_64_tx_port_normal_stats[] = { -+ { "TX_PKT_IN_CNT" }, -+ { "TX_PKT_OUT_CNT" }, -+ { "TX_PKT_TC_0_IN_CNT" }, -+ { "TX_PKT_TC_1_IN_CNT" }, -+ { "TX_PKT_TC_2_IN_CNT" }, -+ { "TX_PKT_TC_3_IN_CNT" }, -+ { "TX_PKT_TC_4_IN_CNT" }, -+ { "TX_PKT_TC_5_IN_CNT" }, -+ { "TX_PKT_TC_6_IN_CNT" }, -+ { "TX_PKT_TC_7_IN_CNT" }, -+ { "TX_PACKET_TC_0_OUT_CNT" }, -+ { "TX_PACKET_TC_1_OUT_CNT" }, -+ { "TX_PACKET_TC_2_OUT_CNT" }, -+ { "TX_PACKET_TC_3_OUT_CNT" }, -+ { "TX_PACKET_TC_4_OUT_CNT" }, -+ { "TX_PACKET_TC_5_OUT_CNT" }, -+ { "TX_PACKET_TC_6_OUT_CNT" }, -+ { "TX_PACKET_TC_7_OUT_CNT" }, -+ { "ROC_TX_PACKET_OUT_CNT" }, -+}; -+ -+static const struct dfx_reg_name dfx_ssu_type_64_tx_comm_stats[] = { -+ { "SSU_PPP_MAC_KEY_NUM" }, -+ { "SSU_PPP_HOST_KEY_NUM" }, -+ { "PPP_SSU_MAC_RLT_NUM" }, -+ { "PPP_SSU_HOST_RLT_NUM" }, -+}; -+ -+static const struct dfx_type_name_parse g_dfx_ssu_name_parse[] = { -+ { TYPE_32_RX_DROP_STATS, -+ dfx_ssu_type_32_rx_drop_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_32_rx_drop_stats)}, -+ { TYPE_32_RX_NORMAL_STATS, -+ dfx_ssu_type_32_rx_normal_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_32_rx_normal_stats)}, -+ { TYPE_32_TX_DROP_STATS, -+ dfx_ssu_type_32_tx_drop_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_32_tx_drop_stats)}, -+ { TYPE_32_TX_NORMAL_STATS, -+ dfx_ssu_type_32_tx_normal_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_32_tx_normal_stats)}, -+ { TYPE_32_RX_PORT_DROP_STATS, -+ dfx_ssu_type_32_rx_port_drop_stats1, HIKP_ARRAY_SIZE(dfx_ssu_type_32_rx_port_drop_stats1)}, -+ { TYPE_32_RX_PORT_DROP_STATS, -+ dfx_ssu_type_32_rx_port_drop_stats2, HIKP_ARRAY_SIZE(dfx_ssu_type_32_rx_port_drop_stats2)}, -+ { TYPE_32_TX_PORT_DROP_STATS, -+ dfx_ssu_type_32_tx_port_drop_stats1, HIKP_ARRAY_SIZE(dfx_ssu_type_32_tx_port_drop_stats1)}, -+ { TYPE_32_TX_PORT_DROP_STATS, -+ dfx_ssu_type_32_tx_port_drop_stats2, HIKP_ARRAY_SIZE(dfx_ssu_type_32_tx_port_drop_stats2)}, -+ { TYPE_32_RUNNING_STATUS, -+ dfx_ssu_type_32_running_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_32_running_stats)}, -+ { TYPE_32_PORT_RUNNING_STATUS, -+ dfx_ssu_type_32_port_running_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_32_port_running_stats)}, -+ { TYPE_32_COMM_STATS, -+ dfx_ssu_type_32_comm_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_32_comm_stats)}, -+ { TYPE_32_COMM_DROP_STATS, -+ dfx_ssu_type_32_comm_drop_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_32_comm_drop_stats)}, -+ { TYPE_32_COMM_ERROR_STATS, -+ dfx_ssu_type_32_comm_err_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_32_comm_err_stats)}, -+ { TYPE_64_RX_PORT_DROP_STATS, -+ dfx_ssu_type_64_rx_port_drop_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_64_rx_port_drop_stats)}, -+ { TYPE_64_TX_PORT_DROP_STATS, -+ dfx_ssu_type_64_tx_port_drop_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_64_tx_port_drop_stats)}, -+ { TYPE_64_RX_PORT_NORMAL_STATS, -+ dfx_ssu_type_64_rx_port_normal_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_64_rx_port_normal_stats)}, -+ { TYPE_64_TX_PORT_NORMAL_STATS, -+ dfx_ssu_type_64_tx_port_normal_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_64_tx_port_normal_stats)}, -+ { TYPE_64_COMM_STATS, -+ dfx_ssu_type_64_tx_comm_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_64_tx_comm_stats)}, -+}; -+ - static void dfx_help_info(const struct major_cmd_ctrl *self) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -218,35 +541,96 @@ static int cmd_dfx_module_select(struct major_cmd_ctrl *self, const char *argv) - return -EINVAL; - } - --static void hikp_nic_dfx_print_b32(uint32_t num, uint32_t *reg_data) -+static const struct dfx_reg_name *hikp_nic_get_ssu_list(uint8_t type_id, uint32_t reg_num) - { -+ uint32_t i; -+ -+ for (i = 0; i < HIKP_ARRAY_SIZE(g_dfx_ssu_name_parse); i++) { -+ if (g_dfx_ssu_name_parse[i].type_id != type_id) -+ continue; -+ if (reg_num != g_dfx_ssu_name_parse[i].reg_num) -+ continue; -+ -+ return g_dfx_ssu_name_parse[i].reg_list; -+ } -+ return NULL; -+} -+ -+static const struct dfx_reg_name *hikp_nic_get_ppp_list(uint8_t type_id, uint32_t reg_num) -+{ -+ uint32_t i; -+ -+ for (i = 0; i < HIKP_ARRAY_SIZE(g_dfx_ppp_name_parse); i++) { -+ if (g_dfx_ppp_name_parse[i].type_id != type_id) -+ continue; -+ if (reg_num != g_dfx_ppp_name_parse[i].reg_num) -+ continue; -+ -+ return g_dfx_ppp_name_parse[i].reg_list; -+ } -+ return NULL; -+} -+ -+static const struct dfx_reg_name *hikp_nic_dfx_get_reg_list(uint8_t type_id, -+ uint32_t sub_cmd_code, -+ uint32_t reg_num) -+{ -+ if (sub_cmd_code == SSU_DFX_REG_DUMP) -+ return hikp_nic_get_ssu_list(type_id, reg_num); -+ else if (sub_cmd_code == PPP_DFX_REG_DUMP) -+ return hikp_nic_get_ppp_list(type_id, reg_num); -+ return NULL; -+} -+ -+static void hikp_nic_dfx_print_b32(struct nic_dfx_type_head *type_head, uint32_t *reg_data) -+{ -+ uint32_t num = (uint32_t)type_head->reg_num; - uint32_t word_num = num * WORD_NUM_PER_REG; -+ const struct dfx_reg_name *reg_list; -+ uint32_t sub_cmd_code; - uint16_t offset; - uint32_t value; - uint32_t index; - uint32_t i; - -+ sub_cmd_code = g_dfx_module_parse[g_dfx_param.module_idx].sub_cmd_code; -+ reg_list = hikp_nic_dfx_get_reg_list(type_head->type_id, sub_cmd_code, num); - for (i = 0, index = 1; i < word_num; i = i + WORD_NUM_PER_REG, index++) { - offset = (uint16_t)HI_GET_BITFIELD(reg_data[i], 0, DFX_REG_ADDR_MASK); - value = reg_data[i + 1]; -- printf("%03u: 0x%04x\t0x%08x\n", index, offset, value); -+ if (reg_list != NULL) { -+ printf("%-30s\t0x%04x\t0x%08x\n", reg_list->name, offset, value); -+ reg_list++; -+ } else { -+ printf("%-30s\t0x%04x\t0x%08x\n", "", offset, value); -+ } - } - } - --static void hikp_nic_dfx_print_b64(uint32_t num, uint32_t *reg_data) -+static void hikp_nic_dfx_print_b64(struct nic_dfx_type_head *type_head, uint32_t *reg_data) - { -+ uint32_t num = (uint32_t)type_head->reg_num; - uint32_t word_num = num * WORD_NUM_PER_REG; -+ const struct dfx_reg_name *reg_list; -+ uint32_t sub_cmd_code; - uint16_t offset; - uint64_t value; - uint32_t index; - uint32_t i; - -+ sub_cmd_code = g_dfx_module_parse[g_dfx_param.module_idx].sub_cmd_code; -+ reg_list = hikp_nic_dfx_get_reg_list(type_head->type_id, sub_cmd_code, num); - for (i = 0, index = 1; i < word_num; i = i + WORD_NUM_PER_REG, index++) { - offset = (uint16_t)HI_GET_BITFIELD(reg_data[i], 0, DFX_REG_ADDR_MASK); - value = (uint64_t)reg_data[i + 1] | - (HI_GET_BITFIELD((uint64_t)reg_data[i], DFX_REG_VALUE_OFF, - DFX_REG_VALUE_MASK) << BIT_NUM_OF_WORD); -- printf("%03u: 0x%04x\t0x%016lx\n", index, offset, value); -+ if (reg_list != NULL) { -+ printf("%-30s\t0x%04x\t0x%016lx\n", reg_list->name, offset, value); -+ reg_list++; -+ } else { -+ printf("%-30s\t0x%04x\t0x%08x\n", "", offset, value); -+ } - } - } - -@@ -287,6 +671,7 @@ static void hikp_nic_dfx_print(const struct nic_dfx_rsp_head_t *rsp_head, uint32 - uint32_t *ptr = reg_data; - uint32_t max_size; - uint32_t num_u32; -+ bool show_title; - uint8_t i; - - max_size = dfx_get_max_reg_bffer_size(rsp_head); -@@ -310,12 +695,15 @@ static void hikp_nic_dfx_print(const struct nic_dfx_rsp_head_t *rsp_head, uint32 - HIKP_ERROR_PRINT("No.%u type is incorrect reg type\n", i + 1u); - break; - } -+ show_title = type_head->type_id != last_type_id; - hikp_nic_dfx_print_type_head(type_head->type_id, &last_type_id); - ptr++; -+ if (show_title) -+ printf("%-30s\t%s\t%s\n", "name", "offset", "value"); - if (type_head->bit_width == WIDTH_32_BIT) { -- hikp_nic_dfx_print_b32((uint32_t)type_head->reg_num, ptr); -+ hikp_nic_dfx_print_b32(type_head, ptr); - } else if (type_head->bit_width == WIDTH_64_BIT) { -- hikp_nic_dfx_print_b64((uint32_t)type_head->reg_num, ptr); -+ hikp_nic_dfx_print_b64(type_head, ptr); - } else { - HIKP_ERROR_PRINT("type%u's bit width error.\n", type_head->type_id); - break; -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.h b/net/nic/nic_dfx/hikp_nic_dfx.h -index d46d290..38f76aa 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.h -+++ b/net/nic/nic_dfx/hikp_nic_dfx.h -@@ -138,4 +138,15 @@ struct nic_dfx_rsp_t { - uint32_t reg_data[MAX_DFX_DATA_NUM]; - }; - -+#define MAX_REG_NAME_LEN 64 -+struct dfx_reg_name { -+ const char name[MAX_REG_NAME_LEN]; -+}; -+ -+struct dfx_type_name_parse { -+ uint8_t type_id; -+ const struct dfx_reg_name *reg_list; -+ uint32_t reg_num; -+}; -+ - #endif /* HIKP_NIC_DFX_H */ --- -2.45.0.windows.1 - diff --git a/0085-hikptool-Added-the-dfx-register-for-PCIe-dump.patch b/0085-hikptool-Added-the-dfx-register-for-PCIe-dump.patch deleted file mode 100644 index 283080d..0000000 --- a/0085-hikptool-Added-the-dfx-register-for-PCIe-dump.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 2aa68f56a13a74d4398f1cb51c67747a04e84146 Mon Sep 17 00:00:00 2001 -From: Bingquan Mou -Date: Mon, 30 Sep 2024 10:02:39 +0800 -Subject: [PATCH 23/27] hikptool: Added the dfx register for PCIe dump. - -category: feature -bugzilla: NA -CVE: NA - -This register is added for PCIe dump. -MAC: MAC_REG_PHY_RXDATA_TS_REG/MAC_LTSSM_TRACER_CFG0_REG/MAC_POWERDOWN_VALUE_REG -PCS: DETECT_CLK_FLG_REG/SDS_CFG_REG_REG -GLB: PCIE_LINK_DOWN_CLR_PORT_EN_REG/CORE_CLK_FLG_REG - -Signed-off-by: Bingquan Mou ---- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index 9444f64..abf0e26 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -129,6 +129,9 @@ struct pcie_dumpreg_info g_reg_table_mac[] = { - {0, "MAC_LEAVE_L0_INFO"}, - {0, "DFX_APB_LANE_ERROR_STATUS_0"}, - {0, "DFX_APB_LANE_ERROR_STATUS_1"}, -+ {0, "MAC_REG_PHY_RXDATA_TS_REG"}, -+ {0, "MAC_LTSSM_TRACER_CFG0_REG"}, -+ {0, "MAC_POWERDOWN_VALUE_REG"}, - }; - - struct pcie_dumpreg_info g_reg_table_pcs[] = { -@@ -141,6 +144,8 @@ struct pcie_dumpreg_info g_reg_table_pcs[] = { - HIKP_PCIE_PCS_LANE_TBL_ENTRY(LANE_INTR_STATUS), - HIKP_PCIE_PCS_LANE_TBL_ENTRY(M_PCS_RPT_REG), - HIKP_PCIE_PCS_LANE_TBL_ENTRY(MSG_BUS_DFX), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(DETECT_CLK_FLG_REG), -+ HIKP_PCIE_PCS_LANE_TBL_ENTRY(SDS_CFG_REG_REG), - }; - - struct pcie_dumpreg_info g_reg_table_iob_tx[] = { -@@ -364,6 +369,8 @@ struct pcie_dumpreg_info g_reg_table_core_glb[] = { - {0, "CORE_INT_FE_RO_2"}, - {0, "PORT07_LINK_MODE"}, - {0, "PORT815_LINK_MODE"}, -+ {0, "PCIE_LINK_DOWN_CLR_PORT_EN_REG"}, -+ {0, "CORE_CLK_FLG_REG"}, - }; - - struct pcie_dumpreg_info g_reg_table_core_tl[] = { --- -2.45.0.windows.1 - diff --git a/0086-hikptool-The-macro_num-error-is-rectified-and-the-of.patch b/0086-hikptool-The-macro_num-error-is-rectified-and-the-of.patch deleted file mode 100644 index 4e4de78..0000000 --- a/0086-hikptool-The-macro_num-error-is-rectified-and-the-of.patch +++ /dev/null @@ -1,62 +0,0 @@ -From f8edb8f7f8882aaa68b24d7bb37659f2589c90ca Mon Sep 17 00:00:00 2001 -From: Bingquan Mou -Date: Sat, 12 Oct 2024 17:11:38 +0800 -Subject: [PATCH 24/27] hikptool: The macro_num error is rectified, and the - offset writing is incorrect. - -category: feature -bugzilla: NA -CVE: NA - -1.It is reasonable that core0 has three macros. Therefore, macro_num == 3 is reasonable. -2.The offset writing is incorrect. - -Signed-off-by: Bingquan Mou ---- - pcie/func_lib/pcie_func/pcie_link_ltssm.c | 2 +- - pcie/func_lib/pcie_func/pcie_link_ltssm.h | 2 +- - pcie/func_lib/pcie_func/pcie_statistics.c | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.c b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -index 1bc2edb..d3534f5 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.c -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -@@ -211,7 +211,7 @@ static int pcie_print_ltssm_trace(const uint64_t *ltssm_input, uint32_t ltssm_nu - (uint32_t)ltssm_val.bits.any_change_pipe_req, - (uint32_t)ltssm_val.bits.rxl0s_st, - (uint32_t)ltssm_val.bits.train_bit_map1, -- (((uint32_t)ltssm_val.bits.rxl0s_st) << GEN5_BIT_OFFEST) | -+ (((uint32_t)ltssm_val.bits.rxl0s_st) << GEN5_BIT_OFFSET) | - ((uint32_t)ltssm_val.bits.mac_rate), - (uint32_t)ltssm_val.bits.duration_counter, - (uint32_t)ltssm_val.bits.ltssm_state, -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.h b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -index 9986f7a..278f3e4 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.h -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -@@ -19,7 +19,7 @@ - #define TRACE_STR_NUM 0x20 - #define TRACER_DEPTH 65 - #define PM_TRACE_STR_NUM 0x28 --#define GEN5_BIT_OFFEST 2 -+#define GEN5_BIT_OFFSET 2 - - struct pcie_ltssm_num_string { - int ltssm; -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.c b/pcie/func_lib/pcie_func/pcie_statistics.c -index 54d4edb..be187f2 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.c -+++ b/pcie/func_lib/pcie_func/pcie_statistics.c -@@ -70,7 +70,7 @@ static int pcie_portid_serdes_relation(const struct pcie_macro_info *macro_info, - return -1; - } - -- if (macro_num >= MAX_MACRO_ONEPORT) { -+ if (macro_num > MAX_MACRO_ONEPORT) { - Info("macro_num [%u] exceeds the maximum array length\n", macro_num); - return -1; - } --- -2.45.0.windows.1 - diff --git a/0087-Fix-the-logic-of-obtaining-statistics-on-flow-contro.patch b/0087-Fix-the-logic-of-obtaining-statistics-on-flow-contro.patch deleted file mode 100644 index 251b0e3..0000000 --- a/0087-Fix-the-logic-of-obtaining-statistics-on-flow-contro.patch +++ /dev/null @@ -1,185 +0,0 @@ -From 261fdd1cc832989c60b3940cd8b2aa6593bc94ea Mon Sep 17 00:00:00 2001 -From: Yuyu Li -Date: Tue, 12 Nov 2024 20:17:06 +0800 -Subject: [PATCH 25/27] Fix the logic of obtaining statistics on flow control - storm suppression - -Previously, regardless of the direction specified by -d, FW would return the statistics -of flow control storm suppression in both directions. Now it only returns the statistic -in the specified direction. An example is shown: - -hikptool nic_qos -i eth6 -g pfc_storm_para -d rx - -before: -PFC STORM Information: -direction: rx -enabled: on -period: 2000ms -pfc threshold: 1000ms -recovery period: 500ms -rx storm suppression count: 14 - -after: -PFC STORM Information: -direction: rx -enabled: on -period: 2000ms -pfc threshold: 1000ms -recovery period: 500ms -storm count: 14 - -Signed-off-by: Yuyu Li ---- - net/nic/nic_qos/hikp_nic_qos.c | 32 ++++++++++++++++++++++---------- - net/nic/nic_qos/hikp_nic_qos.h | 14 +++++++++----- - 2 files changed, 31 insertions(+), 15 deletions(-) - -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index 81eb0ba..32f251e 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -56,7 +56,8 @@ static int hikp_nic_qos_cmd_help(struct major_cmd_ctrl *self, const char *argv) - - static void hikp_nic_qos_show_pkt_buf(const void *data) - { -- struct nic_pkt_buf_info *pkt_buf = (struct nic_pkt_buf_info *)data; -+ struct qos_cmd_info *qos_info_pkt = (struct qos_cmd_info *)data; -+ struct nic_pkt_buf_info *pkt_buf = (struct nic_pkt_buf_info *)&qos_info_pkt->info; - struct nic_shared_buf *share_buf = &pkt_buf->share_buf; - struct nic_priv_buf *priv_buf = pkt_buf->priv_buf; - uint16_t tc_no; -@@ -88,11 +89,12 @@ static void hikp_nic_qos_show_pkt_buf(const void *data) - - static void hikp_nic_qos_show_dcb_info(const void *data) - { -- struct nic_dcb_info *dcb = (struct nic_dcb_info *)data; -+ struct qos_cmd_info *qos_info_dcb = (struct qos_cmd_info *)data; -+ struct nic_dcb_info *dcb = (struct nic_dcb_info *)&qos_info_dcb->info; - struct nic_pfc_info *pfc = &dcb->pfc; - struct nic_ets_info *ets = &dcb->ets; -- uint16_t up; - uint16_t tc_no; -+ uint16_t up; - - printf("PFC configuration\n"); - printf(" PFC enable:"); -@@ -125,7 +127,8 @@ static void hikp_nic_qos_show_dcb_info(const void *data) - - static void hikp_nic_qos_show_pause_info(const void *data) - { -- struct nic_pause_info *pause = (struct nic_pause_info *)data; -+ struct qos_cmd_info *qos_info_pause = (struct qos_cmd_info *)data; -+ struct nic_pause_info *pause = (struct nic_pause_info *)&qos_info_pause->info; - - printf("PAUSE Information\n"); - if (pause->type == HIKP_NONE_PAUSE) -@@ -143,8 +146,10 @@ static void hikp_nic_qos_show_pause_info(const void *data) - - static void hikp_nic_qos_show_pfc_storm_para(const void *data) - { -+ struct qos_cmd_info *qos_info_pfc = (struct qos_cmd_info *)data; - struct nic_pfc_storm_para *pfc_storm_para = -- (struct nic_pfc_storm_para *)data; -+ (struct nic_pfc_storm_para *)&qos_info_pfc->info; -+ uint32_t length = qos_info_pfc->length; - - printf("PFC STORM Information:\n"); - printf("direction: %s\n", pfc_storm_para->dir ? "tx" : "rx"); -@@ -155,6 +160,11 @@ static void hikp_nic_qos_show_pfc_storm_para(const void *data) - printf("check times: %u\n", pfc_storm_para->times) : - printf("pfc threshold: %ums\n", pfc_storm_para->times); - printf("recovery period: %ums\n", pfc_storm_para->recovery_period_ms); -+ -+ if (length < sizeof(struct nic_pfc_storm_para)) -+ return; -+ -+ printf("storm count: %u\n", pfc_storm_para->storm_count); - } - - static int hikp_nic_qos_get_blk(struct hikp_cmd_header *req_header, -@@ -192,11 +202,11 @@ out: - } - - static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const struct bdf_t *bdf, -- union nic_qos_feature_info *data) -+ struct qos_cmd_info *qcmd_info) - { -+ size_t buf_len = sizeof(qcmd_info->info); - struct nic_qos_rsp_head rsp_head = {0}; - struct nic_qos_req_para req_data; -- size_t buf_len = sizeof(*data); - uint32_t total_blk_size; - uint8_t total_blk_num; - uint8_t blk_id = 0; -@@ -207,7 +217,7 @@ static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const - req_data.block_id = blk_id; - req_data.dir = g_qos_param.dir; - -- ret = hikp_nic_qos_get_blk(req_header, &req_data, data, buf_len, &rsp_head); -+ ret = hikp_nic_qos_get_blk(req_header, &req_data, &qcmd_info->info, buf_len, &rsp_head); - if (ret != 0) - return ret; - -@@ -220,13 +230,15 @@ static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const - req_data.dir = g_qos_param.dir; - - ret = hikp_nic_qos_get_blk(req_header, &req_data, -- (uint8_t *)data + total_blk_size, -+ (uint8_t *)&qcmd_info->info + total_blk_size, - buf_len - total_blk_size, &rsp_head); - if (ret != 0) - return ret; - total_blk_size += rsp_head.cur_blk_size; - } - -+ qcmd_info->length = total_blk_size; -+ - return ret; - } - -@@ -234,9 +246,9 @@ static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) - { - char *revision_id = g_qos_param.revision_id; - struct bdf_t *bdf = &g_qos_param.target.bdf; -- union nic_qos_feature_info qos_data = {0}; - struct hikp_cmd_header req_header = {0}; - const struct qos_feature_cmd *qos_cmd; -+ struct qos_cmd_info qos_data = {0}; - int ret; - - if (bdf->dev_id != 0) { -diff --git a/net/nic/nic_qos/hikp_nic_qos.h b/net/nic/nic_qos/hikp_nic_qos.h -index d55970a..77fbdd9 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.h -+++ b/net/nic/nic_qos/hikp_nic_qos.h -@@ -57,6 +57,7 @@ struct nic_pfc_storm_para { - uint32_t period_ms; - uint32_t times; - uint32_t recovery_period_ms; -+ uint32_t storm_count; - }; - - struct nic_ets_info { -@@ -87,11 +88,14 @@ struct nic_pause_info { - uint16_t rsv; - }; - --union nic_qos_feature_info { -- struct nic_pkt_buf_info pkt_buf; -- struct nic_dcb_info dcb; -- struct nic_pause_info pause; -- struct nic_pfc_storm_para pfc_storm_para; -+struct qos_cmd_info { -+ uint32_t length; -+ union nic_qos_feature_info { -+ struct nic_pkt_buf_info pkt_buf; -+ struct nic_dcb_info dcb; -+ struct nic_pause_info pause; -+ struct nic_pfc_storm_para pfc_storm_para; -+ } info; - }; - - struct nic_qos_rsp_head { --- -2.45.0.windows.1 - diff --git a/0088-hikptool-Rectify-the-compilation-alarm.patch b/0088-hikptool-Rectify-the-compilation-alarm.patch deleted file mode 100644 index af82b0f..0000000 --- a/0088-hikptool-Rectify-the-compilation-alarm.patch +++ /dev/null @@ -1,102 +0,0 @@ -From de71b27c71022e1051b1c3e85f849aedb13ec644 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 24 Oct 2024 20:52:48 +0800 -Subject: [PATCH 26/27] hikptool: Rectify the compilation alarm. - -Replace -Wextra with -Werror option. - -Signed-off-by: veega2022 ---- - CMakeLists.txt | 2 +- - net/hikp_net_lib.c | 3 ++- - net/nic/nic_dfx/hikp_nic_dfx.c | 5 +++-- - net/nic/nic_ft/hikp_nic_port_fault.c | 2 +- - net/nic/nic_qos/hikp_nic_qos.c | 7 ++++--- - 5 files changed, 11 insertions(+), 8 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index f2ffe6c..4fb82ca 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -11,7 +11,7 @@ - - project(hikptool C) - --set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -fPIC -fPIE -Wall -Wextra -fno-common -std=gnu11") -+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -fPIC -fPIE -Wall -Werror -fno-common -std=gnu11") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wfloat-equal -fstack-protector-strong -D_FORTIFY_SOURCE=2") - set(CMAKE_SKIP_RPATH TRUE) - -diff --git a/net/hikp_net_lib.c b/net/hikp_net_lib.c -index fbf03bd..f4d4c2a 100644 ---- a/net/hikp_net_lib.c -+++ b/net/hikp_net_lib.c -@@ -142,7 +142,8 @@ static bool check_dev_name_and_get_bdf(int sockfd, struct tool_target *target) - ifr.ifr_data = (char *)&drvinfo; - drvinfo.cmd = ETHTOOL_GDRVINFO; - -- strncpy(ifr.ifr_name, target->dev_name, IFNAMSIZ - 1); -+ strncpy(ifr.ifr_name, target->dev_name, IFNAMSIZ); -+ ifr.ifr_name[IFNAMSIZ - 1] = '\0'; - - if (ioctl(sockfd, SIOCETHTOOL, &ifr) < 0) - return false; -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.c b/net/nic/nic_dfx/hikp_nic_dfx.c -index 67a5fe1..c42b8e7 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.c -+++ b/net/nic/nic_dfx/hikp_nic_dfx.c -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - #include "tool_cmd.h" - #include "hikp_net_lib.h" - #include "hikp_nic_dfx.h" -@@ -626,10 +627,10 @@ static void hikp_nic_dfx_print_b64(struct nic_dfx_type_head *type_head, uint32_t - (HI_GET_BITFIELD((uint64_t)reg_data[i], DFX_REG_VALUE_OFF, - DFX_REG_VALUE_MASK) << BIT_NUM_OF_WORD); - if (reg_list != NULL) { -- printf("%-30s\t0x%04x\t0x%016lx\n", reg_list->name, offset, value); -+ printf("%-30s\t0x%04x\t0x%" PRIx64 "\n", reg_list->name, offset, value); - reg_list++; - } else { -- printf("%-30s\t0x%04x\t0x%08x\n", "", offset, value); -+ printf("%-30s\t0x%04x\t0x%" PRIx64 "\n", "", offset, value); - } - } - } -diff --git a/net/nic/nic_ft/hikp_nic_port_fault.c b/net/nic/nic_ft/hikp_nic_port_fault.c -index 6561e3e..5f78cdd 100644 ---- a/net/nic/nic_ft/hikp_nic_port_fault.c -+++ b/net/nic/nic_ft/hikp_nic_port_fault.c -@@ -41,7 +41,7 @@ static int hikp_nic_port_fault_query(const struct bdf_t *bdf, - } - - rsp = (struct nic_port_fault_rsp *)cmd_ret->rsp_data; -- *info = *(struct nic_port_fault_status *)rsp->data; -+ memcpy(info, rsp->data, sizeof(struct nic_port_fault_status)); - hikp_cmd_free(&cmd_ret); - - return 0; -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index 32f251e..c620a08 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -286,9 +286,10 @@ static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) - memset(revision_id, 0, MAX_PCI_ID_LEN + 1); - ret = get_revision_id_by_bdf(bdf, revision_id, sizeof(g_qos_param.revision_id)); - // show pfc threshold as default if get revision_id error -- if (ret) -- strncpy(g_qos_param.revision_id, HIKP_IEP_REVISION, -- MAX_PCI_REVISION_LEN); -+ if (ret) { -+ strncpy(g_qos_param.revision_id, HIKP_IEP_REVISION, MAX_PCI_REVISION_LEN); -+ g_qos_param.revision_id[MAX_PCI_ID_LEN] = '\0'; -+ } - - printf("############## NIC QOS: %s info ############\n", qos_cmd->feature_name); - qos_cmd->show(&qos_data); --- -2.45.0.windows.1 - diff --git a/0089-hikptool-Update-the-tool-version-number-to-1.1.3.patch b/0089-hikptool-Update-the-tool-version-number-to-1.1.3.patch deleted file mode 100644 index da0387a..0000000 --- a/0089-hikptool-Update-the-tool-version-number-to-1.1.3.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 43577e52be8f24eff1eab81d6474f0b66edc6a21 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 12 Nov 2024 20:28:55 +0800 -Subject: [PATCH 27/27] hikptool: Update the tool version number to 1.1.3 - -Update the tool version number to 1.1.3 - -Signed-off-by: veega2022 ---- - tool_lib/tool_lib.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 15dac74..34cc3e8 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.1.2" -+#define TOOL_VER "1.1.3" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.45.0.windows.1 - diff --git a/0090-hikptool-Support-for-info-collect.patch b/0090-hikptool-Support-for-info-collect.patch deleted file mode 100644 index d23fcac..0000000 --- a/0090-hikptool-Support-for-info-collect.patch +++ /dev/null @@ -1,6084 +0,0 @@ -From 513a68f332d9a40b3ee800d85bba335dacc22212 Mon Sep 17 00:00:00 2001 -From: Xingui Yang -Date: Tue, 27 Aug 2024 11:02:55 +0800 -Subject: [PATCH] hikptool: Support for info collect - -Add the option of information collection and used to collect -full information from each module, such as imp, serdes, pcie -sas, sata, nic, roce, acc, socip, as follow. -1. Help for collect info, e.g. hikptool info_collect -h/--help -2. Collect imp info, e.g. hikptool info_collect -/--imp -3. Collect all info, e.g. hikptool info_collect -/--all - -Signed-off-by: Xingui Yang ---- - CMakeLists.txt | 1 + - info_collect/hikp_collect.h | 53 ++ - info_collect/hikp_collect_acc.c | 237 ++++++++ - info_collect/hikp_collect_common.c | 258 +++++++++ - info_collect/hikp_collect_imp.c | 133 +++++ - info_collect/hikp_collect_lib.c | 508 ++++++++++++++++++ - info_collect/hikp_collect_lib.h | 61 +++ - info_collect/hikp_collect_main.c | 274 ++++++++++ - info_collect/hikp_collect_nic.c | 368 +++++++++++++ - info_collect/hikp_collect_pcie.c | 215 ++++++++ - info_collect/hikp_collect_roce.c | 489 +++++++++++++++++ - info_collect/hikp_collect_sas.c | 453 ++++++++++++++++ - info_collect/hikp_collect_serdes.c | 244 +++++++++ - info_collect/hikp_collect_socip.c | 272 ++++++++++ - info_collect/hikp_collect_socip.h | 238 ++++++++ - net/nic/nic_dfx/hikp_nic_dfx.c | 11 +- - net/nic/nic_dfx/hikp_nic_dfx.h | 3 + - net/nic/nic_fd/hikp_nic_fd.c | 11 +- - net/nic/nic_fd/hikp_nic_fd.h | 4 + - net/nic/nic_fec/hikp_nic_fec.c | 4 +- - net/nic/nic_fec/hikp_nic_fec.h | 2 + - net/nic/nic_ft/hikp_nic_port_fault.c | 4 +- - net/nic/nic_ft/hikp_nic_port_fault.h | 2 + - net/nic/nic_gro/hikp_nic_gro.c | 4 +- - net/nic/nic_gro/hikp_nic_gro.h | 2 + - net/nic/nic_info/hikp_nic_info.c | 4 +- - net/nic/nic_info/hikp_nic_info.h | 2 + - net/nic/nic_log/hikp_nic_log.c | 39 +- - net/nic/nic_log/hikp_nic_log.h | 7 + - net/nic/nic_mac/hikp_nic_mac_dump.c | 28 +- - net/nic/nic_mac/hikp_nic_mac_dump.h | 11 + - net/nic/nic_mac/hikp_nic_port.c | 18 + - net/nic/nic_mac/hikp_nic_port.h | 6 + - net/nic/nic_mac/hikp_nic_xsfp.c | 23 + - net/nic/nic_mac/hikp_nic_xsfp.h | 6 + - net/nic/nic_ncsi/hikp_nic_ncsi.c | 18 + - net/nic/nic_ncsi/hikp_nic_ncsi.h | 6 + - net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c | 4 +- - net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h | 2 + - net/nic/nic_ppp/hikp_nic_ppp.c | 11 +- - net/nic/nic_ppp/hikp_nic_ppp.h | 3 + - net/nic/nic_qos/hikp_nic_qos.c | 22 +- - net/nic/nic_qos/hikp_nic_qos.h | 10 +- - net/nic/nic_queue/hikp_nic_queue.c | 12 +- - net/nic/nic_queue/hikp_nic_queue.h | 4 + - net/nic/nic_rss/hikp_nic_rss.c | 9 +- - net/nic/nic_rss/hikp_nic_rss.h | 3 + - net/nic/nic_torus/hikp_nic_torus.c | 4 +- - net/nic/nic_torus/hikp_nic_torus.h | 2 + - net/roce/roce_bond/hikp_roce_bond.c | 8 +- - net/roce/roce_bond/hikp_roce_bond.h | 3 + - net/roce/roce_caep/hikp_roce_caep.c | 13 +- - net/roce/roce_caep/hikp_roce_caep.h | 4 + - .../roce_global_cfg/hikp_roce_global_cfg.c | 8 +- - .../roce_global_cfg/hikp_roce_global_cfg.h | 3 + - net/roce/roce_gmv/hikp_roce_gmv.c | 13 +- - net/roce/roce_gmv/hikp_roce_gmv.h | 4 + - net/roce/roce_mdb/hikp_roce_mdb.c | 13 +- - net/roce/roce_mdb/hikp_roce_mdb.h | 5 + - net/roce/roce_pkt/hikp_roce_pkt.c | 8 +- - net/roce/roce_pkt/hikp_roce_pkt.h | 3 + - net/roce/roce_qmm/hikp_roce_qmm.c | 18 +- - net/roce/roce_qmm/hikp_roce_qmm.h | 5 + - net/roce/roce_rst/hikp_roce_rst.c | 8 +- - net/roce/roce_rst/hikp_roce_rst.h | 3 + - net/roce/roce_scc/hikp_roce_scc.c | 19 +- - net/roce/roce_scc/hikp_roce_scc.h | 6 +- - net/roce/roce_timer/hikp_roce_timer.c | 8 +- - net/roce/roce_timer/hikp_roce_timer.h | 3 + - net/roce/roce_trp/hikp_roce_trp.c | 24 +- - net/roce/roce_trp/hikp_roce_trp.h | 7 +- - net/roce/roce_tsp/hikp_roce_tsp.c | 28 +- - net/roce/roce_tsp/hikp_roce_tsp.h | 7 +- - pcie/func_lib/pcie_func/pcie_link_ltssm.c | 2 +- - pcie/func_lib/pcie_func/pcie_link_ltssm.h | 1 + - pcie/func_lib/pcie_func/pcie_reg_dump.c | 7 +- - pcie/func_lib/pcie_func/pcie_reg_dump.h | 4 + - pcie/func_lib/pcie_func/pcie_statistics.c | 2 +- - pcie/func_lib/pcie_func/pcie_statistics.h | 2 + - sas/sas_func/sas_common.h | 2 +- - serdes/hikp_serdes.c | 215 ++++---- - serdes/hikp_serdes.h | 4 +- - socip/hikp_socip.h | 1 + - socip/hikp_socip_dumpreg.c | 2 +- - tool_lib/tool_lib.c | 40 ++ - tool_lib/tool_lib.h | 16 + - 86 files changed, 4434 insertions(+), 190 deletions(-) - create mode 100644 info_collect/hikp_collect.h - create mode 100644 info_collect/hikp_collect_acc.c - create mode 100644 info_collect/hikp_collect_common.c - create mode 100644 info_collect/hikp_collect_imp.c - create mode 100644 info_collect/hikp_collect_lib.c - create mode 100644 info_collect/hikp_collect_lib.h - create mode 100644 info_collect/hikp_collect_main.c - create mode 100644 info_collect/hikp_collect_nic.c - create mode 100644 info_collect/hikp_collect_pcie.c - create mode 100644 info_collect/hikp_collect_roce.c - create mode 100644 info_collect/hikp_collect_sas.c - create mode 100644 info_collect/hikp_collect_serdes.c - create mode 100644 info_collect/hikp_collect_socip.c - create mode 100644 info_collect/hikp_collect_socip.h - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 4fb82ca..f28a870 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -38,6 +38,7 @@ file(GLOB_RECURSE HIKPTOOL_SRC - ${CMAKE_CURRENT_SOURCE_DIR}/serdes/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/socip/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/tool_lib/*.c -+ ${CMAKE_CURRENT_SOURCE_DIR}/info_collect/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/hikp_init_main.c - ) - -diff --git a/info_collect/hikp_collect.h b/info_collect/hikp_collect.h -new file mode 100644 -index 0000000..28aa5a4 ---- /dev/null -+++ b/info_collect/hikp_collect.h -@@ -0,0 +1,53 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_COLLECT_H -+#define HIKP_COLLECT_H -+ -+#define GROUP_SAS "sas" -+#define GROUP_SATA "sata" -+#define GROUP_ACC "acc" -+#define GROUP_SOCIP "socip" -+#define GROUP_NIC "nic" -+#define GROUP_ROCE "roce" -+#define GROUP_PCIE "pcie" -+#define GROUP_IMP "imp" -+#define GROUP_COMMON "common" -+#define GROUP_SERDES "serdes" -+ -+enum info_collect_type { -+ COLLECT_ACC, -+ COLLECT_IMP, -+ COLLECT_NIC, -+ COLLECT_PCIE, -+ COLLECT_ROCE, -+ COLLECT_SAS, -+ COLLECT_SATA, -+ COLLECT_SERDES, -+ COLLECT_SOCIP, -+ COLLECT_ALL, -+ COLLECT_UNKNOWN_TYPE, -+}; -+ -+void collect_sas_log(void); -+void collect_sata_log(void); -+void collect_acc_log(void); -+void collect_socip_log(void); -+void collect_common_log(void); -+void collect_nic_log(void); -+void collect_roce_log(void); -+void collect_pcie_info(void); -+void collect_imp_log(void); -+void collect_serdes_log(void); -+ -+#endif /* HIKP_COLLECT_H */ -diff --git a/info_collect/hikp_collect_acc.c b/info_collect/hikp_collect_acc.c -new file mode 100644 -index 0000000..e0f3918 ---- /dev/null -+++ b/info_collect/hikp_collect_acc.c -@@ -0,0 +1,237 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+ -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+ -+struct info_collect_cmd acc_cmd_arr[] = { -+ { -+ .group = GROUP_ACC, -+ .log_name = "uadk_version", -+ .args = {"uadk_tool", "dfx", "--version", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "openssl_version", -+ .args = {"openssl", "version", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "openssl3_version", -+ .args = {"openssl3", "version", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "qemu_version", -+ .args = {"qemu-system-aarch64", "-version", NULL}, -+ }, -+}; -+ -+struct info_collect_cmd acc_cmd_copy[] = { -+ { -+ .group = GROUP_ACC, -+ .log_name = "uadk", -+ .args = {"cp", "-rf", "/var/log/uadk.log", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "acc_sec", -+ .args = {"cp", "-rf", "/sys/kernel/debug/hisi_sec2/", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "acc_sec", -+ .args = {"cp", "-rf", "/sys/module/hisi_sec2/parameters/", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "acc_hpre", -+ .args = {"cp", "-rf", "/sys/kernel/debug/hisi_hpre/", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "acc_hpre", -+ .args = {"cp", "-rf", "/sys/module/hisi_hpre/parameters/", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "acc_zip", -+ .args = {"cp", "-rf", "/sys/kernel/debug/hisi_zip/", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "acc_zip", -+ .args = {"cp", "-rf", "/sys/module/hisi_zip/parameters/", NULL}, -+ }, -+ { -+ .group = GROUP_ACC, -+ .log_name = "acc_trng", -+ .args = {"cp", "-rf", "/sys/module/hisi_trng_v2/parameters/", NULL}, -+ }, -+}; -+ -+struct info_collect_cmd acc_copy_link[] = { -+ { -+ .group = GROUP_ACC, -+ .log_name = "uacce", -+ .args = {"cp", "-rf", "/sys/class/uacce", NULL}, -+ } -+}; -+ -+static int acc_cmd_mkdir(char *root_path, char *src_patch) -+{ -+ char dir_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ int ret; -+ -+ /* mkdir for log sub source */ -+ ret = snprintf(dir_path, LOG_FILE_PATH_MAX_LEN, "%s/%s", -+ root_path, src_patch); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) { -+ HIKP_ERROR_PRINT("create dir path failed: %d\n", ret); -+ return -EINVAL; -+ } -+ -+ ret = tool_mk_dir((const char *)dir_path); -+ if (ret) -+ return ret; -+ -+ return 0; -+} -+ -+static int acc_collect_file(struct info_collect_cmd *acc_cmd, char *root_path, char *dev_path) -+{ -+ char sub_src_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ char save_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ struct info_collect_cmd tmp_cmd = {0}; -+ char *source_path = acc_cmd->args[ARGS_IDX2]; -+ char *sub_group = acc_cmd->log_name; -+ int ret; -+ -+ ret = snprintf(sub_src_path, LOG_FILE_PATH_MAX_LEN, "%s/%s/", -+ source_path, dev_path); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) { -+ HIKP_ERROR_PRINT("create sub source path failed: %d\n", ret); -+ return -EINVAL; -+ } -+ if (access(sub_src_path, F_OK) != 0) { -+ HIKP_ERROR_PRINT("Can't access sub source path: %s\n", sub_src_path); -+ return -ENOENT; -+ } -+ -+ ret = snprintf(save_path, LOG_FILE_PATH_MAX_LEN, "%s/%s/%s/", -+ root_path, sub_group, dev_path); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) { -+ HIKP_ERROR_PRINT("create save path failed: %d\n", ret); -+ return -EINVAL; -+ } -+ -+ tmp_cmd.group = acc_cmd->group; -+ tmp_cmd.log_name = acc_cmd->log_name; -+ tmp_cmd.args[ARGS_IDX0] = acc_cmd->args[ARGS_IDX0]; -+ tmp_cmd.args[ARGS_IDX1] = acc_cmd->args[ARGS_IDX1]; -+ tmp_cmd.args[ARGS_IDX2] = sub_src_path; -+ tmp_cmd.args[ARGS_IDX3] = save_path; -+ tmp_cmd.args[ARGS_IDX4] = NULL; -+ -+ ret = hikp_collect_exec((void *)&tmp_cmd); -+ if (ret) -+ return ret; -+ -+ return 0; -+} -+ -+static int acc_save_link_files(struct info_collect_cmd *link_cmd) -+{ -+ char root_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ char *source_path = link_cmd->args[ARGS_IDX2]; -+ char *sub_group = link_cmd->log_name; -+ struct dirent *dev_dir; -+ DIR *link_dir; -+ int ret; -+ -+ if (strcmp(link_cmd->args[ARGS_IDX0], "cp") != 0) { -+ HIKP_ERROR_PRINT("input cmd failed: %s.\n", link_cmd->args[ARGS_IDX0]); -+ return -EINVAL; -+ } -+ -+ ret = hikp_get_file_path(root_path, LOG_FILE_PATH_MAX_LEN, link_cmd->group); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("get save path fail: %d\n", ret); -+ return ret; -+ } -+ -+ if (source_path == NULL || access(source_path, F_OK) != 0) { -+ HIKP_ERROR_PRINT("Can't access source path: %s\n", source_path); -+ return -ENOENT; -+ } -+ -+ ret = acc_cmd_mkdir(root_path, sub_group); -+ if (ret) -+ return ret; -+ -+ link_dir = opendir(source_path); -+ if (!link_dir) { -+ HIKP_ERROR_PRINT("input source file dir is error!\n"); -+ return -ENOENT; -+ } -+ -+ /* 1 is sizeof ".", 2 is sizeof ".." */ -+ while ((dev_dir = readdir(link_dir)) != NULL) { -+ if (!strncmp(dev_dir->d_name, ".", 1) || -+ !strncmp(dev_dir->d_name, "..", sizeof(".."))) -+ continue; -+ -+ ret = acc_collect_file(link_cmd, root_path, dev_dir->d_name); -+ if (ret) -+ goto free_dir; -+ } -+ -+ closedir(link_dir); -+ return 0; -+ -+free_dir: -+ closedir(link_dir); -+ return ret; -+} -+ -+void collect_acc_log(void) -+{ -+ int i, asize; -+ int ret; -+ -+ asize = (int)HIKP_ARRAY_SIZE(acc_cmd_arr); -+ for (i = 0; i < asize; i++) { -+ ret = hikp_collect_log(acc_cmd_arr[i].group, acc_cmd_arr[i].log_name, -+ hikp_collect_exec, (void *)&acc_cmd_arr[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect_acc_log arr failed: %d\n", ret); -+ } -+ -+ asize = (int)HIKP_ARRAY_SIZE(acc_copy_link); -+ for (i = 0; i < asize; i++) { -+ ret = acc_save_link_files(&acc_copy_link[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect_acc_log link copy failed: %d\n", ret); -+ } -+ -+ asize = (int)HIKP_ARRAY_SIZE(acc_cmd_copy); -+ for (i = 0; i < asize; i++) { -+ ret = hikp_save_files(&acc_cmd_copy[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect_acc_log copy failed: %d\n", ret); -+ } -+} -diff --git a/info_collect/hikp_collect_common.c b/info_collect/hikp_collect_common.c -new file mode 100644 -index 0000000..413aac1 ---- /dev/null -+++ b/info_collect/hikp_collect_common.c -@@ -0,0 +1,258 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+ -+static int software_version_exec(void *data) -+{ -+ const struct info_collect_cmd software_version_cmds[] = { -+ { -+ .args = {"uname", "-a", NULL}, -+ }, -+ { -+ .log_name = "os-release", -+ .args = {"cat", "/etc/*release", NULL}, -+ }, -+ { -+ .log_name = "os-latest", -+ .args = {"cat", "/etc/*latest", NULL}, -+ }, -+ }; -+ HIKP_SET_USED(data); -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(software_version_cmds); -+ for (i = 0; i < size; i++) { -+ if (!strcmp(software_version_cmds[i].args[ARGS_IDX0], "cat")) -+ ret = hikp_collect_cat_glob_exec((void *)&software_version_cmds[i]); -+ else -+ ret = hikp_collect_exec((void *)&software_version_cmds[i]); -+ -+ if (ret) -+ HIKP_ERROR_PRINT("collect software_version_cmds[%zu] log failed: %d\n", -+ i, ret); -+ } -+ -+ return 0; -+} -+ -+static int mem_info_exec(void *data) -+{ -+ const struct info_collect_cmd mem_info_cmds[] = { -+ { -+ .args = {"cat", "/proc/meminfo", NULL}, -+ }, -+ { -+ .args = {"free", "-m", NULL}, -+ }, -+ { -+ .args = {"vmstat", NULL}, -+ }, -+ { -+ .args = {"cat", "/proc/iomem", NULL}, -+ }, -+ }; -+ HIKP_SET_USED(data); -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(mem_info_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_exec((void *)&mem_info_cmds[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect mem_info_cmds[%zu] log failed: %d\n", i, ret); -+ } -+ -+ return 0; -+} -+ -+static int process_info_exec(void *data) -+{ -+ const struct info_collect_cmd process_info_cmds[] = { -+ { -+ .args = {"ps", "euf", NULL}, -+ }, -+ { -+ .args = {"ps", "aux", NULL}, -+ }, -+ { -+ .args = {"top", "-bn", "1", NULL}, -+ }, -+ { -+ .args = {"mpstat", NULL}, -+ }, -+ }; -+ HIKP_SET_USED(data); -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(process_info_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_exec((void *)&process_info_cmds[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect process_info_cmds[%zu] log failed: %d\n", -+ i, ret); -+ } -+ -+ return 0; -+} -+ -+static int config_info_exec(void *data) -+{ -+ struct info_collect_cmd config_info_cmds[] = { -+ { -+ .args = {"cat", "/proc/cmdline", NULL}, -+ }, -+ { -+ .args = {"getconf", "PAGE_SIZE", NULL}, -+ }, -+ { -+ .group = GROUP_COMMON, -+ .log_name = "config", -+ .args = {"cp", "-f", "/boot/config-*", NULL}, -+ }, -+ { -+ .group = GROUP_COMMON, -+ .log_name = "smmu", -+ .args = {"cp", "-rf", "/sys/class/iommu", NULL}, -+ }, -+ }; -+ HIKP_SET_USED(data); -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(config_info_cmds); -+ for (i = 0; i < size; i++) { -+ char *log_name = config_info_cmds[i].log_name; -+ -+ if (log_name && !strcmp(log_name, "config")) -+ ret = hikp_collect_cp_glob_exec((void *)&config_info_cmds[i]); -+ else if (log_name && !strcmp(log_name, "smmu")) -+ ret = hikp_save_files(&config_info_cmds[i]); -+ else -+ ret = hikp_collect_exec((void *)&config_info_cmds[i]); -+ -+ if (ret) -+ HIKP_ERROR_PRINT("collect process_info_cmds[%zu] log failed: %d\n", -+ i, ret); -+ } -+ -+ return 0; -+} -+ -+static int service_info_exec(void *data) -+{ -+ const struct info_collect_cmd service_info_cmds[] = { -+ { -+ .args = {"service", "iptables", "status", NULL}, -+ }, -+ { -+ .args = {"service", "irqbalance", "status", NULL}, -+ }, -+ }; -+ HIKP_SET_USED(data); -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(service_info_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_exec((void *)&service_info_cmds[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect service_info_cmds[%zu] log failed: %d\n", -+ i, ret); -+ } -+ -+ return 0; -+} -+ -+static void collect_software_info(void) -+{ -+ int ret; -+ -+ ret = hikp_collect_log(GROUP_COMMON, "software_version", software_version_exec, (void *)NULL); -+ if (ret) -+ HIKP_ERROR_PRINT("software_version_exec failed: %d\n", ret); -+ -+ ret = hikp_collect_log(GROUP_COMMON, "mem_info", mem_info_exec, (void *)NULL); -+ if (ret) -+ HIKP_ERROR_PRINT("mem_info_exec failed: %d\n", ret); -+ -+ ret = hikp_collect_log(GROUP_COMMON, "process_info", process_info_exec, (void *)NULL); -+ if (ret) -+ HIKP_ERROR_PRINT("process_info_exec failed: %d\n", ret); -+ -+ ret = hikp_collect_log(GROUP_COMMON, "config_info", config_info_exec, (void *)NULL); -+ if (ret) -+ HIKP_ERROR_PRINT("config_info_exec failed: %d\n", ret); -+ -+ ret = hikp_collect_log(GROUP_COMMON, "service_info", service_info_exec, (void *)NULL); -+ if (ret) -+ HIKP_ERROR_PRINT("service_info_exec failed: %d\n", ret); -+} -+ -+static int hardware_info_exec(void *data) -+{ -+ const struct info_collect_cmd hardware_cmds[] = { -+ { -+ .args = {"cat", MIDR_EL1_PATH, NULL}, -+ }, -+ { -+ .args = {"cat", "/sys/bus/cpu/devices/cpu0/cpufreq/scaling_governor", NULL}, -+ }, -+ { -+ .args = {"cat", "/sys/devices/system/cpu/online", NULL}, -+ }, -+ { -+ .args = {"numactl", "-H", NULL}, -+ }, -+ { -+ .args = {"numastat", NULL}, -+ }, -+ { -+ .args = {"lscpu", NULL}, -+ }, -+ { -+ .args = {"dmidecode", NULL}, -+ }, -+ }; -+ HIKP_SET_USED(data); -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(hardware_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_exec((void *)&hardware_cmds[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect hardware_cmds[%zu] log failed: %d\n", i, ret); -+ } -+ -+ return 0; -+} -+ -+static void collect_hardware_info(void) -+{ -+ int ret; -+ -+ ret = hikp_collect_log(GROUP_COMMON, "hardware_info", hardware_info_exec, (void *)NULL); -+ if (ret) -+ HIKP_ERROR_PRINT("hardware_info_exec failed: %d\n", ret); -+} -+ -+void collect_common_log(void) -+{ -+ collect_software_info(); -+ collect_hardware_info(); -+} -diff --git a/info_collect/hikp_collect_imp.c b/info_collect/hikp_collect_imp.c -new file mode 100644 -index 0000000..296cf07 ---- /dev/null -+++ b/info_collect/hikp_collect_imp.c -@@ -0,0 +1,133 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+#include "hikp_nic_log.h" -+#include "hikp_nic_mac_dump.h" -+#include "hikp_nic_port.h" -+#include "hikp_nic_xsfp.h" -+#include "hikp_nic_ncsi.h" -+ -+static int hikp_collect_nic_log_info(void *dev_name) -+{ -+ struct info_collect_cmd nic_log_cmd = { -+ .group = GROUP_IMP, -+ .log_name = NULL, -+ .args = {"mv", NULL, NULL}, -+ }; -+ struct nic_log_collect_param param = {0}; -+ char log_name[MAX_LOG_NAME_LEN] = {0}; -+ int ret; -+ -+ param.net_dev_name = (const char *)dev_name; -+ ret = snprintf(log_name, MAX_LOG_NAME_LEN, "%s_nic_log", (char *)dev_name); -+ if (ret < 0 || (uint32_t)ret >= MAX_LOG_NAME_LEN) -+ return -EINVAL; -+ -+ ret = hikp_collect_log(GROUP_IMP, log_name, hikp_info_collect_nic_log, (void *)¶m); -+ if (ret) { -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", log_name, ret); -+ return ret; -+ } -+ -+ nic_log_cmd.args[ARGS_IDX1] = (char *)hikp_info_collect_get_log_path(); -+ ret = hikp_move_files(&nic_log_cmd); -+ if (ret) -+ HIKP_ERROR_PRINT("collect imp log failed, %d\n", ret); -+ -+ return ret; -+} -+ -+static int hikp_collect_nic_port_info(void *dev_name) -+{ -+ struct nic_port_collect_param param = {0}; -+ char log_name[MAX_LOG_NAME_LEN] = {0}; -+ int ret; -+ -+ param.net_dev_name = (const char *)dev_name; -+ ret = snprintf(log_name, MAX_LOG_NAME_LEN, "%s_nic_port", (char *)dev_name); -+ if (ret < 0 || (uint32_t)ret >= MAX_LOG_NAME_LEN) -+ return -EINVAL; -+ -+ ret = hikp_collect_log(GROUP_IMP, log_name, hikp_info_collect_nic_port, (void *)¶m); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", log_name, ret); -+ -+ return ret; -+} -+ -+static int hikp_collect_nic_xsfp_info(void *dev_name) -+{ -+ struct nic_xsfp_collect_param param = {0}; -+ char log_name[MAX_LOG_NAME_LEN] = {0}; -+ int ret; -+ -+ param.net_dev_name = (const char *)dev_name; -+ ret = snprintf(log_name, MAX_LOG_NAME_LEN, "%s_nic_xsfp", (char *)dev_name); -+ if (ret < 0 || (uint32_t)ret >= MAX_LOG_NAME_LEN) -+ return -EINVAL; -+ -+ ret = hikp_collect_log(GROUP_IMP, log_name, hikp_info_collect_nic_xsfp, (void *)¶m); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", log_name, ret); -+ -+ return ret; -+} -+ -+static int hikp_collect_nic_mac_info(void *dev_name) -+{ -+ struct nic_mac_collect_param param = {0}; -+ char log_name[MAX_LOG_NAME_LEN] = {0}; -+ int ret; -+ -+ param.net_dev_name = (const char *)dev_name; -+ param.module_name = "ALL"; -+ ret = snprintf(log_name, MAX_LOG_NAME_LEN, "%s_nic_mac", (char *)dev_name); -+ if (ret < 0 || (uint32_t)ret >= MAX_LOG_NAME_LEN) -+ return -EINVAL; -+ -+ ret = hikp_collect_log(GROUP_IMP, log_name, hikp_info_collect_nic_mac, (void *)¶m); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", log_name, ret); -+ -+ return ret; -+} -+ -+static int hikp_collect_nic_ncsi_info(void *dev_name) -+{ -+ struct nic_ncsi_collect_param param = {0}; -+ char log_name[MAX_LOG_NAME_LEN] = {0}; -+ int ret; -+ -+ param.net_dev_name = (const char *)dev_name; -+ ret = snprintf(log_name, MAX_LOG_NAME_LEN, "%s_nic_ncsi", (char *)dev_name); -+ if (ret < 0 || (uint32_t)ret >= MAX_LOG_NAME_LEN) -+ return -EINVAL; -+ -+ ret = hikp_collect_log(GROUP_IMP, log_name, hikp_info_collect_nic_ncsi, (void *)¶m); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", log_name, ret); -+ -+ return ret; -+} -+ -+void collect_imp_log(void) -+{ -+ hikp_collect_all_nic_cmd_log(hikp_collect_nic_log_info); -+ hikp_collect_all_nic_cmd_log(hikp_collect_nic_port_info); -+ hikp_collect_all_nic_cmd_log(hikp_collect_nic_xsfp_info); -+ hikp_collect_all_nic_cmd_log(hikp_collect_nic_mac_info); -+ hikp_collect_all_nic_cmd_log(hikp_collect_nic_ncsi_info); -+} -diff --git a/info_collect/hikp_collect_lib.c b/info_collect/hikp_collect_lib.c -new file mode 100644 -index 0000000..bada846 ---- /dev/null -+++ b/info_collect/hikp_collect_lib.c -@@ -0,0 +1,508 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_collect_lib.h" -+#include -+#include -+#include -+#include -+#include -+#include -+#include "tool_lib.h" -+ -+static char log_save_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+static char g_collect_name[MAX_LOG_NAME_LEN] = {0}; -+ -+static bool hikp_nic_drv_check(char *nic_name) -+{ -+ char drv_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ struct dirent *ptr = NULL; -+ bool hns3_if = false; -+ DIR *dir = NULL; -+ int ret; -+ -+ ret = snprintf(drv_path, LOG_FILE_PATH_MAX_LEN, "%s%s/%s", HIKP_NIC_NAME_DIR, -+ nic_name, HIKP_NIC_DRV_DIR); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) -+ return false; -+ -+ if ((dir = opendir(drv_path)) == NULL) -+ return false; -+ -+ while ((ptr = readdir(dir)) != NULL) { -+ if (strcmp(ptr->d_name, HIKP_NIC_DRV_NAME) == 0) { -+ hns3_if = true; -+ break; -+ } -+ } -+ -+ closedir(dir); -+ return hns3_if; -+} -+ -+void hikp_collect_all_nic_cmd_log(collect_cmd_handler_t hikp_collect_one_nic_log) -+{ -+ struct dirent *ptr = NULL; -+ DIR *dir = NULL; -+ int ret; -+ -+ if (!hikp_collect_one_nic_log) { -+ HIKP_ERROR_PRINT("Invalid parameters!\n"); -+ return; -+ } -+ -+ dir = opendir(HIKP_NIC_NAME_DIR); -+ if (!dir) { -+ HIKP_ERROR_PRINT("failed to open path!\n"); -+ return; -+ } -+ -+ while ((ptr = readdir(dir)) != NULL) { -+ if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0)) { -+ continue; -+ } else if (ptr->d_type == DT_LNK) { -+ if (hikp_nic_drv_check(ptr->d_name)) { -+ ret = hikp_collect_one_nic_log((void *)ptr->d_name); -+ if (ret) { -+ HIKP_WARN_PRINT("failed to collect log for: %s", ptr->d_name); -+ break; -+ } -+ } -+ } -+ } -+ -+ closedir(dir); -+} -+ -+static bool is_cmd_valid(struct info_collect_cmd *cmd, unsigned int args_num) -+{ -+ unsigned int i; -+ -+ if (cmd == NULL || cmd->log_name == NULL || args_num == 0 || args_num >= ARGS_MAX_NUM) -+ return false; -+ -+ for (i = 0; i < args_num; i++) -+ if (cmd->args[i] == NULL) -+ return false; -+ -+ return true; -+} -+ -+int hikp_create_save_path(const char *name) -+{ -+ char collect_name[MAX_LOG_NAME_LEN] = {0}; -+ time_t time_seconds = time(0); -+ struct tm timeinfo; -+ int ret; -+ -+ localtime_r(&time_seconds, &timeinfo); -+ if (name != NULL) -+ (void)snprintf((char *)collect_name, MAX_LOG_NAME_LEN, -+ "collect_%s_%04d%02d%02d%02d%02d%02d", -+ name, timeinfo.tm_year + START_YEAR, -+ timeinfo.tm_mon + 1, timeinfo.tm_mday, -+ timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); -+ else -+ (void)snprintf((char *)collect_name, MAX_LOG_NAME_LEN, -+ "collect_%04d%02d%02d%02d%02d%02d", -+ timeinfo.tm_year + START_YEAR, timeinfo.tm_mon + 1, -+ timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, -+ timeinfo.tm_sec); -+ -+ ret = snprintf((char *)log_save_path, LOG_FILE_PATH_MAX_LEN, -+ HIKP_COLLECT_LOG_DIR_PATH"%s", collect_name); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) -+ return -EINVAL; -+ -+ if (!is_dir_exist((const char*)log_save_path)) { -+ if (tool_mk_dir((const char*)log_save_path)) { -+ HIKP_ERROR_PRINT("mkdir %s failed, errno is %d\n", -+ log_save_path, errno); -+ memset(log_save_path, 0, LOG_FILE_PATH_MAX_LEN); -+ return -ENOENT; -+ } -+ } -+ -+ ret = snprintf((char *)g_collect_name, MAX_LOG_NAME_LEN, "%s", collect_name); -+ if (ret < 0 || (uint32_t)(ret) >= MAX_LOG_NAME_LEN) -+ return -EINVAL; -+ -+ return 0; -+} -+ -+static int hikp_get_save_path(char *file_path, unsigned int file_path_len) -+{ -+ int ret; -+ -+ if (access(log_save_path, F_OK) != 0) -+ return -ENOENT; -+ -+ ret = snprintf((char *)file_path, file_path_len, "%s", log_save_path); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) -+ return -EINVAL; -+ -+ return 0; -+} -+ -+int hikp_get_file_path(char *file_path, uint32_t file_path_len, -+ char *group) -+{ -+ char tmp_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ int ret; -+ -+ ret = hikp_get_save_path(tmp_path, LOG_FILE_PATH_MAX_LEN); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("get file save path failed: %d\n", ret); -+ return ret; -+ } -+ -+ if (group != NULL) -+ ret = snprintf(file_path, file_path_len, "%s/%s", -+ tmp_path, group); -+ else -+ ret = snprintf(file_path, file_path_len, "%s", -+ tmp_path); -+ -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) { -+ HIKP_ERROR_PRINT("create file path fail: %d\n", ret); -+ return -EINVAL; -+ } -+ -+ if (!is_dir_exist((const char*)file_path)) { -+ if (tool_mk_dir((const char*)file_path)) { -+ HIKP_ERROR_PRINT("mkdir %s failed: %d\n", -+ file_path, errno); -+ return -ENOENT; -+ } -+ } -+ -+ return 0; -+} -+ -+static int hikp_collect_cmd_exec(const struct info_collect_cmd *cmd) -+{ -+ pid_t pid; -+ int status; -+ -+ pid = fork(); -+ if (pid == 0) { -+ /* -+ * When the command execution fails, exit the child -+ * process just like when it succeeds. -+ * */ -+ if (execvp(cmd->args[ARGS_IDX0], cmd->args) < 0) { -+ HIKP_ERROR_PRINT("execvp failed: %d\n", errno); -+ exit(EXIT_FAILURE); -+ } -+ } else if (pid > 0) { -+ /* Parent process */ -+ waitpid(pid, &status, 0); -+ } else { -+ HIKP_ERROR_PRINT("fork failed!\n"); -+ return -ECHILD; -+ } -+ -+ return 0; -+} -+ -+int hikp_collect_exec(void *data) -+{ -+ struct info_collect_cmd *cmd = (struct info_collect_cmd *)data; -+ struct info_collect_cmd echo_cmd = {0}; -+ char result[MAX_LOG_NAME_LEN] = {0}; -+ int len = 0; -+ int ret; -+ int i; -+ -+ echo_cmd.args[ARGS_IDX0] = "echo"; -+ echo_cmd.args[ARGS_IDX1] = result; -+ echo_cmd.args[ARGS_IDX2] = NULL; -+ for (i = 0; i < ARGS_MAX_NUM && cmd->args[i] != NULL; i++) { -+ ret = snprintf(result + len, -+ MAX_LOG_NAME_LEN - len - 1, -+ "%s ", cmd->args[i]); -+ len += ret; -+ if (ret < 0 || len >= (MAX_LOG_NAME_LEN - 1)) { -+ HIKP_INFO_PRINT("Error getting command args"); -+ break; -+ } -+ } -+ -+ ret = hikp_collect_cmd_exec(&echo_cmd); -+ if (ret) -+ return ret; -+ -+ return hikp_collect_cmd_exec(cmd); -+} -+ -+int hikp_collect_log(char *group, char *log_name, collect_cmd_handler_t func, void *data) -+{ -+ unsigned char file_name[MAX_LOG_NAME_LEN] = {0}; -+ char file_dir[LOG_FILE_PATH_MAX_LEN] = {0}; -+ char file_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ int stdout_fd = dup(STDOUT_FILENO); -+ int stderr_fd = dup(STDERR_FILENO); -+ FILE *log_file; -+ int ret; -+ -+ if (log_name == NULL) { -+ HIKP_ERROR_PRINT("log name is NULL"); -+ return -EINVAL; -+ } -+ -+ ret = generate_file_name(file_name, MAX_LOG_NAME_LEN, -+ (const unsigned char*)log_name); -+ if (ret < 0) -+ return ret; -+ -+ ret = hikp_get_file_path(file_dir, LOG_FILE_PATH_MAX_LEN, group); -+ if (ret < 0) -+ return ret; -+ -+ ret = snprintf(file_path, LOG_FILE_PATH_MAX_LEN, "%s/%s", file_dir, file_name); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) { -+ HIKP_ERROR_PRINT("create log file path fail: %d\n", ret); -+ return -EINVAL; -+ } -+ -+ log_file = fopen(file_path, "a"); -+ if (log_file == NULL) { -+ HIKP_ERROR_PRINT("open %s failed.", file_path); -+ return -ENOENT; -+ } -+ -+ (void)chmod(file_path, S_IRUSR | S_IWUSR | S_IRGRP); -+ -+ fflush(stdout); -+ fflush(stderr); -+ -+ /* Copy the standard output and error information to log_file */ -+ dup2(fileno(log_file), STDOUT_FILENO); -+ dup2(fileno(log_file), STDERR_FILENO); -+ -+ ret = func(data); -+ -+ fflush(stdout); -+ fflush(stderr); -+ -+ /* Redirect stdout and stderr back to the terminal */ -+ dup2(stdout_fd, STDOUT_FILENO); -+ dup2(stderr_fd, STDERR_FILENO); -+ -+ fclose(log_file); -+ close(stdout_fd); -+ close(stderr_fd); -+ -+ return ret; -+} -+ -+int hikp_compress_log(void) -+{ -+ char file_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ char tar_name[LOG_FILE_PATH_MAX_LEN] = {0}; -+ struct info_collect_cmd tar_cmd = {0}; -+ struct info_collect_cmd rm_cmd = {0}; -+ int ret; -+ -+ ret = hikp_get_save_path(file_path, LOG_FILE_PATH_MAX_LEN); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("get save path fail: %d\n", ret); -+ return ret; -+ } -+ -+ ret = snprintf((char *)tar_name, LOG_FILE_PATH_MAX_LEN, "%s.tar.gz", -+ file_path); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) { -+ HIKP_ERROR_PRINT("create tar path fail: %d\n", ret); -+ return -EINVAL; -+ } -+ -+ tar_cmd.args[ARGS_IDX0] = "tar"; -+ tar_cmd.args[ARGS_IDX1] = "-zPcf"; -+ tar_cmd.args[ARGS_IDX2] = tar_name; -+ tar_cmd.args[ARGS_IDX3] = "-C"; -+ tar_cmd.args[ARGS_IDX4] = HIKP_COLLECT_LOG_DIR_PATH; -+ tar_cmd.args[ARGS_IDX5] = g_collect_name; -+ tar_cmd.args[ARGS_IDX6] = NULL; -+ -+ ret = hikp_collect_exec(&tar_cmd); -+ if (ret) -+ return ret; -+ -+ /* Delete the original log after the log is packaged. */ -+ rm_cmd.args[ARGS_IDX0] = "rm"; -+ rm_cmd.args[ARGS_IDX1] = "-rf"; -+ rm_cmd.args[ARGS_IDX2] = file_path; -+ rm_cmd.args[ARGS_IDX3] = NULL; -+ -+ return hikp_collect_exec(&rm_cmd); -+} -+ -+int hikp_move_files(struct info_collect_cmd *mv_cmd) -+{ -+ char dest_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ char tmp_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ char *src_path = mv_cmd->args[ARGS_IDX1]; -+ char *sub_group = mv_cmd->log_name; -+ int ret; -+ -+ if (strcmp(mv_cmd->args[ARGS_IDX0], "mv") != 0) { -+ HIKP_ERROR_PRINT("input cmd failed: %s.\n", mv_cmd->args[ARGS_IDX0]); -+ return -EINVAL; -+ } -+ -+ if (src_path == NULL || access(src_path, F_OK) != 0) { -+ HIKP_ERROR_PRINT("Can't access source path: %s\n", src_path); -+ return -ENOENT; -+ } -+ -+ ret = hikp_get_file_path(tmp_path, LOG_FILE_PATH_MAX_LEN, mv_cmd->group); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("get destination path fail: %d\n", ret); -+ return ret; -+ } -+ -+ if (sub_group == NULL) -+ ret = snprintf(dest_path, LOG_FILE_PATH_MAX_LEN, "%s", tmp_path); -+ else -+ ret = snprintf(dest_path, LOG_FILE_PATH_MAX_LEN, "%s/%s", -+ tmp_path, sub_group); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) { -+ HIKP_ERROR_PRINT("create destination path failed: %d\n", ret); -+ return -EINVAL; -+ } -+ -+ mv_cmd->args[ARGS_IDX2] = dest_path; -+ mv_cmd->args[ARGS_IDX3] = NULL; -+ -+ return hikp_collect_exec((void *)mv_cmd); -+} -+ -+int hikp_save_files(struct info_collect_cmd *save_cmd) -+{ -+ char save_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ char tmp_path[LOG_FILE_PATH_MAX_LEN] = {0}; -+ char *source_path = save_cmd->args[ARGS_IDX2]; -+ char *sub_group = save_cmd->log_name; -+ int ret; -+ -+ if (strcmp(save_cmd->args[ARGS_IDX0], "cp") != 0) { -+ HIKP_ERROR_PRINT("input cmd failed: %s.\n", save_cmd->args[ARGS_IDX0]); -+ return -EINVAL; -+ } -+ -+ if (source_path == NULL || access(source_path, F_OK) != 0) { -+ HIKP_ERROR_PRINT("Can't access source path: %s\n", source_path); -+ return -ENOENT; -+ } -+ -+ ret = hikp_get_file_path(tmp_path, LOG_FILE_PATH_MAX_LEN, save_cmd->group); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("get save path fail: %d\n", ret); -+ return ret; -+ } -+ -+ if (sub_group == NULL) -+ ret = snprintf(save_path, LOG_FILE_PATH_MAX_LEN, "%s", tmp_path); -+ else -+ ret = snprintf(save_path, LOG_FILE_PATH_MAX_LEN, "%s/%s", -+ tmp_path, sub_group); -+ if (ret < 0 || (uint32_t)(ret) >= LOG_FILE_PATH_MAX_LEN) { -+ HIKP_ERROR_PRINT("create save path failed: %d\n", ret); -+ return -EINVAL; -+ } -+ -+ save_cmd->args[ARGS_IDX3] = save_path; -+ save_cmd->args[ARGS_IDX4] = NULL; -+ -+ return hikp_collect_exec((void *)save_cmd); -+} -+ -+int hikp_collect_cat_glob_exec(void *data) -+{ -+ struct info_collect_cmd *cmd = (struct info_collect_cmd *)data; -+ glob_t glb_buff; -+ size_t i; -+ int ret; -+ -+ if (!is_cmd_valid(cmd, ARGS_IDX2)) -+ return -EINVAL; -+ -+ if (strcmp(cmd->args[ARGS_IDX0], "cat")) -+ return -EINVAL; -+ -+ ret = glob(cmd->args[ARGS_IDX1], GLOB_TILDE, NULL, &glb_buff); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to generate cat paths: %s\n", cmd->args[ARGS_IDX1]); -+ return ret; -+ } -+ -+ for (i = 0; i < glb_buff.gl_pathc; i++) { -+ cmd->args[ARGS_IDX1] = glb_buff.gl_pathv[i]; -+ ret = hikp_collect_exec((void *)cmd); -+ if(ret) -+ HIKP_INFO_PRINT("cat %s failed\n", glb_buff.gl_pathv[i]); -+ } -+ -+ globfree(&glb_buff); -+ -+ return 0; -+} -+ -+int hikp_collect_cp_glob_exec(void *data) -+{ -+ struct info_collect_cmd *cmd = (struct info_collect_cmd *)data; -+ char log_name[MAX_LOG_NAME_LEN] = {0}; -+ char tmp[MAX_LOG_NAME_LEN] = {0}; -+ glob_t glb_buff; -+ size_t i; -+ int ret; -+ -+ if (!is_cmd_valid(cmd, ARGS_IDX3)) -+ return -EINVAL; -+ -+ if (strcmp(cmd->args[ARGS_IDX0], "cp")) -+ return -EINVAL; -+ -+ ret = glob(cmd->args[ARGS_IDX2], GLOB_TILDE, NULL, &glb_buff); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to generate cp paths: %s\n", cmd->args[ARGS_IDX2]); -+ return ret; -+ } -+ -+ ret = snprintf(tmp, MAX_LOG_NAME_LEN, "%s", cmd->log_name); -+ if (ret < 0 || (uint32_t)(ret) >= MAX_LOG_NAME_LEN) { -+ HIKP_ERROR_PRINT("log name is invalid\n"); -+ globfree(&glb_buff); -+ return -EINVAL; -+ } -+ -+ for (i = 0; i < glb_buff.gl_pathc; i++) { -+ ret = snprintf(log_name, MAX_LOG_NAME_LEN, "%s_%zu", tmp, i); -+ if (ret < 0 || (uint32_t)(ret) >= MAX_LOG_NAME_LEN) { -+ HIKP_ERROR_PRINT("create log name failed\n"); -+ globfree(&glb_buff); -+ return -EINVAL; -+ } -+ -+ cmd->log_name = log_name; -+ cmd->args[ARGS_IDX2] = glb_buff.gl_pathv[i]; -+ ret = hikp_save_files(cmd); -+ if(ret) -+ HIKP_INFO_PRINT("cp %s failed\n", glb_buff.gl_pathv[i]); -+ } -+ -+ globfree(&glb_buff); -+ -+ return 0; -+} -diff --git a/info_collect/hikp_collect_lib.h b/info_collect/hikp_collect_lib.h -new file mode 100644 -index 0000000..2c59bf0 ---- /dev/null -+++ b/info_collect/hikp_collect_lib.h -@@ -0,0 +1,61 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_COLLECT_LIB_H -+#define HIKP_COLLECT_LIB_H -+ -+#ifndef NULL -+#define NULL ((void *)0) -+#endif -+ -+#define ARGS_IDX0 0 -+#define ARGS_IDX1 1 -+#define ARGS_IDX2 2 -+#define ARGS_IDX3 3 -+#define ARGS_IDX4 4 -+#define ARGS_IDX5 5 -+#define ARGS_IDX6 6 -+#define ARGS_IDX7 7 -+#define ARGS_IDX8 8 -+#define ARGS_IDX9 9 -+#define ARGS_IDX10 10 -+#define ARGS_IDX11 11 -+#define ARGS_MAX_NUM 12 -+#define LOG_FILE_PATH_MAX_LEN 512 -+#define HIKP_COLLECT_LOG_DIR_PATH "/var/log/hikp/" -+#define HIKP_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) -+#define HIKP_NIC_NAME_DIR "/sys/class/net/" -+#define HIKP_NIC_DRV_DIR "device/driver/module/drivers/" -+#define HIKP_NIC_DRV_NAME "pci:hns3" -+ -+typedef int (*collect_cmd_handler_t)(void *); -+ -+struct info_collect_cmd { -+ char *group; -+ char *log_name; -+ char *args[ARGS_MAX_NUM]; -+}; -+ -+int hikp_compress_log(void); -+int hikp_create_save_path(const char *name); -+int hikp_get_file_path(char *file_path, unsigned int file_path_len, -+ char *group); -+int hikp_collect_exec(void *data); -+int hikp_collect_log(char *group, char *log_name, -+ collect_cmd_handler_t func, void *data); -+int hikp_move_files(struct info_collect_cmd *mv_cmd); -+int hikp_save_files(struct info_collect_cmd *save_cmd); -+int hikp_collect_cat_glob_exec(void *data); -+int hikp_collect_cp_glob_exec(void *data); -+void hikp_collect_all_nic_cmd_log(collect_cmd_handler_t hikp_collect_one_nic_log); -+#endif /* HIKP_COLLECT_LIB_H */ -diff --git a/info_collect/hikp_collect_main.c b/info_collect/hikp_collect_main.c -new file mode 100644 -index 0000000..c413346 ---- /dev/null -+++ b/info_collect/hikp_collect_main.c -@@ -0,0 +1,274 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+#include "tool_cmd.h" -+ -+static enum info_collect_type g_info_collect_type = COLLECT_UNKNOWN_TYPE; -+static enum info_collect_type get_info_collect_type(void) -+{ -+ return g_info_collect_type; -+} -+ -+static void set_info_collect_type(enum info_collect_type type) -+{ -+ g_info_collect_type = type; -+} -+ -+static int info_collect_acc(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_ACC); -+ return 0; -+} -+ -+static int info_collect_imp(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_IMP); -+ return 0; -+} -+ -+static int info_collect_nic(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_NIC); -+ return 0; -+} -+ -+static int info_collect_pcie(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_PCIE); -+ return 0; -+} -+ -+static int info_collect_roce(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_ROCE); -+ return 0; -+} -+ -+static int info_collect_sas(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_SAS); -+ return 0; -+} -+ -+static int info_collect_sata(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_SATA); -+ return 0; -+} -+ -+static int info_collect_serdes(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_SERDES); -+ return 0; -+} -+ -+static int info_collect_socip(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_SOCIP); -+ return 0; -+} -+ -+static int info_collect_all(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_ALL); -+ return 0; -+} -+ -+static void collect_all_log(void) -+{ -+ collect_pcie_info(); -+ collect_acc_log(); -+ collect_imp_log(); -+ collect_nic_log(); -+ collect_roce_log(); -+ collect_sas_log(); -+ collect_sata_log(); -+ collect_serdes_log(); -+ collect_socip_log(); -+} -+ -+static int info_collect_excute_funs_call(uint32_t collect_type) -+{ -+ const char *type_name[] = {"acc", "imp", "nic", "pcie", "roce", "sas", -+ "sata", "serdes", "socip", "all"}; -+ int ret; -+ -+ if (collect_type == COLLECT_UNKNOWN_TYPE) -+ return -EINVAL; -+ -+ ret = hikp_create_save_path(type_name[collect_type]); -+ if (ret) { -+ HIKP_ERROR_PRINT("create save path fail: %d\n", ret); -+ return ret; -+ } -+ -+ switch (collect_type) { -+ case COLLECT_ACC: -+ collect_acc_log(); -+ break; -+ case COLLECT_IMP: -+ collect_imp_log(); -+ break; -+ case COLLECT_NIC: -+ collect_nic_log(); -+ break; -+ case COLLECT_PCIE: -+ collect_pcie_info(); -+ break; -+ case COLLECT_ROCE: -+ collect_roce_log(); -+ break; -+ case COLLECT_SAS: -+ collect_sas_log(); -+ break; -+ case COLLECT_SATA: -+ collect_sata_log(); -+ break; -+ case COLLECT_SERDES: -+ collect_serdes_log(); -+ break; -+ case COLLECT_SOCIP: -+ collect_socip_log(); -+ break; -+ case COLLECT_ALL: -+ collect_all_log(); -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ collect_common_log(); -+ ret = hikp_compress_log(); -+ -+ return ret; -+} -+ -+ -+static void info_collect_execute(struct major_cmd_ctrl *self) -+{ -+ const char *suc_msg[] = { -+ "collect acc info success.", -+ "collect imp info success.", -+ "collect nic info success.", -+ "collect pcie info success.", -+ "collect roce info success.", -+ "collect sas info success.", -+ "collect sata info success.", -+ "collect serdes info success.", -+ "collect socip info success.", -+ "collect all info success.", -+ }; -+ const char *err_msg[] = { -+ "collect acc info error.", -+ "collect imp info error.", -+ "collect nic info error.", -+ "collect pcie info error.", -+ "collect roce info error.", -+ "collect sas info error.", -+ "collect sata info error.", -+ "collect serdes info error.", -+ "collect socip info error.", -+ "collect all info error.", -+ "collect info failed, unknown type.", -+ }; -+ enum info_collect_type type; -+ int ret; -+ -+ type = get_info_collect_type(); -+ ret = info_collect_excute_funs_call(type); -+ set_info_collect_type(COLLECT_UNKNOWN_TYPE); -+ if (ret == 0) { -+ printf("%s\n", suc_msg[type]); -+ } else { -+ (void)snprintf(self->err_str, sizeof(self->err_str), "%s\n", err_msg[type]); -+ self->err_no = ret; -+ } -+} -+ -+static int info_collect_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(argv); -+ -+ printf("\n Usage: %s\n", self->cmd_ptr->name); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); -+ printf(" %s, %-25s %s\n", "-acc", "--acc", "collect acc info\n"); -+ printf(" %s, %-25s %s\n", "-imp", "--imp", "collect imp info\n"); -+ printf(" %s, %-25s %s\n", "-nic", "--nic", "collect nic info\n"); -+ printf(" %s, %-25s %s\n", "-pcie", "--pcie", "collect pcie info\n"); -+ printf(" %s, %-25s %s\n", "-roce", "--roce", "collect roce info\n"); -+ printf(" %s, %-25s %s\n", "-sas", "--sas", "collect sas info\n"); -+ printf(" %s, %-25s %s\n", "-sata", "--sata", "collect sata info\n"); -+ printf(" %s, %-25s %s\n", "-serdes", "--serdes", "collect serdes info\n"); -+ printf(" %s, %-25s %s\n", "-socip", "--socip", "collect socip info\n"); -+ printf(" %s, %-25s %s\n", "-all", "--all", "collect all info\n"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static void cmd_info_collect_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = info_collect_execute; -+ -+ cmd_option_register("-h", "--help", false, info_collect_help); -+ cmd_option_register("-acc", "--acc", false, info_collect_acc); -+ cmd_option_register("-imp", "--imp", false, info_collect_imp); -+ cmd_option_register("-nic", "--nic", false, info_collect_nic); -+ cmd_option_register("-pcie", "--pcie", false, info_collect_pcie); -+ cmd_option_register("-roce", "--roce", false, info_collect_roce); -+ cmd_option_register("-sas", "--sas", false, info_collect_sas); -+ cmd_option_register("-sata", "--sata", false, info_collect_sata); -+ cmd_option_register("-serdes", "--serdes", false, info_collect_serdes); -+ cmd_option_register("-socip", "--socip", false, info_collect_socip); -+ cmd_option_register("-all", "--all", false, info_collect_all); -+} -+ -+HIKP_CMD_DECLARE("info_collect", "information collect", cmd_info_collect_init); -diff --git a/info_collect/hikp_collect_nic.c b/info_collect/hikp_collect_nic.c -new file mode 100644 -index 0000000..23c4e49 ---- /dev/null -+++ b/info_collect/hikp_collect_nic.c -@@ -0,0 +1,368 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+#include "hikp_nic_fd.h" -+#include "hikp_nic_gro.h" -+#include "hikp_nic_ppp.h" -+#include "hikp_nic_qos.h" -+#include "hikp_nic_queue.h" -+#include "hikp_nic_rss.h" -+#include "hikp_nic_torus.h" -+#include "hikp_nic_fec.h" -+#include "hikp_nic_dfx.h" -+#include "hikp_nic_info.h" -+#include "hikp_nic_notify_pkt.h" -+#include "hikp_nic_port_fault.h" -+#include "hikp_nic_mac_dump.h" -+ -+static void collect_nic_debugfs_log(void) -+{ -+ struct info_collect_cmd nic_cmd_copy = { -+ .group = GROUP_NIC, -+ .log_name = "debugfs", -+ .args = {"cp", "-rf", "/sys/kernel/debug/hns3/", NULL}, -+ }; -+ int ret; -+ -+ ret = hikp_save_files(&nic_cmd_copy); -+ if (ret) -+ HIKP_ERROR_PRINT("collect_nic_log debugfs failed, %d\n", ret); -+} -+ -+static int collect_hikp_nic_fd_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ /* collect nic_fd hw_info */ -+ printf("hikptool nic_fd -i %s -du hw_info\n", (char *)nic_name); -+ hikp_nic_set_fd_idx(NIC_FD_HW_INFO_DUMP, -1); -+ self.cmd_ptr = &type; -+ ret = hikp_nic_cmd_get_fd_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ hikp_nic_fd_cmd_execute(&self); -+ -+ /* collect nic_fd rules and counters */ -+ printf("hikptool nic_fd -i %s -du rules -st 1\n", (char *)nic_name); -+ hikp_nic_set_fd_idx(NIC_FD_RULES_INFO_DUMP, 1); -+ hikp_nic_fd_cmd_execute(&self); -+ printf("hikptool nic_fd -i %s -du counter -st 1\n", (char *)nic_name); -+ hikp_nic_set_fd_idx(NIC_FD_COUNTER_STATS_DUMP, 1); -+ hikp_nic_fd_cmd_execute(&self); -+ -+ return 0; -+} -+ -+static int collect_hikp_nic_gro_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ printf("hikptool nic_gro -i %s\n", (char *)nic_name); -+ self.cmd_ptr = &type; -+ ret = hikp_nic_gro_get_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ hikp_nic_gro_cmd_execute(&self); -+ return 0; -+} -+ -+static int collect_hikp_nic_ppp_log(void *nic_name) -+{ -+ const char *sub_cmd_name[] = {"mac", "vlan", "mng", "promisc", "vlan_offload"}; -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int i, ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_nic_cmd_get_ppp_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ for (i = NIC_MAC_TBL_DUMP; i <= NIC_VLAN_OFFLOAD_DUMP; ++i) { -+ printf("hikptool nic_ppp -i %s -du %s\n", (char *)nic_name, -+ sub_cmd_name[i - NIC_MAC_TBL_DUMP]); -+ hikp_nic_ppp_set_cmd_param(i-1); -+ hikp_nic_ppp_cmd_execute(&self); -+ } -+ -+ return 0; -+} -+ -+static int collect_hikp_nic_qos_log(void *nic_name) -+{ -+ const char *sub_cmd_name[] = {"pkt_buf", "dcb", "pause"}; -+ const char *dir_name[] = {"rx", "tx"}; -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int i, ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_nic_cmd_get_qos_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ for (i = NIC_PACKET_BUFFER_DUMP; i <= NIC_PAUSE_DUMP; ++i) { -+ printf("hikptool nic_qos -i %s -g %s\n", (char *)nic_name, sub_cmd_name[i]); -+ hikp_nic_qos_set_cmd_feature_idx(i); -+ hikp_nic_qos_cmd_execute(&self); -+ } -+ -+ hikp_nic_qos_set_cmd_feature_idx(NIC_PFC_STORM_PARA_DUMP); -+ for (i = NIC_RX_QOS; i <= NIC_TX_QOS; ++i) { -+ printf("hikptool nic_qos -i %s -g pfc_storm_para -d %s\n", (char *)nic_name, -+ dir_name[i]); -+ hikp_nic_qos_set_cmd_direction(i); -+ hikp_nic_qos_cmd_execute(&self); -+ } -+ -+ return 0; -+} -+ -+static int collect_hikp_nic_queue_log(void *nic_name) -+{ -+ const char *dir_name[] = {"tx", "rx"}; -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int j, ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_nic_cmd_get_queue_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool nic_queue -i %s -du queue_en -a on\n", (char *)nic_name); -+ hikp_nic_queue_cmd_set_param(QUEUE_EN_INFO, -1, NIC_QUEUE_DIR_UNKNOWN); -+ hikp_nic_queue_cmd_execute(&self); -+ printf("hikptool nic_queue -i %s -du func_map\n", (char *)nic_name); -+ hikp_nic_queue_cmd_set_param(QUEUE_FUNC_MAP, -1, NIC_QUEUE_DIR_UNKNOWN); -+ hikp_nic_queue_cmd_execute(&self); -+ -+ for (j = NIC_TX_QUEUE; j <= NIC_RX_QUEUE; ++j) { -+ printf("hikptool nic_queue -i %s -du basic_info -d %s -q 0\n", (char *)nic_name, -+ dir_name[j]); -+ hikp_nic_queue_cmd_set_param(QUEUE_BASIC_INFO, 0, j); -+ hikp_nic_queue_cmd_execute(&self); -+ printf("hikptool nic_queue -i %s -du intr_map -d %s -a on\n", (char *)nic_name, -+ dir_name[j]); -+ hikp_nic_queue_cmd_set_param(QUEUE_INTR_MAP, -1, j); -+ hikp_nic_queue_cmd_execute(&self); -+ } -+ -+ return 0; -+} -+ -+static int collect_hikp_nic_rss_log(void *nic_name) -+{ -+ const char *sub_cmd_name[] = {"algo", "key", "tuple", "reta", "tc_mode"}; -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int i, ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_nic_cmd_get_rss_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ for (i = RSS_ALGO_DUMP; i <= RSS_TC_MODE_DUMP; ++i) { -+ printf("hikptool nic_rss -i %s -g %s\n", (char *)nic_name, sub_cmd_name[i]); -+ hikp_nic_rss_cmd_set_feature_idx(i); -+ hikp_nic_rss_cmd_execute(&self); -+ } -+ -+ return 0; -+} -+ -+static int collect_hikp_nic_torus_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_nic_torus_get_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool nic_torus -i %s\n", (char *)nic_name); -+ hikp_nic_torus_cmd_execute(&self); -+ return 0; -+} -+ -+static int collect_hikp_nic_fec_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_nic_fec_get_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool nic_fec -i %s\n", (char *)nic_name); -+ hikp_nic_fec_cmd_execute(&self); -+ return 0; -+} -+ -+static int collect_hikp_nic_dfx_log(void *nic_name) -+{ -+ const char *sub_cmd_name[] = {"SSU", "IGU_EGU", "PPP", "NCSI", "BIOS", "RCB", "TXDMA", -+ "MASTER"}; -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int i, ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_nic_cmd_dfx_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ for (i = SSU_DFX_REG_DUMP; i <= MASTER_DFX_REG_DUMP; ++i) { -+ printf("hikptool nic_dfx -i %s -m %s\n", (char *)nic_name, sub_cmd_name[i]); -+ hikp_nic_dfx_set_cmd_para(i); -+ hikp_nic_dfx_cmd_execute(&self); -+ } -+ -+ return 0; -+} -+ -+static int collect_hikp_nic_info_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ printf("hikptool nic_info -i %s\n", (char *)nic_name); -+ self.cmd_ptr = &type; -+ ret = hikp_nic_cmd_get_info_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ hikp_nic_info_cmd_execute(&self); -+ return 0; -+} -+ -+static int collect_hikp_nic_notify_pkt_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ printf("hikptool nic_notify_pkt -i %s\n", (char *)nic_name); -+ self.cmd_ptr = &type; -+ ret = hikp_nic_notify_pkt_get_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ hikp_nic_notify_pkt_cmd_execute(&self); -+ return 0; -+} -+ -+static int collect_hikp_nic_port_fault_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ printf("hikptool nic_port_fault -i %s\n", (char *)nic_name); -+ self.cmd_ptr = &type; -+ ret = hikp_nic_port_fault_get_target(&self, (char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to get bdf for %s.\n", (char *)nic_name); -+ return ret; -+ } -+ -+ hikp_nic_port_fault_cmd_execute(&self); -+ return 0; -+} -+ -+static int collect_one_nic_hikp_log_compact(char *net_name, char *module, collect_cmd_handler_t hikp_pfn) -+{ -+ char log_name[LOG_FILE_PATH_MAX_LEN] = {0}; -+ int ret; -+ -+ ret = snprintf(log_name, LOG_FILE_PATH_MAX_LEN, "%s_%s", net_name, module); -+ if (ret < 0 || (uint32_t)ret >= LOG_FILE_PATH_MAX_LEN) -+ return -EINVAL; -+ -+ return hikp_collect_log(GROUP_NIC, log_name, hikp_pfn, (void *)net_name); -+} -+ -+static int collect_one_nic_hikp_log(void *net_name) -+{ -+ struct collect_nic_hikp_log_meta { -+ const char *module_name; -+ collect_cmd_handler_t hikp_pfn; -+ } nic_hikp_log_meta[] = { -+ { "nic_fd", collect_hikp_nic_fd_log }, -+ { "nic_gro", collect_hikp_nic_gro_log }, -+ { "nic_ppp", collect_hikp_nic_ppp_log }, -+ { "nic_qos", collect_hikp_nic_qos_log }, -+ { "nic_queue", collect_hikp_nic_queue_log }, -+ { "nic_rss", collect_hikp_nic_rss_log }, -+ { "nic_torus", collect_hikp_nic_torus_log }, -+ { "nic_fec", collect_hikp_nic_fec_log }, -+ { "nic_dfx", collect_hikp_nic_dfx_log }, -+ { "nic_info", collect_hikp_nic_info_log }, -+ { "nic_notify_pkt", collect_hikp_nic_notify_pkt_log }, -+ { "nic_port_fault", collect_hikp_nic_port_fault_log }, -+ }; -+ size_t i; -+ int ret; -+ -+ for (i = 0; i < HIKP_ARRAY_SIZE(nic_hikp_log_meta); ++i) { -+ ret = collect_one_nic_hikp_log_compact((char *)net_name, -+ nic_hikp_log_meta[i].module_name, -+ nic_hikp_log_meta[i].hikp_pfn); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ nic_hikp_log_meta[i].module_name, ret); -+ } -+ -+ return 0; -+} -+ -+void collect_nic_log(void) -+{ -+ collect_nic_debugfs_log(); -+ hikp_collect_all_nic_cmd_log(collect_one_nic_hikp_log); -+} -diff --git a/info_collect/hikp_collect_pcie.c b/info_collect/hikp_collect_pcie.c -new file mode 100644 -index 0000000..d3cd7ad ---- /dev/null -+++ b/info_collect/hikp_collect_pcie.c -@@ -0,0 +1,215 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+#include "hikptdev_plug.h" -+#include "pcie_link_ltssm.h" -+#include "pcie_statistics.h" -+#include "pcie_common.h" -+#include "pcie_reg_dump.h" -+ -+#define PCIE_DEV_LEN 512 -+#define PCIE_DEV_PATH "/sys/bus/pci/devices" -+#define MAX_NIMBUS_NUM_ALL 8 -+ -+/* Optimization barrier */ -+#ifndef barrier -+/* The "volatile" is due to gcc bugs */ -+# define barrier() __asm__ __volatile__("": : :"memory") -+#endif -+ -+struct pcie_id_info { -+ uint32_t chip_id; -+ uint32_t port_id; -+}; -+ -+/* get pcie config space info */ -+static void collect_pcie_common(char *pcie_dev_name) -+{ -+ struct info_collect_cmd pcie_cmd_arr = {0}; -+ int ret; -+ -+ pcie_cmd_arr.group = GROUP_PCIE; -+ pcie_cmd_arr.log_name = pcie_dev_name; -+ pcie_cmd_arr.args[ARGS_IDX0] = "lspci"; -+ pcie_cmd_arr.args[ARGS_IDX1] = "-vvvxxxx"; -+ pcie_cmd_arr.args[ARGS_IDX2] = "-s"; -+ pcie_cmd_arr.args[ARGS_IDX3] = pcie_dev_name; -+ pcie_cmd_arr.args[ARGS_IDX4] = NULL; -+ ret = hikp_collect_log(pcie_cmd_arr.group, pcie_cmd_arr.log_name, -+ hikp_collect_exec, (void *)&pcie_cmd_arr); -+ if (ret) -+ HIKP_ERROR_PRINT("collect_pcie_common failed: %d\n", ret); -+} -+ -+static void collect_pcie_single_cfg(void) -+{ -+ char dev_name[PCIE_DEV_LEN]; -+ struct dirent *ptr = NULL; -+ DIR *dir = NULL; -+ -+ if ((dir = opendir(PCIE_DEV_PATH)) == NULL) { -+ perror("failed to open path \n"); -+ return; -+ } -+ -+ while ((ptr = readdir(dir)) != NULL) { -+ if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0)) { -+ continue; -+ } else if (ptr->d_type == DT_LNK) { -+ memset(dev_name, 0, sizeof(dev_name)); -+ strncpy(dev_name, ptr->d_name, sizeof(dev_name) - 1); -+ dev_name[sizeof(dev_name) - 1] = '\0'; -+ collect_pcie_common(dev_name); -+ } -+ } -+ -+ closedir(dir); -+} -+ -+/* get pcie config tree info */ -+static void collect_pcie_cfg_tree(void) -+{ -+ struct info_collect_cmd pcie_cmd_arr = { -+ .group = GROUP_PCIE, -+ .log_name = "pcie_tree", -+ .args = {"lspci", "-tv", NULL}, -+ }; -+ int ret; -+ -+ ret = hikp_collect_log(pcie_cmd_arr.group, pcie_cmd_arr.log_name, -+ hikp_collect_exec, (void *)&pcie_cmd_arr); -+ if (ret) -+ HIKP_ERROR_PRINT("collect_pcie_cfg_tree failed: %d\n", ret); -+} -+ -+static int pcie_mv_dumplog(void) -+{ -+ struct info_collect_cmd pcie_cmd_arr = { 0 }; -+ -+ pcie_cmd_arr.group = GROUP_PCIE; -+ pcie_cmd_arr.args[ARGS_IDX0] = "mv"; -+ pcie_cmd_arr.args[ARGS_IDX1] = dumpreg_log_file; -+ -+ return hikp_move_files(&pcie_cmd_arr); -+} -+ -+static int collect_pcie_local_info(void *data) -+{ -+ struct pcie_id_info *info = (struct pcie_id_info *)data; -+ uint32_t port_id; -+ -+ port_id = info->port_id; -+ printf("chip_id:%u, port_id:%u\n", info->chip_id, port_id); -+ /* do dump action for each port */ -+ /* step 1 pcie trace */ -+ printf("hikptool pcie_trace -i %u -s\n", port_id); -+ (void)pcie_ltssm_trace_show(port_id); -+ /* step 2 pcie link status */ -+ printf("hikptool pcie_trace -i %u -f\n", port_id); -+ (void)pcie_ltssm_link_status_get(port_id); -+ /* step 3 pcie err cnt */ -+ printf("hikptool pcie_info -i %u -es\n", port_id); -+ (void)pcie_error_state_get(port_id); -+ /* step 4 pcie pm trace */ -+ printf("hikptool pcie_trace -i %u -pm\n", port_id); -+ (void)pcie_pm_trace(port_id); -+ -+ return 0; -+} -+ -+static int pcie_port_distribution_info(void *data) -+{ -+ uint32_t chip_id = *(uint32_t *)(data); -+ int ret; -+ -+ printf("hikptool pcie_info -i %u -d\n", chip_id); -+ ret = pcie_port_distribution_get(chip_id); -+ if (ret) -+ HIKP_ERROR_PRINT("pcie_port_distribution_get failed: %d\n", ret); -+ return ret; -+} -+ -+static void collect_pcie_local(void) -+{ -+ struct pcie_info_req_para req_data = { 0 }; -+ char name[MAX_LOG_NAME_LEN + 1] = { 0 }; -+ struct pcie_port_info *port_info = NULL; -+ struct hikp_cmd_ret *cmd_ret = NULL; -+ struct hikp_cmd_header req_header; -+ struct pcie_id_info info; -+ uint32_t port_num; -+ uint32_t port_id; -+ uint32_t i, j; -+ int ret; -+ -+ for (i = 0; i < MAX_NIMBUS_NUM_ALL; i++) { -+ req_data.interface_id = i; -+ -+ memset(name, 0, MAX_LOG_NAME_LEN + 1); -+ (void)snprintf(name, MAX_LOG_NAME_LEN, "pcie_local_nimbus_%u", i); -+ -+ ret = hikp_collect_log(GROUP_PCIE, name, pcie_port_distribution_info, (void *)&i); -+ if (ret) { -+ HIKP_INFO_PRINT("Nimbus:%u hikp_collect_log pcie_port_distribution_info unsuccessful!\n", i); -+ return; -+ } -+ -+ hikp_cmd_init(&req_header, PCIE_MOD, PCIE_INFO, INFO_DISTRIBUTION); -+ cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -+ ret = port_distribution_rsp_data_check(cmd_ret, &port_num); -+ if (ret) { -+ HIKP_ERROR_PRINT("port_distribution_rsp_data_check failed: %d\n", ret); -+ hikp_cmd_free(&cmd_ret); -+ return; -+ } -+ -+ port_info = (struct pcie_port_info *)cmd_ret->rsp_data; -+ for (j = 0; j < port_num; j++) { -+ port_id = port_info->info_pair[j].port_id; -+ info.chip_id = i; -+ info.port_id = port_info->info_pair[j].port_id; -+ -+ memset(name, 0, MAX_LOG_NAME_LEN + 1); -+ (void)snprintf(name, MAX_LOG_NAME_LEN, "pcie_local_port_%u", j); -+ -+ ret = hikp_collect_log(GROUP_PCIE, name, collect_pcie_local_info, (void *)&info); -+ if (ret) { -+ HIKP_ERROR_PRINT("hikp_collect_log collect_pcie_local_info failed: %d\n", ret); -+ hikp_cmd_free(&cmd_ret); -+ return; -+ } -+ /* step 1 pcie dumpreg core level */ -+ (void)pcie_dumpreg_do_dump(port_id, DUMP_GLOBAL_LEVEL); -+ (void)pcie_mv_dumplog(); -+ /* step 2 pcie dumpreg port level */ -+ (void)pcie_dumpreg_do_dump(port_id, DUMP_PORT_LEVEL); -+ (void)pcie_mv_dumplog(); -+ } -+ hikp_cmd_free(&cmd_ret); -+ } -+} -+ -+void collect_pcie_info(void) -+{ -+ collect_pcie_cfg_tree(); -+ -+ collect_pcie_single_cfg(); -+ -+ collect_pcie_local(); -+} -diff --git a/info_collect/hikp_collect_roce.c b/info_collect/hikp_collect_roce.c -new file mode 100644 -index 0000000..baf2899 ---- /dev/null -+++ b/info_collect/hikp_collect_roce.c -@@ -0,0 +1,489 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+#include "hikp_roce_bond.h" -+#include "hikp_roce_global_cfg.h" -+#include "hikp_roce_rst.h" -+#include "hikp_roce_timer.h" -+#include "hikp_roce_pkt.h" -+#include "hikp_roce_mdb.h" -+#include "hikp_roce_caep.h" -+#include "hikp_roce_qmm.h" -+#include "hikp_roce_trp.h" -+#include "hikp_roce_tsp.h" -+#include "hikp_roce_scc.h" -+#include "hikp_roce_gmv.h" -+ -+static void collect_roce_devinfo_log(void) -+{ -+ const struct info_collect_cmd roce_devinfo_cmd = { -+ .group = GROUP_ROCE, -+ .log_name = "ibv_devinfo", -+ .args = {"ibv_devinfo", NULL}, -+ }; -+ int ret; -+ -+ ret = hikp_collect_log(roce_devinfo_cmd.group, -+ roce_devinfo_cmd.log_name, -+ hikp_collect_exec, -+ (void *)&roce_devinfo_cmd); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ roce_devinfo_cmd.log_name, ret); -+} -+ -+static void collect_roce_cc_param_log(void) -+{ -+ struct info_collect_cmd roce_cc_param_cmd = { -+ .group = GROUP_ROCE, -+ .log_name = "cc_param", -+ .args = {"cp", "-rf", -+ "/sys/class/infiniband/*/ports/1/cc_param", NULL}, -+ }; -+ int ret; -+ -+ ret = hikp_collect_log(roce_cc_param_cmd.group, -+ roce_cc_param_cmd.log_name, -+ hikp_collect_cp_glob_exec, -+ (void *)&roce_cc_param_cmd); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ roce_cc_param_cmd.log_name, ret); -+} -+ -+static void collect_roce_sw_stats_log(void) -+{ -+ struct info_collect_cmd roce_sw_stats_cmd = { -+ .group = GROUP_ROCE, -+ .log_name = "sw_stat", -+ .args = {"cat", "/sys/kernel/debug/hns_roce/*/sw_stat/sw_stat", -+ NULL}, -+ }; -+ int ret; -+ -+ ret = hikp_collect_log(roce_sw_stats_cmd.group, -+ roce_sw_stats_cmd.log_name, -+ hikp_collect_cat_glob_exec, -+ (void *)&roce_sw_stats_cmd); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ roce_sw_stats_cmd.log_name, ret); -+} -+ -+static void collect_roce_res_stats_log(void) -+{ -+ const struct info_collect_cmd roce_res_stats_cmd = { -+ .group = GROUP_ROCE, -+ .log_name = "rdma_res_show", -+ .args = {"rdma", "res", "show", NULL}, -+ }; -+ int ret; -+ -+ ret = hikp_collect_log(roce_res_stats_cmd.group, -+ roce_res_stats_cmd.log_name, -+ hikp_collect_exec, -+ (void *)&roce_res_stats_cmd); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ roce_res_stats_cmd.log_name, ret); -+} -+ -+static int collect_hikp_roce_gmv_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ uint32_t gmv_index; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_gmv_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_gmv bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ for (gmv_index = 0; gmv_index < ROCE_MAX_HIKPTOOL_GMV; gmv_index++) { -+ printf("hikptool roce_gmv -i %s -x %u\n", (char *)nic_name, gmv_index); -+ hikp_roce_set_gmv_index(gmv_index); -+ hikp_roce_gmv_execute(&self); -+ } -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_scc_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_scc_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_scc bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool roce_scc -i %s -m COMMON\n", (char *)nic_name); -+ hikp_roce_set_scc_submodule(SCC_COMMON); -+ hikp_roce_scc_execute(&self); -+ -+ printf("hikptool roce_scc -i %s -m DCQCN\n", (char *)nic_name); -+ hikp_roce_set_scc_submodule(DCQCN); -+ hikp_roce_scc_execute(&self); -+ -+ printf("hikptool roce_scc -i %s -m DIP\n", (char *)nic_name); -+ hikp_roce_set_scc_submodule(DIP); -+ hikp_roce_scc_execute(&self); -+ -+ printf("hikptool roce_scc -i %s -m HC3\n", (char *)nic_name); -+ hikp_roce_set_scc_submodule(HC3); -+ hikp_roce_scc_execute(&self); -+ -+ printf("hikptool roce_scc -i %s -m LDCP\n", (char *)nic_name); -+ hikp_roce_set_scc_submodule(LDCP); -+ hikp_roce_scc_execute(&self); -+ -+ printf("hikptool roce_scc -i %s -m CFG\n", (char *)nic_name); -+ hikp_roce_set_scc_submodule(CFG); -+ hikp_roce_scc_execute(&self); -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_tsp_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ uint32_t bankid; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_tsp_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_tsp bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ hikp_roce_set_tsp_submodule(TSP_COMMON); -+ for (bankid = 0; bankid <= MAX_TSP_BANK_NUM; bankid++) { -+ hikp_roce_set_tsp_bankid(bankid); -+ -+ printf("hikptool roce_tsp -i %s -m COMMON -b %u\n", (char *)nic_name, bankid); -+ hikp_roce_tsp_execute(&self); -+ } -+ -+ hikp_roce_set_tsp_submodule(TGP_TMP); -+ for (bankid = 0; bankid <= MAX_TGP_TMP_BANK_NUM; bankid++) { -+ hikp_roce_set_tsp_bankid(bankid); -+ -+ printf("hikptool roce_tsp -i %s -m TGP_TMP -b %u\n", (char *)nic_name, bankid); -+ hikp_roce_tsp_execute(&self); -+ } -+ -+ printf("hikptool roce_tsp -i %s -m TDP\n", (char *)nic_name); -+ hikp_roce_set_tsp_submodule(TDP); -+ hikp_roce_tsp_execute(&self); -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_trp_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ uint32_t bankid; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_trp_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_trp bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ hikp_roce_set_trp_submodule(TRP_COMMON); -+ for (bankid = 0; bankid <= TRP_MAX_BANK_NUM; bankid++) { -+ hikp_roce_set_trp_bankid(bankid); -+ -+ printf("hikptool roce_trp -i %s -m COMMON -b %u\n", (char *)nic_name, bankid); -+ hikp_roce_trp_execute(&self); -+ } -+ -+ printf("hikptool roce_trp -i %s -m TRP_RX\n", (char *)nic_name); -+ hikp_roce_set_trp_submodule(TRP_RX); -+ hikp_roce_trp_execute(&self); -+ -+ hikp_roce_set_trp_submodule(GEN_AC); -+ for (bankid = 0; bankid <= GAC_MAX_BANK_NUM; bankid++) { -+ hikp_roce_set_trp_bankid(bankid); -+ -+ printf("hikptool roce_trp -i %s -m GEN_AC -b %u\n", (char *)nic_name, bankid); -+ hikp_roce_trp_execute(&self); -+ } -+ -+ hikp_roce_set_trp_submodule(PAYL); -+ for (bankid = 0; bankid <= PAYL_MAX_BANK_NUM; bankid++) { -+ hikp_roce_set_trp_bankid(bankid); -+ -+ printf("hikptool roce_trp -i %s -m PAYL -b %u\n", (char *)nic_name, bankid); -+ hikp_roce_trp_execute(&self); -+ } -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_qmm_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ uint32_t bankid; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_qmm_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_qmm bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ for (bankid = 0; bankid <= QMM_BANK_NUM; bankid++) { -+ hikp_roce_set_qmm_bankid(bankid); -+ -+ printf("hikptool roce_qmm -i %s -b %u\n", (char *)nic_name, bankid); -+ hikp_roce_set_qmm_ext_flag(false); -+ hikp_roce_qmm_execute(&self); -+ -+ printf("hikptool roce_qmm -i %s -b %u -e\n", (char *)nic_name, bankid); -+ hikp_roce_set_qmm_ext_flag(true); -+ hikp_roce_qmm_execute(&self); -+ } -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_caep_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_caep_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_caep bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool roce_caep -i %s\n", (char *)nic_name); -+ hikp_roce_set_caep_mode(CAEP_ORIGIN); -+ hikp_roce_caep_execute(&self); -+ -+ printf("hikptool roce_caep -i %s -e\n", (char *)nic_name); -+ hikp_roce_set_caep_mode(CAEP_EXT); -+ hikp_roce_caep_execute(&self); -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_mdb_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_mdb_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_mdb bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool roce_mdb -i %s\n", (char *)nic_name); -+ hikp_roce_set_mdb_mode(ROCE_MDB_CMD); -+ hikp_roce_mdb_execute(&self); -+ -+ printf("hikptool roce_mdb -i %s -e\n", (char *)nic_name); -+ hikp_roce_set_mdb_mode(ROCE_MDB_CMD_EXT); -+ hikp_roce_mdb_execute(&self); -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_pkt_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_pkt_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_pkt bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool roce_pkt -i %s\n", (char *)nic_name); -+ hikp_roce_pkt_execute(&self); -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_timer_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_timer_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_timer bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool roce_timer -i %s\n", (char *)nic_name); -+ hikp_roce_timer_execute(&self); -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_rst_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_rst_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_rst bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool roce_rst -i %s\n", (char *)nic_name); -+ hikp_roce_rst_execute(&self); -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_global_cfg_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_global_cfg_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce global_cfg bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool roce_global_cfg -i %s\n", (char *)nic_name); -+ hikp_roce_global_cfg_execute(&self); -+ -+ return 0; -+} -+ -+static int collect_hikp_roce_bond_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_bond_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce bond bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool roce_bond -i %s\n", (char *)nic_name); -+ hikp_roce_bond_execute(&self); -+ -+ return 0; -+} -+ -+static void collect_one_roce_hikp_log_compact(char *net_name, char *module, -+ collect_cmd_handler_t hikp_pfn) -+{ -+ char log_name[LOG_FILE_PATH_MAX_LEN] = {0}; -+ int ret; -+ -+ ret = snprintf(log_name, LOG_FILE_PATH_MAX_LEN, "%s_%s", net_name, -+ module); -+ if (ret < 0 || (uint32_t)ret >= LOG_FILE_PATH_MAX_LEN) { -+ HIKP_ERROR_PRINT("failed to set %s path %d\n", net_name, ret); -+ return; -+ } -+ -+ ret = hikp_collect_log(GROUP_ROCE, log_name, hikp_pfn, (void *)net_name); -+ if (ret) -+ HIKP_ERROR_PRINT("failed to get %s info %d\n", net_name, ret); -+} -+ -+static int collect_one_roce_hikp_log(void *net_name) -+{ -+ struct collect_roce_hikp_log_meta { -+ const char *module_name; -+ collect_cmd_handler_t hikp_pfn; -+ } roce_hikp_log_meta[] = { -+ { "roce_bond", collect_hikp_roce_bond_log }, -+ { "roce_global_cfg", collect_hikp_roce_global_cfg_log }, -+ { "roce_rst", collect_hikp_roce_rst_log }, -+ { "roce_timer", collect_hikp_roce_timer_log }, -+ { "roce_pkt", collect_hikp_roce_pkt_log }, -+ { "roce_mdb", collect_hikp_roce_mdb_log }, -+ { "roce_caep", collect_hikp_roce_caep_log }, -+ { "roce_qmm", collect_hikp_roce_qmm_log }, -+ { "roce_trp", collect_hikp_roce_trp_log }, -+ { "roce_tsp", collect_hikp_roce_tsp_log }, -+ { "roce_scc", collect_hikp_roce_scc_log }, -+ { "roce_gmv", collect_hikp_roce_gmv_log }, -+ }; -+ size_t i; -+ -+ for (i = 0; i < HIKP_ARRAY_SIZE(roce_hikp_log_meta); ++i) { -+ collect_one_roce_hikp_log_compact((char *)net_name, -+ roce_hikp_log_meta[i].module_name, -+ roce_hikp_log_meta[i].hikp_pfn); -+ } -+ -+ return 0; -+} -+ -+void collect_roce_log(void) -+{ -+ collect_roce_devinfo_log(); -+ collect_roce_cc_param_log(); -+ collect_roce_sw_stats_log(); -+ collect_roce_res_stats_log(); -+ hikp_collect_all_nic_cmd_log(collect_one_roce_hikp_log); -+} -+ -diff --git a/info_collect/hikp_collect_sas.c b/info_collect/hikp_collect_sas.c -new file mode 100644 -index 0000000..11022dc ---- /dev/null -+++ b/info_collect/hikp_collect_sas.c -@@ -0,0 +1,453 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+#include "sas_tools_include.h" -+#include "sas_common.h" -+#include "sas_analy_queue.h" -+#include "sas_dump_reg.h" -+#include "sas_read_dev.h" -+#include "sas_read_errcode.h" -+#include "sata_dump_reg.h" -+ -+#define CHIP_MAX_SIZE 10 -+#define DIE_MAX_SIZE 10 -+ -+typedef int (*reg_info_func_t)(uint32_t, uint32_t); -+ -+enum sata_dump_type { -+ SATA_DUMP_UNKNOWN = 0, -+ SATA_DUMP_GLOBAL, -+ SATA_DUMP_PORTX, -+}; -+ -+struct reg_op { -+ char *func_name; -+ reg_info_func_t func; -+}; -+ -+static int sas_sata_reg_log(void *data) -+{ -+ struct reg_op *op = (struct reg_op *)data; -+ bool stop_flag = false; -+ uint32_t i, j; -+ int ret; -+ -+ for (i = 0; i < CHIP_MAX_SIZE; i++) { -+ for (j = 0; j < DIE_MAX_SIZE; j++) { -+ ret = op->func(i, j); -+ if (ret) { -+ HIKP_ERROR_PRINT("%s chip%u die%u failed: %d\n", op->func_name, -+ i, j, ret); -+ /* -+ * Stop collection when the die id is 0, indicating that the -+ * current chip id is not supported. -+ * */ -+ if (j == 0) -+ stop_flag = true; -+ -+ break; -+ } -+ } -+ -+ if (stop_flag) -+ break; -+ } -+ -+ return 0; -+} -+ -+static void collect_sas_path_log(char *group) -+{ -+ struct info_collect_cmd sas_path_cmd = { -+ .log_name = "ls_by-path", -+ .args = {"ls", "-l", "/dev/disk/by-path/", NULL}, -+ }; -+ int ret; -+ -+ ret = hikp_collect_log(group, sas_path_cmd.log_name, -+ hikp_collect_exec, (void *)&sas_path_cmd); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", sas_path_cmd.log_name, ret); -+} -+ -+static void collect_sas_phy_log(void) -+{ -+ struct info_collect_cmd sas_phy_cmds[] = { -+ { -+ .log_name = "phy-invalid_dword_count", -+ .args = {"cat", "/sys/class/sas_phy/*/invalid_dword_count", NULL}, -+ }, -+ { -+ .log_name = "phy-negotiated_linkrate", -+ .args = {"cat", "/sys/class/sas_phy/*/negotiated_linkrate", NULL}, -+ }, -+ { -+ .log_name = "phy-enable", -+ .args = {"cat", "/sys/class/sas_phy/*/enable", NULL}, -+ }, -+ }; -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(sas_phy_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_log(GROUP_SAS, sas_phy_cmds[i].log_name, -+ hikp_collect_cat_glob_exec, (void *)&sas_phy_cmds[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ sas_phy_cmds[i].log_name, ret); -+ } -+} -+ -+static void collect_sas_host_log(void) -+{ -+ struct info_collect_cmd sas_host_cmds[] = { -+ { -+ .log_name = "host-nr_hw_queues", -+ .args = {"cat", "/sys/class/scsi_host/host*/nr_hw_queues", NULL}, -+ }, -+ { -+ .log_name = "host-intr", -+ .args = {"cat", "/sys/class/scsi_host/host*/intr*", NULL}, -+ }, -+ }; -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(sas_host_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_log(GROUP_SAS, sas_host_cmds[i].log_name, -+ hikp_collect_cat_glob_exec, (void *)&sas_host_cmds[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ sas_host_cmds[i].log_name, ret); -+ } -+} -+ -+static void collect_sas_disk_log(void) -+{ -+ struct info_collect_cmd sas_disk_cmds[] = { -+ { -+ .log_name = "disk-scheduler", -+ .args = {"cat", "/sys/block/sd*/queue/scheduler", NULL}, -+ }, -+ { -+ .log_name = "disk-max", -+ .args = {"cat", "/sys/block/sd*/queue/max*", NULL}, -+ }, -+ { -+ .log_name = "disk-state", -+ .args = {"cat", "/sys/block/sd*/device/state", NULL}, -+ }, -+ }; -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(sas_disk_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_log(GROUP_SAS, sas_disk_cmds[i].log_name, -+ hikp_collect_cat_glob_exec, (void *)&sas_disk_cmds[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ sas_disk_cmds[i].log_name, ret); -+ } -+} -+ -+static int collect_sas_lsscsi_log_exec(void *data) -+{ -+ const struct info_collect_cmd sas_lsscsi_cmds[] = { -+ { -+ .args = {"lsscsi", "-lg", NULL}, -+ }, -+ { -+ .args = {"lsscsi", "-pvt", NULL}, -+ }, -+ { -+ .args = {"lsscsi", "-H", NULL}, -+ }, -+ }; -+ size_t i, size; -+ (void)data; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(sas_lsscsi_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_exec((void *)&sas_lsscsi_cmds[i]); -+ if (ret) -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static void collect_sas_lsscsi_log(char *group) -+{ -+ int ret; -+ -+ ret = hikp_collect_log(group, "lsscsi", collect_sas_lsscsi_log_exec, (void *)NULL); -+ if (ret) -+ HIKP_ERROR_PRINT("collect lsscsi log failed: %d\n", ret); -+} -+ -+static void collect_sas_copy_files(void) -+{ -+ struct info_collect_cmd sas_copy_cmds[] = { -+ { -+ .group = GROUP_SAS, -+ .log_name = "debugfs", -+ .args = {"cp", "-rf", "/sys/kernel/debug/hisi_sas/", NULL}, -+ }, -+ { -+ .group = GROUP_SAS, -+ .log_name = "parameters_hw", -+ .args = {"cp", "-rf", "/sys/module/hisi_sas_v3_hw/parameters/", NULL}, -+ }, -+ { -+ .group = GROUP_SAS, -+ .log_name = "parameters_main", -+ .args = {"cp", "-rf", "/sys/module/hisi_sas_main/parameters/", NULL}, -+ }, -+ }; -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(sas_copy_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_save_files(&sas_copy_cmds[i]); -+ if (ret) -+ HIKP_ERROR_PRINT("cp %s failed: %d\n", -+ sas_copy_cmds[i].args[ARGS_IDX2], ret); -+ } -+} -+ -+static int sas_anacq_info(uint32_t chip_id, uint32_t die_id) -+{ -+ struct tool_sas_cmd cmd = { -+ .chip_id = chip_id, -+ .die_id = die_id, -+ }; -+ int ret; -+ -+ printf("hikptool sas_anacq -c %u -d %u -s\n", cmd.chip_id, cmd.die_id); -+ cmd.sas_cmd_type = ANACQ_NUM; -+ ret = sas_analy_cmd(&cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("collect cq number failed: %d\n", ret); -+ return ret; -+ } -+ -+ printf("hikptool sas_anacq -c %u -d %u -p\n", cmd.chip_id, cmd.die_id); -+ cmd.sas_cmd_type = ANACQ_PRT; -+ ret = sas_analy_cmd(&cmd); -+ if (ret) -+ HIKP_ERROR_PRINT("collect cq read/write pointer failed: %d\n", ret); -+ -+ return ret; -+} -+ -+static int sas_anadq_info(uint32_t chip_id, uint32_t die_id) -+{ -+ struct tool_sas_cmd cmd = { -+ .chip_id = chip_id, -+ .die_id = die_id, -+ }; -+ int ret; -+ -+ printf("hikptool sas_anadq -c %u -d %u -s\n", cmd.chip_id, cmd.die_id); -+ cmd.sas_cmd_type = ANADQ_NUM; -+ ret = sas_analy_cmd(&cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("collect dq num failed: %d\n", ret); -+ return ret; -+ } -+ -+ printf("hikptool sas_anadq -c %u -d %u -p\n", cmd.chip_id, cmd.die_id); -+ cmd.sas_cmd_type = ANADQ_PRT; -+ ret = sas_analy_cmd(&cmd); -+ if (ret) -+ HIKP_ERROR_PRINT("collect dq read/write pointer failed: %d\n", ret); -+ -+ return ret; -+} -+ -+static int sas_dump_info(uint32_t chip_id, uint32_t die_id) -+{ -+ struct tool_sas_cmd cmd = { -+ .chip_id = chip_id, -+ .die_id = die_id, -+ }; -+ uint32_t i; -+ int ret; -+ -+ printf("hikptool sas_dump -c %u -d %u -g\n", cmd.chip_id, cmd.die_id); -+ cmd.sas_cmd_type = DUMP_GLOBAL; -+ ret = sas_reg_dump(&cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("dump global failed: %d\n", ret); -+ return ret; -+ } -+ -+ for (i = 0; i <= SAS_MAX_PHY_NUM; i++) { -+ printf("hikptool sas_dump -c %u -d %u -p %u\n", cmd.chip_id, cmd.die_id, i); -+ cmd.sas_cmd_type = DUMP_PHYX; -+ cmd.phy_id = i; -+ ret = sas_reg_dump(&cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("dump phy %u failed: %d\n", i, ret); -+ return ret; -+ } -+ } -+ -+ printf("hikptool sas_dump -c %u -d %u -b\n", cmd.chip_id, cmd.die_id); -+ cmd.sas_cmd_type = DUMP_AXI; -+ ret = sas_reg_dump(&cmd); -+ if (ret) -+ HIKP_ERROR_PRINT("dump axi failed: %d\n", ret); -+ -+ return ret; -+} -+ -+static int sas_dev_info(uint32_t chip_id, uint32_t die_id) -+{ -+ struct tool_sas_cmd cmd = { -+ .chip_id = chip_id, -+ .die_id = die_id, -+ }; -+ -+ printf("hikptool sas_dev -c %u -d %u -l\n", cmd.chip_id, cmd.die_id); -+ cmd.sas_cmd_type = DEV_LINK; -+ return sas_dev(&cmd); -+} -+ -+static int sas_errcode_info(uint32_t chip_id, uint32_t die_id) -+{ -+ struct tool_sas_cmd cmd = { -+ .chip_id = chip_id, -+ .die_id = die_id, -+ }; -+ uint32_t i; -+ int ret; -+ -+ for (i = 0; i < SAS_MAX_ERR_NUM; i++) { -+ printf("hikptool sas_errcode -c %u -d %u -t %u\n", cmd.chip_id, cmd.die_id, i); -+ cmd.sas_cmd_type = i; -+ ret = sas_errcode_read(&cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("collect errcode %u info failed: %d\n", i, ret); -+ return ret; -+ } -+ } -+ -+ return 0; -+} -+ -+static void collect_sas_reg_log(void) -+{ -+ struct reg_op op = {0}; -+ int ret; -+ -+ op.func = sas_anacq_info; -+ op.func_name = "sas_anacq_info"; -+ ret = hikp_collect_log(GROUP_SAS, "sas_anacq", sas_sata_reg_log, (void *)&op); -+ if (ret) -+ HIKP_INFO_PRINT("%s failed: %d\n", op.func_name, ret); -+ -+ op.func = sas_anadq_info; -+ op.func_name = "sas_anadq_info"; -+ ret = hikp_collect_log(GROUP_SAS, "sas_anadq", sas_sata_reg_log, (void *)&op); -+ if (ret) -+ HIKP_INFO_PRINT("%s failed: %d\n", op.func_name, ret); -+ -+ op.func = sas_dump_info; -+ op.func_name = "sas_dump_info"; -+ ret = hikp_collect_log(GROUP_SAS, "sas_dump", sas_sata_reg_log, (void *)&op); -+ if (ret) -+ HIKP_INFO_PRINT("%s failed: %d\n", op.func_name, ret); -+ -+ op.func = sas_dev_info; -+ op.func_name = "sas_dev_info"; -+ ret = hikp_collect_log(GROUP_SAS, "sas_dev", sas_sata_reg_log, (void *)&op); -+ if (ret) -+ HIKP_INFO_PRINT("%s failed: %d\n", op.func_name, ret); -+ -+ op.func = sas_errcode_info; -+ op.func_name = "sas_errcode_info"; -+ ret = hikp_collect_log(GROUP_SAS, "sas_errcode", sas_sata_reg_log, (void *)&op); -+ if (ret) -+ HIKP_INFO_PRINT("%s failed: %d\n", op.func_name, ret); -+} -+ -+void collect_sas_log(void) -+{ -+ collect_sas_phy_log(); -+ collect_sas_host_log(); -+ collect_sas_disk_log(); -+ collect_sas_copy_files(); -+ collect_sas_path_log(GROUP_SAS); -+ collect_sas_lsscsi_log(GROUP_SAS); -+ collect_sas_reg_log(); -+} -+ -+static int sata_reg_dump_info(uint32_t chip_id, uint32_t die_id) -+{ -+ struct tool_sata_cmd cmd = { -+ .chip_id = chip_id, -+ .die_id = die_id, -+ }; -+ uint32_t i; -+ int ret; -+ -+ printf("hikptool sata_dump -c %u -d %u -g\n", cmd.chip_id, cmd.die_id); -+ cmd.sata_cmd_type = SATA_DUMP_GLOBAL; -+ ret = sata_reg_dump(&cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("dump global failed: %d\n", ret); -+ return ret; -+ } -+ -+ cmd.sata_cmd_type = SATA_DUMP_PORTX; -+ for (i = 0; i <= 1; i++) { -+ printf("hikptool sata_dump -c %u -d %u -p %u\n", cmd.chip_id, cmd.die_id, i); -+ cmd.phy_id = i; -+ ret = sata_reg_dump(&cmd); -+ if (ret) { -+ HIKP_INFO_PRINT("dump port%u reg failed: %d\n", i, ret); -+ return ret; -+ } -+ } -+ -+ return 0; -+} -+ -+static void collect_sata_reg_log(void) -+{ -+ struct reg_op op = { -+ .func = sata_reg_dump_info, -+ .func_name = "sata_reg_dump_info", -+ }; -+ int ret; -+ -+ ret = hikp_collect_log(GROUP_SATA, "reg_dump", sas_sata_reg_log, (void *)&op); -+ if (ret) -+ HIKP_INFO_PRINT("%s failed: %d\n", op.func_name, ret); -+} -+ -+void collect_sata_log(void) -+{ -+ collect_sas_path_log(GROUP_SATA); -+ collect_sas_lsscsi_log(GROUP_SATA); -+ collect_sata_reg_log(); -+} -diff --git a/info_collect/hikp_collect_serdes.c b/info_collect/hikp_collect_serdes.c -new file mode 100644 -index 0000000..31f29b3 ---- /dev/null -+++ b/info_collect/hikp_collect_serdes.c -@@ -0,0 +1,244 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+#include "hikp_serdes.h" -+ -+#define MAX_CHIP_NUM_SUPPORT 8 -+#define HIP10_DIE_NUM 2 -+#define HIP11_DIE_NUM 4 -+#define HIP10_DIE_MACRO_NUM 7 -+#define HIP11_DIE_MACRO_NUM 4 -+ -+struct serdes_macro_info { -+ uint8_t macro_id; -+ uint8_t ds_num; -+}; -+ -+struct serdes_log_cmd { -+ struct cmd_serdes_param *cmd; -+ unsigned char die_id; -+}; -+ -+struct serdes_macro_info g_hip10[] = { -+ {0, 4}, /* 0, 4: macro_id, ds_num */ -+ {1, 4}, /* 1, 4: macro_id, ds_num */ -+ {2, 8}, /* 2, 8: macro_id, ds_num */ -+ {3, 8}, /* 3, 8: macro_id, ds_num */ -+ {4, 8}, /* 4, 8: macro_id, ds_num */ -+ {5, 8}, /* 5, 8: macro_id, ds_num */ -+ {6, 8}, /* 6, 8: macro_id, ds_num */ -+}; -+ -+struct serdes_macro_info g_hip11[] = { -+ {0, 4}, /* 0, 4: macro_id, ds_num */ -+ {1, 8}, /* 1, 8: macro_id, ds_num */ -+ {2, 4}, /* 2, 4: macro_id, ds_num */ -+ {3, 4}, /* 3, 4: macro_id, ds_num */ -+}; -+ -+static int is_chip_hip11(void) -+{ -+ return get_chip_type() == CHIP_HIP11; -+} -+ -+static unsigned char serdes_get_die_num(void) -+{ -+ return is_chip_hip11() ? HIP11_DIE_NUM : HIP10_DIE_NUM; -+} -+ -+static unsigned char serdes_get_die_macro_num(void) -+{ -+ return is_chip_hip11() ? HIP11_DIE_MACRO_NUM : HIP10_DIE_MACRO_NUM; -+} -+ -+static struct serdes_macro_info *serdes_get_macro_info(void) -+{ -+ return is_chip_hip11() ? g_hip11 : g_hip10; -+} -+ -+static int collect_serdes_info_process(void *data) -+{ -+ struct serdes_log_cmd *log_cmd = (struct serdes_log_cmd *)data; -+ struct serdes_macro_info *macro_info = serdes_get_macro_info(); -+ unsigned char die_macro_num = serdes_get_die_macro_num(); -+ struct cmd_serdes_param *cmd = log_cmd->cmd; -+ const char *info_cmd_str[] = {"", "-k"}; -+ unsigned char die_id = log_cmd->die_id; -+ /* 0, 1: brief info, detail info */ -+ unsigned char subcmd_list[] = {0, 1}; -+ unsigned char k, p; -+ int ret; -+ -+ for (k = 0; k < die_macro_num; k++) { -+ cmd->macro_id = die_id * die_macro_num + k; -+ cmd->start_sds_id = 0; -+ cmd->sds_num = macro_info[k].ds_num; -+ for (p = 0; p < sizeof(subcmd_list) / sizeof(subcmd_list[0]); p++) { -+ cmd->sub_cmd = subcmd_list[p]; -+ printf("hikptool serdes_info -i %u -s m%ud%u -n %u %s\n", -+ cmd->chip_id, cmd->macro_id, cmd->start_sds_id, -+ cmd->sds_num, info_cmd_str[cmd->sub_cmd]); -+ ret = hikp_serdes_get_reponse(cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("collect chip%u die%u macro%u " -+ "serdes_info%u failed: %d\n", -+ cmd->chip_id, die_id, k, subcmd_list[p], ret); -+ -+ if (ret == -EINVAL) -+ return ret; -+ } -+ } -+ } -+ -+ return 0; -+} -+ -+static void collect_serdes_info_log(void) -+{ -+ struct cmd_serdes_param serdes_info_cmd = {0}; -+ unsigned char chip_num = MAX_CHIP_NUM_SUPPORT; -+ unsigned char die_num = serdes_get_die_num(); -+ char log_name[MAX_LOG_NAME_LEN] = {0}; -+ struct serdes_log_cmd log_cmd = {0}; -+ bool stop = false; -+ unsigned char i, j; -+ int ret; -+ -+ serdes_info_cmd.cmd_type = SERDES_KEY_INFO; -+ for (i = 0; i < chip_num; i++) { -+ for (j = 0; j < die_num; j++) { -+ serdes_info_cmd.chip_id = i; -+ log_cmd.cmd = &serdes_info_cmd; -+ log_cmd.die_id = j; -+ ret = snprintf(log_name, MAX_LOG_NAME_LEN, "serdes_info_c%ud%u", i, j); -+ if (ret < 0 || (uint32_t)(ret) >= MAX_LOG_NAME_LEN) { -+ HIKP_ERROR_PRINT("create serdes_info log name failed\n"); -+ break; -+ } -+ ret = hikp_collect_log(GROUP_SERDES, log_name, -+ collect_serdes_info_process, -+ (void *)&log_cmd); -+ if (ret) { -+ /* -+ * Stop collection when the die id is 0 and ret is -EINVAL, -+ * indicating that the current chip id is not supported. -+ */ -+ if (j == 0 && ret == -EINVAL) -+ stop = true; -+ -+ if (ret == -EINVAL) -+ break; -+ -+ HIKP_ERROR_PRINT("%s chip%u die%u failed: %d\n", __func__, -+ i, j, ret); -+ } -+ } -+ -+ if (stop) -+ break; -+ } -+} -+ -+static int collect_serdes_dump_process(void *data) -+{ -+ const char *dump_cmd_str[HILINK_DUMP_TYPE_END] = {"cs", "ds", "csds", "ram", "subctrl"}; -+ struct serdes_log_cmd *log_cmd = (struct serdes_log_cmd *)data; -+ struct serdes_macro_info *macro_info = serdes_get_macro_info(); -+ unsigned char die_macro_num = serdes_get_die_macro_num(); -+ struct cmd_serdes_param *cmd = log_cmd->cmd; -+ unsigned char die_id = log_cmd->die_id; -+ unsigned char subcmd_list[] = {0, 1, 4}; /* 0, 1, 4: cs, ds, subctrl reg */ -+ unsigned char k, p, q; -+ int ret; -+ -+ for (k = 0; k < die_macro_num; k++) { -+ cmd->macro_id = die_id * die_macro_num + k; -+ for (q = 0; q < macro_info[k].ds_num; q++) { -+ cmd->start_sds_id = q; -+ cmd->sds_num = 1; -+ for (p = 0; p < sizeof(subcmd_list) / sizeof(subcmd_list[0]); p++) { -+ cmd->sub_cmd = subcmd_list[p]; -+ printf("hikptool serdes_dump -i %u -s m%ud%u -c %s\n", -+ cmd->chip_id, cmd->macro_id, cmd->start_sds_id, -+ dump_cmd_str[cmd->sub_cmd]); -+ ret = hikp_serdes_get_reponse(cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("collect chip%u die%u macro%u lane%u " -+ "serdes_dump%u failed: %d\n", -+ cmd->chip_id, die_id, k, q, -+ subcmd_list[p], ret); -+ -+ if (ret == -EINVAL) -+ return ret; -+ } -+ } -+ } -+ } -+ -+ return 0; -+} -+ -+static void collect_serdes_dump_log(void) -+{ -+ struct cmd_serdes_param serdes_dump_cmd = {0}; -+ unsigned char chip_num = MAX_CHIP_NUM_SUPPORT; -+ unsigned char die_num = serdes_get_die_num(); -+ struct serdes_log_cmd log_cmd = {0}; -+ char log_name[MAX_LOG_NAME_LEN] = {0}; -+ unsigned char i, j; -+ bool stop = false; -+ int ret; -+ -+ serdes_dump_cmd.cmd_type = SERDES_DUMP_REG; -+ for (i = 0; i < chip_num; i++) { -+ for (j = 0; j < die_num; j++) { -+ serdes_dump_cmd.chip_id = i; -+ log_cmd.cmd = &serdes_dump_cmd; -+ log_cmd.die_id = j; -+ ret = snprintf(log_name, MAX_LOG_NAME_LEN, "serdes_dump_c%ud%u", i, j); -+ if (ret < 0 || (uint32_t)(ret) >= MAX_LOG_NAME_LEN) { -+ HIKP_ERROR_PRINT("create serdes_info log name failed\n"); -+ break; -+ } -+ ret = hikp_collect_log(GROUP_SERDES, log_name, -+ collect_serdes_dump_process, -+ (void *)&log_cmd); -+ if (ret) { -+ /* -+ * Stop collection when the die id is 0 and ret is -EINVAL, -+ * indicating that the current chip id is not supported. -+ */ -+ if (j == 0 && ret == -EINVAL) -+ stop = true; -+ -+ if (ret == -EINVAL) -+ break; -+ -+ HIKP_ERROR_PRINT("%s chip%u die%u failed: %d\n", __func__, -+ i, j, ret); -+ } -+ } -+ -+ if (stop) -+ break; -+ } -+} -+ -+void collect_serdes_log(void) -+{ -+ collect_serdes_info_log(); -+ collect_serdes_dump_log(); -+} -diff --git a/info_collect/hikp_collect_socip.c b/info_collect/hikp_collect_socip.c -new file mode 100644 -index 0000000..6bccf6a ---- /dev/null -+++ b/info_collect/hikp_collect_socip.c -@@ -0,0 +1,272 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+#include "hikptdev_plug.h" -+#include "hikp_socip.h" -+#include "hikp_collect_socip.h" -+ -+#define SOCIP_MODULENUM 7 -+#define MAX_CHIPNUM 30 -+ -+enum socip_collect_type { -+ GPIO, -+ SPI, -+ I2C, -+ SFC, -+ USB, -+ UART, -+ BT, -+}; -+ -+const char *g_socip_modulename[SOCIP_MODULENUM] = { -+ "gpio", -+ "spi", -+ "i2c", -+ "sfc", -+ "usb", -+ "uart", -+ "bt", -+}; -+ -+struct info_collect_cmd gpio_cmd_arr[] = { -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "gpio", -+ .args = {"cat", "/sys/kernel/debug/gpio", NULL}, -+ }, -+}; -+ -+struct info_collect_cmd spi_cmd_arr[] = { -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "spi", -+ .args = {"cat", "/sys/kernel/debug/dw_spi*/registers", NULL}, -+ }, -+ -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "spi", -+ .args = {"cat", "/sys/kernel/debug/hisi_spi*/registers", NULL}, -+ }, -+ -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "spi", -+ .args = {"cat", "/sys/class/spi_master/spi*/statistics/bytes", NULL}, -+ }, -+ -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "spi", -+ .args = {"cat", "/sys/class/spi_master/spi*/statistics/bytes_rx", NULL}, -+ }, -+ -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "spi", -+ .args = {"cat", "/sys/class/spi_master/spi*/statistics/bytes_tx", NULL}, -+ }, -+}; -+ -+struct info_collect_cmd i2c_cmd_arr[] = { -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "i2c", -+ .args = {"ls", "/sys/class/i2c-adapter", NULL}, -+ }, -+ -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "i2c", -+ .args = {"ls", "/sys/class/i2c-dev", NULL}, -+ }, -+}; -+ -+struct info_collect_cmd sfc_cmd_arr[] = { -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "sfc", -+ .args = {"mtd_debug", "info", "/dev/mtd0", NULL}, -+ }, -+}; -+ -+struct info_collect_cmd usb_cmd_arr[] = { -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "usb", -+ .args = {"cat", "/sys/kernel/debug/usb/devices", NULL}, -+ }, -+}; -+ -+struct info_collect_cmd uart_cmd_arr[] = { -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "uart", -+ .args = {"stty", "-F", "/dev/ttyAMA0", "-a", NULL}, -+ }, -+ -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "uart", -+ .args = {"cat", "/proc/tty/driver/ttyAMA", NULL}, -+ }, -+}; -+ -+struct info_collect_cmd bt_cmd_arr[] = { -+ { -+ .group = GROUP_SOCIP, -+ .log_name = "bt", -+ .args = {"ls", "/dev/ipmi0", NULL}, -+ }, -+}; -+ -+static int socip_get_dumpregparam(struct socip_collect_dumpreg_req req_struct, -+ struct socip_dump_reg_req_data_t *req_data_ptr, uint8_t chip_id, int controller_num) -+{ -+ req_data_ptr->controller_id = req_struct.controller_id[controller_num]; -+ if (req_data_ptr->controller_id == CONTROLLER_MAX_NUM) -+ return -EINVAL; -+ -+ req_data_ptr->chip_id = chip_id; -+ req_data_ptr->die_id = req_struct.die_id; -+ return 0; -+} -+ -+static int collect_socip_dumpreglog(void *version) -+{ -+ size_t i, msize; -+ uint8_t chip_id; -+ uint32_t cpu_version = *(uint32_t *)version; -+ int controller_num, ret; -+ struct hikp_cmd_ret *cmd_ret; -+ struct socip_collect_dumpreg_req *req_struct; -+ struct socip_dump_reg_req_data_t req_data = {0}; -+ struct hikp_cmd_header req_header = {0}; -+ -+ switch (cpu_version) { -+ case CHIP_HIP09: -+ case CHIP_HIP10: -+ case CHIP_HIP10C: -+ req_struct = socip_hip09_hip10x_reg_arr; -+ msize = HIKP_ARRAY_SIZE(socip_hip09_hip10x_reg_arr); -+ break; -+ case CHIP_HIP11: -+ req_struct = socip_hip11_reg_arr; -+ msize = HIKP_ARRAY_SIZE(socip_hip11_reg_arr); -+ break; -+ default: -+ HIKP_ERROR_PRINT("Cpu version not support.\n"); -+ return 0; -+ } -+ -+ for (chip_id = 0; chip_id < MAX_CHIPNUM; chip_id++) { -+ for (i = 0; i < msize; i++) { -+ controller_num = 0; -+ while(controller_num < CONTROLLER_MAX_NUM) { -+ struct socip_dump_reg_req_data_t *req_data_ptr = &req_data; -+ ret = socip_get_dumpregparam(req_struct[i], req_data_ptr, chip_id, controller_num); -+ if (ret) -+ break; -+ -+ hikp_cmd_init(&req_header, SOCIP_MOD, HIKP_SOCIP_CMD_DUMPREG, -+ req_struct[i].module); -+ cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -+ if (!cmd_ret || cmd_ret->status != 0) { -+ HIKP_ERROR_PRINT("hikp_cmd_alloc failed\n"); -+ hikp_cmd_free(&cmd_ret); -+ return 0; -+ } -+ printf("%s\n", req_struct[i].reg_info); -+ printf("hikptool socip_dumpreg -c %u -d %u -m %u -i %u\n",req_data.chip_id, -+ req_data.die_id, req_struct[i].module, req_data.controller_id); -+ dump_reg_info(&cmd_ret->rsp_data[0], cmd_ret->rsp_data_num); -+ hikp_cmd_free(&cmd_ret); -+ controller_num++; -+ } -+ } -+ } -+ -+ return 0; -+} -+ -+static int collect_socip_modulelog(void *module) -+{ -+ size_t i, msize; -+ int ret; -+ -+ switch (*(int *)module) { -+ case GPIO: -+ msize = HIKP_ARRAY_SIZE(gpio_cmd_arr); -+ for (i = 0; i < msize; i++) -+ ret = hikp_collect_exec((void *)&gpio_cmd_arr[i]); -+ break; -+ case SPI: -+ msize = HIKP_ARRAY_SIZE(spi_cmd_arr); -+ for (i = 0; i < msize; i++) -+ ret = hikp_collect_cat_glob_exec((void *)&spi_cmd_arr[i]); -+ break; -+ case I2C: -+ msize = HIKP_ARRAY_SIZE(i2c_cmd_arr); -+ for (i = 0; i < msize; i++) -+ ret = hikp_collect_exec((void *)&i2c_cmd_arr[i]); -+ break; -+ case SFC: -+ msize = HIKP_ARRAY_SIZE(sfc_cmd_arr); -+ for (i = 0; i < msize; i++) -+ ret = hikp_collect_exec((void *)&sfc_cmd_arr[i]); -+ break; -+ case USB: -+ msize = HIKP_ARRAY_SIZE(usb_cmd_arr); -+ for (i = 0; i < msize; i++) -+ ret = hikp_collect_exec((void *)&usb_cmd_arr[i]); -+ break; -+ case UART: -+ msize = HIKP_ARRAY_SIZE(uart_cmd_arr); -+ for (i = 0; i < msize; i++) -+ ret = hikp_collect_exec((void *)&uart_cmd_arr[i]); -+ break; -+ case BT: -+ msize = HIKP_ARRAY_SIZE(bt_cmd_arr); -+ for (i = 0; i < msize; i++) -+ ret = hikp_collect_exec((void *)&bt_cmd_arr[i]); -+ break; -+ default: -+ ret = 0; -+ break; -+ } -+ -+ return ret; -+} -+ -+void collect_socip_log(void) -+{ -+ int i, ret; -+ uint32_t cpu_version = get_chip_type(); -+ -+ for (i = 0; i < SOCIP_MODULENUM; i++) { -+ ret = hikp_collect_log(GROUP_SOCIP, (char *)g_socip_modulename[i], -+ collect_socip_modulelog, (void *)&i); -+ if (ret) { -+ HIKP_ERROR_PRINT("collect_socip_log %s arr failed: %d\n", -+ g_socip_modulename[i], ret); -+ } -+ } -+ -+ ret = hikp_collect_log(GROUP_SOCIP, "dumpreg", collect_socip_dumpreglog, (void *)&cpu_version); -+ if (ret) -+ HIKP_ERROR_PRINT("collect_socip_log dumpreg failed: %d\n", ret); -+} -diff --git a/info_collect/hikp_collect_socip.h b/info_collect/hikp_collect_socip.h -new file mode 100644 -index 0000000..b8bb879 ---- /dev/null -+++ b/info_collect/hikp_collect_socip.h -@@ -0,0 +1,238 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+#ifndef HIKP_COLLECT_SOCIP_H -+#define HIKP_COLLECT_SOCIP_H -+ -+#define MIN_DIE_ID 0 -+#define NIMBUS_A_ID 0 -+#define TOTEM_A_ID 1 -+#define NIMBUS_B_ID 2 -+#define TOTEM_C_ID 2 -+#define TOTEM_B_ID 3 -+#define INVALID_DIE_ID 0xFF -+#define MAX_DIE_ID 3 -+#define CONTROLLER_MAX_NUM 12 -+ -+#define DIE_MIN_INDEX 0 -+#define CPUDIE_MIN_INDEX 0 -+#define CPUDIE_A_INDEX 0 -+#define CPUDIE_B_INDEX 1 -+#define CPUDIE_MAX_INDEX 1 -+#define IODIE_MIN_INDEX 2 -+#define IODIE_A0_INDEX 2 -+#define IODIE_A1_INDEX 3 -+#define IODIE_B0_INDEX 4 -+#define IODIE_B1_INDEX 5 -+#define IODIE_MAX_INDEX 5 -+#define DIE_MAX_INDEX 5 -+ -+struct socip_collect_dumpreg_req { -+ char *reg_info; -+ uint8_t module; -+ uint8_t die_id; -+ uint8_t controller_id[CONTROLLER_MAX_NUM]; -+}; -+ -+struct socip_collect_dumpreg_req socip_hip09_hip10x_reg_arr[] = { -+ { -+ .reg_info = "gpio_NA", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = NIMBUS_A_ID, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "gpio_NB", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = NIMBUS_B_ID, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "gpio_TA", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = TOTEM_A_ID, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "gpio_TB", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = TOTEM_B_ID, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "i2c_NA", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_I2C, -+ .die_id = NIMBUS_A_ID, -+ .controller_id = {0, 1, 5, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "i2c_NB", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_I2C, -+ .die_id = NIMBUS_A_ID, -+ .controller_id = {0, 1, 5, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "spi_NA", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_SPI, -+ .die_id = NIMBUS_A_ID, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "spi_NB", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_SPI, -+ .die_id = NIMBUS_B_ID, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "sfc_NA", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_SFC, -+ .die_id = NIMBUS_A_ID, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "sfc_NB", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_SFC, -+ .die_id = NIMBUS_B_ID, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "btc_NA", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_SFC, -+ .die_id = NIMBUS_A_ID, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "btc_NB", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_SFC, -+ .die_id = NIMBUS_B_ID, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+}; -+ -+struct socip_collect_dumpreg_req socip_hip11_reg_arr[] = { -+ { -+ .reg_info = "gpio_IOA0", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = IODIE_A0_INDEX, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "gpio_IOA1", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = IODIE_A1_INDEX, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "gpio_IOB0", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = IODIE_B0_INDEX, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "gpio_IOB1", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = IODIE_B1_INDEX, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "gpio_CA", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = CPUDIE_A_INDEX, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "gpio_CB", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_GPIO, -+ .die_id = CPUDIE_B_INDEX, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "i2c_IOA0", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_I2C, -+ .die_id = IODIE_A0_INDEX, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "i2c_IOA1", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_I2C, -+ .die_id = IODIE_A1_INDEX, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "i2c_IOB0", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_I2C, -+ .die_id = IODIE_B0_INDEX, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "i2c_IOB1", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_I2C, -+ .die_id = IODIE_B1_INDEX, -+ .controller_id = {0, 1, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "i2c_CA", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_I2C, -+ .die_id = CPUDIE_A_INDEX, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "i2c_CB", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_I2C, -+ .die_id = CPUDIE_B_INDEX, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "spi_CB", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_SPI, -+ .die_id = CPUDIE_B_INDEX, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "sfc_CA", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_SFC, -+ .die_id = CPUDIE_A_INDEX, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+ -+ { -+ .reg_info = "BTC_IOB0", -+ .module = HIKP_SOCIP_SUBCMD_DUMPREG_SFC, -+ .die_id = IODIE_B0_INDEX, -+ .controller_id = {0, CONTROLLER_MAX_NUM}, -+ }, -+}; -+#endif /* HIKP_COLLECT_SOCIP_H */ -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.c b/net/nic/nic_dfx/hikp_nic_dfx.c -index c42b8e7..3bc4e05 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.c -+++ b/net/nic/nic_dfx/hikp_nic_dfx.c -@@ -404,6 +404,13 @@ static const struct dfx_type_name_parse g_dfx_ssu_name_parse[] = { - dfx_ssu_type_64_tx_comm_stats, HIKP_ARRAY_SIZE(dfx_ssu_type_64_tx_comm_stats)}, - }; - -+void hikp_nic_dfx_set_cmd_para(int idx) -+{ -+ g_dfx_param.sub_cmd_code = g_dfx_module_parse[idx].sub_cmd_code; -+ g_dfx_param.module_idx = idx; -+ g_dfx_param.flag |= MODULE_SET_FLAG; -+} -+ - static void dfx_help_info(const struct major_cmd_ctrl *self) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -421,7 +428,7 @@ static int hikp_cmd_dfx_help(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - --static int hikp_nic_cmd_dfx_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_cmd_dfx_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_dfx_param.target)); - if (self->err_no != 0) { -@@ -714,7 +721,7 @@ static void hikp_nic_dfx_print(const struct nic_dfx_rsp_head_t *rsp_head, uint32 - printf("################### ====== dump end ====== ######################\n"); - } - --static void hikp_nic_dfx_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_dfx_cmd_execute(struct major_cmd_ctrl *self) - { - struct nic_dfx_rsp_head_t rsp_head = { 0 }; - struct nic_dfx_rsp_head_t tmp_head = { 0 }; -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.h b/net/nic/nic_dfx/hikp_nic_dfx.h -index 38f76aa..d77bbc3 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.h -+++ b/net/nic/nic_dfx/hikp_nic_dfx.h -@@ -149,4 +149,7 @@ struct dfx_type_name_parse { - uint32_t reg_num; - }; - -+int hikp_nic_cmd_dfx_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_dfx_cmd_execute(struct major_cmd_ctrl *self); -+void hikp_nic_dfx_set_cmd_para(int idx); - #endif /* HIKP_NIC_DFX_H */ -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index fb9333a..d19d7c8 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -109,6 +109,13 @@ static const struct fd_feature_cmd g_fd_feature_cmd[] = { - hikp_nic_query_fd_counter, hikp_nic_show_fd_counter}, - }; - -+void hikp_nic_set_fd_idx(int feature_idx, int stage_no) -+{ -+ g_fd_param.id = -1; -+ g_fd_param.feature_idx = feature_idx; -+ g_fd_param.stage_no = stage_no; -+} -+ - static int hikp_nic_fd_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -@@ -923,7 +930,7 @@ static int hikp_nic_fd_check_input_param(struct major_cmd_ctrl *self, - return 0; - } - --static void hikp_nic_fd_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_fd_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_fd_param.target.bdf; - const struct fd_feature_cmd *fd_cmd; -@@ -983,7 +990,7 @@ out: - hikp_nic_fd_data_free(fd_data); - } - --static int hikp_nic_cmd_get_fd_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_cmd_get_fd_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_fd_param.target)); - if (self->err_no != 0) { -diff --git a/net/nic/nic_fd/hikp_nic_fd.h b/net/nic/nic_fd/hikp_nic_fd.h -index 3f409d0..ce363c9 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.h -+++ b/net/nic/nic_fd/hikp_nic_fd.h -@@ -224,4 +224,8 @@ struct fd_feature_cmd { - void (*show)(const void *data); - }; - -+int hikp_nic_cmd_get_fd_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_fd_cmd_execute(struct major_cmd_ctrl *self); -+void hikp_nic_set_fd_idx(int feature_idx, int stage_no); -+ - #endif /* HIKP_NIC_FD_H */ -diff --git a/net/nic/nic_fec/hikp_nic_fec.c b/net/nic/nic_fec/hikp_nic_fec.c -index 5a34bfd..13c6e13 100644 ---- a/net/nic/nic_fec/hikp_nic_fec.c -+++ b/net/nic/nic_fec/hikp_nic_fec.c -@@ -108,7 +108,7 @@ static void hikp_nic_fec_err_show(const struct nic_fec_err_info *info) - printf("#################### END #######################\n"); - } - --static void hikp_nic_fec_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_fec_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_fec_target.bdf; - struct nic_fec_err_info info = { 0 }; -@@ -136,7 +136,7 @@ static int hikp_nic_fec_cmd_help(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - --static int hikp_nic_fec_get_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_fec_get_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_fec_target); - if (self->err_no != 0) { -diff --git a/net/nic/nic_fec/hikp_nic_fec.h b/net/nic/nic_fec/hikp_nic_fec.h -index 7996273..79a87b5 100644 ---- a/net/nic/nic_fec/hikp_nic_fec.h -+++ b/net/nic/nic_fec/hikp_nic_fec.h -@@ -69,4 +69,6 @@ struct nic_fec_err_info { - }; - }; - -+int hikp_nic_fec_get_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_fec_cmd_execute(struct major_cmd_ctrl *self); - #endif /* HIKP_NIC_FEC_H */ -diff --git a/net/nic/nic_ft/hikp_nic_port_fault.c b/net/nic/nic_ft/hikp_nic_port_fault.c -index 5f78cdd..331b1ec 100644 ---- a/net/nic/nic_ft/hikp_nic_port_fault.c -+++ b/net/nic/nic_ft/hikp_nic_port_fault.c -@@ -80,7 +80,7 @@ static void hikp_nic_port_fault_show(struct nic_port_fault_status *info) - printf("#################### END #######################\n"); - } - --static void hikp_nic_port_fault_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_port_fault_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_port_fault_target.bdf; - struct nic_port_fault_status info = { 0 }; -@@ -108,7 +108,7 @@ static int hikp_nic_port_fault_cmd_help(struct major_cmd_ctrl *self, const char - return 0; - } - --static int hikp_nic_port_fault_get_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_port_fault_get_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_port_fault_target); - if (self->err_no != 0) { -diff --git a/net/nic/nic_ft/hikp_nic_port_fault.h b/net/nic/nic_ft/hikp_nic_port_fault.h -index 7db54f7..9c7e4b2 100644 ---- a/net/nic/nic_ft/hikp_nic_port_fault.h -+++ b/net/nic/nic_ft/hikp_nic_port_fault.h -@@ -51,4 +51,6 @@ struct nic_port_fault_status { - uint8_t hilink_ref_status; - }; - -+int hikp_nic_port_fault_get_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_port_fault_cmd_execute(struct major_cmd_ctrl *self); - #endif /* HIKP_NIC_PORT_FAULT_H */ -diff --git a/net/nic/nic_gro/hikp_nic_gro.c b/net/nic/nic_gro/hikp_nic_gro.c -index 19395af..d821a47 100644 ---- a/net/nic/nic_gro/hikp_nic_gro.c -+++ b/net/nic/nic_gro/hikp_nic_gro.c -@@ -53,7 +53,7 @@ static void hikp_nic_gro_show(const struct nic_gro_info *info) - printf("#################### END #######################\n"); - } - --static void hikp_nic_gro_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_gro_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_gro_target.bdf; - struct nic_gro_info info = { 0 }; -@@ -81,7 +81,7 @@ static int hikp_nic_gro_cmd_help(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - --static int hikp_nic_gro_get_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_gro_get_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_gro_target); - if (self->err_no != 0) { -diff --git a/net/nic/nic_gro/hikp_nic_gro.h b/net/nic/nic_gro/hikp_nic_gro.h -index 49328e6..ae58703 100644 ---- a/net/nic/nic_gro/hikp_nic_gro.h -+++ b/net/nic/nic_gro/hikp_nic_gro.h -@@ -43,4 +43,6 @@ struct nic_gro_info { - uint32_t max_coal_bd_num; - }; - -+int hikp_nic_gro_get_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_gro_cmd_execute(struct major_cmd_ctrl *self); - #endif /* HIKP_NIC_GRO_H */ -diff --git a/net/nic/nic_info/hikp_nic_info.c b/net/nic/nic_info/hikp_nic_info.c -index 49f143f..6fb17a2 100644 ---- a/net/nic/nic_info/hikp_nic_info.c -+++ b/net/nic/nic_info/hikp_nic_info.c -@@ -37,7 +37,7 @@ static int hikp_nic_cmd_get_info_help(struct major_cmd_ctrl *self, const char *a - return 0; - } - --static int hikp_nic_cmd_get_info_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_cmd_get_info_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_info_param.target)); - if (self->err_no != 0) { -@@ -305,7 +305,7 @@ static void hikp_nic_info_print_cur_vf(const struct bdf_t *bdf) - } - } - --static void hikp_nic_info_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_info_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_info_param.target.bdf; - -diff --git a/net/nic/nic_info/hikp_nic_info.h b/net/nic/nic_info/hikp_nic_info.h -index b1dd7dc..83323e8 100644 ---- a/net/nic/nic_info/hikp_nic_info.h -+++ b/net/nic/nic_info/hikp_nic_info.h -@@ -77,4 +77,6 @@ enum nic_info_mac_type { - MAC_TYPE_MAX, - }; - -+void hikp_nic_info_cmd_execute(struct major_cmd_ctrl *self); -+int hikp_nic_cmd_get_info_target(struct major_cmd_ctrl *self, const char *argv); - #endif /* HIKP_NIC_INFO_H */ -diff --git a/net/nic/nic_log/hikp_nic_log.c b/net/nic/nic_log/hikp_nic_log.c -index f182d25..be23ca3 100644 ---- a/net/nic/nic_log/hikp_nic_log.c -+++ b/net/nic/nic_log/hikp_nic_log.c -@@ -23,6 +23,7 @@ - #include "hikp_nic_log.h" - - static struct log_param g_log_param = { 0 }; -+static char g_log_path[OP_LOG_FILE_PATH_MAXLEN] = {0}; - - static int hikp_nic_cmd_log_help(struct major_cmd_ctrl *self, const char *argv) - { -@@ -49,7 +50,6 @@ static int hikp_nic_cmd_log_target(struct major_cmd_ctrl *self, const char *argv - - static int hikp_nic_write_data_to_file(uint8_t *data, uint32_t len) - { -- uint8_t file_path[OP_LOG_FILE_PATH_MAXLEN] = { 0 }; - uint8_t file_name[MAX_LOG_NAME_LEN] = { 0 }; - size_t write_cnt; - FILE *fp = NULL; -@@ -59,23 +59,23 @@ static int hikp_nic_write_data_to_file(uint8_t *data, uint32_t len) - if (ret < 0) - return ret; - -- ret = snprintf((char *)file_path, sizeof(file_path), HIKP_LOG_DIR_PATH"%s", file_name); -+ ret = snprintf(g_log_path, sizeof(g_log_path), HIKP_LOG_DIR_PATH"%s", file_name); - if (ret < 0) { - HIKP_ERROR_PRINT("creat log file path fail.\n"); - return -EIO; - } -- (void)remove((const char *)file_path); -- fp = fopen((char *)file_path, "w+"); -+ (void)remove((const char *)g_log_path); -+ fp = fopen(g_log_path, "w+"); - if (fp == NULL) { -- HIKP_ERROR_PRINT("open %s failed, errno is %d\n", file_path, errno); -+ HIKP_ERROR_PRINT("open %s failed, errno is %d\n", g_log_path, errno); - return -errno; - } - write_cnt = fwrite(data, 1, len, fp); - if (write_cnt != len) -- HIKP_ERROR_PRINT("write %s failed, write cnt %lu.\n", file_path, write_cnt); -+ HIKP_ERROR_PRINT("write %s failed, write cnt %lu.\n", g_log_path, write_cnt); - -- printf("dump m7 log completed, log file: %s.\n", file_path); -- (void)chmod((char *)file_path, 0440); -+ printf("dump m7 log completed, log file: %s.\n", g_log_path); -+ (void)chmod(g_log_path, 0440); - (void)fclose(fp); - return 0; - } -@@ -199,6 +199,29 @@ static void hikp_nic_log_cmd_execute(struct major_cmd_ctrl *self) - self->err_no = hikp_nic_dump_m7_log(self); - } - -+const char *hikp_info_collect_get_log_path(void) -+{ -+ return (const char *)g_log_path; -+} -+ -+int hikp_info_collect_nic_log(void *data) -+{ -+ struct nic_log_collect_param *param = (struct nic_log_collect_param *)data; -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ int ret; -+ -+ memset(&g_log_param, 0, sizeof(g_log_param)); -+ -+ ret = hikp_nic_cmd_log_target(major_cmd, param->net_dev_name); -+ if (ret) -+ return ret; -+ -+ printf("hikptool nic_log -i %s\n", param->net_dev_name); -+ hikp_nic_log_cmd_execute(major_cmd); -+ -+ return ret; -+} -+ - static void cmd_nic_log_init(void) - { - struct major_cmd_ctrl *major_cmd = get_major_cmd(); -diff --git a/net/nic/nic_log/hikp_nic_log.h b/net/nic/nic_log/hikp_nic_log.h -index 2998464..cff1980 100644 ---- a/net/nic/nic_log/hikp_nic_log.h -+++ b/net/nic/nic_log/hikp_nic_log.h -@@ -38,4 +38,11 @@ struct log_param { - struct tool_target target; - }; - -+struct nic_log_collect_param { -+ const char *net_dev_name; -+}; -+ -+const char *hikp_info_collect_get_log_path(void); -+int hikp_info_collect_nic_log(void *data); -+ - #endif /* HIKP_NIC_LOG_H */ -diff --git a/net/nic/nic_mac/hikp_nic_mac_dump.c b/net/nic/nic_mac/hikp_nic_mac_dump.c -index 5439c71..751953c 100644 ---- a/net/nic/nic_mac/hikp_nic_mac_dump.c -+++ b/net/nic/nic_mac/hikp_nic_mac_dump.c -@@ -184,7 +184,7 @@ static int mac_cmd_dump_para_check(struct major_cmd_ctrl *self) - return 0; - } - --static void mac_cmd_dump_execute(struct major_cmd_ctrl *self) -+void mac_cmd_dump_execute(struct major_cmd_ctrl *self) - { - int ret; - -@@ -203,7 +203,7 @@ static void mac_cmd_dump_execute(struct major_cmd_ctrl *self) - mac_cmd_dump_module(self, g_dump_reg_info.module_name); - } - --static int mac_cmd_dump_reg_target(struct major_cmd_ctrl *self, const char *argv) -+int mac_cmd_dump_reg_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_dump_reg_info.target); - if (self->err_no) { -@@ -233,13 +233,35 @@ static int mac_cmd_dump_reg_help(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - --static int mac_cmd_dump_module_cfg(struct major_cmd_ctrl *self, const char *argv) -+int mac_cmd_dump_module_cfg(struct major_cmd_ctrl *self, const char *argv) - { - g_dump_reg_info.module_name = argv; - - return 0; - } - -+int hikp_info_collect_nic_mac(void *data) -+{ -+ struct nic_mac_collect_param *param = (struct nic_mac_collect_param *)data; -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ int ret; -+ -+ memset(&g_dump_reg_info, 0, sizeof(g_dump_reg_info)); -+ -+ ret = mac_cmd_dump_reg_target(major_cmd, param->net_dev_name); -+ if (ret) -+ return ret; -+ -+ ret = mac_cmd_dump_module_cfg(major_cmd, param->module_name); -+ if (ret) -+ return ret; -+ -+ printf("hikptool nic_mac -i %s -m %s\n", param->net_dev_name, param->module_name); -+ mac_cmd_dump_execute(major_cmd); -+ -+ return ret; -+} -+ - static void cmd_mac_dump_reg_init(void) - { - struct major_cmd_ctrl *major_cmd = get_major_cmd(); -diff --git a/net/nic/nic_mac/hikp_nic_mac_dump.h b/net/nic/nic_mac/hikp_nic_mac_dump.h -index 0c58ad5..f74a99e 100644 ---- a/net/nic/nic_mac/hikp_nic_mac_dump.h -+++ b/net/nic/nic_mac/hikp_nic_mac_dump.h -@@ -60,4 +60,15 @@ struct cmd_mac_dump { - uint32_t blk_num[MOD_ID_MAX]; - const char *module_name; - }; -+ -+struct nic_mac_collect_param { -+ const char *net_dev_name; -+ const char *module_name; -+}; -+ -+int hikp_info_collect_nic_mac(void *data); -+ -+int mac_cmd_dump_module_cfg(struct major_cmd_ctrl *self, const char *argv); -+int mac_cmd_dump_reg_target(struct major_cmd_ctrl *self, const char *argv); -+void mac_cmd_dump_execute(struct major_cmd_ctrl *self); - #endif /* HIKP_NIC_MAC_DUMP_H */ -diff --git a/net/nic/nic_mac/hikp_nic_port.c b/net/nic/nic_mac/hikp_nic_port.c -index e28a040..737de07 100644 ---- a/net/nic/nic_mac/hikp_nic_port.c -+++ b/net/nic/nic_mac/hikp_nic_port.c -@@ -630,6 +630,24 @@ static int mac_cmd_port_show_help(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - -+int hikp_info_collect_nic_port(void *data) -+{ -+ struct nic_port_collect_param *param = (struct nic_port_collect_param *)data; -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ int ret; -+ -+ memset(&g_port_info, 0, sizeof(g_port_info)); -+ -+ ret = mac_cmd_get_port_target(major_cmd, param->net_dev_name); -+ if (ret) -+ return ret; -+ -+ printf("hikptool nic_port -i %s\n", param->net_dev_name); -+ mac_cmd_port_execute(major_cmd); -+ -+ return ret; -+} -+ - static void cmd_mac_get_port_init(void) - { - struct major_cmd_ctrl *major_cmd = get_major_cmd(); -diff --git a/net/nic/nic_mac/hikp_nic_port.h b/net/nic/nic_mac/hikp_nic_port.h -index 69ebb53..433eba4 100644 ---- a/net/nic/nic_mac/hikp_nic_port.h -+++ b/net/nic/nic_mac/hikp_nic_port.h -@@ -271,4 +271,10 @@ struct cmd_hot_plug_card_info { - uint8_t cur_type; - }; - -+struct nic_port_collect_param { -+ const char *net_dev_name; -+}; -+ -+int hikp_info_collect_nic_port(void *data); -+ - #endif /* HIKP_NIC_PORT_H */ -diff --git a/net/nic/nic_mac/hikp_nic_xsfp.c b/net/nic/nic_mac/hikp_nic_xsfp.c -index 573837b..91daa52 100644 ---- a/net/nic/nic_mac/hikp_nic_xsfp.c -+++ b/net/nic/nic_mac/hikp_nic_xsfp.c -@@ -734,6 +734,29 @@ static int hikp_xsfp_dump_raw_data(struct major_cmd_ctrl *self, const char *argv - return 0; - } - -+int hikp_info_collect_nic_xsfp(void *data) -+{ -+ struct nic_xsfp_collect_param *param = (struct nic_xsfp_collect_param *)data; -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ int ret; -+ -+ memset(&g_xsfp_dump, 0, sizeof(g_xsfp_dump)); -+ -+ ret = hikp_xsfp_get_target(major_cmd, param->net_dev_name); -+ if (ret) -+ return ret; -+ -+ printf("hikptool nic_xsfp -i %s\n", param->net_dev_name); -+ hikp_xsfp_get_info(major_cmd); -+ -+ printf("hikptool nic_xsfp -i %s -d\n", param->net_dev_name); -+ /* No need to judge the return value */ -+ (void)hikp_xsfp_dump_raw_data(major_cmd, NULL); -+ hikp_xsfp_get_info(major_cmd); -+ -+ return ret; -+} -+ - static void cmd_get_xsfp_info(void) - { - struct major_cmd_ctrl *major_cmd = get_major_cmd(); -diff --git a/net/nic/nic_mac/hikp_nic_xsfp.h b/net/nic/nic_mac/hikp_nic_xsfp.h -index 50cbb2d..7db9693 100644 ---- a/net/nic/nic_mac/hikp_nic_xsfp.h -+++ b/net/nic/nic_mac/hikp_nic_xsfp.h -@@ -549,4 +549,10 @@ struct hikp_xsfp_ctrl { - uint32_t dump_param; - }; - -+struct nic_xsfp_collect_param { -+ const char *net_dev_name; -+}; -+ -+int hikp_info_collect_nic_xsfp(void *data); -+ - #endif /* HIKP_NIC_XSFP_H */ -diff --git a/net/nic/nic_ncsi/hikp_nic_ncsi.c b/net/nic/nic_ncsi/hikp_nic_ncsi.c -index 2e1ea11..84f6337 100644 ---- a/net/nic/nic_ncsi/hikp_nic_ncsi.c -+++ b/net/nic/nic_ncsi/hikp_nic_ncsi.c -@@ -100,6 +100,24 @@ static int nic_ncsi_cmd_show_help(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - -+int hikp_info_collect_nic_ncsi(void *data) -+{ -+ struct nic_ncsi_collect_param *param = (struct nic_ncsi_collect_param *)data; -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ int ret; -+ -+ memset(&g_ncsi_cmd_info, 0, sizeof(g_ncsi_cmd_info)); -+ -+ ret = nic_ncsi_cmd_get_port_info(major_cmd, param->net_dev_name); -+ if (ret) -+ return ret; -+ -+ printf("hikptool nic_ncsi -i %s\n", param->net_dev_name); -+ nic_ncsi_cmd_execute(major_cmd); -+ -+ return ret; -+} -+ - static void cmd_nic_get_ncsi_init(void) - { - struct major_cmd_ctrl *major_cmd = get_major_cmd(); -diff --git a/net/nic/nic_ncsi/hikp_nic_ncsi.h b/net/nic/nic_ncsi/hikp_nic_ncsi.h -index a391d20..56ab653 100644 ---- a/net/nic/nic_ncsi/hikp_nic_ncsi.h -+++ b/net/nic/nic_ncsi/hikp_nic_ncsi.h -@@ -54,4 +54,10 @@ struct nic_ncsi_cmd_info { - bool port_flag; - }; - -+struct nic_ncsi_collect_param { -+ const char *net_dev_name; -+}; -+ -+int hikp_info_collect_nic_ncsi(void *data); -+ - #endif /* HIKP_NIC_NCSI_H */ -diff --git a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -index 5cd8bfa..4efaadc 100644 ---- a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -+++ b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -@@ -70,7 +70,7 @@ static void hikp_nic_notify_pkt_show(const struct nic_notify_pkt_info *info) - printf("####################### END ###########################\n"); - } - --static void hikp_nic_notify_pkt_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_notify_pkt_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_notify_pkt_target.bdf; - struct nic_notify_pkt_info info = {0}; -@@ -94,7 +94,7 @@ static int hikp_nic_notify_pkt_cmd_help(struct major_cmd_ctrl *self, const char - return 0; - } - --static int hikp_nic_notify_pkt_get_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_notify_pkt_get_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_notify_pkt_target); - if (self->err_no != 0) { -diff --git a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h -index 8bdb795..26a86fe 100644 ---- a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h -+++ b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.h -@@ -49,4 +49,6 @@ struct nic_notify_pkt_info { - #define HIKP_NOTIFY_PKT_CFG_PKT_NUM_M GENMASK(5, 2) - #define HIKP_NOTIFY_PKT_CFG_PKT_NUM_S 2 - -+int hikp_nic_notify_pkt_get_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_notify_pkt_cmd_execute(struct major_cmd_ctrl *self); - #endif /* HIKP_NIC_NOTIFY_PKT_H */ -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index aa63f12..24f41ee 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -57,6 +57,13 @@ static const struct ppp_feature_cmd g_ppp_feature_cmd[] = { - hikp_nic_query_ppp_by_blkid, hikp_nic_ppp_show_vlan_offload}, - }; - -+void hikp_nic_ppp_set_cmd_param(int feature_idx) -+{ -+ g_ppp_param.func_id = -1; -+ g_ppp_param.is_uc = -1; -+ g_ppp_param.feature_idx = feature_idx; -+} -+ - static int hikp_nic_ppp_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -@@ -1098,7 +1105,7 @@ static int hikp_nic_check_hw_res(struct hikp_nic_ppp_hw_resources *hw_res) - return 0; - } - --static void hikp_nic_ppp_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_ppp_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_ppp_param.target.bdf; - const struct ppp_feature_cmd *ppp_cmd; -@@ -1157,7 +1164,7 @@ out: - hikp_nic_ppp_data_free(ppp_data); - } - --static int hikp_nic_cmd_get_ppp_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_cmd_get_ppp_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_ppp_param.target)); - if (self->err_no != 0) { -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.h b/net/nic/nic_ppp/hikp_nic_ppp.h -index 033ca4d..229e019 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.h -+++ b/net/nic/nic_ppp/hikp_nic_ppp.h -@@ -246,4 +246,7 @@ struct ppp_feature_cmd { - void (*show)(const void *data); - }; - -+void hikp_nic_ppp_set_cmd_param(int feature_idx); -+int hikp_nic_cmd_get_ppp_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_ppp_cmd_execute(struct major_cmd_ctrl *self); - #endif /* HIKP_NIC_PPP_H */ -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index c620a08..dc6f63e 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -33,6 +33,16 @@ static const struct qos_feature_cmd g_qos_feature_cmd[] = { - hikp_nic_qos_show_pfc_storm_para}, - }; - -+void hikp_nic_qos_set_cmd_feature_idx(int feature_idx) -+{ -+ g_qos_param.feature_idx = feature_idx; -+} -+ -+void hikp_nic_qos_set_cmd_direction(enum nic_pfc_dir dir) -+{ -+ g_qos_param.dir = dir; -+} -+ - static int hikp_nic_qos_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -@@ -242,7 +252,7 @@ static int hikp_nic_query_qos_feature(struct hikp_cmd_header *req_header, const - return ret; - } - --static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) - { - char *revision_id = g_qos_param.revision_id; - struct bdf_t *bdf = &g_qos_param.target.bdf; -@@ -265,7 +275,7 @@ static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) - } - - if (g_qos_param.feature_idx == NIC_PFC_STORM_PARA_DUMP && -- g_qos_param.dir == NIC_QUEUE_DIR_NONE) { -+ g_qos_param.dir == NIC_QOS_DIR_NONE) { - hikp_nic_qos_cmd_help(self, NULL); - snprintf(self->err_str, sizeof(self->err_str), - "-d/--dir param error!"); -@@ -296,7 +306,7 @@ static void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self) - printf("#################### END #######################\n"); - } - --static int hikp_nic_cmd_get_qos_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_cmd_get_qos_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_qos_param.target)); - if (self->err_no != 0) { -@@ -330,11 +340,11 @@ static int hikp_nic_cmd_qos_direct(struct major_cmd_ctrl *self, - const char *argv) - { - if (strcmp(argv, "rx") == 0) { -- g_qos_param.dir = NIC_RX_QUEUE; -+ g_qos_param.dir = NIC_RX_QOS; - return 0; - } - if (strcmp(argv, "tx") == 0) { -- g_qos_param.dir = NIC_TX_QUEUE; -+ g_qos_param.dir = NIC_TX_QOS; - return 0; - } - -@@ -350,7 +360,7 @@ static void cmd_nic_get_qos_init(void) - struct major_cmd_ctrl *major_cmd = get_major_cmd(); - - g_qos_param.feature_idx = -1; -- g_qos_param.dir = NIC_QUEUE_DIR_NONE; -+ g_qos_param.dir = NIC_QOS_DIR_NONE; - - major_cmd->option_count = 0; - major_cmd->execute = hikp_nic_qos_cmd_execute; -diff --git a/net/nic/nic_qos/hikp_nic_qos.h b/net/nic/nic_qos/hikp_nic_qos.h -index 77fbdd9..6ff4e05 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.h -+++ b/net/nic/nic_qos/hikp_nic_qos.h -@@ -118,9 +118,9 @@ struct nic_qos_req_para { - }; - - enum nic_pfc_dir { -- NIC_RX_QUEUE = 0, -- NIC_TX_QUEUE, -- NIC_QUEUE_DIR_NONE, -+ NIC_RX_QOS = 0, -+ NIC_TX_QOS, -+ NIC_QOS_DIR_NONE, - }; - - struct nic_qos_param { -@@ -137,4 +137,8 @@ struct qos_feature_cmd { - void (*show)(const void *data); - }; - -+int hikp_nic_cmd_get_qos_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_qos_cmd_execute(struct major_cmd_ctrl *self); -+void hikp_nic_qos_set_cmd_feature_idx(int feature_idx); -+void hikp_nic_qos_set_cmd_direction(enum nic_pfc_dir dir); - #endif /* HIKP_NIC_QOS_H */ -diff --git a/net/nic/nic_queue/hikp_nic_queue.c b/net/nic/nic_queue/hikp_nic_queue.c -index dafa05e..5bb4335 100644 ---- a/net/nic/nic_queue/hikp_nic_queue.c -+++ b/net/nic/nic_queue/hikp_nic_queue.c -@@ -32,6 +32,14 @@ static const struct queue_feature_cmd g_queue_feature_cmd[] = { - {"func_map", QUEUE_FUNC_MAP, hikp_nic_queue_show_func_map}, - }; - -+void hikp_nic_queue_cmd_set_param(int feature_idx, int qid, enum nic_queue_dir dir) -+{ -+ g_queue_param.is_display_all = true; -+ g_queue_param.qid = qid; -+ g_queue_param.dir = dir; -+ g_queue_param.feature_idx = feature_idx; -+} -+ - static int hikp_nic_queue_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -@@ -340,7 +348,7 @@ static bool hikp_nic_queue_check_feature_para_vaild(const struct queue_feature_c - return valid; - } - --static void hikp_nic_queue_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_queue_cmd_execute(struct major_cmd_ctrl *self) - { - const struct queue_feature_cmd *queue_cmd; - union nic_queue_feature_info *queue_data; -@@ -387,7 +395,7 @@ out: - free(queue_data); - } - --static int hikp_nic_cmd_get_queue_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_cmd_get_queue_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_queue_param.target)); - if (self->err_no != 0) { -diff --git a/net/nic/nic_queue/hikp_nic_queue.h b/net/nic/nic_queue/hikp_nic_queue.h -index fac39a0..ca3541a 100644 ---- a/net/nic/nic_queue/hikp_nic_queue.h -+++ b/net/nic/nic_queue/hikp_nic_queue.h -@@ -152,4 +152,8 @@ struct queue_feature_cmd { - uint32_t sub_cmd_code; - void (*show)(const void *data); - }; -+ -+int hikp_nic_cmd_get_queue_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_queue_cmd_execute(struct major_cmd_ctrl *self); -+void hikp_nic_queue_cmd_set_param(int feature_idx, int qid, enum nic_queue_dir dir); - #endif /* HIKP_NIC_QUEUE_H */ -diff --git a/net/nic/nic_rss/hikp_nic_rss.c b/net/nic/nic_rss/hikp_nic_rss.c -index 65336ff..a7448e4 100644 ---- a/net/nic/nic_rss/hikp_nic_rss.c -+++ b/net/nic/nic_rss/hikp_nic_rss.c -@@ -132,6 +132,11 @@ static const struct rss_feature_cmd g_rss_feature_cmd[] = { - {"tc_mode", RSS_TC_MODE_DUMP, hikp_nic_rss_show_tc_mode}, - }; - -+void hikp_nic_rss_cmd_set_feature_idx(int feature_idx) -+{ -+ g_rss_param.feature_idx = feature_idx; -+} -+ - static int hikp_nic_rss_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -@@ -417,7 +422,7 @@ static int hikp_nic_query_rss_feature(struct hikp_cmd_header *req_header, const - return ret; - } - --static void hikp_nic_rss_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_rss_cmd_execute(struct major_cmd_ctrl *self) - { - union nic_rss_feature_info rss_data = {0}; - const struct rss_feature_cmd *rss_cmd; -@@ -446,7 +451,7 @@ static void hikp_nic_rss_cmd_execute(struct major_cmd_ctrl *self) - printf("#################### END #######################\n"); - } - --static int hikp_nic_cmd_get_rss_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_cmd_get_rss_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_rss_param.target)); - if (self->err_no != 0) { -diff --git a/net/nic/nic_rss/hikp_nic_rss.h b/net/nic/nic_rss/hikp_nic_rss.h -index 39b3300..47aa2b9 100644 ---- a/net/nic/nic_rss/hikp_nic_rss.h -+++ b/net/nic/nic_rss/hikp_nic_rss.h -@@ -91,4 +91,7 @@ struct rss_feature_cmd { - void (*show)(const void *data); - }; - -+int hikp_nic_cmd_get_rss_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_rss_cmd_execute(struct major_cmd_ctrl *self); -+void hikp_nic_rss_cmd_set_feature_idx(int feature_idx); - #endif /* HIKP_NIC_RSS_H */ -diff --git a/net/nic/nic_torus/hikp_nic_torus.c b/net/nic/nic_torus/hikp_nic_torus.c -index 5208bdc..d5e22b1 100644 ---- a/net/nic/nic_torus/hikp_nic_torus.c -+++ b/net/nic/nic_torus/hikp_nic_torus.c -@@ -130,7 +130,7 @@ static void hikp_nic_torus_show(const struct nic_torus_info *info) - printf("#################### END ##########################\n"); - } - --static void hikp_nic_torus_cmd_execute(struct major_cmd_ctrl *self) -+void hikp_nic_torus_cmd_execute(struct major_cmd_ctrl *self) - { - struct bdf_t *bdf = &g_torus_target.bdf; - struct nic_torus_info info = { 0 }; -@@ -158,7 +158,7 @@ static int hikp_nic_torus_cmd_help(struct major_cmd_ctrl *self, const char *argv - return 0; - } - --static int hikp_nic_torus_get_target(struct major_cmd_ctrl *self, const char *argv) -+int hikp_nic_torus_get_target(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_torus_target); - if (self->err_no != 0) { -diff --git a/net/nic/nic_torus/hikp_nic_torus.h b/net/nic/nic_torus/hikp_nic_torus.h -index e6b6552..064ffa3 100644 ---- a/net/nic/nic_torus/hikp_nic_torus.h -+++ b/net/nic/nic_torus/hikp_nic_torus.h -@@ -73,4 +73,6 @@ struct nic_torus_info { - uint32_t ets_tcg0_mapping; - }; - -+int hikp_nic_torus_get_target(struct major_cmd_ctrl *self, const char *argv); -+void hikp_nic_torus_cmd_execute(struct major_cmd_ctrl *self); - #endif /* HIKP_NIC_TORUS_H */ -diff --git a/net/roce/roce_bond/hikp_roce_bond.c b/net/roce/roce_bond/hikp_roce_bond.c -index 8434a0b..5256804 100644 ---- a/net/roce/roce_bond/hikp_roce_bond.c -+++ b/net/roce/roce_bond/hikp_roce_bond.c -@@ -15,6 +15,12 @@ - - static struct cmd_roce_bond_param g_roce_bond_param = { 0 }; - -+int hikp_roce_set_bond_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_bond_param.target); -+} -+ - static int hikp_roce_bond_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -60,7 +66,7 @@ static int hikp_roce_bond_get_data(struct hikp_cmd_ret **cmd_ret, - return ret; - } - --static void hikp_roce_bond_execute(struct major_cmd_ctrl *self) -+void hikp_roce_bond_execute(struct major_cmd_ctrl *self) - { - hikp_roce_ext_execute(self, GET_ROCEE_BOND_CMD, hikp_roce_bond_get_data); - } -diff --git a/net/roce/roce_bond/hikp_roce_bond.h b/net/roce/roce_bond/hikp_roce_bond.h -index 5e18723..2f61727 100644 ---- a/net/roce/roce_bond/hikp_roce_bond.h -+++ b/net/roce/roce_bond/hikp_roce_bond.h -@@ -26,4 +26,7 @@ struct roce_bond_req_param { - uint32_t block_id; - }; - -+int hikp_roce_set_bond_bdf(char *nic_name); -+void hikp_roce_bond_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_BOND_H */ -diff --git a/net/roce/roce_caep/hikp_roce_caep.c b/net/roce/roce_caep/hikp_roce_caep.c -index a52cd54..95795d1 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.c -+++ b/net/roce/roce_caep/hikp_roce_caep.c -@@ -15,6 +15,17 @@ - - static struct cmd_roce_caep_param_t g_roce_caep_param_t = { 0 }; - -+int hikp_roce_set_caep_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_caep_param_t.target); -+} -+ -+void hikp_roce_set_caep_mode(uint32_t mode) -+{ -+ g_roce_caep_param_t.sub_cmd = mode; -+} -+ - static int hikp_roce_caep_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -102,7 +113,7 @@ exec_error: - hikp_cmd_free(&cmd_ret); - } - --static void hikp_roce_caep_execute(struct major_cmd_ctrl *self) -+void hikp_roce_caep_execute(struct major_cmd_ctrl *self) - { - if (g_roce_caep_param_t.sub_cmd == CAEP_ORIGIN) - hikp_roce_caep_execute_origin(self); -diff --git a/net/roce/roce_caep/hikp_roce_caep.h b/net/roce/roce_caep/hikp_roce_caep.h -index becb332..770e2ab 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.h -+++ b/net/roce/roce_caep/hikp_roce_caep.h -@@ -48,4 +48,8 @@ enum roce_caep_cmd_type { - CAEP_EXT, - }; - -+int hikp_roce_set_caep_bdf(char *nic_name); -+void hikp_roce_set_caep_mode(uint32_t mode); -+void hikp_roce_caep_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_CAEP_H */ -diff --git a/net/roce/roce_global_cfg/hikp_roce_global_cfg.c b/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -index 18df065..ca42dfa 100644 ---- a/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -+++ b/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -@@ -15,6 +15,12 @@ - - static struct cmd_roce_global_cfg_param g_roce_global_cfg_param = { 0 }; - -+int hikp_roce_set_global_cfg_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_global_cfg_param.target); -+} -+ - static int hikp_roce_global_cfg_help(struct major_cmd_ctrl *self, - const char *argv) - { -@@ -63,7 +69,7 @@ static int hikp_roce_global_cfg_get_data(struct hikp_cmd_ret **cmd_ret, - return ret; - } - --static void hikp_roce_global_cfg_execute(struct major_cmd_ctrl *self) -+void hikp_roce_global_cfg_execute(struct major_cmd_ctrl *self) - { - enum roce_global_cfg_cmd_type sub_cmds[] = { - ROCE_GLB_GENAC, -diff --git a/net/roce/roce_global_cfg/hikp_roce_global_cfg.h b/net/roce/roce_global_cfg/hikp_roce_global_cfg.h -index aa1db92..eb6f359 100644 ---- a/net/roce/roce_global_cfg/hikp_roce_global_cfg.h -+++ b/net/roce/roce_global_cfg/hikp_roce_global_cfg.h -@@ -37,4 +37,7 @@ enum roce_global_cfg_cmd_type { - ROCE_GLB_NICL, - }; - -+int hikp_roce_set_global_cfg_bdf(char *nic_name); -+void hikp_roce_global_cfg_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_GLOBAL_CFG_H */ -diff --git a/net/roce/roce_gmv/hikp_roce_gmv.c b/net/roce/roce_gmv/hikp_roce_gmv.c -index 1b7db32..5f96451 100644 ---- a/net/roce/roce_gmv/hikp_roce_gmv.c -+++ b/net/roce/roce_gmv/hikp_roce_gmv.c -@@ -16,6 +16,17 @@ - - static struct cmd_roce_gmv_param g_roce_gmv_param = { 0 }; - -+int hikp_roce_set_gmv_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_gmv_param.target); -+} -+ -+void hikp_roce_set_gmv_index(uint32_t gmv_index) -+{ -+ g_roce_gmv_param.gmv_index = gmv_index; -+} -+ - static int hikp_roce_gmv_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -83,7 +94,7 @@ static void hikp_roce_gmv_print(uint32_t reg_num, struct roce_gmv_rsp_data *gmv_ - printf("*******************************************\n"); - } - --static void hikp_roce_gmv_execute(struct major_cmd_ctrl *self) -+void hikp_roce_gmv_execute(struct major_cmd_ctrl *self) - { - struct roce_gmv_req_para req_data = { 0 }; - struct roce_gmv_rsp_data *gmv_rsp = NULL; -diff --git a/net/roce/roce_gmv/hikp_roce_gmv.h b/net/roce/roce_gmv/hikp_roce_gmv.h -index 8bc49d0..29c2e6d 100644 ---- a/net/roce/roce_gmv/hikp_roce_gmv.h -+++ b/net/roce/roce_gmv/hikp_roce_gmv.h -@@ -38,4 +38,8 @@ enum roce_gmv_cmd_type { - GMV_SHOW = 0x0, - }; - -+int hikp_roce_set_gmv_bdf(char *nic_name); -+void hikp_roce_set_gmv_index(uint32_t gmv_index); -+void hikp_roce_gmv_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_GMV_H */ -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.c b/net/roce/roce_mdb/hikp_roce_mdb.c -index a578c87..e0a7cc5 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.c -+++ b/net/roce/roce_mdb/hikp_roce_mdb.c -@@ -16,6 +16,17 @@ - - static struct cmd_roce_mdb_param g_roce_mdb_param = { 0 }; - -+int hikp_roce_set_mdb_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_mdb_param.target); -+} -+ -+void hikp_roce_set_mdb_mode(uint8_t mode) -+{ -+ g_roce_mdb_param.flag = mode; -+} -+ - static int hikp_roce_mdb_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -155,7 +166,7 @@ exec_error: - hikp_cmd_free(&cmd_ret); - } - --static void hikp_roce_mdb_execute(struct major_cmd_ctrl *self) -+void hikp_roce_mdb_execute(struct major_cmd_ctrl *self) - { - if (g_roce_mdb_param.flag & ROCE_MDB_CMD_EXT) { - g_roce_mdb_param.sub_cmd = (g_roce_mdb_param.flag & ROCE_MDB_CMD_CLEAR) ? -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.h b/net/roce/roce_mdb/hikp_roce_mdb.h -index e8dfcca..b95bb56 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.h -+++ b/net/roce/roce_mdb/hikp_roce_mdb.h -@@ -20,6 +20,7 @@ - #define ROCE_HIKP_REG_SWICTH 2 - - #define ROCE_MDB_CMD_CLEAR (1 << 0) -+#define ROCE_MDB_CMD 0 - #define ROCE_MDB_CMD_EXT (1 << 1) - - struct cmd_roce_mdb_param { -@@ -49,4 +50,8 @@ enum roce_mdb_cmd_type { - MDB_CLEAR_EXT, - }; - -+int hikp_roce_set_mdb_bdf(char *nic_name); -+void hikp_roce_set_mdb_mode(uint8_t mode); -+void hikp_roce_mdb_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_MDB_H */ -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.c b/net/roce/roce_pkt/hikp_roce_pkt.c -index 81bdae6..5a6b268 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.c -+++ b/net/roce/roce_pkt/hikp_roce_pkt.c -@@ -15,6 +15,12 @@ - - static struct cmd_roce_pkt_param_t g_roce_pkt_param_t = { 0 }; - -+int hikp_roce_set_pkt_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_pkt_param_t.target); -+} -+ - static int hikp_roce_pkt_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -96,7 +102,7 @@ static void hikp_roce_pkt_print(uint32_t total_block_num, - printf("***********************************\n"); - } - --static void hikp_roce_pkt_execute(struct major_cmd_ctrl *self) -+void hikp_roce_pkt_execute(struct major_cmd_ctrl *self) - { - struct roce_pkt_req_param req_data = { 0 }; - struct roce_pkt_res_param *roce_pkt_res; -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.h b/net/roce/roce_pkt/hikp_roce_pkt.h -index 05d464e..7d23c8f 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.h -+++ b/net/roce/roce_pkt/hikp_roce_pkt.h -@@ -39,4 +39,7 @@ struct roce_pkt_res_param { - struct roce_pkt_res reg_data; - }; - -+int hikp_roce_set_pkt_bdf(char *nic_name); -+void hikp_roce_pkt_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_PKT_H */ -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.c b/net/roce/roce_qmm/hikp_roce_qmm.c -index 8140080..30caa5a 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.c -+++ b/net/roce/roce_qmm/hikp_roce_qmm.c -@@ -16,6 +16,22 @@ - - static struct cmd_roce_qmm_param_t g_roce_qmm_param = { 0 }; - -+int hikp_roce_set_qmm_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_qmm_param.target); -+} -+ -+void hikp_roce_set_qmm_ext_flag(bool ext_flag) -+{ -+ g_roce_qmm_param.ext_flag = ext_flag; -+} -+ -+void hikp_roce_set_qmm_bankid(uint32_t bank_id) -+{ -+ g_roce_qmm_param.bank_id = bank_id; -+} -+ - static int hikp_roce_qmm_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -249,7 +265,7 @@ exec_error: - hikp_cmd_free(&cmd_ret); - } - --static void hikp_roce_qmm_execute(struct major_cmd_ctrl *self) -+void hikp_roce_qmm_execute(struct major_cmd_ctrl *self) - { - static const struct cmd_type_info { - enum roce_qmm_cmd_type sub_cmd; -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.h b/net/roce/roce_qmm/hikp_roce_qmm.h -index eb7722b..b13a716 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.h -+++ b/net/roce/roce_qmm/hikp_roce_qmm.h -@@ -51,4 +51,9 @@ enum roce_qmm_cmd_type { - QMM_SHOW_TOP_EXT, - }; - -+int hikp_roce_set_qmm_bdf(char *nic_name); -+void hikp_roce_set_qmm_ext_flag(bool ext_flag); -+void hikp_roce_set_qmm_bankid(uint32_t bank_id); -+void hikp_roce_qmm_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_QMM_H */ -diff --git a/net/roce/roce_rst/hikp_roce_rst.c b/net/roce/roce_rst/hikp_roce_rst.c -index 570e7f4..cfccc47 100644 ---- a/net/roce/roce_rst/hikp_roce_rst.c -+++ b/net/roce/roce_rst/hikp_roce_rst.c -@@ -15,6 +15,12 @@ - - static struct cmd_roce_rst_param g_roce_rst_param = { 0 }; - -+int hikp_roce_set_rst_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_rst_param.target); -+} -+ - static int hikp_roce_rst_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -60,7 +66,7 @@ static int hikp_roce_rst_get_data(struct hikp_cmd_ret **cmd_ret, - return ret; - } - --static void hikp_roce_rst_execute(struct major_cmd_ctrl *self) -+void hikp_roce_rst_execute(struct major_cmd_ctrl *self) - { - hikp_roce_ext_execute(self, GET_ROCEE_RST_CMD, hikp_roce_rst_get_data); - } -diff --git a/net/roce/roce_rst/hikp_roce_rst.h b/net/roce/roce_rst/hikp_roce_rst.h -index e864b68..782d0ff 100644 ---- a/net/roce/roce_rst/hikp_roce_rst.h -+++ b/net/roce/roce_rst/hikp_roce_rst.h -@@ -26,4 +26,7 @@ struct roce_rst_req_param { - uint32_t block_id; - }; - -+int hikp_roce_set_rst_bdf(char *nic_name); -+void hikp_roce_rst_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_RST_H */ -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index f330e97..c660799 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -15,7 +15,7 @@ - - struct cmd_roce_scc_param_t g_roce_scc_param_t = { 0 }; - struct roce_scc_module g_roce_scc_module[] = { -- ROCE_SCC_HANDLE(COMMON), -+ { "COMMON", SCC_COMMON }, - ROCE_SCC_HANDLE(DCQCN), - ROCE_SCC_HANDLE(DIP), - ROCE_SCC_HANDLE(HC3), -@@ -23,6 +23,17 @@ struct roce_scc_module g_roce_scc_module[] = { - ROCE_SCC_HANDLE(CFG), - }; - -+int hikp_roce_set_scc_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_scc_param_t.target); -+} -+ -+void hikp_roce_set_scc_submodule(uint32_t module) -+{ -+ g_roce_scc_param_t.sub_cmd = module; -+} -+ - static int hikp_roce_scc_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -78,7 +89,7 @@ static int hikp_roce_scc_clear_set(struct major_cmd_ctrl *self, const char *argv - - static int hikp_roce_scc_clear_module_check(void) - { -- if (g_roce_scc_param_t.sub_cmd == COMMON) -+ if (g_roce_scc_param_t.sub_cmd == SCC_COMMON) - return 0; - - return -EINVAL; -@@ -292,7 +303,7 @@ static const struct reg_name_info { - const char **reg_name; - uint8_t arr_len; - } g_scc_reg_name_info_table[] = { -- {COMMON, g_scc_common_reg_name, HIKP_ARRAY_SIZE(g_scc_common_reg_name)}, -+ {SCC_COMMON, g_scc_common_reg_name, HIKP_ARRAY_SIZE(g_scc_common_reg_name)}, - {DCQCN, g_scc_dcqcn_reg_name, HIKP_ARRAY_SIZE(g_scc_dcqcn_reg_name)}, - {DIP, g_scc_dip_reg_name, HIKP_ARRAY_SIZE(g_scc_dip_reg_name)}, - {HC3, g_scc_hc3_reg_name, HIKP_ARRAY_SIZE(g_scc_hc3_reg_name)}, -@@ -330,7 +341,7 @@ static void hikp_roce_scc_print(uint8_t total_block_num, - printf("***********************************\n"); - } - --static void hikp_roce_scc_execute(struct major_cmd_ctrl *self) -+void hikp_roce_scc_execute(struct major_cmd_ctrl *self) - { - struct roce_scc_head res_head; - uint32_t *offset_start = NULL; -diff --git a/net/roce/roce_scc/hikp_roce_scc.h b/net/roce/roce_scc/hikp_roce_scc.h -index 9b5c0c5..b86b59a 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.h -+++ b/net/roce/roce_scc/hikp_roce_scc.h -@@ -58,7 +58,7 @@ struct roce_scc_module { - }; - - enum roce_scc_type { -- COMMON = 1, -+ SCC_COMMON = 1, - DCQCN, - DIP, - HC3, -@@ -66,4 +66,8 @@ enum roce_scc_type { - CFG, - }; - -+int hikp_roce_set_scc_bdf(char *nic_name); -+void hikp_roce_set_scc_submodule(uint32_t module); -+void hikp_roce_scc_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_SCC_H */ -diff --git a/net/roce/roce_timer/hikp_roce_timer.c b/net/roce/roce_timer/hikp_roce_timer.c -index 962127b..a6af959 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.c -+++ b/net/roce/roce_timer/hikp_roce_timer.c -@@ -15,6 +15,12 @@ - - static struct cmd_roce_timer_params g_roce_timer_param = { 0 }; - -+int hikp_roce_set_timer_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_timer_param.target); -+} -+ - static int hikp_roce_timer_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -192,7 +198,7 @@ static int hikp_roce_timer_clear(struct major_cmd_ctrl *self) - return 0; - } - --static void hikp_roce_timer_execute(struct major_cmd_ctrl *self) -+void hikp_roce_timer_execute(struct major_cmd_ctrl *self) - { - int (*func[])(struct major_cmd_ctrl *self) = { - hikp_roce_timer_show_cqc, hikp_roce_timer_show_qpc -diff --git a/net/roce/roce_timer/hikp_roce_timer.h b/net/roce/roce_timer/hikp_roce_timer.h -index 314547e..f82afe1 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.h -+++ b/net/roce/roce_timer/hikp_roce_timer.h -@@ -40,4 +40,7 @@ struct roce_timer_rsp_data { - uint32_t timer_content[ROCE_HIKP_TIMER_REG_NUM][2]; - }; - -+int hikp_roce_set_timer_bdf(char *nic_name); -+void hikp_roce_timer_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_TIMER_H */ -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index 68c4cf2..9b1ddb1 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -18,9 +18,25 @@ struct roce_trp_module g_roce_trp_module[] = { - ROCE_TRP_HANDLE(TRP_RX), - ROCE_TRP_HANDLE(GEN_AC), - ROCE_TRP_HANDLE(PAYL), -- ROCE_TRP_HANDLE(COMMON), -+ { "COMMON", TRP_COMMON }, - }; - -+int hikp_roce_set_trp_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_trp_param_t.target); -+} -+ -+void hikp_roce_set_trp_bankid(uint32_t bank_id) -+{ -+ g_roce_trp_param_t.bank_id = bank_id; -+} -+ -+void hikp_roce_set_trp_submodule(uint32_t module) -+{ -+ g_roce_trp_param_t.sub_cmd = module; -+} -+ - static int hikp_roce_trp_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -86,7 +102,7 @@ static int hikp_roce_trp_bank_get(struct major_cmd_ctrl *self, const char *argv) - static int hikp_roce_trp_bank_check(void) - { - switch (g_roce_trp_param_t.sub_cmd) { -- case (COMMON): -+ case (TRP_COMMON): - if (g_roce_trp_param_t.bank_id > TRP_MAX_BANK_NUM) - return -EINVAL; - break; -@@ -341,7 +357,7 @@ static const struct reg_name_info { - const char **reg_name; - uint8_t arr_len; - } g_trp_reg_name_info_table[] = { -- {COMMON, g_trp_common_reg_name, HIKP_ARRAY_SIZE(g_trp_common_reg_name)}, -+ {TRP_COMMON, g_trp_common_reg_name, HIKP_ARRAY_SIZE(g_trp_common_reg_name)}, - {TRP_RX, g_trp_trp_rx_reg_name, HIKP_ARRAY_SIZE(g_trp_trp_rx_reg_name)}, - {GEN_AC, g_trp_gen_ac_reg_name, HIKP_ARRAY_SIZE(g_trp_gen_ac_reg_name)}, - {PAYL, g_trp_payl_reg_name, HIKP_ARRAY_SIZE(g_trp_payl_reg_name)}, -@@ -377,7 +393,7 @@ static void hikp_roce_trp_print(uint8_t total_block_num, - printf("***********************************\n"); - } - --static void hikp_roce_trp_execute(struct major_cmd_ctrl *self) -+void hikp_roce_trp_execute(struct major_cmd_ctrl *self) - { - struct roce_trp_head res_head; - uint32_t *offset_start = NULL; -diff --git a/net/roce/roce_trp/hikp_roce_trp.h b/net/roce/roce_trp/hikp_roce_trp.h -index 212d36f..023e290 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.h -+++ b/net/roce/roce_trp/hikp_roce_trp.h -@@ -67,7 +67,12 @@ enum roce_trp_type { - TRP_RX = 1, - GEN_AC, - PAYL, -- COMMON, -+ TRP_COMMON, - }; - -+void hikp_roce_set_trp_submodule(uint32_t module); -+void hikp_roce_set_trp_bankid(uint32_t bank_id); -+int hikp_roce_set_trp_bdf(char *nic_name); -+void hikp_roce_trp_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_TRP_H */ -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.c b/net/roce/roce_tsp/hikp_roce_tsp.c -index 9dd7956..e07e882 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.c -+++ b/net/roce/roce_tsp/hikp_roce_tsp.c -@@ -15,11 +15,27 @@ - - static struct cmd_roce_tsp_param_t g_roce_tsp_param_t = { 0 }; - static struct roce_tsp_module g_roce_tsp_module[] = { -- TSP_HANDLE(COMMON), -+ { "COMMON", TSP_COMMON }, - TSP_HANDLE(TDP), - TSP_HANDLE(TGP_TMP), - }; - -+int hikp_roce_set_tsp_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_tsp_param_t.target); -+} -+ -+void hikp_roce_set_tsp_bankid(uint32_t bank_id) -+{ -+ g_roce_tsp_param_t.bank_id = bank_id; -+} -+ -+void hikp_roce_set_tsp_submodule(uint32_t module) -+{ -+ g_roce_tsp_param_t.sub_cmd_code = module; -+} -+ - static int hikp_roce_tsp_help(struct major_cmd_ctrl *self, const char *argv) - { - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -@@ -85,7 +101,7 @@ static int hikp_roce_tsp_bank_get(struct major_cmd_ctrl *self, const char *argv) - static int hikp_roce_tsp_bank_check(void) - { - switch (g_roce_tsp_param_t.sub_cmd_code) { -- case (COMMON): -+ case (TSP_COMMON): - if (g_roce_tsp_param_t.bank_id > MAX_TSP_BANK_NUM) - return -EINVAL; - break; -@@ -194,9 +210,11 @@ static const struct reg_name_info { - const char **reg_name; - uint8_t arr_len; - } g_tsp_reg_name_info_table[] = { -- {COMMON, g_tsp_common_reg_name, HIKP_ARRAY_SIZE(g_tsp_common_reg_name)}, -+ {TSP_COMMON, g_tsp_common_reg_name, -+ HIKP_ARRAY_SIZE(g_tsp_common_reg_name)}, - {TDP, g_tsp_tdp_reg_name, HIKP_ARRAY_SIZE(g_tsp_tdp_reg_name)}, -- {TGP_TMP, g_tsp_tgp_tmp_reg_name, HIKP_ARRAY_SIZE(g_tsp_tgp_tmp_reg_name)}, -+ {TGP_TMP, g_tsp_tgp_tmp_reg_name, -+ HIKP_ARRAY_SIZE(g_tsp_tgp_tmp_reg_name)}, - }; - - static void hikp_roce_tsp_print(uint32_t total_block_num, -@@ -229,7 +247,7 @@ static void hikp_roce_tsp_print(uint32_t total_block_num, - printf("***********************************\n"); - } - --static void hikp_roce_tsp_execute(struct major_cmd_ctrl *self) -+void hikp_roce_tsp_execute(struct major_cmd_ctrl *self) - { - struct roce_tsp_res_param *roce_tsp_res; - struct roce_tsp_req_param req_data; -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.h b/net/roce/roce_tsp/hikp_roce_tsp.h -index a35f869..12bd0a3 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.h -+++ b/net/roce/roce_tsp/hikp_roce_tsp.h -@@ -56,9 +56,14 @@ struct roce_tsp_module { - }; - - enum roce_tsp_sub_cmd_code { -- COMMON = 1, -+ TSP_COMMON = 1, - TDP, - TGP_TMP, - }; - -+int hikp_roce_set_tsp_bdf(char *nic_name); -+void hikp_roce_set_tsp_bankid(uint32_t bank_id); -+void hikp_roce_set_tsp_submodule(uint32_t module); -+void hikp_roce_tsp_execute(struct major_cmd_ctrl *self); -+ - #endif /* HIKP_ROCE_TSP_H */ -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.c b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -index d3534f5..695d40f 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.c -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.c -@@ -69,7 +69,7 @@ union pm_state_reg { - uint64_t val; - }; - --static int pcie_get_ltssm_trace(uint32_t port_id, uint64_t *ltssm_status, uint32_t *ltssm_num) -+int pcie_get_ltssm_trace(uint32_t port_id, uint64_t *ltssm_status, uint32_t *ltssm_num) - { - struct hikp_cmd_header req_header; - struct hikp_cmd_ret *cmd_ret = NULL; -diff --git a/pcie/func_lib/pcie_func/pcie_link_ltssm.h b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -index 278f3e4..9d02557 100644 ---- a/pcie/func_lib/pcie_func/pcie_link_ltssm.h -+++ b/pcie/func_lib/pcie_func/pcie_link_ltssm.h -@@ -59,5 +59,6 @@ int pcie_ltssm_trace_clear(uint32_t port_id); - int pcie_ltssm_trace_mode_set(uint32_t port_id, uint32_t mode); - int pcie_ltssm_link_status_get(uint32_t port_id); - int pcie_pm_trace(uint32_t port_id); -+int pcie_get_ltssm_trace(uint32_t port_id, uint64_t *ltssm_status, uint32_t *ltssm_num); - - #endif /* PCIE_LINK_LTSSM_H */ -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index abf0e26..0ce2e5d 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -17,13 +17,13 @@ - #include - #include - #include --#include "tool_lib.h" - #include "hikptdev_plug.h" - #include "os_common.h" - #include "pcie_common.h" - #include "pcie_reg_dump.h" - - int g_pcie_dumpreg_fd; -+char dumpreg_log_file[MAX_LOG_NAME_LEN + 1] = {0}; - - struct pcie_dumpreg_info g_reg_table_tl[] = { - {0, "TL_ASPM_IDLE_CNT"}, -@@ -412,6 +412,9 @@ static int pcie_create_dumpreg_log_file(uint32_t port_id, uint32_t dump_level) - if (ret) - return -EINVAL; - -+ memset(dumpreg_log_file, 0, sizeof(dumpreg_log_file)); -+ (void)strncpy((char *)dumpreg_log_file, file_name, MAX_LOG_NAME_LEN + 1); -+ - (void)remove((const char *)file_name); - /* Add write permission to the file */ - fd_file = open(file_name, O_RDWR | O_SYNC | O_CREAT, 0600); -@@ -558,7 +561,7 @@ int pcie_dumpreg_do_dump(uint32_t port_id, uint32_t dump_level) - struct pcie_dump_req_para req_data = { 0 }; - int ret = 0; - -- Info("pcie reg dump start.\n"); -+ Info("hikptool pcie_dumpreg -i %u -l %u -d\n", port_id, dump_level); - - req_data.port_id = port_id; - req_data.level = dump_level; -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.h b/pcie/func_lib/pcie_func/pcie_reg_dump.h -index aaf22ba..3c52a6e 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.h -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.h -@@ -15,10 +15,12 @@ - #define PCIE_REG_DUMP_H - - #include "pcie_common_api.h" -+#include "tool_lib.h" - - #define PCIE_REG_NAME_LEN 60 - #define MAX_STR_LEN 80 - #define PCIE_DUMPREG_LOGFILE_NAME "pcie_dumpreg" -+#define LOG_FILE_PATH_MAX_LEN 512 - - #define HIKP_PCIE_PCS_LANE_TBL_ENTRY(name) \ - {0, STR(CONTACT(name, _00))}, {0, STR(CONTACT(name, _01))}, \ -@@ -54,6 +56,8 @@ struct pcie_dumpreg_table { - struct pcie_dumpreg_info *dump_info; - }; - -+extern char dumpreg_log_file[MAX_LOG_NAME_LEN + 1]; - int pcie_dumpreg_do_dump(uint32_t port_id, uint32_t dump_level); - -+ - #endif /* PCIE_REG_DUMP_H */ -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.c b/pcie/func_lib/pcie_func/pcie_statistics.c -index be187f2..c7fee0b 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.c -+++ b/pcie/func_lib/pcie_func/pcie_statistics.c -@@ -29,7 +29,7 @@ static const char *g_global_ndie_name[] = { - "Ndie_A", "Ndie_B", "Ndie_C", "Ndie_D" - }; - --static int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, uint32_t *port_num) -+int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, uint32_t *port_num) - { - size_t rsp_data_size, expect_data_size; - struct pcie_port_info *port_info = NULL; -diff --git a/pcie/func_lib/pcie_func/pcie_statistics.h b/pcie/func_lib/pcie_func/pcie_statistics.h -index c373573..d7a68e2 100644 ---- a/pcie/func_lib/pcie_func/pcie_statistics.h -+++ b/pcie/func_lib/pcie_func/pcie_statistics.h -@@ -15,6 +15,7 @@ - #define PCIE_STATISTICS_H - - #include "pcie_common_api.h" -+#include "hikptdev_plug.h" - - #define GLOBAL_WIDTH_TABLE_SIZE 5 - #define MAX_MACRO_ONEPORT 3 -@@ -126,5 +127,6 @@ struct pcie_info_req_para { - int pcie_port_distribution_get(uint32_t chip_id); - int pcie_error_state_get(uint32_t port_id); - int pcie_error_state_clear(uint32_t port_id); -+int port_distribution_rsp_data_check(const struct hikp_cmd_ret *cmd_ret, uint32_t *port_num); - - #endif /* PCIE_STATISTICS_H */ -diff --git a/sas/sas_func/sas_common.h b/sas/sas_func/sas_common.h -index eed0fa5..78edf2e 100644 ---- a/sas/sas_func/sas_common.h -+++ b/sas/sas_func/sas_common.h -@@ -16,7 +16,7 @@ - - #define RESP_MAX_NUM 60 - #define SAS_MAX_PHY_NUM 7 --#define SAS_MAX_ERR_NUM 6 -+#define SAS_MAX_ERR_NUM 5 - #define SAS_ERR_NUM 4 - #define SAS_QUEUE_NUM 16 - #define IPTT_ICT_STATUS 29 -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index 92e380e..2367382 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -24,6 +24,10 @@ static struct cmd_serdes_param g_serdes_param = {0xff, 0xff, 0xff, 0xff, 0xff, 0 - - #define SERDES_OUTPUT_MAX_SIZE 2560 - static char g_serdes_data_out_buf[SERDES_OUTPUT_MAX_SIZE] = {0}; -+static struct hilink_cmd_out g_out_put = {0}; -+ -+static void hikp_serdes_info_print(struct cmd_serdes_param *cmd); -+static void hikp_serdes_dump_print(struct cmd_serdes_param *cmd); - - static int cmd_serdes_maininfo_help(struct major_cmd_ctrl *self, const char *argv) - { -@@ -120,12 +124,12 @@ static int cmd_serdes_key_info_pro(struct major_cmd_ctrl *self, const char *argv - } - - #define USEMODE_SSC_STR_MAXLEN 20 --static void hikp_serdes_brief_info_print(struct major_cmd_ctrl *self, -- const struct hilink_brief_info *data, uint32_t data_size) -+static void hikp_serdes_brief_info_print(struct cmd_serdes_param *cmd, -+ const struct hilink_brief_info *data, uint32_t data_size) - { - uint8_t ds_id; -- uint8_t start_sds_id = g_serdes_param.start_sds_id; -- uint8_t sds_num = g_serdes_param.sds_num; -+ uint8_t start_sds_id = cmd->start_sds_id; -+ uint8_t sds_num = cmd->sds_num; - char usemode_ssc_str[USEMODE_SSC_STR_MAXLEN] = {0}; - const char *usemode_array[HILINK_USE_MODE_END] = { - "default", "pcie", "sata", "sas", "hccs", -@@ -136,26 +140,20 @@ static void hikp_serdes_brief_info_print(struct major_cmd_ctrl *self, - }; - - if (data_size != sds_num) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), -- "serdes brief info data size is wrong."); -+ printf("serdes brief info data size is wrong.\n"); - return; - } - - for (ds_id = 0; ds_id < sds_num; ds_id++) { - if (data[ds_id].usemode >= HILINK_USE_MODE_END) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), -- "usemode[%u] is out of range.", data[ds_id].usemode); -+ printf("usemode[%u] is out of range.\n", data[ds_id].usemode); - return; - } - strncpy(usemode_ssc_str, usemode_array[data[ds_id].usemode], - sizeof(usemode_ssc_str) - 1); - - if (data[ds_id].ssc_type >= HILINK_SSC_TYPE_END) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), -- "ssc_type[%u] is out of range.", data[ds_id].ssc_type); -+ printf("ssc_type[%u] is out of range.\n", data[ds_id].ssc_type); - return; - } - if (data[ds_id].usemode < HILINK_USE_MODE_HCCS) { -@@ -165,7 +163,7 @@ static void hikp_serdes_brief_info_print(struct major_cmd_ctrl *self, - } - printf("chip%u (M%u,ds%d) pll(%u, %u) pn(%u, %u) power(%u, %u)" - "(refclk_sel:%u) rate(%u, %u Mhz) usemode(%s)\n", -- g_serdes_param.chip_id, g_serdes_param.macro_id, -+ cmd->chip_id, cmd->macro_id, - ds_id + start_sds_id, data[ds_id].tx_cs_sel, data[ds_id].rx_cs_sel, - data[ds_id].tx_pn, data[ds_id].rx_pn, - data[ds_id].tx_power, data[ds_id].rx_power, -@@ -200,25 +198,22 @@ static void hikp_serdes_brief_info_print(struct major_cmd_ctrl *self, - "-------------------------------------------------" \ - "--------------------------------\n") - --static void hikp_serdes_detail_info_print(struct major_cmd_ctrl *self, -- const struct hilink_detail_info *data, -- uint32_t data_size) -+static void hikp_serdes_detail_info_print(struct cmd_serdes_param *cmd, -+ const struct hilink_detail_info *data, uint32_t data_size) - { - uint32_t i; - uint8_t ds_id; -- uint8_t start_sds_id = g_serdes_param.start_sds_id; -- uint8_t sds_num = g_serdes_param.sds_num; -+ uint8_t start_sds_id = cmd->start_sds_id; -+ uint8_t sds_num = cmd->sds_num; - - if (data_size != sds_num) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), -- "serdes detail info data size is wrong."); -+ printf("serdes detail info data size is wrong.\n"); - return; - } - printf(KEY_INFO_TITLE); - for (ds_id = 0; ds_id < sds_num; ds_id++) { - printf("chip%u (M%u,ds%d) [%3d,%3d,%3u,%3d,%3d]", -- g_serdes_param.chip_id, g_serdes_param.macro_id, ds_id + start_sds_id, -+ cmd->chip_id, cmd->macro_id, ds_id + start_sds_id, - data[ds_id].tx_cfg.fir_pre2, data[ds_id].tx_cfg.fir_pre1, - data[ds_id].tx_cfg.fir_main, data[ds_id].tx_cfg.fir_post1, - data[ds_id].tx_cfg.fir_post2); -@@ -243,6 +238,8 @@ static void hikp_serdes_detail_info_print(struct major_cmd_ctrl *self, - static void hikp_serdes_logout_init(struct hilink_cmd_out *logout, char *buffer, - uint32_t size, uint32_t type) - { -+ memset(buffer, 0, size); -+ - logout->str_len = size; - logout->result_offset = 0; - logout->out_str = buffer; -@@ -282,67 +279,88 @@ static int hikp_serdes_info_para_check(struct major_cmd_ctrl *self) - return 0; - } - --static void hikp_serdes_info_cmd_execute(struct major_cmd_ctrl *self) -+static void hikp_serdes_print(struct cmd_serdes_param *cmd) -+{ -+ if (cmd->cmd_type == SERDES_KEY_INFO) -+ hikp_serdes_info_print(cmd); -+ else if (cmd->cmd_type == SERDES_DUMP_REG) -+ hikp_serdes_dump_print(cmd); -+} -+ -+int hikp_serdes_get_reponse(struct cmd_serdes_param *cmd) - { - struct hikp_cmd_header req_header = {0}; - struct hikp_cmd_ret *cmd_ret; - struct hilink_cmd_in hilink_cmd = {0}; -- struct hilink_brief_info *brief_info_data = NULL; -- struct hilink_detail_info *detail_info_data = NULL; -- struct hilink_cmd_out out_put; - size_t out_out_header_size; -- int ret; -- -- ret = hikp_serdes_info_para_check(self); -- if (ret != 0) -- return; - -- hikp_serdes_logout_init(&out_put, g_serdes_data_out_buf, SERDES_OUTPUT_MAX_SIZE, 0); -+ hilink_cmd.cmd_type = cmd->cmd_type; -+ hilink_cmd.sub_cmd = cmd->sub_cmd; -+ hilink_cmd.cmd_para.chip_id = cmd->chip_id; -+ hilink_cmd.cmd_para.macro_id = cmd->macro_id; -+ hilink_cmd.cmd_para.start_sds_id = cmd->start_sds_id; -+ hilink_cmd.cmd_para.sds_num = cmd->sds_num; - -- hilink_cmd.cmd_type = SERDES_KEY_INFO; -- hilink_cmd.sub_cmd = g_serdes_param.sub_cmd; -- hilink_cmd.cmd_para.chip_id = g_serdes_param.chip_id; -- hilink_cmd.cmd_para.macro_id = g_serdes_param.macro_id; -- hilink_cmd.cmd_para.start_sds_id = g_serdes_param.start_sds_id; -- hilink_cmd.cmd_para.sds_num = g_serdes_param.sds_num; -+ hikp_serdes_logout_init(&g_out_put, g_serdes_data_out_buf, SERDES_OUTPUT_MAX_SIZE, 0); - -- hikp_cmd_init(&req_header, SERDES_MOD, SERDES_KEY_INFO, g_serdes_param.sub_cmd); -+ hikp_cmd_init(&req_header, SERDES_MOD, cmd->cmd_type, cmd->sub_cmd); - cmd_ret = hikp_cmd_alloc(&req_header, &hilink_cmd, sizeof(hilink_cmd)); - if (cmd_ret == NULL || cmd_ret->status != 0) { -- snprintf(self->err_str, sizeof(self->err_str), "hikp_cmd_alloc err."); -- self->err_no = -EINVAL; -- goto err_out; -+ printf("hikp_cmd_alloc err.\n"); -+ hikp_cmd_free(&cmd_ret); -+ return -EINVAL; - } -- out_out_header_size = sizeof(out_put.str_len) + sizeof(out_put.result_offset) + -- sizeof(out_put.type) + sizeof(out_put.ret_val); -- memcpy(&out_put, cmd_ret->rsp_data, out_out_header_size); -+ out_out_header_size = sizeof(g_out_put.str_len) + sizeof(g_out_put.result_offset) + -+ sizeof(g_out_put.type) + sizeof(g_out_put.ret_val); -+ memcpy(&g_out_put, cmd_ret->rsp_data, out_out_header_size); - -- if ((cmd_ret->rsp_data_num * sizeof(uint32_t) - out_out_header_size) > -- SERDES_OUTPUT_MAX_SIZE) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), -- "serdes_info rsp_data data copy size error, data size:0x%zx max size:0x%x.", -+ if ((cmd_ret->rsp_data_num * sizeof(uint32_t) - out_out_header_size) > SERDES_OUTPUT_MAX_SIZE) { -+ printf("serdes_info rsp_data data copy size error, data size:0x%zx max size:0x%x.", - (cmd_ret->rsp_data_num * sizeof(uint32_t) - out_out_header_size), - SERDES_OUTPUT_MAX_SIZE); -- goto err_out; -+ hikp_cmd_free(&cmd_ret); -+ return -EINVAL; - } -- memcpy(out_put.out_str, cmd_ret->rsp_data + out_out_header_size / sizeof(uint32_t), -+ memcpy(g_out_put.out_str, cmd_ret->rsp_data + out_out_header_size / sizeof(uint32_t), - cmd_ret->rsp_data_num * sizeof(uint32_t) - out_out_header_size); -+ hikp_cmd_free(&cmd_ret); -+ -+ hikp_serdes_print(cmd); -+ -+ return 0; -+} - -- if (g_serdes_param.sub_cmd > 0) { -- detail_info_data = (struct hilink_detail_info *)out_put.out_str; -- hikp_serdes_detail_info_print(self, detail_info_data, -- out_put.result_offset / -- sizeof(struct hilink_detail_info)); -+static void hikp_serdes_info_print(struct cmd_serdes_param *cmd) -+{ -+ struct hilink_brief_info *brief_info_data = NULL; -+ struct hilink_detail_info *detail_info_data = NULL; -+ -+ if (cmd->sub_cmd > 0) { -+ detail_info_data = (struct hilink_detail_info *)g_out_put.out_str; -+ hikp_serdes_detail_info_print(cmd, detail_info_data, -+ g_out_put.result_offset / sizeof(struct hilink_detail_info)); - } else { -- brief_info_data = (struct hilink_brief_info *)out_put.out_str; -- hikp_serdes_brief_info_print(self, brief_info_data, -- out_put.result_offset / -- sizeof(struct hilink_brief_info)); -+ brief_info_data = (struct hilink_brief_info *)g_out_put.out_str; -+ hikp_serdes_brief_info_print(cmd, brief_info_data, -+ g_out_put.result_offset / sizeof(struct hilink_brief_info)); - } -+} - --err_out: -- hikp_cmd_free(&cmd_ret); -+static void hikp_serdes_info_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ int ret; -+ -+ ret = hikp_serdes_info_para_check(self); -+ if (ret != 0) -+ return; -+ -+ g_serdes_param.cmd_type = SERDES_KEY_INFO; -+ ret = hikp_serdes_get_reponse(&g_serdes_param); -+ if (ret != 0) { -+ self->err_no = ret; -+ snprintf(self->err_str, sizeof(self->err_str), "serdes_info hikp_serdes_get_reponse err\n"); -+ return; -+ } - } - - static void cmd_serdes_maininfo_init(void) -@@ -393,22 +411,27 @@ _SERDES_DUMP_SUBCMD_PRO_: - return 0; - } - --static void hikp_serdes_dump_print(struct major_cmd_ctrl *self, -- const uint32_t *data, uint32_t data_size) -+static void hikp_serdes_dump_print(struct cmd_serdes_param *cmd) - { -+ uint32_t *dump_data = (uint32_t *)g_out_put.out_str; -+ uint32_t data_size = g_out_put.result_offset / sizeof(uint32_t); - uint32_t i; - -+ if (g_out_put.type == 1) { /* 0:data; 1:string */ -+ printf("serdes dump data type is string, buffer is not enough.\n"); -+ return; -+ } -+ - /* 2: Check whether addresses and values are paired */ - if (data_size == 0 || data_size % 2 != 0) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), "serdes dump data size is wrong."); -+ printf("serdes dump data size is wrong.\n"); - return; - } - - printf("\n[-------Macro%uCS/DS%u-------]\nAddr Value", -- g_serdes_param.macro_id, g_serdes_param.start_sds_id); -+ cmd->macro_id, cmd->start_sds_id); - for (i = 0; i < data_size; i += 2) { /* 2: Addresses and values are paired */ -- printf("\n0x%04x 0x%08x", data[i], data[i + 1]); -+ printf("\n0x%04x 0x%08x", dump_data[i], dump_data[i + 1]); - } - printf("\n"); - } -@@ -444,59 +467,19 @@ static int hikp_serdes_dump_para_check(struct major_cmd_ctrl *self) - - static void hikp_serdes_dump_cmd_execute(struct major_cmd_ctrl *self) - { -- struct hikp_cmd_header req_header = {0}; -- struct hikp_cmd_ret *cmd_ret; -- struct hilink_cmd_in hilink_cmd = {0}; -- uint32_t *dump_data = NULL; -- struct hilink_cmd_out out_put; -- size_t out_out_header_size; - int ret; - - ret = hikp_serdes_dump_para_check(self); - if (ret != 0) - return; - -- hikp_serdes_logout_init(&out_put, g_serdes_data_out_buf, SERDES_OUTPUT_MAX_SIZE, 0); -- -- hilink_cmd.cmd_type = SERDES_DUMP_REG; -- hilink_cmd.sub_cmd = g_serdes_param.sub_cmd; -- hilink_cmd.cmd_para.chip_id = g_serdes_param.chip_id; -- hilink_cmd.cmd_para.macro_id = g_serdes_param.macro_id; -- hilink_cmd.cmd_para.start_sds_id = g_serdes_param.start_sds_id; -- -- hikp_cmd_init(&req_header, SERDES_MOD, SERDES_DUMP_REG, g_serdes_param.sub_cmd); -- cmd_ret = hikp_cmd_alloc(&req_header, &hilink_cmd, sizeof(hilink_cmd)); -- if (cmd_ret == NULL || cmd_ret->status != 0) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), "hikp_cmd_alloc err."); -- goto err_out; -- } -- out_out_header_size = sizeof(out_put.str_len) + sizeof(out_put.result_offset) + -- sizeof(out_put.type) + sizeof(out_put.ret_val); -- memcpy(&out_put, cmd_ret->rsp_data, out_out_header_size); -- -- if ((cmd_ret->rsp_data_num * sizeof(uint32_t) - out_out_header_size) > -- SERDES_OUTPUT_MAX_SIZE) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), -- "serdes_dump rsp_data data copy size error, data size:0x%zx max size:0x%x.", -- (cmd_ret->rsp_data_num * sizeof(uint32_t) - out_out_header_size), -- SERDES_OUTPUT_MAX_SIZE); -- goto err_out; -- } -- memcpy(out_put.out_str, cmd_ret->rsp_data + out_out_header_size / sizeof(uint32_t), -- cmd_ret->rsp_data_num * sizeof(uint32_t) - out_out_header_size); -- if (out_put.type == 1) { /* 0:data; 1:string */ -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), -- "serdes dump data type is string, buffer is not enough."); -- goto err_out; -+ g_serdes_param.cmd_type = SERDES_DUMP_REG; -+ ret = hikp_serdes_get_reponse(&g_serdes_param); -+ if (ret != 0) { -+ self->err_no = ret; -+ snprintf(self->err_str, sizeof(self->err_str), "serdes_dump hikp_serdes_get_reponse err\n"); -+ return; - } -- -- dump_data = (uint32_t *)out_put.out_str; -- hikp_serdes_dump_print(self, dump_data, out_put.result_offset / sizeof(uint32_t)); --err_out: -- hikp_cmd_free(&cmd_ret); - } - - static void cmd_serdes_dump_init(void) -diff --git a/serdes/hikp_serdes.h b/serdes/hikp_serdes.h -index 2c04e8a..4ea969d 100644 ---- a/serdes/hikp_serdes.h -+++ b/serdes/hikp_serdes.h -@@ -113,7 +113,7 @@ struct cmd_serdes_param { - uint8_t sds_num; - uint8_t val; - uint8_t sub_cmd; -- uint8_t rsvd1; -+ uint8_t cmd_type; - uint8_t rsvd2; - }; - -@@ -210,4 +210,6 @@ struct hilink_brief_info { - uint32_t rsvd_1; - }; - -+int hikp_serdes_get_reponse(struct cmd_serdes_param *cmd); -+ - #endif /* HIKP_SERDES_H */ -diff --git a/socip/hikp_socip.h b/socip/hikp_socip.h -index 8d3f31b..0b82f90 100644 ---- a/socip/hikp_socip.h -+++ b/socip/hikp_socip.h -@@ -46,4 +46,5 @@ struct socip_dump_reg_req_data_t { - uint8_t controller_id; - }; - -+void dump_reg_info(const uint32_t *reg_data, uint32_t data_num); - #endif /* HIKP_SOCIP_H */ -diff --git a/socip/hikp_socip_dumpreg.c b/socip/hikp_socip_dumpreg.c -index 4b6b70c..a3a20cb 100644 ---- a/socip/hikp_socip_dumpreg.c -+++ b/socip/hikp_socip_dumpreg.c -@@ -105,7 +105,7 @@ static bool check_socip_dumpreg_param(void) - return ret; - } - --static void dump_reg_info(const uint32_t *reg_data, uint32_t data_num) -+void dump_reg_info(const uint32_t *reg_data, uint32_t data_num) - { - #define ONE_LINE_PRINT_DATA_NUM 4 - uint32_t i; -diff --git a/tool_lib/tool_lib.c b/tool_lib/tool_lib.c -index 4d02bdd..62f5fbb 100644 ---- a/tool_lib/tool_lib.c -+++ b/tool_lib/tool_lib.c -@@ -16,6 +16,46 @@ - #include - #include - -+uint32_t get_chip_type(void) -+{ -+ char part_num_str[MIDR_BUFFER_SIZE] = {0}; -+ char midr_buffer[MIDR_BUFFER_SIZE] = {0}; -+ uint32_t chip_type = CHIP_UNKNOW; -+ uint64_t midr_el1; -+ uint32_t part_num; -+ FILE *file; -+ -+ file = fopen(MIDR_EL1_PATH, "r"); -+ if (file == NULL) { -+ HIKP_ERROR_PRINT("Open file: %s failed\n", MIDR_EL1_PATH); -+ return chip_type; -+ } -+ -+ if (fgets(midr_buffer, MIDR_BUFFER_SIZE, file) == NULL) { -+ HIKP_ERROR_PRINT("Read file: %s failed\n", MIDR_EL1_PATH); -+ fclose(file); -+ return chip_type; -+ } -+ -+ fclose(file); -+ midr_el1 = strtoul(midr_buffer, NULL, MIDR_HEX_TYPE); -+ part_num = (midr_el1 & 0xffff) >> PART_NUM_OFFSET; -+ (void)snprintf(part_num_str, MIDR_BUFFER_SIZE, "%x", part_num); -+ -+ if (strcmp(part_num_str, "d02") == 0) -+ chip_type = CHIP_HIP09; -+ else if (strcmp(part_num_str, "d03") == 0) -+ chip_type = CHIP_HIP10; -+ else if (strcmp(part_num_str, "d45") == 0) -+ chip_type = CHIP_HIP10C; -+ else if (strcmp(part_num_str, "d22") == 0) -+ chip_type = CHIP_HIP11; -+ else -+ chip_type = CHIP_UNKNOW; -+ -+ return chip_type; -+} -+ - int string_toui(const char *nptr, uint32_t *value) - { - char *endptr = NULL; -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 34cc3e8..3bf7bf8 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -90,6 +90,22 @@ struct type_trans { - #define HIKP_WARN_PRINT(x, args...) HIKP_LOG_PRINT("[ WARN ] " x, ##args) - #define HIKP_INFO_PRINT(x, args...) HIKP_LOG_PRINT("[ INFO ] " x, ##args) - #define HIKP_DBG_PRINT(x, args...) HIKP_LOG_PRINT("[ DBG ] " x, ##args) -+#define HIKP_SET_USED(x) (void)(x) -+ -+#define MIDR_EL1_PATH "/sys/devices/system/cpu/cpu0/regs/identification/midr_el1" -+#define MIDR_BUFFER_SIZE 20 -+#define PART_NUM_OFFSET 4 -+#define MIDR_HEX_TYPE 16 -+ -+enum chip_type { -+ CHIP_HIP09, -+ CHIP_HIP10, -+ CHIP_HIP10C, -+ CHIP_HIP11, -+ CHIP_UNKNOW, -+}; -+ -+uint32_t get_chip_type(void); - - int string_toui(const char *nptr, uint32_t *value); - int string_toub(const char *nptr, uint8_t *value); --- -2.45.0.windows.1 - diff --git a/0091-hikptool-Added-compilation-options.patch b/0091-hikptool-Added-compilation-options.patch deleted file mode 100644 index 167363d..0000000 --- a/0091-hikptool-Added-compilation-options.patch +++ /dev/null @@ -1,2007 +0,0 @@ -From f58af3995b2ce367210f0bf4cc8d1def791c88f9 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Fri, 14 Mar 2025 20:10:53 +0800 -Subject: [PATCH] hikptool: Added compilation options. - -The following compilation options are added: - --Wuninitialized -Wundef -Wunused -Wdate-time --Wshadow -Wvla -Wdisabled-optimization -Wempty-body -Wignored-qualifiers --Wimplicit-fallthrough=3 -Wtype-limits -Wshift-negative-value -Wswitch-default --Wframe-larger-than=8192 -Wshift-overflow=2 -Wwrite-strings -Wmissing-format-attribute --Wformat-nonliteral -Wduplicated-cond -Wtrampolines -Wlogical-op -Wsuggest-attribute=format --Wduplicated-branches -Wmissing-include-dirs -Wmissing-declarations --Wreturn-local-addr -Wredundant-decls -Wfloat-conversion -Wmissing-prototypes --Wno-discarded-qualifiers -Wstrict-prototypes - -And alos rectify compilation alarms and errors. - -Signed-off-by: veega2022 ---- - CMakeLists.txt | 10 +++++- - cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c | 16 ++++++++++ - cxl/usr_cmd/cmd_analysis/cxl_cmd_dl.c | 16 ++++++++++ - cxl/usr_cmd/cmd_analysis/cxl_cmd_membar.c | 10 ++++++ - cxl/usr_cmd/cmd_analysis/cxl_cmd_rcrb.c | 13 ++++++++ - libhikptdev/src/rciep/hikpt_rciep.c | 28 ++++++++++------ - net/hikp_net_lib.c | 4 +-- - net/nic/nic_dfx/hikp_nic_dfx.c | 2 ++ - net/nic/nic_fd/hikp_nic_fd.c | 23 +++++++------ - net/nic/nic_fec/hikp_nic_fec.c | 2 ++ - net/nic/nic_ft/hikp_nic_port_fault.c | 2 ++ - net/nic/nic_gro/hikp_nic_gro.c | 2 ++ - net/nic/nic_info/hikp_nic_info.c | 2 ++ - net/nic/nic_log/hikp_nic_log.c | 2 ++ - net/nic/nic_mac/hikp_nic_mac_dump.c | 4 +++ - net/nic/nic_mac/hikp_nic_port.c | 2 ++ - net/nic/nic_mac/hikp_nic_xsfp.c | 17 ++++++---- - net/nic/nic_ncsi/hikp_nic_ncsi.c | 2 ++ - net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c | 2 ++ - net/nic/nic_ppp/hikp_nic_ppp.c | 4 +++ - net/nic/nic_qos/hikp_nic_qos.c | 2 ++ - net/nic/nic_queue/hikp_nic_queue.c | 2 ++ - net/nic/nic_rss/hikp_nic_rss.c | 2 ++ - net/nic/nic_torus/hikp_nic_torus.c | 2 ++ - net/roce/roce_bond/hikp_roce_bond.c | 4 +++ - net/roce/roce_caep/hikp_roce_caep.c | 7 ++++ - .../roce_global_cfg/hikp_roce_global_cfg.c | 6 +++- - net/roce/roce_gmv/hikp_roce_gmv.c | 4 +++ - net/roce/roce_mdb/hikp_roce_mdb.c | 8 +++++ - net/roce/roce_pkt/hikp_roce_pkt.c | 5 +++ - net/roce/roce_qmm/hikp_roce_qmm.c | 10 ++++-- - net/roce/roce_rst/hikp_roce_rst.c | 4 +++ - net/roce/roce_scc/hikp_roce_scc.c | 5 +++ - net/roce/roce_timer/hikp_roce_timer.c | 11 ++++++- - net/roce/roce_trp/hikp_roce_trp.c | 2 ++ - net/roce/roce_tsp/hikp_roce_tsp.c | 5 +++ - net/roh/hikp_roh_mac.c | 6 ++-- - net/roh/hikp_roh_show_bp.c | 5 +++ - net/roh/hikp_roh_show_mib.c | 5 +++ - net/ub/ub_bp/hikp_ub_bp.c | 2 ++ - net/ub/ub_crd/hikp_ub_crd.c | 2 ++ - net/ub/ub_dfx/hikp_ub_dfx.c | 2 ++ - net/ub/ub_info/hikp_ub_info.c | 2 ++ - net/ub/ub_link/hikp_ub_link.c | 2 ++ - net/ub/ub_ppp/hikp_unic_ppp.c | 7 ++-- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 2 +- - pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c | 9 ++++++ - pcie/usr_cmd/cmd_analysis/pcie_cmd_info.c | 13 ++++++++ - pcie/usr_cmd/cmd_analysis/pcie_cmd_reg_read.c | 11 +++++++ - pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c | 18 +++++++++++ - sas/sas_func/sas_analy_queue.c | 2 +- - sas/sas_func/sas_dump_reg.c | 6 ++-- - sas/sas_func/sas_read_dev.c | 6 ++-- - sas/sas_func/sas_read_dqe.c | 6 ++-- - sas/sas_func/sas_read_errcode.c | 2 +- - sas/user_cmd/cmd_code/sas_cmd_anacq.c | 8 +++++ - sas/user_cmd/cmd_code/sas_cmd_anadq.c | 8 +++++ - sas/user_cmd/cmd_code/sas_cmd_common.c | 2 +- - sas/user_cmd/cmd_code/sas_cmd_dev.c | 5 +++ - sas/user_cmd/cmd_code/sas_cmd_dqe.c | 4 ++- - sas/user_cmd/cmd_code/sas_cmd_dump.c | 8 +++++ - sas/user_cmd/cmd_code/sas_cmd_errcode.c | 2 ++ - sata/sata_func/sata_dump_reg.c | 4 +-- - sata/user_cmd/cmd_code/sata_cmd_dump.c | 11 +++++++ - serdes/hikp_serdes.c | 7 ++++ - socip/hikp_socip_dumpreg.c | 2 ++ - tool_lib/op_logs.c | 32 +++++++++---------- - tool_lib/tool_lib.c | 2 +- - tool_lib/tool_lib.h | 4 +++ - 69 files changed, 377 insertions(+), 72 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index f28a870..56cc932 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -11,7 +11,15 @@ - - project(hikptool C) - --set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -fPIC -fPIE -Wall -Werror -fno-common -std=gnu11") -+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ -+ -O2 -fPIC -fPIE -Wall -Werror -Wextra -Wuninitialized -Wundef -Wunused -Wdate-time \ -+ -Wshadow -Wvla -Wdisabled-optimization -Wempty-body -Wignored-qualifiers \ -+ -Wimplicit-fallthrough=3 -Wtype-limits -Wshift-negative-value -Wswitch-default \ -+ -Wframe-larger-than=8192 -Wshift-overflow=2 -Wwrite-strings -Wmissing-format-attribute \ -+ -Wformat-nonliteral -Wduplicated-cond -Wtrampolines -Wlogical-op -Wsuggest-attribute=format \ -+ -Wduplicated-branches -Wmissing-include-dirs -Wmissing-declarations \ -+ -Wreturn-local-addr -Wredundant-decls -Wfloat-conversion -Wmissing-prototypes \ -+ -Wno-discarded-qualifiers -Wstrict-prototypes -fno-common -std=gnu11") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wfloat-equal -fstack-protector-strong -D_FORTIFY_SOURCE=2") - set(CMAKE_SKIP_RPATH TRUE) - -diff --git a/cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c b/cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c -index 2df9dc5..208a7d4 100644 ---- a/cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c -+++ b/cxl/usr_cmd/cmd_analysis/cxl_cmd_cpa.c -@@ -25,6 +25,8 @@ struct tool_cxl_cmd g_cxl_cpa_cmd = { - - static int cxl_cpa_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf(" Usage: %s\n", self->cmd_ptr->name); - printf(" %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-i", "--interface", "please input port[x] first"); -@@ -44,6 +46,8 @@ static int cxl_port_id_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret) { - printf("cxl cpa set port id err %d\n", ret); -@@ -56,6 +60,9 @@ static int cxl_port_id_set(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_cpa_err_status_show(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_cpa_cmd.cmd_type = CPA_ERR; - - return 0; -@@ -63,6 +70,9 @@ static int cxl_cpa_err_status_show(struct major_cmd_ctrl *self, const char *argv - - static int cxl_cpa_mmrg_show(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_cpa_cmd.cmd_type = CPA_MMRG; - - return 0; -@@ -70,6 +80,9 @@ static int cxl_cpa_mmrg_show(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_cpa_dump(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_cpa_cmd.cmd_type = CPA_DUMP; - - return 0; -@@ -77,6 +90,9 @@ static int cxl_cpa_dump(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_cpa_config(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_cpa_cmd.cmd_type = CPA_CONFIG; - - return 0; -diff --git a/cxl/usr_cmd/cmd_analysis/cxl_cmd_dl.c b/cxl/usr_cmd/cmd_analysis/cxl_cmd_dl.c -index 226db1e..7ac0784 100644 ---- a/cxl/usr_cmd/cmd_analysis/cxl_cmd_dl.c -+++ b/cxl/usr_cmd/cmd_analysis/cxl_cmd_dl.c -@@ -25,6 +25,8 @@ struct tool_cxl_cmd g_cxl_dl_cmd = { - - static int cxl_dl_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf(" Usage: %s\n", self->cmd_ptr->name); - printf(" %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-i", "--interface", "please input port[x] first"); -@@ -44,6 +46,8 @@ static int cxl_dl_port_id_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret) { - printf("cxl dl set port id err %d\n", ret); -@@ -56,6 +60,9 @@ static int cxl_dl_port_id_set(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_dl_err_status(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_dl_cmd.cmd_type = CXL_DL_ERR; - - return 0; -@@ -63,6 +70,9 @@ static int cxl_dl_err_status(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_dl_dump(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_dl_cmd.cmd_type = CXL_DL_DUMP; - - return 0; -@@ -70,6 +80,9 @@ static int cxl_dl_dump(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_dl_dfx(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_dl_cmd.cmd_type = CXL_DL_DFX; - - return 0; -@@ -77,6 +90,9 @@ static int cxl_dl_dfx(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_dl_fsm_state(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_dl_cmd.cmd_type = CXL_DL_FSM_STATE; - - return 0; -diff --git a/cxl/usr_cmd/cmd_analysis/cxl_cmd_membar.c b/cxl/usr_cmd/cmd_analysis/cxl_cmd_membar.c -index f444b56..0ebca4f 100644 ---- a/cxl/usr_cmd/cmd_analysis/cxl_cmd_membar.c -+++ b/cxl/usr_cmd/cmd_analysis/cxl_cmd_membar.c -@@ -25,6 +25,8 @@ struct tool_cxl_cmd g_cxl_membar_cmd = { - - static int cxl_membar_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf(" Usage: %s\n", self->cmd_ptr->name); - printf(" %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-i", "--interface", "please input port[x] first"); -@@ -42,6 +44,8 @@ static int cxl_membar_port_id_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret) { - printf("cxl membar set port id err %d\n", ret); -@@ -54,6 +58,9 @@ static int cxl_membar_port_id_set(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_membar_err_info(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_membar_cmd.cmd_type = CXL_MEMBAR_ERR; - - return 0; -@@ -61,6 +68,9 @@ static int cxl_membar_err_info(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_membar_dump(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_membar_cmd.cmd_type = CXL_MEMBAR_DUMP; - - return 0; -diff --git a/cxl/usr_cmd/cmd_analysis/cxl_cmd_rcrb.c b/cxl/usr_cmd/cmd_analysis/cxl_cmd_rcrb.c -index f83b64d..0179605 100644 ---- a/cxl/usr_cmd/cmd_analysis/cxl_cmd_rcrb.c -+++ b/cxl/usr_cmd/cmd_analysis/cxl_cmd_rcrb.c -@@ -25,6 +25,8 @@ struct tool_cxl_cmd g_cxl_rcrb_cmd = { - - static int cxl_rcrb_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf(" Usage: %s\n", self->cmd_ptr->name); - printf(" %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-i", "--interface", "please input port[x] first"); -@@ -43,6 +45,8 @@ static int cxl_rcrb_port_id_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret) { - printf("cxl rcrb set port id err %d\n", ret); -@@ -55,6 +59,9 @@ static int cxl_rcrb_port_id_set(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_rcrb_link_status(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_rcrb_cmd.cmd_type = CXL_RCRB_LINK; - - return 0; -@@ -62,6 +69,9 @@ static int cxl_rcrb_link_status(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_rcrb_header_info(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_rcrb_cmd.cmd_type = CXL_RCRB_HDR; - - return 0; -@@ -69,6 +79,9 @@ static int cxl_rcrb_header_info(struct major_cmd_ctrl *self, const char *argv) - - static int cxl_rcrb_dump(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_cxl_rcrb_cmd.cmd_type = CXL_RCRB_DUMP; - - return 0; -diff --git a/libhikptdev/src/rciep/hikpt_rciep.c b/libhikptdev/src/rciep/hikpt_rciep.c -index 5a38b3b..88ac16e 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.c -+++ b/libhikptdev/src/rciep/hikpt_rciep.c -@@ -526,27 +526,35 @@ static void hikp_munmap(void) - g_hikp_rsp = NULL; - } - -+static int hikp_dev_set_iep_fd(char *iep) -+{ -+ char path[PATH_MAX + 1] = { 0 }; -+ -+ if (strlen(iep) > PATH_MAX || realpath(iep, path) == NULL) -+ return -ENOENT; -+ -+ g_iep_fd = open(path, O_RDWR | O_SYNC); -+ if (g_iep_fd < 0) { -+ printf("failed to open %s.\n", iep); -+ return -errno; -+ } -+ -+ return 0; -+} -+ - int hikp_dev_init(void) - { - size_t i, len; - int ret = 0; - char *iep; -- char path[PATH_MAX + 1] = { 0 }; - - iep = hikp_get_iep_dir(HIKP_RESOURCE_DIR); - if (iep == NULL) - return -ENOENT; - -- if (strlen(iep) > PATH_MAX || realpath(iep, path) == NULL) { -- ret = -ENOENT; -- goto out_free_iep; -- } -- g_iep_fd = open(path, O_RDWR | O_SYNC); -- if (g_iep_fd < 0) { -- printf("failed to open %s.\n", iep); -- ret = -errno; -+ ret = hikp_dev_set_iep_fd(iep); -+ if (ret) - goto out_free_iep; -- } - - g_hikp_req = (union hikp_space_req *)mmap(0, sizeof(union hikp_space_req), - PROT_READ | PROT_WRITE, MAP_SHARED, g_iep_fd, 0); -diff --git a/net/hikp_net_lib.c b/net/hikp_net_lib.c -index f4d4c2a..7646aad 100644 ---- a/net/hikp_net_lib.c -+++ b/net/hikp_net_lib.c -@@ -309,7 +309,7 @@ int get_vf_dev_info_by_pf_dev_name(const char *pf_dev_name, - - ret = snprintf(dev_name_dir, sizeof(dev_name_dir), "%s%s%s%u%s", HIKP_NET_DEV_PATH, - pf_dev_name, HIKP_VIRTFN_PATH, vf_id, HIKP_NET_PATH); -- if (ret < 0 || ret >= sizeof(dev_name_dir)) { -+ if (ret < 0 || ret >= MAX_BUS_PCI_DIR_LEN) { - HIKP_ERROR_PRINT("get vf dev_name dir fail.\n"); - return -EIO; - } -@@ -333,7 +333,7 @@ int get_pf_dev_info_by_vf_dev_name(const char *vf_dev_name, struct tool_target * - - ret = snprintf(dev_name_dir, sizeof(dev_name_dir), "%s%s%s", HIKP_NET_DEV_PATH, - vf_dev_name, HIKP_PHYSFN_PATH); -- if (ret < 0 || ret >= sizeof(dev_name_dir)) { -+ if (ret < 0 || ret >= MAX_BUS_PCI_DIR_LEN) { - HIKP_ERROR_PRINT("get vf dev_name dir fail.\n"); - return -EIO; - } -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.c b/net/nic/nic_dfx/hikp_nic_dfx.c -index 3bc4e05..d6114de 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.c -+++ b/net/nic/nic_dfx/hikp_nic_dfx.c -@@ -424,6 +424,8 @@ static void dfx_help_info(const struct major_cmd_ctrl *self) - - static int hikp_cmd_dfx_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - dfx_help_info(self); - return 0; - } -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index d19d7c8..fb5f029 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -118,6 +118,8 @@ void hikp_nic_set_fd_idx(int feature_idx, int stage_no) - - static int hikp_nic_fd_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -@@ -640,6 +642,8 @@ static int hikp_nic_query_fd_rules(struct hikp_cmd_header *req_header, const str - uint32_t idx; - int ret = 0; - -+ HIKP_SET_USED(len); -+ - if (stage >= NIC_FD_STAGE_NUM) { - HIKP_ERROR_PRINT("The fd stage number(%d) is error!\n", stage + 1); - return -EIO; -@@ -700,6 +704,8 @@ static int hikp_nic_query_fd_counter(struct hikp_cmd_header *req_header, const s - uint16_t idx; - int ret = 0; - -+ HIKP_SET_USED(len); -+ - if (stage >= NIC_FD_STAGE_NUM) { - HIKP_ERROR_PRINT("The fd stage number(%d) is error!\n", stage + 1); - return -EIO; -@@ -757,7 +763,7 @@ static int hikp_nic_get_fd_hw_info(const struct bdf_t *bdf, struct nic_fd_hw_inf - sizeof(*hw_info)); - } - --static int hikp_nic_fd_alloc_rules_buf(struct nic_fd_rules *rules, uint8_t stage_num, -+static int hikp_nic_fd_alloc_rules_buf(struct nic_fd_rules *rules, - struct nic_fd_hw_info *hw_info, uint16_t stage_no) - { - uint16_t max_key_bytes; -@@ -775,7 +781,7 @@ static int hikp_nic_fd_alloc_rules_buf(struct nic_fd_rules *rules, uint8_t stage - return 0; - } - --static int hikp_nic_fd_alloc_counter_buf(struct nic_fd_counter *counter, uint8_t stage_num, -+static int hikp_nic_fd_alloc_counter_buf(struct nic_fd_counter *counter, - struct nic_fd_hw_info *hw_info, uint16_t stage_no) - { - counter[stage_no].entry = -@@ -789,8 +795,7 @@ static int hikp_nic_fd_alloc_counter_buf(struct nic_fd_counter *counter, uint8_t - return 0; - } - --static union nic_fd_feature_info *hikp_nic_fd_data_alloc(const struct fd_feature_cmd *fd_cmd, -- const struct nic_fd_hw_info *hw_cfg) -+static union nic_fd_feature_info *hikp_nic_fd_data_alloc(const struct fd_feature_cmd *fd_cmd) - { - uint16_t stage_no = g_fd_param.stage_no - 1; - union nic_fd_feature_info *fd_data; -@@ -803,11 +808,9 @@ static union nic_fd_feature_info *hikp_nic_fd_data_alloc(const struct fd_feature - } - - if (strcmp(fd_cmd->feature_name, NIC_FD_RULES_NAME) == 0) -- ret = hikp_nic_fd_alloc_rules_buf(fd_data->rules, NIC_FD_STAGE_NUM, -- &g_fd_hw_info, stage_no); -+ ret = hikp_nic_fd_alloc_rules_buf(fd_data->rules, &g_fd_hw_info, stage_no); - else if (strcmp(fd_cmd->feature_name, NIC_FD_COUNTER_NAME) == 0) -- ret = hikp_nic_fd_alloc_counter_buf(fd_data->counter, NIC_FD_STAGE_NUM, -- &g_fd_hw_info, stage_no); -+ ret = hikp_nic_fd_alloc_counter_buf(fd_data->counter, &g_fd_hw_info, stage_no); - if (ret != 0) - goto out; - -@@ -884,7 +887,7 @@ static int hikp_nic_fd_check_entry_index_valid(struct major_cmd_ctrl *self, - hw_entry_size = fd_cmd->sub_cmd_code == NIC_FD_RULES_INFO_DUMP ? - hw_info->alloc.stage_entry_num[stage_no] : - hw_info->alloc.stage_counter_num[stage_no]; -- if (fd_param->id >= hw_entry_size) { -+ if ((uint32_t)fd_param->id >= hw_entry_size) { - snprintf(self->err_str, sizeof(self->err_str), - "entry id(%d) must be less than hardware specifications(%u).", - fd_param->id, hw_entry_size); -@@ -963,7 +966,7 @@ void hikp_nic_fd_cmd_execute(struct major_cmd_ctrl *self) - if (ret != 0) - return; - -- fd_data = hikp_nic_fd_data_alloc(fd_cmd, &g_fd_hw_info); -+ fd_data = hikp_nic_fd_data_alloc(fd_cmd); - if (fd_data == NULL) { - HIKP_ERROR_PRINT("Fail to alloc fd data memory.\n"); - self->err_no = -ENOMEM; -diff --git a/net/nic/nic_fec/hikp_nic_fec.c b/net/nic/nic_fec/hikp_nic_fec.c -index 13c6e13..8de0b59 100644 ---- a/net/nic/nic_fec/hikp_nic_fec.c -+++ b/net/nic/nic_fec/hikp_nic_fec.c -@@ -126,6 +126,8 @@ void hikp_nic_fec_cmd_execute(struct major_cmd_ctrl *self) - - static int hikp_nic_fec_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_ft/hikp_nic_port_fault.c b/net/nic/nic_ft/hikp_nic_port_fault.c -index 331b1ec..7d15a07 100644 ---- a/net/nic/nic_ft/hikp_nic_port_fault.c -+++ b/net/nic/nic_ft/hikp_nic_port_fault.c -@@ -98,6 +98,8 @@ void hikp_nic_port_fault_cmd_execute(struct major_cmd_ctrl *self) - - static int hikp_nic_port_fault_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_gro/hikp_nic_gro.c b/net/nic/nic_gro/hikp_nic_gro.c -index d821a47..3e9b31a 100644 ---- a/net/nic/nic_gro/hikp_nic_gro.c -+++ b/net/nic/nic_gro/hikp_nic_gro.c -@@ -71,6 +71,8 @@ void hikp_nic_gro_cmd_execute(struct major_cmd_ctrl *self) - - static int hikp_nic_gro_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_info/hikp_nic_info.c b/net/nic/nic_info/hikp_nic_info.c -index 6fb17a2..b05d6ef 100644 ---- a/net/nic/nic_info/hikp_nic_info.c -+++ b/net/nic/nic_info/hikp_nic_info.c -@@ -25,6 +25,8 @@ static struct nic_info_param g_info_param = { 0 }; - - static int hikp_nic_cmd_get_info_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_log/hikp_nic_log.c b/net/nic/nic_log/hikp_nic_log.c -index be23ca3..0e2d556 100644 ---- a/net/nic/nic_log/hikp_nic_log.c -+++ b/net/nic/nic_log/hikp_nic_log.c -@@ -27,6 +27,8 @@ static char g_log_path[OP_LOG_FILE_PATH_MAXLEN] = {0}; - - static int hikp_nic_cmd_log_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -diff --git a/net/nic/nic_mac/hikp_nic_mac_dump.c b/net/nic/nic_mac/hikp_nic_mac_dump.c -index 751953c..e0d0891 100644 ---- a/net/nic/nic_mac/hikp_nic_mac_dump.c -+++ b/net/nic/nic_mac/hikp_nic_mac_dump.c -@@ -217,6 +217,8 @@ int mac_cmd_dump_reg_target(struct major_cmd_ctrl *self, const char *argv) - - static int mac_cmd_dump_reg_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i -m \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -235,6 +237,8 @@ static int mac_cmd_dump_reg_help(struct major_cmd_ctrl *self, const char *argv) - - int mac_cmd_dump_module_cfg(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ - g_dump_reg_info.module_name = argv; - - return 0; -diff --git a/net/nic/nic_mac/hikp_nic_port.c b/net/nic/nic_mac/hikp_nic_port.c -index 737de07..396c3ec 100644 ---- a/net/nic/nic_mac/hikp_nic_port.c -+++ b/net/nic/nic_mac/hikp_nic_port.c -@@ -619,6 +619,8 @@ static int mac_cmd_get_port_target(struct major_cmd_ctrl *self, const char *argv - - static int mac_cmd_port_show_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_mac/hikp_nic_xsfp.c b/net/nic/nic_mac/hikp_nic_xsfp.c -index 91daa52..fc24d59 100644 ---- a/net/nic/nic_mac/hikp_nic_xsfp.c -+++ b/net/nic/nic_mac/hikp_nic_xsfp.c -@@ -313,7 +313,7 @@ static void sfp_print_dom_info(const struct sfp_page_info *info) - (int8_t)info->page_a2.temperature[0], info->page_a2.temperature[1]); - } - --static void hikp_show_sfp_info(const uint8_t *data, uint32_t size) -+static void hikp_show_sfp_info(const uint8_t *data) - { - struct sfp_page_info *sfp_data = (struct sfp_page_info *)data; - -@@ -412,7 +412,7 @@ static void qsfp_print_dom_info(const struct qsfp_page0_info *info) - (int8_t)info->page_lower.temperature_msb, info->page_lower.temperature_lsb); - } - --static void hikp_show_qsfp_info(const uint8_t *data, uint32_t size) -+static void hikp_show_qsfp_info(const uint8_t *data) - { - struct qsfp_page0_info *qsfp_data = (struct qsfp_page0_info *)(data); - -@@ -554,7 +554,7 @@ static void cmis_print_dom_info(const struct cmis_page_info *info) - info->page0_lower.module_temp[1]); - } - --static void hikp_show_cmis_info(const uint8_t *data, uint32_t size) -+static void hikp_show_cmis_info(const uint8_t *data) - { - struct cmis_page_info *cmis_data = (struct cmis_page_info *)data; - -@@ -567,17 +567,17 @@ static void hikp_show_cmis_info(const uint8_t *data, uint32_t size) - static void hikp_xsfp_parse_info(const uint8_t *data, uint32_t size) - { - if (data[SFF_ID_OFFSET] == ID_SFP) { -- hikp_show_sfp_info(data, size); -+ hikp_show_sfp_info(data); - } else if (data[SFF_ID_OFFSET] == ID_QSFP || - data[SFF_ID_OFFSET] == ID_QSFP_PLUS || - data[SFF_ID_OFFSET] == ID_QSFP28) { -- hikp_show_qsfp_info(data, size); -+ hikp_show_qsfp_info(data); - } else if (data[SFF_ID_OFFSET] == ID_QSFP_DD || - data[SFF_ID_OFFSET] == ID_SFP_DD || - data[SFF_ID_OFFSET] == ID_QSFP_P_CMIS || - data[SFF_ID_OFFSET] == ID_SFP_DD_CMIS || - data[SFF_ID_OFFSET] == ID_SFP_P_CMIS) { -- hikp_show_cmis_info(data, size); -+ hikp_show_cmis_info(data); - } else { - /* unknown type just dump hex data */ - hikp_xsfp_dump_hex(data, size); -@@ -702,6 +702,8 @@ ERR_OUT: - - static int hikp_xsfp_show_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i [-d]"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -@@ -729,6 +731,9 @@ static int hikp_xsfp_get_target(struct major_cmd_ctrl *self, const char *argv) - - static int hikp_xsfp_dump_raw_data(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_xsfp_dump.dump_param |= XSFP_RAW_DATA_BIT; - - return 0; -diff --git a/net/nic/nic_ncsi/hikp_nic_ncsi.c b/net/nic/nic_ncsi/hikp_nic_ncsi.c -index 84f6337..955e456 100644 ---- a/net/nic/nic_ncsi/hikp_nic_ncsi.c -+++ b/net/nic/nic_ncsi/hikp_nic_ncsi.c -@@ -89,6 +89,8 @@ static int nic_ncsi_cmd_get_port_info(struct major_cmd_ctrl *self, const char *a - - static int nic_ncsi_cmd_show_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -index 4efaadc..c301dad 100644 ---- a/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -+++ b/net/nic/nic_notify_pkt/hikp_nic_notify_pkt.c -@@ -84,6 +84,8 @@ void hikp_nic_notify_pkt_cmd_execute(struct major_cmd_ctrl *self) - - static int hikp_nic_notify_pkt_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index 24f41ee..43a9000 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -66,6 +66,8 @@ void hikp_nic_ppp_set_cmd_param(int feature_idx) - - static int hikp_nic_ppp_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -@@ -788,6 +790,8 @@ static int hikp_nic_query_ppp_by_entryid(struct hikp_cmd_header *req_header, - const struct ppp_feature_cmd *ppp_cmd; - struct nic_ppp_req_para req_data = {0}; - -+ HIKP_SET_USED(len); -+ - req_data.bdf = *bdf; - ppp_cmd = &g_ppp_feature_cmd[g_ppp_param.feature_idx]; - if (strcmp(ppp_cmd->feature_name, NIC_PPP_MAC_TBL_NAME) == 0) -diff --git a/net/nic/nic_qos/hikp_nic_qos.c b/net/nic/nic_qos/hikp_nic_qos.c -index dc6f63e..6435f7c 100644 ---- a/net/nic/nic_qos/hikp_nic_qos.c -+++ b/net/nic/nic_qos/hikp_nic_qos.c -@@ -45,6 +45,8 @@ void hikp_nic_qos_set_cmd_direction(enum nic_pfc_dir dir) - - static int hikp_nic_qos_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_queue/hikp_nic_queue.c b/net/nic/nic_queue/hikp_nic_queue.c -index 5bb4335..dae634f 100644 ---- a/net/nic/nic_queue/hikp_nic_queue.c -+++ b/net/nic/nic_queue/hikp_nic_queue.c -@@ -42,6 +42,8 @@ void hikp_nic_queue_cmd_set_param(int feature_idx, int qid, enum nic_queue_dir d - - static int hikp_nic_queue_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_rss/hikp_nic_rss.c b/net/nic/nic_rss/hikp_nic_rss.c -index a7448e4..76cab8a 100644 ---- a/net/nic/nic_rss/hikp_nic_rss.c -+++ b/net/nic/nic_rss/hikp_nic_rss.c -@@ -139,6 +139,8 @@ void hikp_nic_rss_cmd_set_feature_idx(int feature_idx) - - static int hikp_nic_rss_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/nic/nic_torus/hikp_nic_torus.c b/net/nic/nic_torus/hikp_nic_torus.c -index d5e22b1..7ad5211 100644 ---- a/net/nic/nic_torus/hikp_nic_torus.c -+++ b/net/nic/nic_torus/hikp_nic_torus.c -@@ -148,6 +148,8 @@ void hikp_nic_torus_cmd_execute(struct major_cmd_ctrl *self) - - static int hikp_nic_torus_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -diff --git a/net/roce/roce_bond/hikp_roce_bond.c b/net/roce/roce_bond/hikp_roce_bond.c -index 5256804..244f29c 100644 ---- a/net/roce/roce_bond/hikp_roce_bond.c -+++ b/net/roce/roce_bond/hikp_roce_bond.c -@@ -23,6 +23,8 @@ int hikp_roce_set_bond_bdf(char *nic_name) - - static int hikp_roce_bond_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -51,6 +53,8 @@ static int hikp_roce_bond_get_data(struct hikp_cmd_ret **cmd_ret, - uint32_t req_size; - int ret; - -+ HIKP_SET_USED(reg_name); -+ - req_data.bdf = g_roce_bond_param.target.bdf; - req_data.block_id = block_id; - -diff --git a/net/roce/roce_caep/hikp_roce_caep.c b/net/roce/roce_caep/hikp_roce_caep.c -index 95795d1..290aa18 100644 ---- a/net/roce/roce_caep/hikp_roce_caep.c -+++ b/net/roce/roce_caep/hikp_roce_caep.c -@@ -28,6 +28,8 @@ void hikp_roce_set_caep_mode(uint32_t mode) - - static int hikp_roce_caep_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -59,6 +61,8 @@ static int hikp_roce_caep_get_data(struct hikp_cmd_ret **cmd_ret, - uint32_t req_size; - int ret; - -+ HIKP_SET_USED(reg_name); -+ - req_data_ext.origin_param.bdf = g_roce_caep_param_t.target.bdf; - req_data_ext.block_id = block_id; - -@@ -124,6 +128,9 @@ void hikp_roce_caep_execute(struct major_cmd_ctrl *self) - - static int hikp_roce_caep_ext_set(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_roce_caep_param_t.sub_cmd = CAEP_EXT; - - return 0; -diff --git a/net/roce/roce_global_cfg/hikp_roce_global_cfg.c b/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -index ca42dfa..8b0d93a 100644 ---- a/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -+++ b/net/roce/roce_global_cfg/hikp_roce_global_cfg.c -@@ -24,6 +24,8 @@ int hikp_roce_set_global_cfg_bdf(char *nic_name) - static int hikp_roce_global_cfg_help(struct major_cmd_ctrl *self, - const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -54,6 +56,8 @@ static int hikp_roce_global_cfg_get_data(struct hikp_cmd_ret **cmd_ret, - uint32_t req_size; - int ret; - -+ HIKP_SET_USED(reg_name); -+ - req_data.bdf = g_roce_global_cfg_param.target.bdf; - req_data.block_id = block_id; - -@@ -81,7 +85,7 @@ void hikp_roce_global_cfg_execute(struct major_cmd_ctrl *self) - ROCE_GLB_TDP_M, - ROCE_GLB_NICL, - }; -- int i; -+ size_t i; - - for (i = 0; i < HIKP_ARRAY_SIZE(sub_cmds); i++) { - g_roce_global_cfg_param.sub_cmd = sub_cmds[i]; -diff --git a/net/roce/roce_gmv/hikp_roce_gmv.c b/net/roce/roce_gmv/hikp_roce_gmv.c -index 5f96451..92bead1 100644 ---- a/net/roce/roce_gmv/hikp_roce_gmv.c -+++ b/net/roce/roce_gmv/hikp_roce_gmv.c -@@ -29,6 +29,8 @@ void hikp_roce_set_gmv_index(uint32_t gmv_index) - - static int hikp_roce_gmv_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -103,6 +105,8 @@ void hikp_roce_gmv_execute(struct major_cmd_ctrl *self) - uint32_t reg_num; - int ret; - -+ HIKP_SET_USED(self); -+ - req_data.bdf = g_roce_gmv_param.target.bdf; - req_data.gmv_index = g_roce_gmv_param.gmv_index; - hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_GMV_CMD, GMV_SHOW); -diff --git a/net/roce/roce_mdb/hikp_roce_mdb.c b/net/roce/roce_mdb/hikp_roce_mdb.c -index e0a7cc5..c0d028f 100644 ---- a/net/roce/roce_mdb/hikp_roce_mdb.c -+++ b/net/roce/roce_mdb/hikp_roce_mdb.c -@@ -29,6 +29,8 @@ void hikp_roce_set_mdb_mode(uint8_t mode) - - static int hikp_roce_mdb_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -54,6 +56,9 @@ static int hikp_roce_mdb_target(struct major_cmd_ctrl *self, const char *argv) - - static int hikp_roce_mdb_clear_set(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_roce_mdb_param.flag |= ROCE_MDB_CMD_CLEAR; - - return 0; -@@ -182,6 +187,9 @@ void hikp_roce_mdb_execute(struct major_cmd_ctrl *self) - - static int hikp_roce_mdb_ext_set(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_roce_mdb_param.flag |= ROCE_MDB_CMD_EXT; - - return 0; -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.c b/net/roce/roce_pkt/hikp_roce_pkt.c -index 5a6b268..1538788 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.c -+++ b/net/roce/roce_pkt/hikp_roce_pkt.c -@@ -23,6 +23,8 @@ int hikp_roce_set_pkt_bdf(char *nic_name) - - static int hikp_roce_pkt_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -47,6 +49,9 @@ static int hikp_roce_pkt_target(struct major_cmd_ctrl *self, const char *argv) - - static int hikp_roce_pkt_clear_set(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_roce_pkt_param_t.reset_flag = 1; - return 0; - } -diff --git a/net/roce/roce_qmm/hikp_roce_qmm.c b/net/roce/roce_qmm/hikp_roce_qmm.c -index 30caa5a..af327c2 100644 ---- a/net/roce/roce_qmm/hikp_roce_qmm.c -+++ b/net/roce/roce_qmm/hikp_roce_qmm.c -@@ -34,6 +34,8 @@ void hikp_roce_set_qmm_bankid(uint32_t bank_id) - - static int hikp_roce_qmm_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -208,7 +210,8 @@ static int hikp_roce_qmm_get_data(struct hikp_cmd_ret **cmd_ret, - struct roce_qmm_req_para_ext req_data_ext; - struct hikp_cmd_header req_header = { 0 }; - uint32_t req_size; -- int ret, i; -+ size_t i; -+ int ret; - - if (reg_name) { - for (i = 0; i < HIKP_ARRAY_SIZE(g_qmm_reg_name_info_table); i++) { -@@ -277,7 +280,7 @@ void hikp_roce_qmm_execute(struct major_cmd_ctrl *self) - {QMM_SHOW_TOP, QMM_SHOW_TOP_EXT, "TOP"}, - }; - -- for (int i = 0; i < HIKP_ARRAY_SIZE(sub_cmd_info_table); i++) { -+ for (size_t i = 0; i < HIKP_ARRAY_SIZE(sub_cmd_info_table); i++) { - g_roce_qmm_param.sub_name = sub_cmd_info_table[i].sub_name; - if (g_roce_qmm_param.ext_flag) { - g_roce_qmm_param.sub_cmd = sub_cmd_info_table[i].sub_ext_cmd; -@@ -298,6 +301,9 @@ void hikp_roce_qmm_execute(struct major_cmd_ctrl *self) - - static int hikp_roce_qmm_ext_set(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_roce_qmm_param.ext_flag = true; - - return 0; -diff --git a/net/roce/roce_rst/hikp_roce_rst.c b/net/roce/roce_rst/hikp_roce_rst.c -index cfccc47..c49074b 100644 ---- a/net/roce/roce_rst/hikp_roce_rst.c -+++ b/net/roce/roce_rst/hikp_roce_rst.c -@@ -23,6 +23,8 @@ int hikp_roce_set_rst_bdf(char *nic_name) - - static int hikp_roce_rst_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -51,6 +53,8 @@ static int hikp_roce_rst_get_data(struct hikp_cmd_ret **cmd_ret, - uint32_t req_size; - int ret; - -+ HIKP_SET_USED(reg_name); -+ - req_data.bdf = g_roce_rst_param.target.bdf; - req_data.block_id = block_id; - -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index c660799..67a2a1e 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -36,6 +36,8 @@ void hikp_roce_set_scc_submodule(uint32_t module) - - static int hikp_roce_scc_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -82,6 +84,9 @@ static int hikp_roce_scc_module_select(struct major_cmd_ctrl *self, const char * - - static int hikp_roce_scc_clear_set(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_roce_scc_param_t.reset_flag = 1; - - return 0; -diff --git a/net/roce/roce_timer/hikp_roce_timer.c b/net/roce/roce_timer/hikp_roce_timer.c -index a6af959..927d8a6 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.c -+++ b/net/roce/roce_timer/hikp_roce_timer.c -@@ -23,6 +23,8 @@ int hikp_roce_set_timer_bdf(char *nic_name) - - static int hikp_roce_timer_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -46,6 +48,9 @@ static int hikp_roce_timer_target(struct major_cmd_ctrl *self, const char *argv) - - static int hikp_roce_timer_clear_set(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_roce_timer_param.flag = ROCE_TIMER_CMD_CLEAR; - return 0; - } -@@ -120,6 +125,8 @@ static int hikp_roce_timer_show_qpc(struct major_cmd_ctrl *self) - struct hikp_cmd_ret *cmd_ret = NULL; - int ret; - -+ HIKP_SET_USED(self); -+ - req_data.bdf = g_roce_timer_param.target.bdf; - if (g_roce_timer_param.flag) - hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_TIMER_CMD, TIMER_QPC_CLEAR); -@@ -153,6 +160,8 @@ static int hikp_roce_timer_show_cqc(struct major_cmd_ctrl *self) - struct hikp_cmd_ret *cmd_ret = NULL; - int ret; - -+ HIKP_SET_USED(self); -+ - req_data.bdf = g_roce_timer_param.target.bdf; - if (g_roce_timer_param.flag) - hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_TIMER_CMD, TIMER_CQC_CLEAR); -@@ -204,7 +213,7 @@ void hikp_roce_timer_execute(struct major_cmd_ctrl *self) - hikp_roce_timer_show_cqc, hikp_roce_timer_show_qpc - }; - const char *function[] = {"show cqc", "show qpc"}; -- int i = 0; -+ size_t i = 0; - int ret; - - if (g_roce_timer_param.flag) { -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index 9b1ddb1..67dfb8e 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -39,6 +39,8 @@ void hikp_roce_set_trp_submodule(uint32_t module) - - static int hikp_roce_trp_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.c b/net/roce/roce_tsp/hikp_roce_tsp.c -index e07e882..5fe2104 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.c -+++ b/net/roce/roce_tsp/hikp_roce_tsp.c -@@ -38,6 +38,8 @@ void hikp_roce_set_tsp_submodule(uint32_t module) - - static int hikp_roce_tsp_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -118,6 +120,9 @@ static int hikp_roce_tsp_bank_check(void) - - static int hikp_roce_tsp_clear_set(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_roce_tsp_param_t.reset_flag = 1; - - return 0; -diff --git a/net/roh/hikp_roh_mac.c b/net/roh/hikp_roh_mac.c -index aa13f92..e16a3db 100644 ---- a/net/roh/hikp_roh_mac.c -+++ b/net/roh/hikp_roh_mac.c -@@ -18,6 +18,8 @@ static struct roh_mac_param g_roh_mac_param = { 0 }; - - static int hikp_roh_mac_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, - "-i -s \n"); - printf("\n %s\n", self->cmd_ptr->help_info); -@@ -96,7 +98,7 @@ int hikp_roh_get_mac_type(struct major_cmd_ctrl *self, struct bdf_t bdf) - return is_roh; - } - --static void hikp_roh_show_mac_type(struct major_cmd_ctrl *self, int mac_type) -+static void hikp_roh_show_mac_type(int mac_type) - { - if (mac_type) - printf("MAC_TYPE: ROH\n"); -@@ -382,7 +384,7 @@ static void hikp_roh_mac_execute_entry(struct major_cmd_ctrl *self) - HIKP_ERROR_PRINT("Failed get current mac type\n"); - return; - } -- hikp_roh_show_mac_type(self, mac_type); -+ hikp_roh_show_mac_type(mac_type); - break; - case (CMD_SHOW_CAM_FLAG): - if (hikp_roh_is_roh(self) > 0) -diff --git a/net/roh/hikp_roh_show_bp.c b/net/roh/hikp_roh_show_bp.c -index 0b53eda..edc1dc6 100644 ---- a/net/roh/hikp_roh_show_bp.c -+++ b/net/roh/hikp_roh_show_bp.c -@@ -17,6 +17,8 @@ static struct cmd_roh_show_bp_param g_roh_show_bp_param = { 0 }; - - static int hikp_roh_show_bp_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i -s\n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -115,6 +117,9 @@ static void hikp_roh_show_bp_execute(struct major_cmd_ctrl *self) - - static int hikp_roh_show_bp_parse(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_roh_show_bp_param.flag |= ROH_CMD_SHOW_BP; - return 0; - } -diff --git a/net/roh/hikp_roh_show_mib.c b/net/roh/hikp_roh_show_mib.c -index 5f03355..96dd688 100644 ---- a/net/roh/hikp_roh_show_mib.c -+++ b/net/roh/hikp_roh_show_mib.c -@@ -151,6 +151,8 @@ static char g_roh_mac_mib_name[MIB_EVENT_COUNT][ROH_NAME_MAX] = { - - static int hikp_roh_show_mib_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i -s\n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -@@ -253,6 +255,9 @@ static void hikp_roh_show_mib_execute(struct major_cmd_ctrl *self) - - static int hikp_roh_show_mib_parse(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - roh_show_mib_param.flag |= ROH_CMD_SHOW_MIB; - return 0; - } -diff --git a/net/ub/ub_bp/hikp_ub_bp.c b/net/ub/ub_bp/hikp_ub_bp.c -index 179aa22..2dfe69c 100644 ---- a/net/ub/ub_bp/hikp_ub_bp.c -+++ b/net/ub/ub_bp/hikp_ub_bp.c -@@ -17,6 +17,8 @@ static struct ub_bp_param g_ub_bp_param = { 0 }; - - static int hikp_ub_bp_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -diff --git a/net/ub/ub_crd/hikp_ub_crd.c b/net/ub/ub_crd/hikp_ub_crd.c -index 6d2ba21..678bc84 100644 ---- a/net/ub/ub_crd/hikp_ub_crd.c -+++ b/net/ub/ub_crd/hikp_ub_crd.c -@@ -17,6 +17,8 @@ static struct ub_crd_param g_ub_crd_param = { 0 }; - - static int hikp_ub_crd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -diff --git a/net/ub/ub_dfx/hikp_ub_dfx.c b/net/ub/ub_dfx/hikp_ub_dfx.c -index dd3a713..8a3e293 100644 ---- a/net/ub/ub_dfx/hikp_ub_dfx.c -+++ b/net/ub/ub_dfx/hikp_ub_dfx.c -@@ -44,6 +44,8 @@ static void dfx_help_info(const struct major_cmd_ctrl *self) - - static int hikp_ub_dfx_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - dfx_help_info(self); - return 0; - } -diff --git a/net/ub/ub_info/hikp_ub_info.c b/net/ub/ub_info/hikp_ub_info.c -index d113f7c..ef58ff5 100644 ---- a/net/ub/ub_info/hikp_ub_info.c -+++ b/net/ub/ub_info/hikp_ub_info.c -@@ -17,6 +17,8 @@ static struct ub_info_param g_ub_info_param = { 0 }; - - static int hikp_ub_info_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -diff --git a/net/ub/ub_link/hikp_ub_link.c b/net/ub/ub_link/hikp_ub_link.c -index 1cc1879..801e56e 100644 ---- a/net/ub/ub_link/hikp_ub_link.c -+++ b/net/ub/ub_link/hikp_ub_link.c -@@ -17,6 +17,8 @@ static struct ub_link_param g_ub_link_param = { 0 }; - - static int hikp_ub_link_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" Options:\n\n"); -diff --git a/net/ub/ub_ppp/hikp_unic_ppp.c b/net/ub/ub_ppp/hikp_unic_ppp.c -index 01c1624..4c48e70 100644 ---- a/net/ub/ub_ppp/hikp_unic_ppp.c -+++ b/net/ub/ub_ppp/hikp_unic_ppp.c -@@ -39,6 +39,8 @@ static const struct unic_ppp_feature_cmd g_unic_ppp_feature_cmd[] = { - - static int hikp_unic_ppp_cmd_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -@@ -209,8 +211,7 @@ static int hikp_unic_ppp_alloc_guid_tbl_entry(const struct hikp_unic_ppp_hw_reso - } - - static union unic_ppp_feature_info* --hikp_unic_ppp_data_alloc(const struct unic_ppp_feature_cmd *unic_ppp_cmd, -- const struct hikp_unic_ppp_hw_resources *hw_res) -+hikp_unic_ppp_data_alloc(const struct hikp_unic_ppp_hw_resources *hw_res) - { - union unic_ppp_feature_info *unic_ppp_data; - int ret = -1; -@@ -461,7 +462,7 @@ static void hikp_unic_ppp_cmd_execute(struct major_cmd_ctrl *self) - } - - unic_ppp_cmd = &g_unic_ppp_feature_cmd[g_unic_ppp_param.feature_idx]; -- unic_ppp_data = hikp_unic_ppp_data_alloc(unic_ppp_cmd, &g_unic_ppp_hw_res); -+ unic_ppp_data = hikp_unic_ppp_data_alloc(&g_unic_ppp_hw_res); - if (unic_ppp_data == NULL) { - snprintf(self->err_str, sizeof(self->err_str), - "failed to allocate unic_ppp_data memory!"); -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index 0ce2e5d..4172637 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -446,7 +446,7 @@ static void pcie_dumpreg_write_value_to_file(const char *reg_name, uint32_t val) - int ret; - - ret = snprintf(str, sizeof(str), " %-40s : 0x%x\n", reg_name, val); -- if (ret < 0 || ret >= sizeof(str)) { -+ if (ret < 0 || ret >= MAX_STR_LEN) { - Err("pcie dumpreg write info to logfile failed.\n"); - } else { - wr_ret = write(g_pcie_dumpreg_fd, str, strlen(str)); -diff --git a/pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c b/pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c -index 6d1c674..8ec0404 100644 ---- a/pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c -+++ b/pcie/usr_cmd/cmd_analysis/pcie_cmd_dumpreg.c -@@ -29,6 +29,8 @@ struct tool_pcie_cmd g_dumpreg_cmd = { - - static int pcie_dumpreg_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-i", "--interface", "please input port[x] first\n"); -@@ -48,6 +50,8 @@ static int pcie_port_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret) { - printf("info set port id err %d.\n", ret); -@@ -63,6 +67,8 @@ static int dump_level_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val = 0; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret || val < DUMP_GLOBAL_LEVEL || val > DUMP_PORT_LEVEL) { - printf("info set id err, ret = %d, val = %u\n", ret, val); -@@ -75,6 +81,9 @@ static int dump_level_set(struct major_cmd_ctrl *self, const char *argv) - - static int pcie_dumpreg_dump(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_dumpreg_cmd.cmd_type = DUMPREG_DUMP; - - return 0; -diff --git a/pcie/usr_cmd/cmd_analysis/pcie_cmd_info.c b/pcie/usr_cmd/cmd_analysis/pcie_cmd_info.c -index aeab241..f3bd46f 100644 ---- a/pcie/usr_cmd/cmd_analysis/pcie_cmd_info.c -+++ b/pcie/usr_cmd/cmd_analysis/pcie_cmd_info.c -@@ -26,6 +26,8 @@ struct tool_pcie_cmd g_info_cmd = { - - static int pcie_info_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-i", "--interface", -@@ -42,6 +44,9 @@ static int pcie_info_help(struct major_cmd_ctrl *self, const char *argv) - - static int pcie_distribution_show(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_info_cmd.cmd_type = INFO_DISTRIBUTION; - - return 0; -@@ -49,6 +54,9 @@ static int pcie_distribution_show(struct major_cmd_ctrl *self, const char *argv) - - static int pcie_err_state_show(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_info_cmd.cmd_type = INFO_ERR_STATE_SHOW; - - return 0; -@@ -56,6 +64,9 @@ static int pcie_err_state_show(struct major_cmd_ctrl *self, const char *argv) - - static int pcie_err_state_clear(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_info_cmd.cmd_type = INFO_ERR_STATE_CLEAR; - - return 0; -@@ -66,6 +77,8 @@ static int pcie_port_chip_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret) { - printf("info set id err %d\n", ret); -diff --git a/pcie/usr_cmd/cmd_analysis/pcie_cmd_reg_read.c b/pcie/usr_cmd/cmd_analysis/pcie_cmd_reg_read.c -index 6e54516..a884604 100644 ---- a/pcie/usr_cmd/cmd_analysis/pcie_cmd_reg_read.c -+++ b/pcie/usr_cmd/cmd_analysis/pcie_cmd_reg_read.c -@@ -32,6 +32,8 @@ struct tool_pcie_cmd g_regread_cmd = { - - static int pcie_reg_read_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-i", "--interface", "please input port[x] first\n"); -@@ -50,6 +52,8 @@ static int pcie_port_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret) { - printf("info set port id err %d.\n", ret); -@@ -65,6 +69,8 @@ static int read_module_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = pcie_read_name2module_id(argv, &val); - if (ret) { - printf("undefined module \"%s\".\n", argv); -@@ -80,6 +86,8 @@ static int read_offset_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret) { - printf("info set offset err %d.\n", ret); -@@ -92,6 +100,9 @@ static int read_offset_set(struct major_cmd_ctrl *self, const char *argv) - - static int pcie_reg_read_exe(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_regread_cmd.cmd_type = REGRD_READ; - - return 0; -diff --git a/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c b/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c -index 8ceb85a..7b0efde 100644 ---- a/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c -+++ b/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c -@@ -27,6 +27,8 @@ struct tool_pcie_cmd g_trace_cmd = { - - static int pcie_trace_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-i", "--interface", "please input port[x] first\n"); -@@ -45,6 +47,9 @@ static int pcie_trace_help(struct major_cmd_ctrl *self, const char *argv) - - static int pcie_trace_clear(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_trace_cmd.cmd_type = TRACE_CLEAR; - - return 0; -@@ -53,6 +58,9 @@ static int pcie_trace_clear(struct major_cmd_ctrl *self, const char *argv) - - static int pcie_trace_show(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_trace_cmd.cmd_type = TRACE_SHOW; - - return 0; -@@ -60,6 +68,9 @@ static int pcie_trace_show(struct major_cmd_ctrl *self, const char *argv) - - static int pcie_pm_show(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_trace_cmd.cmd_type = TRACE_PM; - - return 0; -@@ -70,6 +81,8 @@ static int pcie_trace_mode_set(struct major_cmd_ctrl *self, const char *argv) - int ret; - uint32_t val = 0; - -+ HIKP_SET_USED(self); -+ - g_trace_cmd.cmd_type = TRACE_MODE; - ret = string_toui(argv, &val); - if (ret || val > 1) { -@@ -83,6 +96,9 @@ static int pcie_trace_mode_set(struct major_cmd_ctrl *self, const char *argv) - - static int pcie_link_information_get(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_trace_cmd.cmd_type = TRACE_INFO; - return 0; - } -@@ -92,6 +108,8 @@ static int pcie_port_id_set(struct major_cmd_ctrl *self, const char *argv) - uint32_t val; - int ret; - -+ HIKP_SET_USED(self); -+ - ret = string_toui(argv, &val); - if (ret) { - printf("trace set port id err %d\n", ret); -diff --git a/sas/sas_func/sas_analy_queue.c b/sas/sas_func/sas_analy_queue.c -index f1d2e7e..3411f67 100644 ---- a/sas/sas_func/sas_analy_queue.c -+++ b/sas/sas_func/sas_analy_queue.c -@@ -46,7 +46,7 @@ static int sas_get_res(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; -- for (int i = 0; i < *reg_num; i++) -+ for (uint32_t i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - - hikp_cmd_free(&cmd_ret); -diff --git a/sas/sas_func/sas_dump_reg.c b/sas/sas_func/sas_dump_reg.c -index 39fa5ed..4269822 100644 ---- a/sas/sas_func/sas_dump_reg.c -+++ b/sas/sas_func/sas_dump_reg.c -@@ -38,14 +38,14 @@ static int sas_get_reg(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - return -1; - } - *reg_num = cmd_ret->rsp_data_num; -- for (int i = 0; i < *reg_num; i++) -+ for (uint32_t i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - - hikp_cmd_free(&cmd_ret); - return 0; - } - --static void sas_print_reg(uint32_t cmd_type, const uint32_t *reg_save, uint32_t reg_num) -+static void sas_print_reg(const uint32_t *reg_save, uint32_t reg_num) - { - uint32_t i; - -@@ -71,7 +71,7 @@ int sas_reg_dump(struct tool_sas_cmd *cmd) - if (ret) - return ret; - -- sas_print_reg(cmd->sas_cmd_type, reg_save, reg_num); -+ sas_print_reg(reg_save, reg_num); - - return 0; - } -diff --git a/sas/sas_func/sas_read_dev.c b/sas/sas_func/sas_read_dev.c -index b5d7e18..dec2935 100644 ---- a/sas/sas_func/sas_read_dev.c -+++ b/sas/sas_func/sas_read_dev.c -@@ -22,7 +22,7 @@ - - static int sas_get_dev(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint32_t *reg_num) - { -- int i; -+ uint32_t i; - struct hikp_cmd_header req_header; - struct hikp_cmd_ret *cmd_ret; - struct sas_dev_req_para req_data = { 0 }; -@@ -46,7 +46,7 @@ static int sas_get_dev(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - return 0; - } - --static void print_dev_link(const uint32_t *reg_save, uint32_t reg_num) -+static void print_dev_link(const uint32_t *reg_save) - { - uint32_t i; - uint32_t index, index1; -@@ -84,7 +84,7 @@ static void sas_print_dev(const uint32_t *reg_save, uint32_t reg_num, uint32_t c - } - switch (cmd_type) { - case DEV_LINK: -- print_dev_link(reg_save, reg_num); -+ print_dev_link(reg_save); - break; - default: - printf("cmd_type is error\n"); -diff --git a/sas/sas_func/sas_read_dqe.c b/sas/sas_func/sas_read_dqe.c -index dac2546..ae4ef68 100644 ---- a/sas/sas_func/sas_read_dqe.c -+++ b/sas/sas_func/sas_read_dqe.c -@@ -39,14 +39,14 @@ static int sas_get_dqe(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; -- for (int i = 0; i < *reg_num; i++) -+ for (uint32_t i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - - hikp_cmd_free(&cmd_ret); - return 0; - } - --static void print_dqe_info(const void *reg_save, uint32_t reg_num) -+static void print_dqe_info(const void *reg_save) - { - volatile struct hisi_sas_dq_info *dqe = (volatile struct hisi_sas_dq_info *)(reg_save); - -@@ -109,6 +109,6 @@ int sas_dqe(const struct tool_sas_cmd *cmd) - printf("SAS dqe is failed\n"); - return -EINVAL; - } -- print_dqe_info(reg_save, reg_num); -+ print_dqe_info(reg_save); - return 0; - } -diff --git a/sas/sas_func/sas_read_errcode.c b/sas/sas_func/sas_read_errcode.c -index d451a98..8263550 100644 ---- a/sas/sas_func/sas_read_errcode.c -+++ b/sas/sas_func/sas_read_errcode.c -@@ -37,7 +37,7 @@ static int sas_get_errcode(const struct tool_sas_cmd *cmd, uint32_t *reg_save, u - return -EINVAL; - } - *reg_num = cmd_ret->rsp_data_num; -- for (int i = 0; i < *reg_num; i++) -+ for (uint32_t i = 0; i < *reg_num; i++) - reg_save[i] = cmd_ret->rsp_data[i]; - - hikp_cmd_free(&cmd_ret); -diff --git a/sas/user_cmd/cmd_code/sas_cmd_anacq.c b/sas/user_cmd/cmd_code/sas_cmd_anacq.c -index 46bf5aa..bdaaa42 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_anacq.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_anacq.c -@@ -19,6 +19,8 @@ - - static int sas_anacq_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-c", "--chipid", "please input chip id[x] first\n"); -@@ -34,11 +36,17 @@ static int sas_anacq_help(struct major_cmd_ctrl *self, const char *argv) - - static int sas_anacq_prt(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - return sas_set_cmd_type(ANACQ_PRT); - } - - static int sas_anacq_num(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - return sas_set_cmd_type(ANACQ_NUM); - } - -diff --git a/sas/user_cmd/cmd_code/sas_cmd_anadq.c b/sas/user_cmd/cmd_code/sas_cmd_anadq.c -index e1b68b6..bff2c71 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_anadq.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_anadq.c -@@ -19,6 +19,8 @@ - - static int sas_anadq_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-c", "--chipid", "please input chip id[x] first\n"); -@@ -34,11 +36,17 @@ static int sas_anadq_help(struct major_cmd_ctrl *self, const char *argv) - - static int sas_anadq_prt(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - return sas_set_cmd_type(ANADQ_PRT); - } - - static int sas_anadq_num(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - return sas_set_cmd_type(ANADQ_NUM); - } - -diff --git a/sas/user_cmd/cmd_code/sas_cmd_common.c b/sas/user_cmd/cmd_code/sas_cmd_common.c -index 7d4ffbb..1dafc0a 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_common.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_common.c -@@ -23,7 +23,7 @@ static struct tool_sas_cmd g_sas_cmd = { - .dqe_id = (uint32_t)(-1), - }; - --int sas_set_id(struct major_cmd_ctrl *self, const char *argv, uint32_t *id) -+static int sas_set_id(struct major_cmd_ctrl *self, const char *argv, uint32_t *id) - { - int ret; - uint32_t val = 0; -diff --git a/sas/user_cmd/cmd_code/sas_cmd_dev.c b/sas/user_cmd/cmd_code/sas_cmd_dev.c -index 6a5eae0..879e764 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_dev.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_dev.c -@@ -19,6 +19,8 @@ - - static int sas_dev_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-c", "--chipid", "please input chip id[x] first\n"); -@@ -33,6 +35,9 @@ static int sas_dev_help(struct major_cmd_ctrl *self, const char *argv) - - static int sas_dev_link(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - return sas_set_cmd_type(DEV_LINK); - } - -diff --git a/sas/user_cmd/cmd_code/sas_cmd_dqe.c b/sas/user_cmd/cmd_code/sas_cmd_dqe.c -index 26bf0eb..5a85468 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_dqe.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_dqe.c -@@ -19,6 +19,8 @@ - - static int sas_dqe_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-c", "--chipid", "please input chip id[x] first\n"); -@@ -57,7 +59,7 @@ static int sas_set_queue_id(struct major_cmd_ctrl *self, const char *argv) - - static int sas_dqe_excute_funs_call(uint32_t cmd_type) - { -- if ((cmd_type != SAS_UNKNOW_CMD) && (sas_get_que_id() != (uint32_t)(-1))) -+ if ((cmd_type != SAS_UNKNOW_CMD) && (sas_get_que_id() != (-1))) - return sas_dqe(sas_get_cmd_p()); - - return -EINVAL; -diff --git a/sas/user_cmd/cmd_code/sas_cmd_dump.c b/sas/user_cmd/cmd_code/sas_cmd_dump.c -index e7dedf0..db7d2c8 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_dump.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_dump.c -@@ -19,6 +19,8 @@ - - static int sas_dump_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-c", "--chipid", "please input chip id[x] first\n"); -@@ -35,6 +37,9 @@ static int sas_dump_help(struct major_cmd_ctrl *self, const char *argv) - - static int sas_dump_global(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - (void)sas_set_cmd_type(DUMP_GLOBAL); - return 0; - } -@@ -56,6 +61,9 @@ static int sas_dump_phyx(struct major_cmd_ctrl *self, char const *argv) - - static int sas_dump_axi(struct major_cmd_ctrl *self, char const *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - (void)sas_set_cmd_type(DUMP_AXI); - return 0; - } -diff --git a/sas/user_cmd/cmd_code/sas_cmd_errcode.c b/sas/user_cmd/cmd_code/sas_cmd_errcode.c -index eb3c5e6..ebe7d1c 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_errcode.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_errcode.c -@@ -18,6 +18,8 @@ - - static int sas_errcode_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-c", "--chipid", "please input chip id[x] first\n"); -diff --git a/sata/sata_func/sata_dump_reg.c b/sata/sata_func/sata_dump_reg.c -index d63a14b..d9911d6 100644 ---- a/sata/sata_func/sata_dump_reg.c -+++ b/sata/sata_func/sata_dump_reg.c -@@ -46,7 +46,7 @@ static int sata_get_reg(const struct tool_sata_cmd *cmd, uint32_t *reg_save, uin - return 0; - } - --static void sata_print_reg(uint32_t cmd_type, const uint32_t *reg_save, uint32_t reg_num) -+static void sata_print_reg(const uint32_t *reg_save, uint32_t reg_num) - { - uint32_t i; - -@@ -72,7 +72,7 @@ int sata_reg_dump(struct tool_sata_cmd *cmd) - if (ret) - return ret; - -- sata_print_reg(cmd->sata_cmd_type, sata_reg_save, sata_reg_num); -+ sata_print_reg(sata_reg_save, sata_reg_num); - - return 0; - } -diff --git a/sata/user_cmd/cmd_code/sata_cmd_dump.c b/sata/user_cmd/cmd_code/sata_cmd_dump.c -index d38ff1c..2b74712 100644 ---- a/sata/user_cmd/cmd_code/sata_cmd_dump.c -+++ b/sata/user_cmd/cmd_code/sata_cmd_dump.c -@@ -26,6 +26,8 @@ struct tool_sata_cmd g_sata_dump_cmd = { - - static int sata_dump_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf(" %s, %-25s %s\n", "-c", "--chipid", "please input chip id[x] first\n"); -@@ -56,16 +58,25 @@ static int sata_set_id(struct major_cmd_ctrl *self, const char *argv, uint32_t * - - static int sata_set_chip_id(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - return sata_set_id(self, argv, &g_sata_dump_cmd.chip_id); - } - - static int sata_set_die_id(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - return sata_set_id(self, argv, &g_sata_dump_cmd.die_id); - } - - static int sata_dump_global(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_sata_dump_cmd.sata_cmd_type = DUMP_GLOBAL; - return 0; - } -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index 2367382..01776df 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -31,6 +31,8 @@ static void hikp_serdes_dump_print(struct cmd_serdes_param *cmd); - - static int cmd_serdes_maininfo_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, - "-i -s -n [-k]"); - printf("\n %s, e.g. hikptool serdes_info -i 0 -s m3d0 -n 4 -k\n", -@@ -119,6 +121,9 @@ static int cmd_serdes_lane_num(struct major_cmd_ctrl *self, const char *argv) - - static int cmd_serdes_key_info_pro(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ - g_serdes_param.sub_cmd = 1; - return 0; - } -@@ -379,6 +384,8 @@ static void cmd_serdes_maininfo_init(void) - - static int cmd_serdes_dump_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, - "-c -i -s "); - printf("\n %s, e.g. hikptool serdes_dump -c cs -i 0 -s m0d0\n", -diff --git a/socip/hikp_socip_dumpreg.c b/socip/hikp_socip_dumpreg.c -index a3a20cb..b3b3ed7 100644 ---- a/socip/hikp_socip_dumpreg.c -+++ b/socip/hikp_socip_dumpreg.c -@@ -39,6 +39,8 @@ static struct dump_reg_param_t g_dump_reg_param[SOCIP_DUMP_REG_PARAM_NUM] = {0}; - - static int cmd_socip_dump_help(struct major_cmd_ctrl *self, const char *argv) - { -+ HIKP_SET_USED(argv); -+ - printf("\n Usage: %s %s\n", self->cmd_ptr->name, - "-c -d -m -i "); - printf("\n %s\n", self->cmd_ptr->help_info); -diff --git a/tool_lib/op_logs.c b/tool_lib/op_logs.c -index 6f28ecd..c1c7d02 100644 ---- a/tool_lib/op_logs.c -+++ b/tool_lib/op_logs.c -@@ -246,7 +246,7 @@ int op_log_initialise(const char *log_dir) - memset(log_path, '\0', OP_LOG_FILE_PATH_MAXLEN); - memset(g_op_log, '\0', OP_LOG_FILE_PATH_MAXLEN); - ret = snprintf(log_path, sizeof(log_path), "%s", log_dir); -- if (ret < 0 || ret >= sizeof(log_path)) -+ if (ret < 0 || (size_t)ret >= sizeof(log_path)) - return -EINVAL; - - if (!is_dir_exist(log_path)) { -@@ -275,22 +275,17 @@ int op_log_initialise(const char *log_dir) - void op_log_record_input(const int argc, const char **argv) - { - char input_str[OP_LOG_FILE_W_MAXSIZE + 1] = {0}; -- struct op_log_print_t log_info[] = { -- {"%s", g_cmd_exec_time}, -- {"[%s]", input_str}, -- }; -- size_t i, arr_size; - int offset = 0; - char *arg; - int ret; - - memset(g_input_buf, 0, sizeof(g_input_buf)); - -- if (argv == NULL || argc == 0) -+ if (argv == NULL || argc <= 0) - return; - - arg = input_str; -- for (i = 0; i < argc; i++) { -+ for (int i = 0; i < argc; i++) { - ret = snprintf(arg, (sizeof(input_str) - (arg - input_str)), "%s ", argv[i]); - if (ret < 0 || ret >= (int)(sizeof(input_str) - (arg - input_str))) - return; -@@ -299,15 +294,18 @@ void op_log_record_input(const int argc, const char **argv) - } - input_str[strlen(input_str) - 1] = 0; - -- arr_size = HIKP_ARRAY_SIZE(log_info); -- for (i = 0; i < arr_size; i++) { -- ret = snprintf(g_input_buf + offset, (OP_LOG_FILE_W_MAXSIZE + 1 - offset), -- log_info[i].format, log_info[i].str); -- if (ret < 0 || ret >= (OP_LOG_FILE_W_MAXSIZE + 1 - offset)) -- return; -- -- offset += ret; -+ ret = snprintf(g_input_buf + offset, (OP_LOG_FILE_W_MAXSIZE + 1 - offset), -+ "%s", g_cmd_exec_time); -+ if (ret < 0 || ret >= (OP_LOG_FILE_W_MAXSIZE + 1 - offset)) { -+ printf("snprintf exec time failed, ret 0x%x\n", ret); -+ return; - } -+ -+ offset += ret; -+ ret = snprintf(g_input_buf + offset, (OP_LOG_FILE_W_MAXSIZE + 1 - offset), -+ "[%s]", input_str); -+ if (ret < 0 || ret >= (OP_LOG_FILE_W_MAXSIZE + 1 - offset)) -+ printf("snprintf exec cmd failed, ret 0x%x\n", ret); - } - - void op_log_record_result(int ret, const char *tool_name, const char *log_dir) -@@ -393,7 +391,7 @@ static int signal_fcntl(const char *name, uint32_t operation, int *fd) - return uda_fcntl(lock_file, operation, fd); - } - --void signal_op_log_write(int signal_code) -+static void signal_op_log_write(int signal_code) - { - char log_str[] = "[00:00:00] [KILLED<00>].\r\n"; - int op_log_fd; -diff --git a/tool_lib/tool_lib.c b/tool_lib/tool_lib.c -index 62f5fbb..3dc5dad 100644 ---- a/tool_lib/tool_lib.c -+++ b/tool_lib/tool_lib.c -@@ -245,7 +245,7 @@ int tool_flock(const char *name, uint32_t operation, int *fd, const char *log_di - } - - ret = snprintf(lock_file, sizeof(lock_file), "%s", log_dir); -- if (ret < 0 || ret >= sizeof(lock_file)) { -+ if (ret < 0 || (size_t)ret >= sizeof(lock_file)) { - HIKP_ERROR_PRINT("generate flock [%s] folder name failed, errno is %d\n", - log_dir, errno); - return -errno; -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 3bf7bf8..24b1fbb 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -90,6 +90,10 @@ struct type_trans { - #define HIKP_WARN_PRINT(x, args...) HIKP_LOG_PRINT("[ WARN ] " x, ##args) - #define HIKP_INFO_PRINT(x, args...) HIKP_LOG_PRINT("[ INFO ] " x, ##args) - #define HIKP_DBG_PRINT(x, args...) HIKP_LOG_PRINT("[ DBG ] " x, ##args) -+ -+/* definition to mark a variable or function parameter as used so -+ * as to avoid a compiler warning -+ */ - #define HIKP_SET_USED(x) (void)(x) - - #define MIDR_EL1_PATH "/sys/devices/system/cpu/cpu0/regs/identification/midr_el1" --- -2.45.0.windows.1 - diff --git a/0092-hikptool-pcie-The-query-result-of-pcie_dumpreg-does-.patch b/0092-hikptool-pcie-The-query-result-of-pcie_dumpreg-does-.patch deleted file mode 100644 index 8d6f29b..0000000 --- a/0092-hikptool-pcie-The-query-result-of-pcie_dumpreg-does-.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 4fa7bfb97799f85940d2c8cec1a2078a3a637d4d Mon Sep 17 00:00:00 2001 -From: moubingquan -Date: Fri, 20 Dec 2024 15:03:30 +0800 -Subject: [PATCH 69/81] [hikptool/ pcie]:The query result of pcie_dumpreg does - not match the register list. - -Rectify the problem that the pcie_regdump -command dump registers do not match the register table. - -Signed-off-by: moubingquan ---- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 8 ++------ - 1 file changed, 2 insertions(+), 6 deletions(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index 4172637..ad7cc7f 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -64,10 +64,8 @@ struct pcie_dumpreg_info g_reg_table_tl[] = { - {0, "TL_RX_NONPOST_CNT"}, - {0, "TL_RX_CPL_CNT"}, - {0, "TL_RX_LOC_TLP_CNT"}, -- {0, "TL_RX_ERR_STATUS"}, - {0, "TL_CFGSPACE_BDF"}, - {0, "TL_TX_UR_CNT"}, -- {0, "TL_RX_ERR_STATUS"}, - }; - - struct pcie_dumpreg_info g_reg_table_dl[] = { -@@ -126,7 +124,6 @@ struct pcie_dumpreg_info g_reg_table_mac[] = { - {0, "MAC_REG_DEBUG_PIPE9"}, - {0, "MAC_REG_DEBUG_PIPE10"}, - {0, "MAC_REG_DEBUG_PIPE11"}, -- {0, "MAC_LEAVE_L0_INFO"}, - {0, "DFX_APB_LANE_ERROR_STATUS_0"}, - {0, "DFX_APB_LANE_ERROR_STATUS_1"}, - {0, "MAC_REG_PHY_RXDATA_TS_REG"}, -@@ -255,7 +252,6 @@ struct pcie_dumpreg_info g_reg_table_iob_rx[] = { - {0, "DFX_IOB_RX_CNT_RESP_RX"}, - {0, "DFX_IOB_RX_CNT_RESP_LOC"}, - {0, "DFX_IOB_RX_CNT_RESP_RECV"}, -- {0, "IOB_RX_INT_STATUS"}, - {0, "DFX_IOB_RX_AMB_WR_CNT_0"}, - {0, "DFX_IOB_RX_AMB_WR_CNT_1"}, - {0, "DFX_IOB_RX_AMB_RD_CNT_0"}, -@@ -369,8 +365,8 @@ struct pcie_dumpreg_info g_reg_table_core_glb[] = { - {0, "CORE_INT_FE_RO_2"}, - {0, "PORT07_LINK_MODE"}, - {0, "PORT815_LINK_MODE"}, -- {0, "PCIE_LINK_DOWN_CLR_PORT_EN_REG"}, -- {0, "CORE_CLK_FLG_REG"}, -+ {0, "PCIE_LINK_DOWN_CLR_PORT_EN"}, -+ {0, "CORE_CLK_FLG"}, - }; - - struct pcie_dumpreg_info g_reg_table_core_tl[] = { --- -2.45.0.windows.1 - diff --git a/0093-hikptool-hccs-support-dump-hccs-info.patch b/0093-hikptool-hccs-support-dump-hccs-info.patch deleted file mode 100644 index 5daade3..0000000 --- a/0093-hikptool-hccs-support-dump-hccs-info.patch +++ /dev/null @@ -1,1032 +0,0 @@ -From 71cc63275102a8956afaf60f9183899cd7c4cc82 Mon Sep 17 00:00:00 2001 -From: Jie Hai -Date: Tue, 17 Dec 2024 15:29:28 +0800 -Subject: [PATCH] hikptool/hccs: support dump hccs info - -1. support dump HCCS topology. - e.g. hikptool hccs -g topo -2. support dump HCCS port fixed attributes. - e.g. hikptool hccs -g fixed_attr -c \ - -d -p -3. support dump HCCS port dfx information. - e.g. hikptool hccs -g dfx_info -c \ - -d -p - -Signed-off-by: Huisong Li -Signed-off-by: Jie Hai ---- - CMakeLists.txt | 1 + - hccs/hikp_hccs.c | 807 ++++++++++++++++++++++++++++ - hccs/hikp_hccs.h | 161 ++++++ - libhikptdev/include/hikptdev_plug.h | 1 + - 4 files changed, 970 insertions(+) - create mode 100644 hccs/hikp_hccs.c - create mode 100644 hccs/hikp_hccs.h - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 56cc932..72f2dab 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -45,6 +45,7 @@ file(GLOB_RECURSE HIKPTOOL_SRC - ${CMAKE_CURRENT_SOURCE_DIR}/sata/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/serdes/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/socip/*.c -+ ${CMAKE_CURRENT_SOURCE_DIR}/hccs/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/tool_lib/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/info_collect/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/hikp_init_main.c -diff --git a/hccs/hikp_hccs.c b/hccs/hikp_hccs.c -new file mode 100644 -index 0000000..5ef4222 ---- /dev/null -+++ b/hccs/hikp_hccs.c -@@ -0,0 +1,807 @@ -+/* -+ * Copyright (c) 2024-2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include "tool_cmd.h" -+#include "hikpt_rciep.h" -+#include "hikp_hccs.h" -+ -+enum hccs_link_fsm { -+ HCCS_PORT_RESET = 1, -+ HCCS_PORT_SETUP, -+ HCCS_PORT_CONFIG, -+ HCCS_PORT_READY -+}; -+ -+const struct { -+ enum hccs_link_fsm link_fsm; -+ const char *str; -+} link_fsm_map[] = { -+ {HCCS_PORT_RESET, "reset"}, -+ {HCCS_PORT_SETUP, "setup"}, -+ {HCCS_PORT_CONFIG, "config"}, -+ {HCCS_PORT_READY, "link-up"}, -+}; -+ -+static struct hccs_param g_hccs_param = { 0 }; -+static struct hikp_plat_hccs_info g_hccs_info = { 0 }; -+ -+static int hikp_hccs_get_plat_topo(struct hccs_param *param, -+ union hccs_feature_info *info); -+static void hikp_hccs_show_topo(union hccs_feature_info *data); -+static int hikp_hccs_get_port_attr(struct hccs_param *param, -+ union hccs_feature_info *info); -+static void hikp_hccs_show_port_attr(union hccs_feature_info *feature_info); -+static int hikp_hccs_get_port_dfx_info(struct hccs_param *param, -+ union hccs_feature_info *info); -+static void hikp_hccs_show_port_dfx_info(union hccs_feature_info *feature_info); -+static int hikp_plat_hccs_hw_info(struct hikp_plat_hccs_info *hccs_info); -+static int hikp_hccs_get_die_num(uint8_t chip_id, struct hikp_plat_hccs_info *hccs_info); -+ -+static const struct hikp_hccs_feature_cmd g_hccs_feature_cmd[] = { -+ {"topo", HCCS_GET_PORT_IDS_ON_DIE, hikp_hccs_get_plat_topo, -+ hikp_hccs_show_topo, 0}, -+ {"fixed_attr", HCCS_GET_PORT_FIXED_ATTR, hikp_hccs_get_port_attr, -+ hikp_hccs_show_port_attr, HCCS_PORT_INFO_MASK}, -+ {"dfx_info", HCCS_GET_PORT_DFX_INFO, hikp_hccs_get_port_dfx_info, -+ hikp_hccs_show_port_dfx_info, HCCS_PORT_INFO_MASK}, -+}; -+ -+static int hikp_hccs_cmd_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(argv); -+ -+ printf("\n Usage: %s\n", self->cmd_ptr->name); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-c", "--chip_id=", "target chip"); -+ printf(" %s, %-25s %s\n", "-d", "--die_id=", "target die"); -+ printf(" %s, %-25s %s\n", "-p", "--port_id=", "target port"); -+ printf(" %s\n", -+ "[-g/--get ]\n" -+ " topo : get hccs_typo info, no target specified.\n" -+ " fixed_attr : get fixed attributes for port specified by -c X -d X -p X.\n" -+ " dfx_info : get dfx info for port specified by -c X -d X -p X.\n"); -+ return 0; -+} -+ -+static int hikp_hccs_cmd_send(struct hikp_cmd_header *req_header, -+ struct hikp_hccs_req *req_data, -+ void *buff, size_t buff_len, -+ struct hikp_hccs_rsp_head *rsp_head) -+{ -+ struct hikp_cmd_ret *cmd_ret; -+ struct hikp_hccs_rsp *rsp; -+ uint64_t cur_blk_size; -+ int ret; -+ -+ cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(struct hikp_hccs_req)); -+ ret = hikp_rsp_normal_check(cmd_ret); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Failed to query from firmware! ret = %d.\n", ret); -+ goto out; -+ } -+ -+ rsp = (struct hikp_hccs_rsp *)cmd_ret->rsp_data; -+ cur_blk_size = rsp->rsp_head.cur_blk_size; -+ if (cur_blk_size == 0) { -+ HIKP_ERROR_PRINT("Firmware reported zero data size!\n"); -+ ret = -EINVAL; -+ goto out; -+ } -+ if (cur_blk_size > buff_len || -+ cur_blk_size > sizeof(struct hikp_hccs_rsp)) { -+ HIKP_ERROR_PRINT("The firmware data size (%" PRIu64 ") greater than " -+ "sw buffer(%zu) or hikp_hccs_rsp size(%zu).\n", -+ cur_blk_size, buff_len, sizeof(struct hikp_hccs_rsp)); -+ ret = -EINVAL; -+ goto out; -+ } -+ -+ memcpy(buff, rsp->rsp_data, rsp->rsp_head.cur_blk_size); -+ rsp_head->total_blk_num = rsp->rsp_head.total_blk_num; -+ rsp_head->cur_blk_size = rsp->rsp_head.cur_blk_size; -+ -+out: -+ hikp_cmd_free(&cmd_ret); -+ return ret; -+} -+ -+static int hikp_hccs_query(struct hikp_cmd_header *req_header, -+ struct hikp_hccs_req *req_data, -+ void *buff, size_t buff_len) -+{ -+ struct hikp_hccs_rsp_head rsp_head = {0}; -+ uint16_t total_blk_size = 0; -+ uint16_t total_blk_num; -+ uint16_t blk_id = 0; -+ int ret; -+ -+ ret = hikp_hccs_cmd_send(req_header, req_data, buff, buff_len, &rsp_head); -+ if (ret != 0) -+ return ret; -+ total_blk_num = rsp_head.total_blk_num; -+ total_blk_size += rsp_head.cur_blk_size; -+ for (blk_id = 1; blk_id < total_blk_num; blk_id++) { -+ if (buff_len <= total_blk_size) { -+ HIKP_ERROR_PRINT("No enough buffer to get block-(%u) context.\n", -+ blk_id); -+ return -EINVAL; -+ } -+ -+ req_data->head.blk_id = blk_id; -+ ret = hikp_hccs_cmd_send(req_header, req_data, -+ (uint8_t *)buff + total_blk_size, -+ buff_len - total_blk_size, &rsp_head); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Failed to get context for block-(%u)!\n", -+ blk_id); -+ return -EINVAL; -+ } -+ total_blk_size += rsp_head.cur_blk_size; -+ } -+ -+ return 0; -+} -+ -+static int hikp_hccs_get_chip_num(struct hikp_plat_hccs_info *hccs_info) -+{ -+ struct hccs_chip_num_rsp_data rsp_data = {0}; -+ struct hikp_cmd_header req_header = {0}; -+ struct hikp_hccs_req req = {0}; -+ int ret; -+ -+ hikp_cmd_init(&req_header, HCCS_MOD, HCCS_GET_CHIP_NUM, 0); -+ ret = hikp_hccs_query(&req_header, &req, -+ &rsp_data, sizeof(struct hccs_chip_num_rsp_data)); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Failed to get chip number from firmware, ret = %d!\n", ret); -+ return ret; -+ } -+ -+ if (rsp_data.chip_num == 0) { -+ HIKP_ERROR_PRINT("The chip number obtained from firmware is zero!\n"); -+ return -EINVAL; -+ } -+ hccs_info->chip_num = rsp_data.chip_num; -+ -+ return 0; -+} -+ -+static int hikp_hccs_get_die_num(uint8_t chip_id, struct hikp_plat_hccs_info *hccs_info) -+{ -+ struct hccs_die_num_rsp_data rsp_data = {0}; -+ struct hikp_cmd_header req_header = {0}; -+ struct hccs_die_num_req_para *req_param; -+ struct hikp_hccs_req req = {0}; -+ int ret; -+ -+ hikp_cmd_init(&req_header, HCCS_MOD, HCCS_GET_DIE_NUM, 0); -+ req_param = (struct hccs_die_num_req_para *)&req.req_data; -+ req_param->chip_id = chip_id; -+ ret = hikp_hccs_query(&req_header, &req, -+ &rsp_data, sizeof(struct hccs_die_num_rsp_data)); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Failed to get die number from firmware, ret = %d!\n", ret); -+ return ret; -+ } -+ -+ hccs_info->chip_info[chip_id].die_num = rsp_data.die_num; -+ return 0; -+} -+ -+static int hikp_hccs_get_die_info(struct hccs_die_info *die_info, -+ uint8_t chip_id, uint8_t die_idx) -+{ -+ struct hccs_die_info_rsp_data rsp_data = {0}; -+ struct hccs_die_info_req_para *req_param; -+ struct hikp_cmd_header req_header = {0}; -+ struct hikp_hccs_req req = {0}; -+ int ret; -+ -+ hikp_cmd_init(&req_header, HCCS_MOD, HCCS_GET_DIE_INFO, 0); -+ req_param = (struct hccs_die_info_req_para *)&req.req_data; -+ req_param->chip_id = chip_id; -+ req_param->die_idx = die_idx; -+ ret = hikp_hccs_query(&req_header, &req, -+ &rsp_data, sizeof(struct hccs_die_info_rsp_data)); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Fail to get die information from firmware, ret = %d!\n", ret); -+ return ret; -+ } -+ -+ die_info->die_id = rsp_data.die_id; -+ die_info->port_num = rsp_data.port_num; -+ return 0; -+} -+ -+static int hikp_hccs_get_all_die_info(struct hikp_plat_hccs_info *hccs_info) -+{ -+ uint8_t chip_id, die_idx, die_num; -+ struct hccs_chip_info *chip_info; -+ struct hccs_die_info *die_info; -+ bool has_die = false; -+ int ret; -+ -+ for (chip_id = 0; chip_id < hccs_info->chip_num; chip_id++) { -+ chip_info = &hccs_info->chip_info[chip_id]; -+ die_num = chip_info->die_num; -+ if (die_num == 0) -+ continue; -+ -+ has_die = true; -+ die_info = (struct hccs_die_info *)calloc(die_num, sizeof(struct hccs_die_info)); -+ if (die_info == NULL) { -+ HIKP_ERROR_PRINT("Failed to allocate memory for die information!\n"); -+ return -ENOMEM; -+ } -+ chip_info->die_info = die_info; -+ for (die_idx = 0; die_idx < die_num; die_idx++, die_info++) { -+ ret = hikp_hccs_get_die_info(die_info, chip_id, die_idx); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("Failed to get die information for die idx %u!\n", -+ die_idx); -+ return ret; -+ } -+ } -+ } -+ -+ return has_die ? 0 : -EINVAL; -+} -+ -+static int hikp_hccs_get_ports_on_die(uint8_t *port_ids, uint16_t port_num, -+ uint8_t chip_id, uint8_t die_id) -+{ -+ struct hccs_die_ports_req_para *req_param; -+ struct hikp_cmd_header req_header = {0}; -+ struct hikp_hccs_req req = {0}; -+ int ret; -+ -+ hikp_cmd_init(&req_header, HCCS_MOD, HCCS_GET_PORT_IDS_ON_DIE, 0); -+ req_param = (struct hccs_die_ports_req_para *)&req.req_data; -+ req_param->chip_id = chip_id; -+ req_param->die_id = die_id; -+ ret = hikp_hccs_query(&req_header, &req, -+ port_ids, sizeof(uint8_t) * port_num); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Fail to get port ids from firmware, ret = %d!\n", ret); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static int hikp_hccs_get_all_port_info(struct hikp_plat_hccs_info *hccs_info) -+{ -+ struct hccs_chip_info *chip_info; -+ struct hccs_die_info *die_info; -+ struct hccs_die_info *dies; -+ uint8_t chip_id, die_idx; -+ bool has_port = false; -+ int ret; -+ -+ for (chip_id = 0; chip_id < hccs_info->chip_num; chip_id++) { -+ chip_info = &hccs_info->chip_info[chip_id]; -+ dies = chip_info->die_info; -+ has_port = false; -+ for (die_idx = 0; die_idx < chip_info->die_num; die_idx++) { -+ die_info = &dies[die_idx]; -+ if (die_info->port_num == 0) -+ continue; -+ -+ has_port = true; -+ die_info->port_ids = (uint8_t *)calloc(die_info->port_num, -+ sizeof(uint8_t)); -+ if (die_info->port_ids == NULL) -+ return -ENOMEM; -+ -+ ret = hikp_hccs_get_ports_on_die(die_info->port_ids, die_info->port_num, -+ chip_id, die_info->die_id); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("Failed to get port ids for " -+ "chip (%u) die idx (%u)!\n", -+ chip_id, die_idx); -+ return ret; -+ } -+ } -+ } -+ -+ return has_port ? 0 : -EINVAL; -+} -+ -+static int hikp_hccs_get_chip_info(struct hikp_plat_hccs_info *hccs_info) -+{ -+ uint8_t chip_id; -+ int ret; -+ -+ ret = hikp_hccs_get_chip_num(hccs_info); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("Failed to get chip num!\n"); -+ return ret; -+ } -+ -+ hccs_info->chip_info = (struct hccs_chip_info *)calloc(hccs_info->chip_num, -+ sizeof(struct hccs_chip_info)); -+ if (hccs_info->chip_info == NULL) { -+ HIKP_ERROR_PRINT("Failed to allocate memory for chip info!\n"); -+ return -ENOMEM; -+ } -+ -+ for (chip_id = 0; chip_id < hccs_info->chip_num; chip_id++) { -+ ret = hikp_hccs_get_die_num(chip_id, hccs_info); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("Failed to get die num!\n"); -+ return ret; -+ } -+ } -+ -+ return 0; -+} -+ -+static int hikp_plat_hccs_hw_info(struct hikp_plat_hccs_info *hccs_info) -+{ -+ int ret; -+ -+ ret = hikp_hccs_get_chip_info(hccs_info); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Failed to get chip info, ret = %d!\n", ret); -+ return ret; -+ } -+ -+ ret = hikp_hccs_get_all_die_info(hccs_info); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Failed to get all die info, ret = %d!\n", ret); -+ return ret; -+ } -+ -+ ret = hikp_hccs_get_all_port_info(hccs_info); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Failed to get all port info, ret = %d!\n", ret); -+ return ret; -+ } -+ return 0; -+} -+ -+static int hikp_hccs_get_plat_topo(struct hccs_param *param, -+ union hccs_feature_info *info) -+{ -+ int ret; -+ -+ HIKP_SET_USED(param); -+ HIKP_SET_USED(info); -+ -+ ret = hikp_plat_hccs_hw_info(&g_hccs_info); -+ if (ret < 0) { -+ HIKP_ERROR_PRINT("Failed to get HCCS hardware info, ret = %d!\n", ret); -+ return ret; -+ } -+ return 0; -+} -+ -+static void hikp_plat_hccs_free(struct hikp_plat_hccs_info *hccs_info) -+{ -+ struct hccs_chip_info *chip_info; -+ struct hccs_die_info *die_info; -+ uint8_t chip_id, die_idx; -+ -+ if (hccs_info->chip_info == NULL) -+ return; -+ -+ for (chip_id = 0; chip_id < hccs_info->chip_num; chip_id++) { -+ chip_info = &hccs_info->chip_info[chip_id]; -+ die_info = chip_info->die_info; -+ if (die_info == NULL) -+ continue; -+ -+ for (die_idx = 0; die_idx < chip_info->die_num; die_idx++) { -+ if (die_info[die_idx].port_ids == NULL) -+ continue; -+ free(die_info[die_idx].port_ids); -+ die_info[die_idx].port_ids = NULL; -+ } -+ free(die_info); -+ chip_info->die_info = NULL; -+ } -+ free(hccs_info->chip_info); -+ hccs_info->chip_info = NULL; -+} -+ -+static bool hikp_hccs_die_id_valid(struct hikp_plat_hccs_info *hccs_info, -+ struct hccs_param *param, uint8_t *die_idx) -+{ -+ struct hccs_chip_info *chip_info; -+ struct hccs_die_info *die_info; -+ uint8_t idx; -+ -+ chip_info = &hccs_info->chip_info[param->chip_id]; -+ die_info = chip_info->die_info; -+ for (idx = 0; idx < chip_info->die_num; idx++) { -+ if (param->die_id != die_info[idx].die_id) -+ continue; -+ *die_idx = idx; -+ return true; -+ } -+ return false; -+} -+ -+static bool hikp_hccs_port_id_valid(struct hikp_plat_hccs_info *hccs_info, -+ struct hccs_param *param, uint8_t die_idx) -+{ -+ struct hccs_chip_info *chip_info; -+ struct hccs_die_info *die_info; -+ uint8_t port_id, *port_ids; -+ -+ chip_info = &hccs_info->chip_info[param->chip_id]; -+ die_info = &chip_info->die_info[die_idx]; -+ port_ids = die_info->port_ids; -+ -+ for (port_id = 0; port_id < die_info->port_num; port_id++) { -+ if (param->port_id == port_ids[port_id]) -+ return true; -+ } -+ -+ return false; -+} -+ -+static bool hikp_hccs_req_param_check(struct hikp_plat_hccs_info *hccs_info, -+ struct hccs_param *param) -+{ -+ uint8_t die_idx; -+ -+ if (param->chip_id >= hccs_info->chip_num) { -+ HIKP_ERROR_PRINT("param error: chip id %u exceed chip number %u!\n", -+ param->chip_id, hccs_info->chip_num); -+ return false; -+ } -+ -+ if (!hikp_hccs_die_id_valid(hccs_info, param, &die_idx)) { -+ HIKP_ERROR_PRINT("Param error: die%u not found on chip%u!\n", -+ param->die_id, param->chip_id); -+ return false; -+ } -+ -+ if (!hikp_hccs_port_id_valid(hccs_info, param, die_idx)) { -+ HIKP_ERROR_PRINT("Param error: port id %u not found on chip%u die%u!\n", -+ param->port_id, param->chip_id, param->die_id); -+ return false; -+ } -+ -+ return true; -+} -+ -+static int hikp_hccs_get_port_attr(struct hccs_param *param, -+ union hccs_feature_info *info) -+{ -+ struct hccs_port_attr_req_para *req_para; -+ struct hikp_cmd_header req_header = {0}; -+ struct hikp_hccs_req req = {0}; -+ int ret; -+ -+ ret = hikp_plat_hccs_hw_info(&g_hccs_info); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Failed to get HCCS hardware info for " -+ "port attributes, ret = %d.\n", ret); -+ return ret; -+ } -+ -+ if (!hikp_hccs_req_param_check(&g_hccs_info, param)) -+ return -EINVAL; -+ -+ hikp_cmd_init(&req_header, HCCS_MOD, HCCS_GET_PORT_FIXED_ATTR, 0); -+ req_para = (struct hccs_port_attr_req_para *)&req.req_data; -+ req_para->chip_id = param->chip_id; -+ req_para->die_id = param->die_id; -+ req_para->port_id = param->port_id; -+ ret = hikp_hccs_query(&req_header, &req, -+ info, sizeof(union hccs_feature_info)); -+ if (ret != 0) -+ return ret; -+ return 0; -+} -+ -+static int hikp_hccs_get_port_dfx_info(struct hccs_param *param, -+ union hccs_feature_info *info) -+{ -+ struct hikp_hccs_rsp_head rsp_head = {0}; -+ struct hikp_cmd_header req_header = {0}; -+ struct hccs_port_dfx_info_vld *dfx_info; -+ struct hccs_port_dfx_req_para *dfx_req; -+ struct hikp_hccs_req req = {0}; -+ int ret; -+ -+ ret = hikp_plat_hccs_hw_info(&g_hccs_info); -+ if (ret != 0) { -+ HIKP_ERROR_PRINT("Failed to get HCCS hardware info for dfx info, ret = %d\n", -+ ret); -+ return ret; -+ } -+ -+ if (!hikp_hccs_req_param_check(&g_hccs_info, param)) -+ return -EINVAL; -+ -+ dfx_info = &info->dfx_info; -+ dfx_req = (struct hccs_port_dfx_req_para *)&req.req_data; -+ dfx_req->chip_id = param->chip_id; -+ dfx_req->port_id = param->port_id; -+ dfx_req->die_id = param->die_id; -+ hikp_cmd_init(&req_header, HCCS_MOD, HCCS_GET_PORT_DFX_INFO, 0); -+ ret = hikp_hccs_cmd_send(&req_header, &req, -+ &dfx_info->info, -+ sizeof(struct hccs_port_dfx_info), -+ &rsp_head); -+ if (ret != 0) -+ return ret; -+ -+ dfx_info->vld_size = rsp_head.cur_blk_size; -+ -+ return 0; -+} -+ -+static void hikp_hccs_show_topo(union hccs_feature_info *data) -+{ -+ uint8_t chip_id, die_idx, die_num, port_idx, *port_ids; -+ struct hccs_die_info *die_info; -+ struct hccs_die_info *dies; -+ -+ HIKP_SET_USED(data); -+ -+ for (chip_id = 0; chip_id < g_hccs_info.chip_num; chip_id++) { -+ die_num = g_hccs_info.chip_info[chip_id].die_num; -+ dies = g_hccs_info.chip_info[chip_id].die_info; -+ printf("--chip%u\n", chip_id); -+ if (die_num == 0) -+ continue; -+ for (die_idx = 0; die_idx < die_num; die_idx++) { -+ die_info = &dies[die_idx]; -+ printf("\t--die%u\n", die_info->die_id); -+ port_ids = die_info->port_ids; -+ if (die_info->port_num == 0) -+ continue; -+ -+ for (port_idx = 0; port_idx < die_info->port_num; port_idx++) -+ printf("\t\t--hccs%u\n", port_ids[port_idx]); -+ } -+ } -+} -+ -+static void hikp_hccs_show_port_attr(union hccs_feature_info *feature_info) -+{ -+ struct hccs_port_fixed_attr *info = &feature_info->attr; -+ -+ printf("%-16s\tHCCS-V%u\n" -+ "%-16s\tx%u\n" -+ "%-16s\t%uMbps\n" -+ "%-16s\t%u\n", -+ "hccs_type", info->hccs_type, -+ "lane_mode", info->lane_mode, -+ "speed", info->speed, -+ "enabled", info->enabled); -+} -+ -+static const char *hikp_hccs_link_fsm_to_str(uint8_t link_fsm) -+{ -+ size_t i; -+ -+ for (i = 0; i < sizeof(link_fsm_map) / sizeof(link_fsm_map[0]); i++) { -+ if (link_fsm_map[i].link_fsm == link_fsm) -+ return link_fsm_map[i].str; -+ } -+ -+ return "unknown"; -+} -+ -+static void hikp_hccs_show_port_dfx_info(union hccs_feature_info *feature_info) -+{ -+ struct hccs_port_dfx_info_vld *info_vld = &feature_info->dfx_info; -+ struct hccs_port_dfx_info *info = &info_vld->info; -+ size_t vld_size; -+ -+ vld_size = (size_t)info_vld->vld_size; -+ if (vld_size >= sizeof(info->link_fsm)) { -+ printf("%-16s\t%s\n", "link_fsm", hikp_hccs_link_fsm_to_str(info->link_fsm)); -+ vld_size -= sizeof(info->link_fsm); -+ } -+ -+ if (vld_size >= sizeof(info->cur_lane_num)) { -+ printf("%-16s\t%u\n", "cur_lane_num", info->cur_lane_num); -+ vld_size -= sizeof(info->cur_lane_num); -+ } -+ -+ if (vld_size >= sizeof(info->lane_mask)) { -+ printf("%-16s\t0x%x\n", "lane_mask", info->lane_mask); -+ vld_size -= sizeof(info->lane_mask); -+ } -+ -+ if (vld_size >= sizeof(info->crc_err_cnt)) { -+ printf("%-16s\t%u\n", "crc_err_cnt", info->crc_err_cnt); -+ vld_size -= sizeof(info->crc_err_cnt); -+ } -+ -+ if (vld_size >= sizeof(info->retry_cnt)) { -+ printf("%-16s\t%u\n", "retry_cnt", info->retry_cnt); -+ vld_size -= sizeof(info->retry_cnt); -+ } -+ -+ if (vld_size >= sizeof(info->phy_reinit_cnt)) { -+ printf("%-16s\t%u\n", "phy_reinit_cnt", info->phy_reinit_cnt); -+ vld_size -= sizeof(info->phy_reinit_cnt); -+ } -+ -+ if (vld_size >= sizeof(info->tx_credit)) { -+ printf("%-16s\t%u\n", "tx_credit", info->tx_credit); -+ vld_size -= sizeof(info->tx_credit); -+ } -+} -+ -+static void hikp_hccs_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ const struct hikp_hccs_feature_cmd *hccs_cmd; -+ union hccs_feature_info info = {0}; -+ int ret; -+ -+ if (g_hccs_param.feature_idx == -1) { -+ hikp_hccs_cmd_help(self, NULL); -+ snprintf(self->err_str, sizeof(self->err_str), "-g/--get param error!"); -+ self->err_no = -EINVAL; -+ return; -+ } -+ -+ hccs_cmd = &g_hccs_feature_cmd[g_hccs_param.feature_idx]; -+ if (g_hccs_param.param_mask != hccs_cmd->param_needed) { -+ hikp_hccs_cmd_help(self, NULL); -+ snprintf(self->err_str, sizeof(self->err_str), "Parameter mismatched!"); -+ self->err_no = -EINVAL; -+ return; -+ } -+ -+ ret = hikp_hccs_get_chip_num(&g_hccs_info); -+ if (ret < 0) { -+ self->err_no = ret; -+ return; -+ } -+ -+ if (g_hccs_info.chip_num == 1) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "The command is just supported on multi-sockets!\n"); -+ self->err_no = -EINVAL; -+ return; -+ } -+ -+ ret = hccs_cmd->query(&g_hccs_param, &info); -+ if (ret != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "Failed to query %s, ret = %d.", -+ hccs_cmd->feature_name, ret); -+ self->err_no = ret; -+ hikp_plat_hccs_free(&g_hccs_info); -+ return; -+ } -+ -+ printf("############## HCCS: %s info ############\n", hccs_cmd->feature_name); -+ hccs_cmd->show(&info); -+ printf("#################### END #######################\n"); -+ -+ hikp_plat_hccs_free(&g_hccs_info); -+} -+ -+static int hikp_hccs_cmd_feature_select(struct major_cmd_ctrl *self, const char *argv) -+{ -+ size_t feat_size = HIKP_ARRAY_SIZE(g_hccs_feature_cmd); -+ size_t i; -+ -+ for (i = 0; i < feat_size; i++) { -+ if (strcmp(argv, g_hccs_feature_cmd[i].feature_name) == 0) { -+ g_hccs_param.feature_idx = i; -+ return 0; -+ } -+ } -+ -+ hikp_hccs_cmd_help(self, NULL); -+ snprintf(self->err_str, sizeof(self->err_str), "-g/--get param error!!!"); -+ self->err_no = -EINVAL; -+ -+ return self->err_no; -+} -+ -+static int hikp_hccs_cmd_parse_chip(struct major_cmd_ctrl *self, const char *argv) -+{ -+ uint32_t chip_id; -+ -+ self->err_no = string_toui(argv, &chip_id); -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "Failed to parse -c/--chip_id parameter."); -+ return self->err_no; -+ } -+ if (chip_id > UINT8_MAX) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "chip id should not be greater than %u.", UINT8_MAX); -+ self->err_no = -EINVAL; -+ return self->err_no; -+ } -+ -+ g_hccs_param.param_mask |= HCCS_ENABLE_CHIP_ID; -+ g_hccs_param.chip_id = (uint8_t)chip_id; -+ -+ return 0; -+} -+ -+static int hikp_hccs_cmd_parse_die(struct major_cmd_ctrl *self, const char *argv) -+{ -+ uint32_t die_id; -+ -+ self->err_no = string_toui(argv, &die_id); -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "Failed to parse -d/--die_id parameter."); -+ return self->err_no; -+ } -+ -+ if (die_id > UINT8_MAX) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "die id should not be greater than %u.", UINT8_MAX); -+ self->err_no = -EINVAL; -+ return self->err_no; -+ } -+ -+ g_hccs_param.param_mask |= HCCS_ENABLE_DIE_ID; -+ g_hccs_param.die_id = (uint8_t)die_id; -+ -+ return 0; -+} -+ -+static int hikp_hccs_cmd_parse_port(struct major_cmd_ctrl *self, const char *argv) -+{ -+ uint32_t port_id; -+ -+ self->err_no = string_toui(argv, &port_id); -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "Failed to parse -p/--port_id parameter."); -+ return self->err_no; -+ } -+ -+ if (port_id > UINT8_MAX) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "port id should not be greater %u.", UINT8_MAX); -+ self->err_no = -EINVAL; -+ return self->err_no; -+ } -+ -+ g_hccs_param.param_mask |= HCCS_ENABLE_PORT_ID; -+ g_hccs_param.port_id = (uint8_t)port_id; -+ return 0; -+} -+ -+static void hikp_hccs_cmd_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ g_hccs_param.feature_idx = -1; -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_hccs_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_hccs_cmd_help); -+ cmd_option_register("-g", "--get", true, hikp_hccs_cmd_feature_select); -+ cmd_option_register("-c", "--chip_id", true, hikp_hccs_cmd_parse_chip); -+ cmd_option_register("-d", "--die_id", true, hikp_hccs_cmd_parse_die); -+ cmd_option_register("-p", "--port_id", true, hikp_hccs_cmd_parse_port); -+} -+ -+HIKP_CMD_DECLARE("hccs", "dump HCCS information.", hikp_hccs_cmd_init); -diff --git a/hccs/hikp_hccs.h b/hccs/hikp_hccs.h -new file mode 100644 -index 0000000..8ccc01a ---- /dev/null -+++ b/hccs/hikp_hccs.h -@@ -0,0 +1,161 @@ -+/* -+ * Copyright (c) 2024-2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_HCCS_H -+#define HIKP_HCCS_H -+ -+#include -+ -+enum hikp_hccs_cmd_type { -+ HCCS_GET_CHIP_NUM = 0, -+ HCCS_GET_DIE_NUM, -+ HCCS_GET_DIE_INFO, -+ HCCS_GET_PORT_IDS_ON_DIE, -+ HCCS_GET_PORT_FIXED_ATTR, -+ HCCS_GET_PORT_DFX_INFO, -+}; -+ -+struct hccs_die_info { -+ uint8_t die_id; -+ uint16_t port_num; -+ uint8_t *port_ids; -+}; -+ -+struct hccs_chip_info { -+ uint8_t chip_id; -+ uint8_t die_num; -+ struct hccs_die_info *die_info; -+}; -+ -+struct hccs_port_fixed_attr { -+ uint8_t hccs_type; /* HCCS_V1, HCCS_V2 and etc. */ -+ uint8_t lane_mode; -+ uint16_t speed; /* Unit Mbps. */ -+ uint8_t enabled; /* Indicate if port is enabled. */ -+ uint8_t rsv[3]; -+}; -+ -+struct hccs_port_dfx_info { -+ uint8_t link_fsm; -+ uint8_t cur_lane_num; -+ uint16_t lane_mask; -+ uint32_t crc_err_cnt; -+ uint32_t retry_cnt; -+ uint32_t phy_reinit_cnt; -+ uint32_t tx_credit; -+ uint32_t rsv1[54]; -+}; -+ -+struct hccs_port_dfx_info_vld { -+ struct hccs_port_dfx_info info; -+ uint8_t vld_size; /* Indicate the valid bytes firmware reported. */ -+}; -+ -+union hccs_feature_info { -+ struct hccs_port_fixed_attr attr; -+ struct hccs_port_dfx_info_vld dfx_info; -+}; -+ -+struct hccs_chip_num_rsp_data { -+ uint8_t chip_num; -+}; -+ -+struct hccs_die_num_req_para { -+ uint8_t chip_id; -+}; -+ -+struct hccs_die_num_rsp_data { -+ uint8_t die_num; -+}; -+ -+struct hccs_die_info_req_para { -+ uint8_t chip_id; -+ uint8_t die_idx; -+}; -+ -+struct hccs_die_info_rsp_data { -+ uint8_t die_id; -+ uint8_t rsv; -+ uint16_t port_num; -+}; -+ -+struct hccs_die_ports_req_para { -+ uint8_t chip_id; -+ uint8_t die_id; -+}; -+ -+struct hccs_port_attr_req_para { -+ uint8_t chip_id; -+ uint8_t die_id; -+ uint8_t port_id; -+}; -+ -+struct hccs_port_dfx_req_para { -+ uint8_t chip_id; -+ uint8_t die_id; -+ uint8_t port_id; -+}; -+ -+struct hikp_hccs_rsp_head { -+ uint16_t total_blk_num; -+ uint8_t cur_blk_size; /* real data size, not contain header size. */ -+ uint8_t rsv; -+}; -+ -+#define HCCS_MAX_RSP_DATA 59 -+struct hikp_hccs_rsp { -+ struct hikp_hccs_rsp_head rsp_head; /* 4 Byte */ -+ uint32_t rsp_data[HCCS_MAX_RSP_DATA]; -+}; -+ -+struct hikp_hccs_req_head { -+ uint16_t blk_id; -+ uint16_t rsv; -+}; -+ -+#define HCCS_MAX_REQ_DATA 31 -+struct hikp_hccs_req { -+ struct hikp_hccs_req_head head; /* 4 Byte */ -+ uint32_t req_data[HCCS_MAX_REQ_DATA]; -+}; -+ -+#define HCCS_ENABLE_CHIP_ID HI_BIT(0) -+#define HCCS_ENABLE_DIE_ID HI_BIT(1) -+#define HCCS_ENABLE_PORT_ID HI_BIT(2) -+#define HCCS_PORT_INFO_MASK (HCCS_ENABLE_CHIP_ID | HCCS_ENABLE_DIE_ID | \ -+ HCCS_ENABLE_PORT_ID) -+ -+struct hccs_param { -+ int feature_idx; -+ uint8_t chip_id; -+ uint8_t die_id; -+ uint32_t port_id; -+ /* mask for param passed by user, see HCCS_ENABLE_XXX. */ -+ uint16_t param_mask; -+}; -+ -+struct hikp_plat_hccs_info { -+ uint8_t chip_num; -+ struct hccs_chip_info *chip_info; -+}; -+ -+#define HIKP_HCCS_FEATURE_NAME_LEN 20 -+struct hikp_hccs_feature_cmd { -+ const char feature_name[HIKP_HCCS_FEATURE_NAME_LEN]; -+ uint32_t cmd_code; -+ int (*query)(struct hccs_param *param, union hccs_feature_info *info); -+ void (*show)(union hccs_feature_info *data); -+ uint16_t param_needed; -+}; -+ -+#endif /* HIKP_HCCS_H */ -diff --git a/libhikptdev/include/hikptdev_plug.h b/libhikptdev/include/hikptdev_plug.h -index 2123935..d45a654 100644 ---- a/libhikptdev/include/hikptdev_plug.h -+++ b/libhikptdev/include/hikptdev_plug.h -@@ -44,6 +44,7 @@ enum cmd_module_type { - DPDK_MOD = 9, - CXL_MOD = 10, - UB_MOD = 11, -+ HCCS_MOD = 16 - }; - - void hikp_unlock(void); --- -2.45.0.windows.1 - diff --git a/0094-hikptool-pcie-The-PCS-layer-register-print-command-i.patch b/0094-hikptool-pcie-The-PCS-layer-register-print-command-i.patch deleted file mode 100644 index 83f91b4..0000000 --- a/0094-hikptool-pcie-The-PCS-layer-register-print-command-i.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 315bab874c894053be65b47be3ac783dcd1259da Mon Sep 17 00:00:00 2001 -From: moubingquan -Date: Wed, 8 Jan 2025 10:49:19 +0800 -Subject: [PATCH 71/81] [hikptool/ pcie]:The PCS-layer register print command - is deleted. - -The register print of the PCS layer is deleted. -Currently, the register of this module does -not need to be dumped. - -Signed-off-by: moubingquan ---- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 15 --------------- - pcie/func_lib/pcie_func/pcie_reg_dump.h | 10 ---------- - 2 files changed, 25 deletions(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index ad7cc7f..cb59d2c 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -131,20 +131,6 @@ struct pcie_dumpreg_info g_reg_table_mac[] = { - {0, "MAC_POWERDOWN_VALUE_REG"}, - }; - --struct pcie_dumpreg_info g_reg_table_pcs[] = { -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(SERDES_STATUS_RPT), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(EBUF_STATUS), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(GEN3_DEC_ENC_STATUS), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(WAKE_STATUS), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(RECV_DET_OR_PWR_CHAGE), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(EQEVAL_STATUS), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(LANE_INTR_STATUS), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(M_PCS_RPT_REG), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(MSG_BUS_DFX), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(DETECT_CLK_FLG_REG), -- HIKP_PCIE_PCS_LANE_TBL_ENTRY(SDS_CFG_REG_REG), --}; -- - struct pcie_dumpreg_info g_reg_table_iob_tx[] = { - {0, "IOB_TX_ECAM_CONTROL0"}, - {0, "IOB_TX_ECAM_CONTROL1"}, -@@ -456,7 +442,6 @@ struct pcie_dumpreg_table g_dump_info_glb[] = { - {HIKP_ARRAY_SIZE(g_reg_table_iob_rx), g_reg_table_iob_rx}, - {HIKP_ARRAY_SIZE(g_reg_table_ap_glb), g_reg_table_ap_glb}, - {HIKP_ARRAY_SIZE(g_reg_table_core_glb), g_reg_table_core_glb}, -- {HIKP_ARRAY_SIZE(g_reg_table_pcs), g_reg_table_pcs}, - {HIKP_ARRAY_SIZE(g_reg_table_core_tl), g_reg_table_core_tl}, - {HIKP_ARRAY_SIZE(g_reg_table_dfx_core_tl), g_reg_table_dfx_core_tl}, - }; -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.h b/pcie/func_lib/pcie_func/pcie_reg_dump.h -index 3c52a6e..c74ce56 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.h -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.h -@@ -22,16 +22,6 @@ - #define PCIE_DUMPREG_LOGFILE_NAME "pcie_dumpreg" - #define LOG_FILE_PATH_MAX_LEN 512 - --#define HIKP_PCIE_PCS_LANE_TBL_ENTRY(name) \ -- {0, STR(CONTACT(name, _00))}, {0, STR(CONTACT(name, _01))}, \ -- {0, STR(CONTACT(name, _02))}, {0, STR(CONTACT(name, _03))}, \ -- {0, STR(CONTACT(name, _04))}, {0, STR(CONTACT(name, _05))}, \ -- {0, STR(CONTACT(name, _06))}, {0, STR(CONTACT(name, _07))}, \ -- {0, STR(CONTACT(name, _08))}, {0, STR(CONTACT(name, _09))}, \ -- {0, STR(CONTACT(name, _10))}, {0, STR(CONTACT(name, _11))}, \ -- {0, STR(CONTACT(name, _12))}, {0, STR(CONTACT(name, _13))}, \ -- {0, STR(CONTACT(name, _14))}, {0, STR(CONTACT(name, _15))} -- - enum pcie_dump_level { - DUMP_GLOBAL_LEVEL = 1, - DUMP_PORT_LEVEL = 2, --- -2.45.0.windows.1 - diff --git a/0095-hikptool-pcie-Resolved-the-problem-that-it-takes-a-l.patch b/0095-hikptool-pcie-Resolved-the-problem-that-it-takes-a-l.patch deleted file mode 100644 index 3e3ee51..0000000 --- a/0095-hikptool-pcie-Resolved-the-problem-that-it-takes-a-l.patch +++ /dev/null @@ -1,119 +0,0 @@ -From 2f868efe20df8a6c0d28969912bee91d82482c21 Mon Sep 17 00:00:00 2001 -From: moubingquan -Date: Wed, 15 Jan 2025 10:24:28 +0800 -Subject: [PATCH] hikptool/pcie: Resolved the problem that it takes a long time - to write files - -The write function takes a long time to write -files when the FIO pressure is heavy. -Therefore, the function needs to be changed to -fwrite with cache. - -Signed-off-by: moubingquan ---- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 34 +++++++++++-------------- - 1 file changed, 15 insertions(+), 19 deletions(-) - -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index cb59d2c..ba6641e 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -22,7 +22,7 @@ - #include "pcie_common.h" - #include "pcie_reg_dump.h" - --int g_pcie_dumpreg_fd; -+FILE *g_pcie_dumpreg_fd = NULL; - char dumpreg_log_file[MAX_LOG_NAME_LEN + 1] = {0}; - - struct pcie_dumpreg_info g_reg_table_tl[] = { -@@ -381,7 +381,7 @@ static int pcie_create_dumpreg_log_file(uint32_t port_id, uint32_t dump_level) - { - char file_name[MAX_LOG_NAME_LEN + 1] = { 0 }; - char info_str[MAX_LOG_NAME_LEN + 1] = { 0 }; -- int fd_file; -+ FILE *fd_file = NULL; - int ret; - - ret = snprintf(info_str, sizeof(info_str), "%s_port%u_level%u", -@@ -399,8 +399,8 @@ static int pcie_create_dumpreg_log_file(uint32_t port_id, uint32_t dump_level) - - (void)remove((const char *)file_name); - /* Add write permission to the file */ -- fd_file = open(file_name, O_RDWR | O_SYNC | O_CREAT, 0600); -- if (fd_file < 0) { -+ fd_file = fopen(file_name, "w+"); -+ if (fd_file == NULL) { - Err("open %s failed.\n", file_name); - return -EPERM; - } -@@ -409,30 +409,26 @@ static int pcie_create_dumpreg_log_file(uint32_t port_id, uint32_t dump_level) - return 0; - } - --static int pcie_close_dumpreg_log_file(void) -+static void pcie_close_dumpreg_log_file(void) - { -- int ret; -- -- ret = fchmod(g_pcie_dumpreg_fd, 0400); -- close(g_pcie_dumpreg_fd); -+ fclose(g_pcie_dumpreg_fd); - /* Revoke write permission of file */ -- g_pcie_dumpreg_fd = -1; -- -- return ret; -+ chmod(dumpreg_log_file, 0400); -+ g_pcie_dumpreg_fd = NULL; - } - - static void pcie_dumpreg_write_value_to_file(const char *reg_name, uint32_t val) - { - char str[MAX_STR_LEN] = { 0 }; -- ssize_t wr_ret; -+ size_t wr_ret; - int ret; - - ret = snprintf(str, sizeof(str), " %-40s : 0x%x\n", reg_name, val); - if (ret < 0 || ret >= MAX_STR_LEN) { - Err("pcie dumpreg write info to logfile failed.\n"); - } else { -- wr_ret = write(g_pcie_dumpreg_fd, str, strlen(str)); -- if (wr_ret == -1) -+ wr_ret = fwrite(str, 1, strlen(str), g_pcie_dumpreg_fd); -+ if (wr_ret != strlen(str)) - Err("write info to logfile failed.\n"); - } - } -@@ -470,7 +466,7 @@ static int pcie_dumpreg_write_header_to_file(uint32_t version, - const struct pcie_dump_req_para *req_data) - { - char str[MAX_STR_LEN] = {0}; -- ssize_t wr_ret; -+ size_t wr_ret; - int ret; - - ret = snprintf(str, sizeof(str), "Command Version[%u], dump_level[%u], port_id[%u]\n\n", -@@ -480,8 +476,8 @@ static int pcie_dumpreg_write_header_to_file(uint32_t version, - return -EIO; - } - -- wr_ret = write(g_pcie_dumpreg_fd, str, strlen(str)); -- if (wr_ret == -1) { -+ wr_ret = fwrite(str, 1, strlen(str), g_pcie_dumpreg_fd); -+ if (wr_ret != strlen(str)) { - Err("write header to logfile failed.\n"); - return -EIO; - } -@@ -566,7 +562,7 @@ int pcie_dumpreg_do_dump(uint32_t port_id, uint32_t dump_level) - - Info("pcie reg dump finish.\n"); - close_file_ret: -- (void)pcie_close_dumpreg_log_file(); -+ pcie_close_dumpreg_log_file(); - free_cmd_ret: - hikp_cmd_free(&cmd_ret); - --- -2.45.0.windows.1 - diff --git a/0096-Hikptool-add-support-dump-SDMA-register-information-.patch b/0096-Hikptool-add-support-dump-SDMA-register-information-.patch deleted file mode 100644 index 3000006..0000000 --- a/0096-Hikptool-add-support-dump-SDMA-register-information-.patch +++ /dev/null @@ -1,472 +0,0 @@ -From fde1f62e767c37f6a6c717df3d03154d081da47e Mon Sep 17 00:00:00 2001 -From: wangzijian -Date: Tue, 25 Feb 2025 07:11:27 +0800 -Subject: [PATCH 1/2] Hikptool add support dump SDMA register information - according to the usage environment. - -1. support dump SDMA channel status reg e.g. hikptool sdma_dump -s -c -d -2. support dump SDMA pc reg e.g. hikptool sdma_dump -p -c -d -n -3. support dump SDMA vc reg e.g. hikptool sdma_dump -v -c -d -n - -Signed-off-by: wangzijian ---- - CMakeLists.txt | 1 + - libhikptdev/include/hikptdev_plug.h | 3 +- - sdma/sdma_func/sdma_common.h | 31 +++++ - sdma/sdma_func/sdma_dump_reg.c | 133 ++++++++++++++++++++++ - sdma/sdma_func/sdma_dump_reg.h | 28 +++++ - sdma/user_cmd/sdma_cmd_dump.c | 171 ++++++++++++++++++++++++++++ - sdma/user_cmd/sdma_tools_include.h | 24 ++++ - 7 files changed, 390 insertions(+), 1 deletion(-) - create mode 100644 sdma/sdma_func/sdma_common.h - create mode 100644 sdma/sdma_func/sdma_dump_reg.c - create mode 100644 sdma/sdma_func/sdma_dump_reg.h - create mode 100644 sdma/user_cmd/sdma_cmd_dump.c - create mode 100644 sdma/user_cmd/sdma_tools_include.h - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 72f2dab..4f4eb03 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -46,6 +46,7 @@ file(GLOB_RECURSE HIKPTOOL_SRC - ${CMAKE_CURRENT_SOURCE_DIR}/serdes/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/socip/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/hccs/*.c -+ ${CMAKE_CURRENT_SOURCE_DIR}/sdma/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/tool_lib/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/info_collect/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/hikp_init_main.c -diff --git a/libhikptdev/include/hikptdev_plug.h b/libhikptdev/include/hikptdev_plug.h -index d45a654..375fb89 100644 ---- a/libhikptdev/include/hikptdev_plug.h -+++ b/libhikptdev/include/hikptdev_plug.h -@@ -44,7 +44,8 @@ enum cmd_module_type { - DPDK_MOD = 9, - CXL_MOD = 10, - UB_MOD = 11, -- HCCS_MOD = 16 -+ HCCS_MOD = 16, -+ SDMA_MOD = 17 - }; - - void hikp_unlock(void); -diff --git a/sdma/sdma_func/sdma_common.h b/sdma/sdma_func/sdma_common.h -new file mode 100644 -index 0000000..40969b8 ---- /dev/null -+++ b/sdma/sdma_func/sdma_common.h -@@ -0,0 +1,31 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef SDMA_COMMON_H -+#define SDMA_COMMON_H -+ -+#define RESP_MAX_NUM 160 -+ -+/* SDMA command code */ -+enum sdma_cmd_type { -+ SDMA_DUMP = 0, -+}; -+ -+enum sdma_dump_cmd_type { -+ DUMP_UNKNOWN = 0, -+ DUMP_CHN_STATUS, -+ DUMP_CHN_PC, -+ DUMP_CHN_VC, -+}; -+ -+#endif /* SDMA_COMMON_H */ -diff --git a/sdma/sdma_func/sdma_dump_reg.c b/sdma/sdma_func/sdma_dump_reg.c -new file mode 100644 -index 0000000..7440fb6 ---- /dev/null -+++ b/sdma/sdma_func/sdma_dump_reg.c -@@ -0,0 +1,133 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "hikptdev_plug.h" -+#include "sdma_common.h" -+#include "sdma_dump_reg.h" -+ -+#define TARGET_DIR "/sys/devices/platform/" -+#define PREFIX "HISI0431" -+#define PREFIX_LEN 8 -+ -+int sdma_dev_check(void) -+{ -+ struct dirent *entry; -+ DIR *dir; -+ -+ dir = opendir(TARGET_DIR); -+ if (dir == NULL) { -+ perror("opendir"); -+ return -errno; -+ } -+ -+ while ((entry = readdir(dir)) != NULL) { -+ if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) -+ continue; -+ -+ if (strlen(entry->d_name) >= PREFIX_LEN) { -+ if (strncmp(entry->d_name, PREFIX, PREFIX_LEN) == 0) { -+ closedir(dir); -+ return 0; -+ } -+ } -+ } -+ -+ closedir(dir); -+ return -ENODEV; -+} -+ -+static int sdma_rsp_normal_check(const struct hikp_cmd_ret *cmd_ret) -+{ -+ if (cmd_ret == NULL) -+ return -ENOSPC; -+ -+ if (cmd_ret->status != 0) -+ return -EINVAL; -+ -+ if (cmd_ret->rsp_data_num > RESP_MAX_NUM) -+ return -E2BIG; -+ -+ return 0; -+} -+ -+static int sdma_get_reg(const struct tool_sdma_cmd *cmd, uint32_t *reg_save, uint32_t *reg_num) -+{ -+ struct sdma_dump_req_para req_data = { 0 }; -+ struct hikp_cmd_header req_header = { 0 }; -+ struct hikp_cmd_ret *cmd_ret; -+ uint32_t i; -+ int ret; -+ -+ req_data.chip_id = cmd->chip_id; -+ req_data.die_id = cmd->die_id; -+ req_data.chn_id = cmd->chn_id; -+ -+ hikp_cmd_init(&req_header, SDMA_MOD, SDMA_DUMP, cmd->sdma_cmd_type); -+ cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -+ ret = sdma_rsp_normal_check(cmd_ret); -+ if (ret) { -+ printf("check cmd ret failed, ret: %d.\n", ret); -+ hikp_cmd_free(&cmd_ret); -+ return ret; -+ } -+ *reg_num = cmd_ret->rsp_data_num; -+ for (i = 0; i < *reg_num; i++) -+ reg_save[i] = cmd_ret->rsp_data[i]; -+ -+ hikp_cmd_free(&cmd_ret); -+ -+ return 0; -+} -+ -+static void sdma_print_reg(const uint32_t *reg_save, uint32_t reg_num) -+{ -+ uint32_t i; -+ -+ if (reg_num == 0) { -+ printf("SDMA dump is failed\n"); -+ return; -+ } -+ printf(" sdma reg dump list:\n"); -+ for (i = 0; i < reg_num; i++) -+ printf(" 0x%08x\n", reg_save[i]); -+} -+ -+int sdma_reg_dump(struct tool_sdma_cmd *cmd) -+{ -+ uint32_t sdma_reg_save[RESP_MAX_NUM] = { 0 }; -+ uint32_t sdma_reg_num = 0; -+ int ret; -+ -+ if (cmd == NULL) -+ return -EINVAL; -+ -+ ret = sdma_dev_check(); -+ if (ret) { -+ printf("The current environment not support this feature!\n"); -+ return ret; -+ } -+ -+ ret = sdma_get_reg(cmd, sdma_reg_save, &sdma_reg_num); -+ if (ret) -+ return ret; -+ -+ sdma_print_reg(sdma_reg_save, sdma_reg_num); -+ -+ return 0; -+} -diff --git a/sdma/sdma_func/sdma_dump_reg.h b/sdma/sdma_func/sdma_dump_reg.h -new file mode 100644 -index 0000000..51c4e66 ---- /dev/null -+++ b/sdma/sdma_func/sdma_dump_reg.h -@@ -0,0 +1,28 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef SDMA_DUMP_REG_H -+#define SDMA_DUMP_REG_H -+ -+#include "sdma_tools_include.h" -+ -+struct sdma_dump_req_para { -+ uint32_t chip_id; -+ uint32_t die_id; -+ uint32_t chn_id; -+}; -+ -+int sdma_dev_check(void); -+int sdma_reg_dump(struct tool_sdma_cmd *cmd); -+ -+#endif /* SDMA_DUMP_REG_H */ -diff --git a/sdma/user_cmd/sdma_cmd_dump.c b/sdma/user_cmd/sdma_cmd_dump.c -new file mode 100644 -index 0000000..47b095d ---- /dev/null -+++ b/sdma/user_cmd/sdma_cmd_dump.c -@@ -0,0 +1,171 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include "hikptdev_plug.h" -+#include "tool_lib.h" -+#include "tool_cmd.h" -+#include "sdma_tools_include.h" -+#include "sdma_common.h" -+#include "sdma_dump_reg.h" -+ -+struct tool_sdma_cmd g_sdma_dump_cmd = { -+ .sdma_cmd_type = DUMP_UNKNOWN, -+ .chip_id = (uint32_t)(-1), -+ .die_id = (uint32_t)(-1), -+ .chn_id = (uint32_t)(-1), -+}; -+ -+static int sdma_dump_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ int ret; -+ -+ ret = sdma_dev_check(); -+ if (ret) { -+ printf("The current environment not support this feature!\n"); -+ return ret; -+ } -+ HIKP_SET_USED(argv); -+ -+ printf("\n Usage: %s\n", self->cmd_ptr->name); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" %s, %-25s %s\n", "-c", "--chipid", "please input chip id[x] first\n"); -+ printf(" %s, %-25s %s\n", "-d", "--dieid", "please input die id[x] first\n"); -+ printf(" %s, %-25s %s\n", "-n", "--chnid", "please input chn id[x] first\n"); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); -+ printf(" %s, %-25s %s\n", "-s", "--chnstatus", "dump sdma channel status dfx reg\n"); -+ printf("\tParameter Limitation: -c --chipid and -d --dieid is necessary,"); -+ printf(" -n --chnid is invalid\n"); -+ printf("\tUsage: -s -c [chipid] -d [dieid], e.g. -s -c 0 -d 0\n\n"); -+ printf(" %s, %-25s %s\n", "-p", "--pc", "dump sdma pc channel dfx reg\n"); -+ printf("\tParameter Limitation: All three parameters are necessary,"); -+ printf(" the -n --chnid range is limited to 0-31\n"); -+ printf("\tUsage: -p -c [chipid] -d [dieid] -n [chnid], e.g. -p -c 0 -d 0 -n 31\n\n"); -+ printf(" %s, %-25s %s\n", "-v", "--vc", "dump sdma vc channel dfx reg\n"); -+ printf("\tParameter Limitation: All three parameters are necessary,"); -+ printf(" the -n --chnid range is limited to 0-159\n"); -+ printf("\tUsage: -v -c [chipid] -d [dieid] -n [chnid], e.g. -v -c 0 -d 0 -n 159\n\n"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static int sdma_set_id(struct major_cmd_ctrl *self, const char *argv, uint32_t *id) -+{ -+ uint32_t val = 0; -+ int ret; -+ -+ ret = string_toui(argv, &val); -+ if (ret) { -+ snprintf(self->err_str, sizeof(self->err_str), "Invalid id."); -+ self->err_no = ret; -+ return ret; -+ } -+ *id = val; -+ return ret; -+} -+ -+static int sdma_set_chip_id(struct major_cmd_ctrl *self, const char *argv) -+{ -+ return sdma_set_id(self, argv, &g_sdma_dump_cmd.chip_id); -+} -+ -+static int sdma_set_die_id(struct major_cmd_ctrl *self, const char *argv) -+{ -+ return sdma_set_id(self, argv, &g_sdma_dump_cmd.die_id); -+} -+ -+static int sdma_set_chn_id(struct major_cmd_ctrl *self, const char *argv) -+{ -+ return sdma_set_id(self, argv, &g_sdma_dump_cmd.chn_id); -+} -+ -+static int sdma_dump_chn_status(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ g_sdma_dump_cmd.sdma_cmd_type = DUMP_CHN_STATUS; -+ return 0; -+} -+ -+static int sdma_dump_chn_pc(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ g_sdma_dump_cmd.sdma_cmd_type = DUMP_CHN_PC; -+ return 0; -+} -+ -+static int sdma_dump_chn_vc(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ g_sdma_dump_cmd.sdma_cmd_type = DUMP_CHN_VC; -+ return 0; -+} -+ -+static int sdma_dump_excute_function_call(uint32_t cmd_type) -+{ -+ if (cmd_type != DUMP_UNKNOWN) -+ return sdma_reg_dump(&g_sdma_dump_cmd); -+ -+ return -EINVAL; -+} -+ -+static void sdma_dump_execute(struct major_cmd_ctrl *self) -+{ -+ int ret; -+ const char *suc_msg[] = { -+ "", -+ "sdma_dump_chn_status success.", -+ "sdma_dump_dfx_pc success.", -+ "sdma_dump_dfx_vc success." -+ }; -+ const char *err_msg[] = { -+ "sdma_dump failed, unknown cmd type", -+ "sdma_dump_chn_status error.", -+ "sdma_dump_dfx_pc error.", -+ "sdma_dump_dfx_vc error." -+ }; -+ -+ ret = sdma_dump_excute_function_call(g_sdma_dump_cmd.sdma_cmd_type); -+ if (ret == 0) -+ printf("%s\n", suc_msg[g_sdma_dump_cmd.sdma_cmd_type]); -+ else { -+ snprintf(self->err_str, sizeof(self->err_str), "%s\n", -+ err_msg[g_sdma_dump_cmd.sdma_cmd_type]); -+ self->err_no = ret; -+ } -+} -+ -+static void cmd_sdma_dump_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = sdma_dump_execute; -+ -+ cmd_option_register("-c", "--chipid", true, sdma_set_chip_id); -+ cmd_option_register("-d", "--dieid", true, sdma_set_die_id); -+ cmd_option_register("-n", "--chnid", true, sdma_set_chn_id); -+ cmd_option_register("-h", "--help", false, sdma_dump_help); -+ cmd_option_register("-s", "--chnstatus", false, sdma_dump_chn_status); -+ cmd_option_register("-p", "--pc", false, sdma_dump_chn_pc); -+ cmd_option_register("-v", "--vc", false, sdma_dump_chn_vc); -+} -+ -+HIKP_CMD_DECLARE("sdma_dump", "sdma reg dump", cmd_sdma_dump_init); -diff --git a/sdma/user_cmd/sdma_tools_include.h b/sdma/user_cmd/sdma_tools_include.h -new file mode 100644 -index 0000000..01b24b5 ---- /dev/null -+++ b/sdma/user_cmd/sdma_tools_include.h -@@ -0,0 +1,24 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef SDMA_TOOLS_INCLUDE_H -+#define SDMA_TOOLS_INCLUDE_H -+ -+struct tool_sdma_cmd { -+ uint32_t sdma_cmd_type; -+ uint32_t chip_id; -+ uint32_t die_id; -+ uint32_t chn_id; -+}; -+ -+#endif /* SDMA_TOOLS_INCLUDE_H */ --- -2.45.0.windows.1 - diff --git a/0097-Add-support-collect-sdma-hikptool-dump-reg-info.patch b/0097-Add-support-collect-sdma-hikptool-dump-reg-info.patch deleted file mode 100644 index fe689aa..0000000 --- a/0097-Add-support-collect-sdma-hikptool-dump-reg-info.patch +++ /dev/null @@ -1,389 +0,0 @@ -From 3a8f39f91fd54a656a0b3d9278f4d77eddc94771 Mon Sep 17 00:00:00 2001 -From: zhangyuyang -Date: Fri, 28 Feb 2025 14:20:26 +0800 -Subject: [PATCH 2/2] Add support collect sdma hikptool dump reg info. - -1. support collect sdma info e.g. hiktool info_collect -sdma - -Signed-off-by: zhangyuyang ---- - info_collect/hikp_collect.h | 3 + - info_collect/hikp_collect_main.c | 19 ++- - info_collect/hikp_collect_sdma.c | 261 +++++++++++++++++++++++++++++++ - 3 files changed, 282 insertions(+), 1 deletion(-) - create mode 100644 info_collect/hikp_collect_sdma.c - -diff --git a/info_collect/hikp_collect.h b/info_collect/hikp_collect.h -index 28aa5a4..26108ac 100644 ---- a/info_collect/hikp_collect.h -+++ b/info_collect/hikp_collect.h -@@ -24,6 +24,7 @@ - #define GROUP_IMP "imp" - #define GROUP_COMMON "common" - #define GROUP_SERDES "serdes" -+#define GROUP_SDMA "sdma" - - enum info_collect_type { - COLLECT_ACC, -@@ -35,6 +36,7 @@ enum info_collect_type { - COLLECT_SATA, - COLLECT_SERDES, - COLLECT_SOCIP, -+ COLLECT_SDMA, - COLLECT_ALL, - COLLECT_UNKNOWN_TYPE, - }; -@@ -49,5 +51,6 @@ void collect_roce_log(void); - void collect_pcie_info(void); - void collect_imp_log(void); - void collect_serdes_log(void); -+void collect_sdma_log(void); - - #endif /* HIKP_COLLECT_H */ -diff --git a/info_collect/hikp_collect_main.c b/info_collect/hikp_collect_main.c -index c413346..46120a5 100644 ---- a/info_collect/hikp_collect_main.c -+++ b/info_collect/hikp_collect_main.c -@@ -108,6 +108,15 @@ static int info_collect_socip(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - -+static int info_collect_sdma(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ set_info_collect_type(COLLECT_SDMA); -+ return 0; -+} -+ - static int info_collect_all(struct major_cmd_ctrl *self, const char *argv) - { - HIKP_SET_USED(self); -@@ -128,12 +137,13 @@ static void collect_all_log(void) - collect_sata_log(); - collect_serdes_log(); - collect_socip_log(); -+ collect_sdma_log(); - } - - static int info_collect_excute_funs_call(uint32_t collect_type) - { - const char *type_name[] = {"acc", "imp", "nic", "pcie", "roce", "sas", -- "sata", "serdes", "socip", "all"}; -+ "sata", "serdes", "socip", "sdma", "all"}; - int ret; - - if (collect_type == COLLECT_UNKNOWN_TYPE) -@@ -173,6 +183,9 @@ static int info_collect_excute_funs_call(uint32_t collect_type) - case COLLECT_SOCIP: - collect_socip_log(); - break; -+ case COLLECT_SDMA: -+ collect_sdma_log(); -+ break; - case COLLECT_ALL: - collect_all_log(); - break; -@@ -199,6 +212,7 @@ static void info_collect_execute(struct major_cmd_ctrl *self) - "collect sata info success.", - "collect serdes info success.", - "collect socip info success.", -+ "collect sdma info success.", - "collect all info success.", - }; - const char *err_msg[] = { -@@ -211,6 +225,7 @@ static void info_collect_execute(struct major_cmd_ctrl *self) - "collect sata info error.", - "collect serdes info error.", - "collect socip info error.", -+ "collect sdma info error.", - "collect all info error.", - "collect info failed, unknown type.", - }; -@@ -245,6 +260,7 @@ static int info_collect_help(struct major_cmd_ctrl *self, const char *argv) - printf(" %s, %-25s %s\n", "-sata", "--sata", "collect sata info\n"); - printf(" %s, %-25s %s\n", "-serdes", "--serdes", "collect serdes info\n"); - printf(" %s, %-25s %s\n", "-socip", "--socip", "collect socip info\n"); -+ printf(" %s, %-25s %s\n", "-sdma", "--sdma", "collect sdma info\n"); - printf(" %s, %-25s %s\n", "-all", "--all", "collect all info\n"); - printf("\n"); - -@@ -268,6 +284,7 @@ static void cmd_info_collect_init(void) - cmd_option_register("-sata", "--sata", false, info_collect_sata); - cmd_option_register("-serdes", "--serdes", false, info_collect_serdes); - cmd_option_register("-socip", "--socip", false, info_collect_socip); -+ cmd_option_register("-sdma", "--sdma", false, info_collect_sdma); - cmd_option_register("-all", "--all", false, info_collect_all); - } - -diff --git a/info_collect/hikp_collect_sdma.c b/info_collect/hikp_collect_sdma.c -new file mode 100644 -index 0000000..8dc315c ---- /dev/null -+++ b/info_collect/hikp_collect_sdma.c -@@ -0,0 +1,261 @@ -+/* -+ * Copyright (c) 2024 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include "hikp_collect_lib.h" -+#include "hikp_collect.h" -+#include "tool_lib.h" -+#include "sdma_dump_reg.h" -+#include "sdma_tools_include.h" -+ -+#define PC_MAX_NUM 32 -+#define VC_MAX_NUM 160 -+#define SDMA_DIE_MAX 4 -+#define SDMA_DIE_CHANGE 2 -+#define SDMA_DUMP_DELAY 50000 -+#define BUFFER_LENTH 1024 -+ -+typedef int (*reg_info_func_t)(uint32_t, uint32_t); -+ -+enum sdma_dump_type { -+ SDMA_DUMP_UNKNOWN = 0, -+ SDMA_DUMP_CHN_STATUS, -+ SDMA_DUMP_CHN_PC, -+ SDMA_DUMP_CHN_VC, -+}; -+ -+struct reg_op { -+ char *func_name; -+ reg_info_func_t func; -+ uint32_t sdma_die; -+}; -+ -+static int sdma_dmesg_exec(void *data) -+{ -+ struct info_collect_cmd *cmd = (struct info_collect_cmd *)data; -+ char dmesg_cmd[MAX_LOG_NAME_LEN] = {0}; -+ char buffer[BUFFER_LENTH] = {0}; -+ int i = 0; -+ FILE *fp; -+ -+ while (cmd->args[i] != 0) { -+ strcat(dmesg_cmd, cmd->args[i]); -+ strcat(dmesg_cmd, " "); -+ i++; -+ } -+ -+ fp = popen(dmesg_cmd, "r"); -+ if (fp == NULL) { -+ perror("popen"); -+ return -errno; -+ } -+ -+ while (fgets(buffer, sizeof(buffer), fp) != NULL) { -+ printf("%s", buffer); -+ } -+ -+ pclose(fp); -+ -+ return 0; -+} -+ -+static void collect_sdma_kernel_log(void) -+{ -+ struct info_collect_cmd sdma_kernel_cmds[] = { -+ { -+ .log_name = "dmesg", -+ .args = {"dmesg", "|", "grep", "sdma", NULL}, -+ }, -+ }; -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(sdma_kernel_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_log(GROUP_SDMA, sdma_kernel_cmds[i].log_name, -+ sdma_dmesg_exec, (void *)&sdma_kernel_cmds[i]); -+ if (ret) { -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ sdma_kernel_cmds[i].log_name, ret); -+ } -+ } -+} -+ -+static void collect_sdma_debugfs_log(void) -+{ -+ struct info_collect_cmd sdma_debugfs_cmds[] = { -+ { -+ .log_name = "sdma_channels", -+ .args = {"cat", "/sys/kernel/debug/sdma/sdma_channels", NULL}, -+ }, -+ { -+ .log_name = "sdma_error", -+ .args = {"cat", "/sys/kernel/debug/sdma/sdma_error", NULL}, -+ }, -+ { -+ .log_name = "sdma_stats", -+ .args = {"cat", "/sys/kernel/debug/sdma/sdma_stats", NULL}, -+ }, -+ }; -+ size_t i, size; -+ int ret; -+ -+ size = HIKP_ARRAY_SIZE(sdma_debugfs_cmds); -+ for (i = 0; i < size; i++) { -+ ret = hikp_collect_log(GROUP_SDMA, sdma_debugfs_cmds[i].log_name, -+ hikp_collect_cat_glob_exec, (void *)&sdma_debugfs_cmds[i]); -+ if (ret) { -+ HIKP_ERROR_PRINT("collect %s log failed: %d\n", -+ sdma_debugfs_cmds[i].log_name, ret); -+ } -+ } -+} -+ -+static int sdma_reg_log(void *data) -+{ -+ struct reg_op *op = (struct reg_op *)data; -+ uint32_t chip, die; -+ int ret; -+ -+ chip = op->sdma_die / SDMA_DIE_CHANGE; -+ die = op->sdma_die % SDMA_DIE_CHANGE; -+ ret = op->func(chip, die); -+ if (ret) -+ HIKP_ERROR_PRINT("%s chip%u die%u failed: %d\n", op->func_name, chip, die, ret); -+ -+ return ret; -+} -+ -+static int sdma_chn_status_dump_info(uint32_t chip_id, uint32_t die_id) -+{ -+ struct tool_sdma_cmd cmd = { -+ .chip_id = chip_id, -+ .die_id = die_id, -+ }; -+ int ret; -+ -+ printf("hikptool sdma_dump -s -c %u -d %u\n", cmd.chip_id, cmd.die_id); -+ printf(" sdma%u channel status\n", SDMA_DIE_CHANGE * cmd.chip_id + cmd.die_id); -+ cmd.sdma_cmd_type = SDMA_DUMP_CHN_STATUS; -+ ret = sdma_reg_dump(&cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("dump channel status failed: %d\n", ret); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static int sdma_pc_dump_info(uint32_t chip_id, uint32_t die_id) -+{ -+ struct tool_sdma_cmd cmd = { -+ .chip_id = chip_id, -+ .die_id = die_id, -+ }; -+ uint32_t i; -+ int ret; -+ -+ cmd.sdma_cmd_type = SDMA_DUMP_CHN_PC; -+ for (i = 0; i < PC_MAX_NUM; i++) { -+ printf("hikptool sdma_dump -p -c %u -d %u -n %u\n", cmd.chip_id, cmd.die_id, i); -+ printf(" sdma%u pc chn%u\n", SDMA_DIE_CHANGE * cmd.chip_id + cmd.die_id, i); -+ cmd.chn_id = i; -+ ret = sdma_reg_dump(&cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("dump pc chn%u reg failed: %d\n", i, ret); -+ return ret; -+ } -+ } -+ -+ return 0; -+} -+ -+static int sdma_vc_dump_info(uint32_t chip_id, uint32_t die_id) -+{ -+ struct tool_sdma_cmd cmd = { -+ .chip_id = chip_id, -+ .die_id = die_id, -+ }; -+ uint32_t i; -+ int ret; -+ -+ cmd.sdma_cmd_type = SDMA_DUMP_CHN_VC; -+ for (i = 0; i < VC_MAX_NUM; i++) { -+ printf("hikptool sdma_dump -v -c %u -d %u -n %u\n", cmd.chip_id, cmd.die_id, i); -+ printf(" sdma%u vc chn%u\n", SDMA_DIE_CHANGE * cmd.chip_id + cmd.die_id, i); -+ cmd.chn_id = i; -+ ret = sdma_reg_dump(&cmd); -+ if (ret) { -+ HIKP_ERROR_PRINT("dump vc chn%u reg failed: %d\n", i, ret); -+ return ret; -+ } -+ } -+ -+ return 0; -+} -+ -+static void collect_sdma_reg_log(void) -+{ -+ struct reg_op ch_op = { -+ .func = sdma_chn_status_dump_info, -+ .func_name = "sdma_chn_status_dump_info", -+ }; -+ struct reg_op pc_op = { -+ .func = sdma_pc_dump_info, -+ .func_name = "sdma_pc_dump_info", -+ }; -+ struct reg_op vc_op = { -+ .func = sdma_vc_dump_info, -+ .func_name = "sdma_vc_dump_info", -+ }; -+ char log_name[MAX_LOG_NAME_LEN] = {0}; -+ uint32_t i; -+ int ret; -+ -+ for (i = 0; i < SDMA_DIE_MAX; i++) { -+ ch_op.sdma_die = i; -+ memset(log_name, 0, MAX_LOG_NAME_LEN); -+ (void)snprintf(log_name, MAX_LOG_NAME_LEN, "sdma%u_channel_status_dump", i); -+ -+ ret = hikp_collect_log(GROUP_SDMA, log_name, sdma_reg_log, (void *)&ch_op); -+ if (ret) -+ HIKP_ERROR_PRINT("%s failed: %d\n", ch_op.func_name, ret); -+ usleep(SDMA_DUMP_DELAY); -+ -+ pc_op.sdma_die = i; -+ memset(log_name, 0, MAX_LOG_NAME_LEN); -+ (void)snprintf(log_name, MAX_LOG_NAME_LEN, "sdma%u_pc_dump", i); -+ -+ ret = hikp_collect_log(GROUP_SDMA, log_name, sdma_reg_log, (void *)&pc_op); -+ if (ret) -+ HIKP_ERROR_PRINT("%s failed: %d\n", pc_op.func_name, ret); -+ usleep(SDMA_DUMP_DELAY); -+ -+ vc_op.sdma_die = i; -+ memset(log_name, 0, MAX_LOG_NAME_LEN); -+ (void)snprintf(log_name, MAX_LOG_NAME_LEN, "sdma%u_vc_dump", i); -+ -+ ret = hikp_collect_log(GROUP_SDMA, log_name, sdma_reg_log, (void *)&vc_op); -+ if (ret) -+ HIKP_ERROR_PRINT("%s failed: %d\n", vc_op.func_name, ret); -+ usleep(SDMA_DUMP_DELAY); -+ } -+} -+ -+void collect_sdma_log(void) -+{ -+ collect_sdma_kernel_log(); -+ collect_sdma_debugfs_log(); -+ collect_sdma_reg_log(); -+} --- -2.45.0.windows.1 - diff --git a/0098-hikptool-Update-the-tool-version-number-to-1.1.4.patch b/0098-hikptool-Update-the-tool-version-number-to-1.1.4.patch deleted file mode 100644 index 0520b30..0000000 --- a/0098-hikptool-Update-the-tool-version-number-to-1.1.4.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 3feff89b32b14e562e79d7c07053dd764321accc Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Fri, 14 Mar 2025 20:41:11 +0800 -Subject: [PATCH] hikptool: Update the tool version number to 1.1.4 - -Update the tool version number to 1.1.4 - -Signed-off-by: veega2022 ---- - tool_lib/tool_lib.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index 24b1fbb..d4493d7 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.1.3" -+#define TOOL_VER "1.1.4" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.45.0.windows.1 - diff --git a/0099-hikptool-ras-Add-support-for-exporting-black-box-dat.patch b/0099-hikptool-ras-Add-support-for-exporting-black-box-dat.patch deleted file mode 100644 index fe1d504..0000000 --- a/0099-hikptool-ras-Add-support-for-exporting-black-box-dat.patch +++ /dev/null @@ -1,713 +0,0 @@ -From 2cfa1ab8d699bc0336063409942ff5afb86394a8 Mon Sep 17 00:00:00 2001 -From: Bing Xia -Date: Wed, 12 Mar 2025 10:24:21 +0800 -Subject: [PATCH] hikptool: ras: Add support for exporting black box data to - file. - -1. support export black box data - e.g. hikptool bbox_export -2. support clear black box data - e.g. hikptool bbox_export -c - -Signed-off-by: Bing Xia xiabing14@h-partners.com ---- - CMakeLists.txt | 1 + - libhikptdev/include/hikptdev_plug.h | 3 +- - ras/ras_func/ras_common.h | 26 ++ - ras/ras_func/ras_dump_data.c | 389 ++++++++++++++++++++++++++++ - ras/ras_func/ras_dump_data.h | 88 +++++++ - ras/user_cmd/ras_cmd_dump.c | 99 +++++++ - ras/user_cmd/ras_tools_include.h | 25 ++ - 7 files changed, 630 insertions(+), 1 deletion(-) - create mode 100644 ras/ras_func/ras_common.h - create mode 100644 ras/ras_func/ras_dump_data.c - create mode 100644 ras/ras_func/ras_dump_data.h - create mode 100644 ras/user_cmd/ras_cmd_dump.c - create mode 100644 ras/user_cmd/ras_tools_include.h - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 4f4eb03..d50e2ac 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -47,6 +47,7 @@ file(GLOB_RECURSE HIKPTOOL_SRC - ${CMAKE_CURRENT_SOURCE_DIR}/socip/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/hccs/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/sdma/*.c -+ ${CMAKE_CURRENT_SOURCE_DIR}/ras/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/tool_lib/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/info_collect/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/hikp_init_main.c -diff --git a/libhikptdev/include/hikptdev_plug.h b/libhikptdev/include/hikptdev_plug.h -index 375fb89..bb58496 100644 ---- a/libhikptdev/include/hikptdev_plug.h -+++ b/libhikptdev/include/hikptdev_plug.h -@@ -45,7 +45,8 @@ enum cmd_module_type { - CXL_MOD = 10, - UB_MOD = 11, - HCCS_MOD = 16, -- SDMA_MOD = 17 -+ SDMA_MOD = 17, -+ RAS_MOD = 19 - }; - - void hikp_unlock(void); -diff --git a/ras/ras_func/ras_common.h b/ras/ras_func/ras_common.h -new file mode 100644 -index 0000000..9b9a486 ---- /dev/null -+++ b/ras/ras_func/ras_common.h -@@ -0,0 +1,26 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef RAS_COMMON_H -+#define RAS_COMMON_H -+ -+enum { -+ RAS_DUMP, -+}; -+ -+enum ras_dump_cmd_type { -+ DUMP_DFX = 0, -+ DUMP_CLEAR, -+}; -+ -+#endif /* RAS_COMMON_H */ -diff --git a/ras/ras_func/ras_dump_data.c b/ras/ras_func/ras_dump_data.c -new file mode 100644 -index 0000000..6230a48 ---- /dev/null -+++ b/ras/ras_func/ras_dump_data.c -@@ -0,0 +1,389 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "hikptdev_plug.h" -+#include "op_logs.h" -+#include "ras_common.h" -+#include "ras_dump_data.h" -+ -+static struct dfx_reg_dump_header header; -+ -+static int ras_get_data(uint32_t ras_cmd_type, struct ras_dump_req_para *req_data, -+ struct ras_rsp *ras_rsp_data) -+{ -+ uint32_t i; -+ struct hikp_cmd_ret *cmd_ret; -+ struct hikp_cmd_header req_header; -+ -+ hikp_cmd_init(&req_header, RAS_MOD, RAS_DUMP, ras_cmd_type); -+ cmd_ret = hikp_cmd_alloc(&req_header, req_data, RAS_REQ_DATA_LEN); -+ if (cmd_ret == NULL || cmd_ret->status != 0 || -+ cmd_ret->rsp_data_num > HIKP_RSP_ALL_DATA_MAX) { -+ printf("hikp_data_proc err\n"); -+ hikp_cmd_free(&cmd_ret); -+ return -1; -+ } -+ -+ ras_rsp_data->rsp_data_num = cmd_ret->rsp_data_num; -+ for (i = 0; i < ras_rsp_data->rsp_data_num; i++) { -+ ras_rsp_data->rsp_data[i] = cmd_ret->rsp_data[i]; -+ } -+ -+ hikp_cmd_free(&cmd_ret); -+ return 0; -+} -+ -+static void ras_print_time(struct file_seq *s) -+{ -+ time_t time_seconds = time(0); -+ struct tm timeinfo; -+ -+ (void)localtime_r(&time_seconds, &timeinfo); -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Time: %d-%d-%d %d:%d:%d\n", -+ timeinfo.tm_year + START_YEAR, timeinfo.tm_mon + 1, timeinfo.tm_mday, -+ timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); -+} -+ -+static int ras_parse_data(uint32_t *reg_save, uint32_t reg_num, uint32_t reg_off, struct file_seq *s) -+{ -+ uint32_t i, j; -+ uint32_t cycle; -+ uint32_t reg_count, pkt_reg_num; -+ uint32_t off = reg_off; -+ -+ pkt_reg_num = header.pkt_length / sizeof(uint32_t); -+ cycle = reg_num / pkt_reg_num; -+ if (!cycle) -+ return -1; -+ -+ for (i = 0; i < cycle; i++) { -+ if ((off + pkt_reg_num) > HIKP_RSP_ALL_DATA_MAX) { -+ HIKP_ERROR_PRINT("off is %u, pkt_reg_num is %u,\ -+ reg_save index will exceed max reg_save length\n", -+ off, pkt_reg_num); -+ return -1; -+ } -+ -+ ras_print_time(s); -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Socket: 0X%hhX\t", -+ (reg_save[off + DFX_HEAD_INFO_DW0] >> DFX_HEAD_SKT_ID_OFF) & 0xff); -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "DIE: 0X%hhX\t", -+ (reg_save[off + DFX_HEAD_INFO_DW0] >> DFX_HEAD_DIE_ID_OFF) & 0xff); -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Module: 0X%hhX\t", -+ (reg_save[off + DFX_HEAD_INFO_DW1] >> DFX_HEAD_MODULE_ID_OFF) & 0xff); -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Sub Module: 0X%hhX\t", -+ (reg_save[off + DFX_HEAD_INFO_DW1] >> DFX_HEAD_SUBMODULE_ID_OFF) & 0xff); -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "SequenceNum: 0X%hhX\t", -+ (reg_save[off + DFX_HEAD_INFO_DW1] >> DFX_HEAD_SEQUENCE_NUM_OFF) & 0xff); -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Version: 0X%hhX\n", -+ (reg_save[off + DFX_HEAD_INFO_DW0] >> DFX_HEAD_VERSION_OFF) & 0xff); -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, -+ "----------------------- DFX REGISTER DUMP -----------------------\n"); -+ -+ reg_count = (reg_save[off + DFX_HEAD_INFO_DW1] >> DFX_HEAD_REG_COUNT_OFF) & 0xff; -+ if (!reg_count || reg_count > pkt_reg_num - DFX_REG_PACKET_HEAD_LEN) { -+ HIKP_ERROR_PRINT("reg_count is %u, value is not within the reasonable range(1-%u).\n", -+ reg_count, pkt_reg_num - DFX_REG_PACKET_HEAD_LEN); -+ return -1; -+ } -+ -+ for (j = 0; j < reg_count; j++) -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "0X%X\n", -+ reg_save[off + DFX_COMMON_MAIN_TEXT_BEGIN + j]); -+ -+ s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "\n"); -+ off += pkt_reg_num; -+ } -+ -+ return 0; -+} -+ -+static int ras_generate_file_name(struct file_seq *s) -+{ -+ time_t time_seconds = time(0); -+ struct tm timeinfo; -+ int ret; -+ -+ (void)localtime_r(&time_seconds, &timeinfo); -+ ret = snprintf(s->file_name, MAX_LOG_NAME_LEN, "rasdfx_%d_%d_%d_%d_%d_%d.log", -+ timeinfo.tm_year + START_YEAR, timeinfo.tm_mon + 1, timeinfo.tm_mday, -+ timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); -+ if (ret < 0 || (uint32_t)ret >= MAX_LOG_NAME_LEN) { -+ HIKP_ERROR_PRINT("generate file name failed, errno is %d\n", errno); -+ return -errno; -+ } -+ -+ return 0; -+} -+ -+static int ras_store_data(struct file_seq *s) -+{ -+ char file_path[OP_LOG_FILE_PATH_MAXLEN]; -+ size_t write_cnt; -+ FILE *fp; -+ int rc; -+ -+ rc = snprintf(file_path, sizeof(file_path), HIKP_LOG_DIR_PATH"%s", s->file_name); -+ if (rc < 0) { -+ HIKP_ERROR_PRINT("creat log file path fail.\n"); -+ return -EIO; -+ } -+ -+ fp = fopen(file_path, "a"); -+ if (fp == NULL) { -+ HIKP_ERROR_PRINT("open %s failed, errno is %d\n", file_path, errno); -+ return -errno; -+ } -+ -+ write_cnt = fwrite(s->buffer, 1, s->len, fp); -+ if (write_cnt != (uint32_t)s->len) { -+ fclose(fp); -+ HIKP_ERROR_PRINT("write %s failed, write cnt %zu.\n", file_path, write_cnt); -+ return -EAGAIN; -+ } -+ -+ printf("dump imp log completed, log file: %s.\n", file_path); -+ /* Set the file permission to 0440 */ -+ if (chmod(file_path, 0440)) -+ HIKP_ERROR_PRINT("chmod %s failed, errno is %d\n", file_path, errno); -+ -+ if (fclose(fp)) { -+ HIKP_ERROR_PRINT("close %s failed, errno is %d\n", file_path, errno); -+ return -errno; -+ } -+ -+ s->len = 0; -+ -+ return 0; -+} -+ -+static int file_seq_init(struct file_seq *s, uint32_t size) -+{ -+ if (!size) -+ return -1; -+ -+ s->buffer_size = size; -+ s->len = 0; -+ s->buffer = (char*)malloc(s->buffer_size); -+ if (!s->buffer) -+ return -1; -+ -+ return 0; -+} -+ -+static void file_seq_destroy(struct file_seq *s) -+{ -+ free(s->buffer); -+ s->buffer = NULL; -+} -+ -+static void ras_rsp_init(struct ras_rsp *ras_rsp_data) -+{ -+ ras_rsp_data->first_pkt_begin = 0; -+ ras_rsp_data->last_pkt_end = 0; -+ ras_rsp_data->rsp_data_num = 0; -+ ras_rsp_data->packet_buffer_len = 0; -+ -+ memset(ras_rsp_data->rsp_data, 0, sizeof(ras_rsp_data->rsp_data)); -+ memset(ras_rsp_data->packet_buffer, 0, sizeof(ras_rsp_data->packet_buffer)); -+} -+ -+static int parse_packet_buffer_data(struct ras_rsp *ras_rsp_data, -+ uint32_t pkt_reg_num, struct file_seq *s) -+{ -+ int ret; -+ -+ if (pkt_reg_num > MAX_DFX_PACKET_LEN) { -+ HIKP_ERROR_PRINT("pkt_reg_num is %u, has exceeded max packet length\n", pkt_reg_num); -+ return -1; -+ } -+ -+ if (ras_rsp_data->packet_buffer_len) { -+ uint32_t rest_pkt_length; -+ -+ rest_pkt_length = pkt_reg_num - ras_rsp_data->packet_buffer_len; -+ memcpy(ras_rsp_data->packet_buffer + ras_rsp_data->packet_buffer_len, -+ ras_rsp_data->rsp_data, rest_pkt_length); -+ -+ ras_rsp_data->first_pkt_begin = rest_pkt_length; -+ ret = ras_parse_data(ras_rsp_data->packet_buffer, pkt_reg_num, 0, s); -+ if (ret) { -+ HIKP_ERROR_PRINT("ras parse packet_buffer_data is failed\n"); -+ return ret; -+ } -+ } else { -+ ras_rsp_data->first_pkt_begin = 0; -+ } -+ -+ if (ras_rsp_data->first_pkt_begin == ras_rsp_data->rsp_data_num) -+ return 0; -+ -+ ras_rsp_data->packet_buffer_len = -+ (ras_rsp_data->rsp_data_num - ras_rsp_data->first_pkt_begin) % pkt_reg_num; -+ ras_rsp_data->last_pkt_end = ras_rsp_data->rsp_data_num - ras_rsp_data->packet_buffer_len - 1; -+ ras_rsp_data->rsp_data_num = ras_rsp_data->last_pkt_end - ras_rsp_data->first_pkt_begin + 1; -+ -+ memcpy(ras_rsp_data->packet_buffer, ras_rsp_data->rsp_data + ras_rsp_data->last_pkt_end + 1, -+ ras_rsp_data->packet_buffer_len); -+ -+ return 0; -+} -+ -+static int ras_dump_pkt_pre(struct ras_rsp *ras_rsp_data, struct file_seq *s) -+{ -+ int ret; -+ uint32_t reg_num, max_pkt_num, s_buffer_size; -+ -+ max_pkt_num = (HIKP_RSP_DATA_SIZE_MAX / header.pkt_length) + 1; -+ reg_num = header.pkt_length / sizeof(uint32_t) - DFX_REG_PACKET_HEAD_LEN; -+ s_buffer_size = max_pkt_num * -+ (reg_num * DFX_FILE_SINGLE_REG_SIZE + DFX_FILE_SINGLE_PACKET_HEAD_SIZE); -+ ras_rsp_data->rsp_data_num = 0; -+ -+ ret = file_seq_init(s, s_buffer_size); -+ if (ret) { -+ HIKP_ERROR_PRINT("malloc file_seq buffer is failed\n"); -+ return ret; -+ } -+ -+ ret = ras_generate_file_name(s); -+ if (ret) { -+ HIKP_ERROR_PRINT("ras generate file name is failed\n"); -+ file_seq_destroy(s); -+ return ret; -+ } -+ -+ return ret; -+} -+ -+static int ras_dump_packet(struct tool_ras_cmd *cmd, struct ras_rsp *ras_rsp_data, -+ struct ras_dump_req_para *req_data) -+{ -+ int ret; -+ uint32_t i, cmd_num; -+ bool has_printed_socid = false; -+ struct file_seq s; -+ -+ ret = ras_dump_pkt_pre(ras_rsp_data, &s); -+ if (ret) -+ return ret; -+ -+ cmd_num = (header.pkt_num * header.pkt_length + -+ HIKP_RSP_DATA_SIZE_MAX - 1) / HIKP_RSP_DATA_SIZE_MAX; -+ /* 0: get header info; 1-n: get packet data */ -+ for (i = 0; i < cmd_num; i++) { -+ req_data->cmd_id = i + 1; -+ ret = ras_get_data(cmd->ras_cmd_type, req_data, ras_rsp_data); -+ if (ret) { -+ HIKP_ERROR_PRINT("ras dump cmd %u is failed\n", req_data->cmd_id); -+ goto err_out_free; -+ } -+ -+ if (!has_printed_socid) { -+ s.len += snprintf(s.buffer + s.len, s.buffer_size - s.len, "SocID: %hhX\n", -+ (ras_rsp_data->rsp_data[DFX_HEAD_INFO_DW0] >> DFX_HEAD_SOC_ID_OFF) & 0xff); -+ s.len += snprintf(s.buffer + s.len, s.buffer_size - s.len, "\n"); -+ -+ has_printed_socid = true; -+ } -+ -+ ret = parse_packet_buffer_data(ras_rsp_data, header.pkt_length / sizeof(uint32_t), &s); -+ if (ret) { -+ HIKP_ERROR_PRINT("ras parse packet buffer data is failed\n"); -+ goto err_out_free; -+ } -+ -+ if (ras_rsp_data->first_pkt_begin != ras_rsp_data->rsp_data_num) { -+ ret = ras_parse_data(ras_rsp_data->rsp_data, ras_rsp_data->rsp_data_num, -+ ras_rsp_data->first_pkt_begin, &s); -+ if (ret) { -+ HIKP_ERROR_PRINT("ras parse rsp_data is failed\n"); -+ goto err_out_free; -+ } -+ } -+ -+ ret = ras_store_data(&s); -+ if (ret) { -+ HIKP_ERROR_PRINT("ras store rsp_data is failed\n"); -+ goto err_out_free; -+ } -+ } -+ -+err_out_free: -+ file_seq_destroy(&s); -+ return ret; -+} -+ -+int ras_data_dump(struct tool_ras_cmd *cmd) -+{ -+ int ret; -+ struct ras_rsp ras_rsp_data; -+ struct ras_dump_req_para req_data = {0}; -+ -+ if (cmd == NULL) -+ return -ENOSPC; -+ -+ ras_rsp_init(&ras_rsp_data); -+ ret = ras_get_data(cmd->ras_cmd_type, &req_data, &ras_rsp_data); -+ if (ret || (ras_rsp_data.rsp_data_num != DFX_REG_DUMP_HEADER_LEN)) { -+ HIKP_ERROR_PRINT("ras dump header is failed, rsp_data_num is %u\n", -+ ras_rsp_data.rsp_data_num); -+ return -1; -+ } -+ -+ if (!ras_rsp_data.rsp_data[HEAD_MAGIC]) { -+ HIKP_ERROR_PRINT("ras dfx dump is failed, data does not exist or has been cleared.\n"); -+ return -1; -+ } -+ -+ header.pkt_num = ras_rsp_data.rsp_data[PKT_NUM]; -+ header.pkt_length = ras_rsp_data.rsp_data[PKT_LENGTH]; -+ if (header.pkt_num == 0 || header.pkt_length < DFX_REG_PACKET_HEAD_LEN) { -+ HIKP_ERROR_PRINT("ras dfx dump is failed, pkt_num is %u, pkt_length is %u\n", -+ header.pkt_num, header.pkt_length); -+ return -1; -+ } -+ -+ ret = ras_dump_packet(cmd, &ras_rsp_data, &req_data); -+ if (ret) -+ HIKP_ERROR_PRINT("ras dump packet is failed\n"); -+ -+ return ret; -+} -+ -+int ras_data_clear(struct tool_ras_cmd *cmd) -+{ -+ int ret; -+ struct ras_rsp ras_rsp_data; -+ struct ras_dump_req_para req_data = { 0 }; -+ -+ if (cmd == NULL) -+ return -ENOSPC; -+ -+ ras_rsp_init(&ras_rsp_data); -+ ret = ras_get_data(cmd->ras_cmd_type, &req_data, &ras_rsp_data); -+ if (ret || ras_rsp_data.rsp_data_num != DFX_REG_DUMP_HEADER_LEN || -+ ras_rsp_data.rsp_data[HEAD_MAGIC] != DFX_DATA_IS_CLEARED) { -+ HIKP_ERROR_PRINT("ras dfx data clear is failed\n"); -+ return -1; -+ } -+ -+ return 0; -+} -+ -diff --git a/ras/ras_func/ras_dump_data.h b/ras/ras_func/ras_dump_data.h -new file mode 100644 -index 0000000..9b326b3 ---- /dev/null -+++ b/ras/ras_func/ras_dump_data.h -@@ -0,0 +1,88 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef RAS_DUMP_REG_H -+#define RAS_DUMP_REG_H -+ -+#include "ras_tools_include.h" -+#include "hikpt_rciep.h" -+#include "tool_lib.h" -+ -+#define RAS_FILE_HEAD_BUF_LEN 256 -+#define MAX_DFX_PACKET_LEN 256 -+#define RAS_REQ_DATA_LEN 4 -+#define DFX_REG_DUMP_HEADER_LEN 6 -+#define DFX_REG_PACKET_HEAD_LEN 3 -+ -+struct dfx_reg_dump_header { -+ uint32_t head_magic; // 文件头的magic数字,特定值表示有效记录。 -+ uint32_t version; // 存储格å¼ç‰ˆæœ¬ -+ uint32_t cap_bits; // bit0表示是å¦å¼€å¯crc,其余bitä¿ç•™ã€‚ -+ uint32_t pkt_num; // packetæ•°é‡ -+ uint32_t pkt_length; // å•个packetå ç”¨å†…存空间,å•ä½bytes -+ uint32_t reserved; -+}; -+ -+struct file_seq { -+ char *buffer; -+ uint32_t buffer_size; -+ int len; -+ char file_name[MAX_LOG_NAME_LEN]; -+}; -+ -+struct ras_rsp { -+ uint32_t rsp_data[HIKP_RSP_ALL_DATA_MAX]; -+ uint32_t first_pkt_begin; -+ uint32_t last_pkt_end; -+ uint32_t rsp_data_num; -+ uint32_t packet_buffer[MAX_DFX_PACKET_LEN]; -+ uint32_t packet_buffer_len; -+}; -+ -+struct ras_dump_req_para { -+ uint32_t cmd_id; -+}; -+ -+enum reg_dump_header_index { -+ HEAD_MAGIC, -+ VERSION, -+ CAP_BITS, -+ PKT_NUM, -+ PKT_LENGTH -+}; -+ -+enum dfx_packet_index { -+ DFX_HEAD_INFO_DW0, -+ DFX_HEAD_INFO_DW1, -+ DFX_COMMON_MAIN_TEXT_BEGIN = 3 -+}; -+ -+#define DFX_HEAD_VERSION_OFF 0 -+#define DFX_HEAD_SOC_ID_OFF 8 -+#define DFX_HEAD_SKT_ID_OFF 16 -+#define DFX_HEAD_DIE_ID_OFF 24 -+#define DFX_HEAD_MODULE_ID_OFF 0 -+#define DFX_HEAD_SUBMODULE_ID_OFF 8 -+#define DFX_HEAD_SEQUENCE_NUM_OFF 16 -+#define DFX_HEAD_REG_COUNT_OFF 24 -+ -+#define DFX_DATA_IS_CLEARED 0 -+ -+#define DFX_FILE_SINGLE_PACKET_HEAD_SIZE 256 -+#define DFX_FILE_SINGLE_REG_SIZE 10 -+ -+ -+int ras_data_dump(struct tool_ras_cmd *cmd); -+int ras_data_clear(struct tool_ras_cmd *cmd); -+ -+#endif /* RAS_DUMP_REG_H */ -diff --git a/ras/user_cmd/ras_cmd_dump.c b/ras/user_cmd/ras_cmd_dump.c -new file mode 100644 -index 0000000..f8ae828 ---- /dev/null -+++ b/ras/user_cmd/ras_cmd_dump.c -@@ -0,0 +1,99 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include "tool_cmd.h" -+#include "ras_tools_include.h" -+#include "ras_dump_data.h" -+ -+struct tool_ras_cmd g_ras_dump_cmd = { -+ .ras_cmd_type = DUMP_DFX, -+}; -+ -+static int ras_dump_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(argv); -+ -+ printf("\n Usage: %s\n", self->cmd_ptr->name); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); -+ printf(" %s, %-25s %s\n", "-c", "--clear", "clearing memory dfx data\n"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static enum ras_dump_cmd_type ras_get_cmd_type(void) -+{ -+ return g_ras_dump_cmd.ras_cmd_type; -+} -+ -+static void ras_set_cmd_type(enum ras_dump_cmd_type type) -+{ -+ g_ras_dump_cmd.ras_cmd_type = type; -+} -+ -+static int ras_set_clear(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ ras_set_cmd_type(DUMP_CLEAR); -+ return 0; -+} -+ -+static int ras_dump_execute_process(void) -+{ -+ if (ras_get_cmd_type() == DUMP_DFX) -+ return ras_data_dump(&g_ras_dump_cmd); -+ else if (ras_get_cmd_type() == DUMP_CLEAR) -+ return ras_data_clear(&g_ras_dump_cmd); -+ else -+ return -EINVAL; -+} -+ -+static void ras_dump_execute(struct major_cmd_ctrl *self) -+{ -+ int ret; -+ const char *suc_msg[] = { -+ "ras dfx data dump success.", -+ "ras dfx data clear success." -+ }; -+ const char *err_msg[] = { -+ "ras dfx data dump error.", -+ "ras dfx data clear error." -+ }; -+ -+ ret = ras_dump_execute_process(); -+ if (ret == 0) { -+ printf("%s\n", suc_msg[ras_get_cmd_type()]); -+ } else { -+ snprintf(self->err_str, sizeof(self->err_str), "%s\n", -+ err_msg[ras_get_cmd_type()]); -+ self->err_no = ret; -+ } -+} -+ -+static void cmd_ras_dump_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = ras_dump_execute; -+ -+ cmd_option_register("-c", "--clear", false, ras_set_clear); -+ cmd_option_register("-h", "--help", false, ras_dump_help); -+} -+ -+HIKP_CMD_DECLARE("bbox_export", "export black box data to file", cmd_ras_dump_init); -diff --git a/ras/user_cmd/ras_tools_include.h b/ras/user_cmd/ras_tools_include.h -new file mode 100644 -index 0000000..a999b8a ---- /dev/null -+++ b/ras/user_cmd/ras_tools_include.h -@@ -0,0 +1,25 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef RAS_TOOLS_INCLUDE_H -+#define RAS_TOOLS_INCLUDE_H -+ -+#include "hikptdev_plug.h" -+#include "tool_lib.h" -+#include "ras_common.h" -+ -+struct tool_ras_cmd { -+ enum ras_dump_cmd_type ras_cmd_type; -+}; -+ -+#endif /* RAS_TOOLS_INCLUDE_H */ --- -2.33.0 - diff --git a/0100-hikptool-The-cpu_ring-command-is-added.patch b/0100-hikptool-The-cpu_ring-command-is-added.patch deleted file mode 100644 index e82989f..0000000 --- a/0100-hikptool-The-cpu_ring-command-is-added.patch +++ /dev/null @@ -1,225 +0,0 @@ -From 1bcb93fece24ffa688443716898e0150174bb005 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 7 May 2025 17:35:03 +0800 -Subject: [PATCH] hikptool: The cpu_ring command is added. - -Added the cpu_ring command for obtaining -the ring information of the CPU core. -Obtains the ring information of all chips -based on the -d parameter. - -eg: hikptool cpu_ring -d - -The information is displayed at the cluster granularity. - -Signed-off-by: veega2022 ---- - CMakeLists.txt | 1 + - core_ring/hikp_core_ring.c | 106 ++++++++++++++++++++++++++++ - core_ring/hikp_core_ring.h | 42 +++++++++++ - libhikptdev/include/hikptdev_plug.h | 1 + - tool_lib/tool_lib.h | 2 +- - 5 files changed, 151 insertions(+), 1 deletion(-) - create mode 100644 core_ring/hikp_core_ring.c - create mode 100644 core_ring/hikp_core_ring.h - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index d50e2ac..386cc28 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -37,6 +37,7 @@ endmacro() - option(ENABLE_STATIC "Make tool run as independently as possible" off) - - file(GLOB_RECURSE HIKPTOOL_SRC -+ ${CMAKE_CURRENT_SOURCE_DIR}/core_ring/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/cxl/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/net/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/ossl/*.c -diff --git a/core_ring/hikp_core_ring.c b/core_ring/hikp_core_ring.c -new file mode 100644 -index 0000000..1e8178f ---- /dev/null -+++ b/core_ring/hikp_core_ring.c -@@ -0,0 +1,106 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_core_ring.h" -+#include -+#include -+#include -+#include -+#include "tool_cmd.h" -+#include "hikptdev_plug.h" -+ -+static uint32_t g_cmd_param_mask = {0}; -+ -+static int hikp_core_ring_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(argv); -+ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-d"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-d", "--dump", "dump the ring info of the cpu core"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static int hikp_core_ring_get_info(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ g_cmd_param_mask |= PARAM_DUMP_MASK; -+ -+ return 0; -+} -+ -+static void hikp_core_ring_print_info(const struct core_ring_info *ring_info) -+{ -+ uint32_t cnt = 0; -+ -+ for (uint32_t chip = 0; chip < ring_info->chip_num; chip++) { -+ printf("chip %u core ring:\n", chip); -+ for (uint32_t cluster = 0; cluster < ring_info->per_cluster_num; cluster++) { -+ if (cnt >= RING_DATA_MAX) -+ break; -+ -+ printf("\tcluster%u ring info: 0x%" PRIx64 "\n", -+ cluster, ring_info->ring_data[cnt++]); -+ } -+ } -+} -+ -+static void hikp_core_ring_dump(struct major_cmd_ctrl *self) -+{ -+ struct hikp_cmd_header req_header = {0}; -+ struct core_ring_req cmd_req = {0}; -+ struct hikp_cmd_ret *cmd_ret; -+ -+ hikp_cmd_init(&req_header, CORE_RING_MOD, CORE_RING_DUMP, RING_INFO_DUMP); -+ cmd_ret = hikp_cmd_alloc(&req_header, &cmd_req, sizeof(cmd_req)); -+ self->err_no = hikp_rsp_normal_check(cmd_ret); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "get core ring info failed."); -+ hikp_cmd_free(&cmd_ret); -+ return; -+ } -+ -+ hikp_core_ring_print_info((struct core_ring_info *)cmd_ret->rsp_data); -+ -+ hikp_cmd_free(&cmd_ret); -+} -+ -+static void hikp_core_ring_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ if ((g_cmd_param_mask & PARAM_DUMP_MASK) == 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "Need input -d param!"); -+ self->err_no = -EINVAL; -+ return; -+ } -+ -+ hikp_core_ring_dump(self); -+} -+ -+static void cmd_core_ring_info_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_core_ring_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_core_ring_help); -+ cmd_option_register("-d", "--dump", false, hikp_core_ring_get_info); -+} -+ -+HIKP_CMD_DECLARE("cpu_ring", "dump cpu core ring info.", cmd_core_ring_info_init); -diff --git a/core_ring/hikp_core_ring.h b/core_ring/hikp_core_ring.h -new file mode 100644 -index 0000000..68f8261 ---- /dev/null -+++ b/core_ring/hikp_core_ring.h -@@ -0,0 +1,42 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_CORE_RING_H -+#define HIKP_CORE_RING_H -+#include -+#include "tool_lib.h" -+ -+#define PARAM_DUMP_MASK HI_BIT(0) -+ -+enum core_ring_cmd_type { -+ CORE_RING_DUMP = 1, -+}; -+ -+enum core_ring_sub_cmd_type { -+ RING_INFO_DUMP = 1, -+}; -+ -+#define RING_DATA_MAX 29 /* A maximum of 240 bytes can be transmitted at a time. */ -+struct core_ring_info { -+ uint8_t chip_num; -+ uint8_t per_cluster_num; -+ uint8_t rsv0[2]; -+ uint32_t rsv1; -+ uint64_t ring_data[RING_DATA_MAX]; -+}; -+ -+struct core_ring_req { -+ uint32_t cmd_flag; /* Reserved in the current version */ -+}; -+ -+#endif /* HIKP_CORE_RING_H */ -diff --git a/libhikptdev/include/hikptdev_plug.h b/libhikptdev/include/hikptdev_plug.h -index bb58496..ba9931f 100644 ---- a/libhikptdev/include/hikptdev_plug.h -+++ b/libhikptdev/include/hikptdev_plug.h -@@ -46,6 +46,7 @@ enum cmd_module_type { - UB_MOD = 11, - HCCS_MOD = 16, - SDMA_MOD = 17, -+ CORE_RING_MOD = 18, - RAS_MOD = 19 - }; - -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index d4493d7..d4accf1 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -18,7 +18,7 @@ - - #define TOOL_NAME "hikptool" - --#define TOOL_VER "1.1.4" -+#define TOOL_VER "1.1.5" - - #define HI_GET_BITFIELD(value, start, mask) (((value) >> (start)) & (mask)) - #define HI_SET_FIELD(origin, shift, val) ((origin) |= (val) << (shift)) --- -2.45.0.windows.1 - diff --git a/0101-hikptool-Code-quality-reinforcement.patch b/0101-hikptool-Code-quality-reinforcement.patch deleted file mode 100644 index 9279479..0000000 --- a/0101-hikptool-Code-quality-reinforcement.patch +++ /dev/null @@ -1,465 +0,0 @@ -From a24253e1a53ae199c8838f07ce3daa0ac6039894 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 10 Jun 2025 22:14:32 +0800 -Subject: [PATCH] hikptool: Code quality reinforcement - -Fixed some Code Security Review Comments -Including: Out-of-bounds access risk, -null pointer check - -Signed-off-by: veega2022 ---- - hccs/hikp_hccs.c | 2 +- - info_collect/hikp_collect_lib.c | 23 +++++++++++--- - net/nic/nic_dfx/hikp_nic_dfx.c | 16 ++++++---- - net/nic/nic_fd/hikp_nic_fd.c | 9 ++++++ - net/nic/nic_fd/hikp_nic_fd.h | 1 + - net/nic/nic_log/hikp_nic_log.c | 31 ++++++++++++++----- - .../roce_ext_common/hikp_roce_ext_common.c | 10 ++++++ - net/roce/roce_scc/hikp_roce_scc.c | 12 ++++--- - net/roce/roce_trp/hikp_roce_trp.c | 12 ++++--- - net/ub/ub_dfx/hikp_ub_dfx.c | 30 +++++++++++------- - net/ub/ub_ppp/hikp_unic_ppp.c | 13 +++++--- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 7 ++++- - tool_lib/tool_cmd.c | 10 +++++- - 13 files changed, 128 insertions(+), 48 deletions(-) - -diff --git a/hccs/hikp_hccs.c b/hccs/hikp_hccs.c -index 5ef4222..d979aad 100644 ---- a/hccs/hikp_hccs.c -+++ b/hccs/hikp_hccs.c -@@ -106,7 +106,7 @@ static int hikp_hccs_cmd_send(struct hikp_cmd_header *req_header, - goto out; - } - if (cur_blk_size > buff_len || -- cur_blk_size > sizeof(struct hikp_hccs_rsp)) { -+ cur_blk_size > sizeof(rsp->rsp_data)) { - HIKP_ERROR_PRINT("The firmware data size (%" PRIu64 ") greater than " - "sw buffer(%zu) or hikp_hccs_rsp size(%zu).\n", - cur_blk_size, buff_len, sizeof(struct hikp_hccs_rsp)); -diff --git a/info_collect/hikp_collect_lib.c b/info_collect/hikp_collect_lib.c -index bada846..c4db315 100644 ---- a/info_collect/hikp_collect_lib.c -+++ b/info_collect/hikp_collect_lib.c -@@ -102,10 +102,15 @@ int hikp_create_save_path(const char *name) - { - char collect_name[MAX_LOG_NAME_LEN] = {0}; - time_t time_seconds = time(0); -- struct tm timeinfo; -+ struct tm timeinfo, *ptm; - int ret; - -- localtime_r(&time_seconds, &timeinfo); -+ ptm = localtime_r(&time_seconds, &timeinfo); -+ if (!ptm) { -+ HIKP_ERROR_PRINT("failed to get time info.\n"); -+ return -EINVAL; -+ } -+ - if (name != NULL) - (void)snprintf((char *)collect_name, MAX_LOG_NAME_LEN, - "collect_%s_%04d%02d%02d%02d%02d%02d", -@@ -201,12 +206,22 @@ static int hikp_collect_cmd_exec(const struct info_collect_cmd *cmd) - * process just like when it succeeds. - * */ - if (execvp(cmd->args[ARGS_IDX0], cmd->args) < 0) { -- HIKP_ERROR_PRINT("execvp failed: %d\n", errno); -+ HIKP_ERROR_PRINT("%s: execvp failed %d\n", cmd->args[ARGS_IDX0], errno); - exit(EXIT_FAILURE); - } - } else if (pid > 0) { - /* Parent process */ -- waitpid(pid, &status, 0); -+ if (waitpid(pid, &status, 0) < 0) { -+ HIKP_ERROR_PRINT("%s: waitpid() failure %d\n", -+ cmd->args[ARGS_IDX0], errno); -+ } else if (WIFEXITED((unsigned int)status) && -+ (WEXITSTATUS((unsigned int)status) != 0)) { -+ HIKP_ERROR_PRINT("%s: child exit %u\n", -+ cmd->args[ARGS_IDX0], -+ WEXITSTATUS((unsigned int)status)); -+ if (strcmp(cmd->args[ARGS_IDX0], "tar") == 0) -+ return -ECHILD; -+ } - } else { - HIKP_ERROR_PRINT("fork failed!\n"); - return -ECHILD; -diff --git a/net/nic/nic_dfx/hikp_nic_dfx.c b/net/nic/nic_dfx/hikp_nic_dfx.c -index d6114de..c7737a8 100644 ---- a/net/nic/nic_dfx/hikp_nic_dfx.c -+++ b/net/nic/nic_dfx/hikp_nic_dfx.c -@@ -406,9 +406,11 @@ static const struct dfx_type_name_parse g_dfx_ssu_name_parse[] = { - - void hikp_nic_dfx_set_cmd_para(int idx) - { -- g_dfx_param.sub_cmd_code = g_dfx_module_parse[idx].sub_cmd_code; -- g_dfx_param.module_idx = idx; -- g_dfx_param.flag |= MODULE_SET_FLAG; -+ if (idx < (int)HIKP_ARRAY_SIZE(g_dfx_module_parse)) { -+ g_dfx_param.sub_cmd_code = g_dfx_module_parse[idx].sub_cmd_code; -+ g_dfx_param.module_idx = idx; -+ g_dfx_param.flag |= MODULE_SET_FLAG; -+ } - } - - static void dfx_help_info(const struct major_cmd_ctrl *self) -@@ -458,6 +460,7 @@ static int hikp_nic_dfx_get_blk(struct hikp_cmd_ret **cmd_ret, - static int hikp_nic_get_first_blk_dfx(struct nic_dfx_rsp_head_t *rsp_head, uint32_t **reg_data, - uint32_t *max_dfx_size, uint32_t *version) - { -+ uint32_t reg_data_size = MAX_DFX_DATA_NUM * sizeof(uint32_t); - struct nic_dfx_rsp_t *dfx_rsp = NULL; - struct hikp_cmd_ret *cmd_ret = NULL; - int ret; -@@ -482,11 +485,12 @@ static int hikp_nic_get_first_blk_dfx(struct nic_dfx_rsp_head_t *rsp_head, uint3 - goto err_out; - } - -- if (rsp_head->cur_blk_size > *max_dfx_size) { -+ if (rsp_head->cur_blk_size > *max_dfx_size || rsp_head->cur_blk_size > reg_data_size) { - free(*reg_data); - *reg_data = NULL; -- HIKP_ERROR_PRINT("blk0 reg_data copy size error, data size: 0x%x, max size: 0x%x\n", -- rsp_head->cur_blk_size, *max_dfx_size); -+ HIKP_ERROR_PRINT("blk0 reg_data copy size error" -+ "data size: 0x%x, max size: 0x%x, reg_data_size: 0x%x\n", -+ rsp_head->cur_blk_size, *max_dfx_size, reg_data_size); - ret = -EINVAL; - goto err_out; - } -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index 10fee42..eace094 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -841,6 +841,7 @@ static void hikp_nic_fd_data_free(union nic_fd_feature_info *fd_data) - static int hikp_nic_check_fd_hw_info(const struct nic_fd_hw_info *hw_info, - const struct fd_feature_cmd *fd_cmd) - { -+ uint16_t max_key_bytes, active_key_bits; - uint16_t i; - - if (strcmp(fd_cmd->feature_name, NIC_FD_RULES_NAME) == 0) { -@@ -863,6 +864,14 @@ static int hikp_nic_check_fd_hw_info(const struct nic_fd_hw_info *hw_info, - return -EOPNOTSUPP; - } - } -+ -+ max_key_bytes = hikp_nic_get_tcam_data_size(hw_info->key_max_bit); -+ active_key_bits = hikp_nic_get_max_key_len(hw_info->mode); -+ if (active_key_bits > max_key_bytes * HIKP_BITS_PER_BYTE) { -+ HIKP_ERROR_PRINT("The active tcam bits(%u) is more than the max key bits(%d).\n", -+ active_key_bits, max_key_bytes * HIKP_BITS_PER_BYTE); -+ return -EINVAL; -+ } - } else if (strcmp(fd_cmd->feature_name, NIC_FD_COUNTER_NAME) == 0) { - if (hw_info->alloc.stage_counter_num[NIC_FD_STAGE_1] == 0) { - HIKP_ERROR_PRINT("The stage1's counter number is zero.\n"); -diff --git a/net/nic/nic_fd/hikp_nic_fd.h b/net/nic/nic_fd/hikp_nic_fd.h -index ce363c9..98577ff 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.h -+++ b/net/nic/nic_fd/hikp_nic_fd.h -@@ -113,6 +113,7 @@ struct nic_fd_key_cfg { - struct nic_fd_hw_info { - uint8_t mode; - uint8_t enable; -+ /* Max key bit width hwardware supported and unrelated to mode. */ - uint16_t key_max_bit; - struct nic_fd_alloc alloc; - struct nic_fd_key_cfg key_cfg[NIC_FD_STAGE_NUM]; -diff --git a/net/nic/nic_log/hikp_nic_log.c b/net/nic/nic_log/hikp_nic_log.c -index 0e2d556..4dd2721 100644 ---- a/net/nic/nic_log/hikp_nic_log.c -+++ b/net/nic/nic_log/hikp_nic_log.c -@@ -56,30 +56,45 @@ static int hikp_nic_write_data_to_file(uint8_t *data, uint32_t len) - size_t write_cnt; - FILE *fp = NULL; - int ret; -+ int rc; - - ret = generate_file_name(file_name, MAX_LOG_NAME_LEN, (const unsigned char *)"m7"); - if (ret < 0) - return ret; - -- ret = snprintf(g_log_path, sizeof(g_log_path), HIKP_LOG_DIR_PATH"%s", file_name); -- if (ret < 0) { -+ rc = snprintf(g_log_path, sizeof(g_log_path), HIKP_LOG_DIR_PATH"%s", file_name); -+ if (rc < 0) { - HIKP_ERROR_PRINT("creat log file path fail.\n"); - return -EIO; - } -- (void)remove((const char *)g_log_path); -+ -+ if (access((const char *)g_log_path, F_OK) == 0) { -+ if (remove((const char *)g_log_path)) { -+ HIKP_ERROR_PRINT("remove %s failed, errno is %d\n", g_log_path, errno); -+ return -errno; -+ } -+ } -+ - fp = fopen(g_log_path, "w+"); - if (fp == NULL) { - HIKP_ERROR_PRINT("open %s failed, errno is %d\n", g_log_path, errno); - return -errno; - } - write_cnt = fwrite(data, 1, len, fp); -- if (write_cnt != len) -- HIKP_ERROR_PRINT("write %s failed, write cnt %lu.\n", g_log_path, write_cnt); -+ if (write_cnt != len) { -+ HIKP_ERROR_PRINT("write %s failed, write cnt %zu.\n", g_log_path, write_cnt); -+ ret = -EAGAIN; -+ } - - printf("dump m7 log completed, log file: %s.\n", g_log_path); -- (void)chmod(g_log_path, 0440); -- (void)fclose(fp); -- return 0; -+ /* Set the file permission to 0440 */ -+ if (chmod(g_log_path, 0440)) -+ HIKP_ERROR_PRINT("chmod %s failed, errno is %d\n", g_log_path, errno); -+ -+ if (fclose(fp)) -+ HIKP_ERROR_PRINT("close %s failed, errno is %d\n", g_log_path, errno); -+ -+ return ret; - } - - static int hikp_nic_get_blk_log(struct hikp_cmd_ret **cmd_ret, uint32_t blk_id) -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index 9c844f4..fda2cf8 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -96,6 +96,7 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - struct reg_data *reg = &output->reg; - struct hikp_cmd_ret *cmd_ret; - uint32_t remain_block; -+ size_t reg_data_size; - size_t cur_size; - int ret; - -@@ -144,6 +145,15 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - } - - cur_size = res_head->cur_block_num * sizeof(uint32_t); -+ /*calculates the size of reg_data in the roce_ext_res_param structure.*/ -+ reg_data_size = cmd_ret->rsp_data_num * sizeof(uint32_t) - sizeof(struct roce_ext_head); -+ if (cur_size + reg_array_length * sizeof(uint32_t) > reg_data_size) { -+ printf("hikptool roce_%s cur size error, cur_size: %zu, reg_data_size: %zu.\n", -+ cmd_name, cur_size, reg_data_size); -+ ret = -EINVAL; -+ hikp_roce_ext_reg_data_free(reg); -+ goto get_data_error; -+ } - memcpy(reg->offset + block_id, - (uint32_t *)&roce_ext_res->reg_data, cur_size); - memcpy(reg->data + block_id, -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index 67a2a1e..d7aaaa8 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -169,9 +169,10 @@ static int hikp_roce_scc_get_total_data_num(struct roce_scc_head *res_head, - } - - cur_size = roce_scc_res->head.cur_block_num * sizeof(uint32_t); -- if (cur_size > max_size) { -+ if (cur_size > max_size || roce_scc_res->head.cur_block_num > ROCE_HIKP_SCC_REG_NUM) { - printf("hikptool roce_scc log data copy size error, " -- "data size: 0x%zx, max size: 0x%zx\n", cur_size, max_size); -+ "data size: 0x%zx, max size: 0x%zx, block_num: 0x%x\n", -+ cur_size, max_size, roce_scc_res->head.cur_block_num); - ret = -EINVAL; - goto get_data_error; - } -@@ -204,10 +205,11 @@ static int hikp_roce_scc_get_next_data(struct roce_scc_head *res_head, - - roce_scc_res = (struct roce_scc_res_param *)cmd_ret->rsp_data; - cur_size = roce_scc_res->head.cur_block_num * sizeof(uint32_t); -- if (cur_size > data_size) { -- hikp_cmd_free(&cmd_ret); -+ if (cur_size > data_size || roce_scc_res->head.cur_block_num > ROCE_HIKP_SCC_REG_NUM) { - printf("hikptool roce_scc next log data copy size error, " -- "data size: 0x%zx, max size: 0x%zx\n", cur_size, data_size); -+ "data size: 0x%zx, max size: 0x%zx, block_num: 0x%x\n", -+ cur_size, data_size, roce_scc_res->head.cur_block_num); -+ hikp_cmd_free(&cmd_ret); - return -EINVAL; - } - memcpy(*offset, roce_scc_res->reg_data.offset, cur_size); -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index 67dfb8e..8b34409 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -192,9 +192,10 @@ static int hikp_roce_trp_get_total_data_num(struct roce_trp_head *res_head, - } - - cur_size = roce_trp_res->head.cur_block_num * sizeof(uint32_t); -- if (cur_size > max_size) { -+ if (cur_size > max_size || roce_trp_res->head.cur_block_num > ROCE_HIKP_TRP_REG_NUM) { - printf("hikptool roce_trp log data copy size error, " -- "data size: 0x%zx, max size: 0x%zx\n", cur_size, max_size); -+ "data size: 0x%zx, max size: 0x%zx, block_num: 0x%x\n", -+ cur_size, max_size, roce_trp_res->head.cur_block_num); - hikp_roce_trp_reg_data_free(offset, data); - ret = -EINVAL; - goto get_data_error; -@@ -229,10 +230,11 @@ static int hikp_roce_trp_get_next_data(struct roce_trp_head *res_head, - roce_trp_res = (struct roce_trp_res_param *)cmd_ret->rsp_data; - cur_size = roce_trp_res->head.cur_block_num * sizeof(uint32_t); - -- if (cur_size > data_size) { -- hikp_cmd_free(&cmd_ret); -+ if (cur_size > data_size || roce_trp_res->head.cur_block_num > ROCE_HIKP_TRP_REG_NUM) { - printf("hikptool roce_trp next log data copy size error, " -- "data size: 0x%zx, max size: 0x%zx\n", cur_size, data_size); -+ "data size: 0x%zx, max size: 0x%zx, block_num: 0x%x\n", -+ cur_size, data_size, roce_trp_res->head.cur_block_num); -+ hikp_cmd_free(&cmd_ret); - return -EINVAL; - } - memcpy(*offset, roce_trp_res->reg_data.offset, cur_size); -diff --git a/net/ub/ub_dfx/hikp_ub_dfx.c b/net/ub/ub_dfx/hikp_ub_dfx.c -index 8a3e293..4929003 100644 ---- a/net/ub/ub_dfx/hikp_ub_dfx.c -+++ b/net/ub/ub_dfx/hikp_ub_dfx.c -@@ -104,6 +104,7 @@ static int hikp_ub_get_first_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t - struct ub_dfx_rsp *dfx_rsp = NULL; - struct hikp_cmd_ret *cmd_ret; - uint32_t rsp_data_size; -+ uint8_t cur_blk_size; - int ret; - - ret = hikp_ub_dfx_get_blk_data(&cmd_ret, 0, g_ub_dfx_param.sub_cmd_code); -@@ -127,18 +128,20 @@ static int hikp_ub_get_first_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t - } - - rsp_data_size = cmd_ret->rsp_data_num * REP_DATA_BLK_SIZE; -- if (rsp_data_size - sizeof(dfx_rsp->rsp_head) < rsp_head->cur_blk_size || -- *max_dfx_size < rsp_head->cur_blk_size) { -- HIKP_ERROR_PRINT("blk0 reg_data copy size error, rsp data size: %u, data size: %hhu, max size: %u\n", -- rsp_data_size, rsp_head->cur_blk_size, *max_dfx_size); -+ cur_blk_size = rsp_head->cur_blk_size; -+ if (rsp_data_size - sizeof(dfx_rsp->rsp_head) < cur_blk_size || -+ *max_dfx_size < cur_blk_size || cur_blk_size > sizeof(dfx_rsp->reg_data)) { -+ HIKP_ERROR_PRINT("blk0 reg_data copy size error, rsp data size: %u, " -+ "data size: %hhu, max size: %u\n", -+ rsp_data_size, cur_blk_size, *max_dfx_size); - free(*reg_data); - *reg_data = NULL; - ret = -EINVAL; - goto err_out; - } -- memcpy(*reg_data, dfx_rsp->reg_data, rsp_head->cur_blk_size); -+ memcpy(*reg_data, dfx_rsp->reg_data, cur_blk_size); - -- *max_dfx_size -= (uint32_t)rsp_head->cur_blk_size; -+ *max_dfx_size -= (uint32_t)cur_blk_size; - err_out: - hikp_cmd_free(&cmd_ret); - -@@ -151,6 +154,7 @@ static int hikp_ub_get_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t blk_id - struct ub_dfx_rsp *dfx_rsp = NULL; - struct hikp_cmd_ret *cmd_ret; - uint32_t rsp_data_size; -+ uint8_t cur_blk_size; - int ret; - - ret = hikp_ub_dfx_get_blk_data(&cmd_ret, blk_id, g_ub_dfx_param.sub_cmd_code); -@@ -160,15 +164,17 @@ static int hikp_ub_get_blk_dfx(struct ub_dfx_rsp_head *rsp_head, uint32_t blk_id - dfx_rsp = (struct ub_dfx_rsp *)(cmd_ret->rsp_data); - *rsp_head = dfx_rsp->rsp_head; - rsp_data_size = cmd_ret->rsp_data_num * REP_DATA_BLK_SIZE; -- if (rsp_data_size - sizeof(dfx_rsp->rsp_head) < rsp_head->cur_blk_size || -- rsp_head->cur_blk_size > *max_dfx_size) { -- HIKP_ERROR_PRINT("blk%u reg_data copy size error, rsp data size: %u, data size: %hhu, max size: %u\n", -- blk_id, rsp_data_size, rsp_head->cur_blk_size, *max_dfx_size); -+ cur_blk_size = rsp_head->cur_blk_size; -+ if (rsp_data_size - sizeof(dfx_rsp->rsp_head) < cur_blk_size || -+ *max_dfx_size < cur_blk_size || cur_blk_size > sizeof(dfx_rsp->reg_data)) { -+ HIKP_ERROR_PRINT("blk%u reg_data copy size error, rsp data size: %u, " -+ "data size: %hhu, max size: %u\n", -+ blk_id, rsp_data_size, cur_blk_size, *max_dfx_size); - ret = -EINVAL; - goto err_out; - } -- memcpy(reg_data, dfx_rsp->reg_data, rsp_head->cur_blk_size); -- *max_dfx_size -= (uint32_t)rsp_head->cur_blk_size; -+ memcpy(reg_data, dfx_rsp->reg_data, cur_blk_size); -+ *max_dfx_size -= (uint32_t)cur_blk_size; - - err_out: - hikp_cmd_free(&cmd_ret); -diff --git a/net/ub/ub_ppp/hikp_unic_ppp.c b/net/ub/ub_ppp/hikp_unic_ppp.c -index 4c48e70..5f48ee6 100644 ---- a/net/ub/ub_ppp/hikp_unic_ppp.c -+++ b/net/ub/ub_ppp/hikp_unic_ppp.c -@@ -90,6 +90,7 @@ static int hikp_unic_ppp_get_blk(struct hikp_cmd_header *req_header, - struct hikp_cmd_ret *cmd_ret; - struct unic_ppp_rsp *rsp; - uint32_t rsp_data_size; -+ uint8_t cur_blk_size; - int ret = 0; - - cmd_ret = hikp_cmd_alloc(req_header, req_data, sizeof(*req_data)); -@@ -100,14 +101,16 @@ static int hikp_unic_ppp_get_blk(struct hikp_cmd_header *req_header, - - rsp = (struct unic_ppp_rsp *)cmd_ret->rsp_data; - rsp_data_size = cmd_ret->rsp_data_num * REP_DATA_BLK_SIZE; -- if (rsp_data_size - sizeof(rsp->rsp_head) < rsp->rsp_head.cur_blk_size || -- buf_len < rsp->rsp_head.cur_blk_size) { -- HIKP_ERROR_PRINT("block context copy size error, data size: %u, buffer size: %zu, blk size: %hhu.\n", -- rsp_data_size, buf_len, rsp->rsp_head.cur_blk_size); -+ cur_blk_size = rsp->rsp_head.cur_blk_size; -+ if (rsp_data_size - sizeof(rsp->rsp_head) < cur_blk_size || -+ buf_len < cur_blk_size || cur_blk_size > sizeof(rsp->rsp_data)) { -+ HIKP_ERROR_PRINT("block context copy size error, data size: %u, " -+ "buffer size: %zu, blk size: %hhu.\n", -+ rsp_data_size, buf_len, cur_blk_size); - ret = -EINVAL; - goto out; - } -- memcpy(buf, rsp->rsp_data, rsp->rsp_head.cur_blk_size); -+ memcpy(buf, rsp->rsp_data, cur_blk_size); - memcpy(rsp_head, &rsp->rsp_head, sizeof(struct unic_ppp_rsp_head)); - - out: -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index ba6641e..f7ec2b3 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -397,7 +397,12 @@ static int pcie_create_dumpreg_log_file(uint32_t port_id, uint32_t dump_level) - memset(dumpreg_log_file, 0, sizeof(dumpreg_log_file)); - (void)strncpy((char *)dumpreg_log_file, file_name, MAX_LOG_NAME_LEN + 1); - -- (void)remove((const char *)file_name); -+ if (access((const char *)file_name, F_OK) == 0) { -+ if (remove((const char *)file_name)) { -+ Err("remove %s failed, errno is %d\n", file_name, errno); -+ return -errno; -+ } -+ } - /* Add write permission to the file */ - fd_file = fopen(file_name, "w+"); - if (fd_file == NULL) { -diff --git a/tool_lib/tool_cmd.c b/tool_lib/tool_cmd.c -index db54f0f..409bb5d 100644 ---- a/tool_lib/tool_cmd.c -+++ b/tool_lib/tool_cmd.c -@@ -206,7 +206,15 @@ void command_parse_and_excute(const int argc, const char **argv) - snprintf(major_cmd->err_str, sizeof(major_cmd->err_str), "locking failed."); - goto PARSE_OUT; - } -- major_cmd->execute(major_cmd); -+ -+ if (major_cmd->execute) { -+ major_cmd->execute(major_cmd); -+ } else { -+ major_cmd->err_no = -EPERM; -+ snprintf(major_cmd->err_str, sizeof(major_cmd->err_str), -+ "Command execute is null."); -+ } -+ - tool_unlock(&lock_fd, UDA_FLOCK_BLOCK); - PARSE_OUT: - if (major_cmd->err_no) --- -2.45.0.windows.1 - diff --git a/0102-hikptool-Add-more-RoCE-registers-for-diagnosis.patch b/0102-hikptool-Add-more-RoCE-registers-for-diagnosis.patch deleted file mode 100644 index 3c426de..0000000 --- a/0102-hikptool-Add-more-RoCE-registers-for-diagnosis.patch +++ /dev/null @@ -1,78 +0,0 @@ -From fc70fc5b4e5c5d3dda0e1c7926af46b815309d99 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Thu, 12 Jun 2025 21:37:47 +0800 -Subject: [PATCH] hikptool: Add more RoCE registers for diagnosis - -Add more RoCE registers for diagnosis. - -Signed-off-by: Junxian Huang ---- - net/roce/roce_pkt/hikp_roce_pkt.c | 3 +++ - net/roce/roce_scc/hikp_roce_scc.c | 1 + - net/roce/roce_timer/hikp_roce_timer.c | 8 ++++++++ - net/roce/roce_tsp/hikp_roce_tsp.c | 4 ++++ - 4 files changed, 16 insertions(+) - -diff --git a/net/roce/roce_pkt/hikp_roce_pkt.c b/net/roce/roce_pkt/hikp_roce_pkt.c -index 1538788..4d1a377 100644 ---- a/net/roce/roce_pkt/hikp_roce_pkt.c -+++ b/net/roce/roce_pkt/hikp_roce_pkt.c -@@ -90,6 +90,9 @@ static const char *g_pkt_reg_name[] = { - "ROCEE_CNP_PKT_TX_CNT", - "TRP_GET_MPT_ERR_PKT_CNT", - "TRP_GET_IRRL_ERR_PKT_CNT", -+ "GEN_AC_CQ_CQE_CNT", -+ "GEN_AC_CQ_POE_CNT", -+ "GEN_AC_CQ_NOTIFY_CNT", - }; - - static void hikp_roce_pkt_print(uint32_t total_block_num, -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index d7aaaa8..428beda 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -265,6 +265,7 @@ static const char *g_scc_common_reg_name[] = { - "SCC_INPUT_REQ_CNT", - "SCC_OUTPUT_RSP_CNT", - "SCC_INOUT_CNT_CFG", -+ "SCC_CUR_PROCESS_TIME", - }; - - static const char *g_scc_dcqcn_reg_name[] = { -diff --git a/net/roce/roce_timer/hikp_roce_timer.c b/net/roce/roce_timer/hikp_roce_timer.c -index 927d8a6..38b63ac 100644 ---- a/net/roce/roce_timer/hikp_roce_timer.c -+++ b/net/roce/roce_timer/hikp_roce_timer.c -@@ -69,6 +69,14 @@ static const char *g_timer_qpc_reg_name[] = { - "ROCEE_TIMER_QPC_ECC_ERR", - "ROCEE_TIMER_QPC_ECC_ERR_INFO", - "START_TYPE_ERR_CNT", -+ "FIFO_CNT_TH0", -+ "FIFO_CNT_TH1", -+ "FIFO_CNT_TH2", -+ "FIFO_CNT_TH3", -+ "FIFO_CNT_TH4", -+ "FIFO_CNT_TH5", -+ "FIFO_CNT_TH6", -+ "FIFO_CNT_TH7", - }; - - static const char *g_timer_cqc_reg_name[] = { -diff --git a/net/roce/roce_tsp/hikp_roce_tsp.c b/net/roce/roce_tsp/hikp_roce_tsp.c -index 5fe2104..671288d 100644 ---- a/net/roce/roce_tsp/hikp_roce_tsp.c -+++ b/net/roce/roce_tsp/hikp_roce_tsp.c -@@ -167,6 +167,10 @@ static const char *g_tsp_common_reg_name[] = { - "TSP_INDRECT_RD_CTRL", - "TSP_INDRECT_RD_DATA", - "ROCEE_TSP_OVF", -+ "ROCE_TPP_DATA_FIFO_ST", -+ "ROCE_TPP_DATA_ALM", -+ "ROCE_TPP_DATA_STA0", -+ "ROCE_TPP_DATA_STA1", - }; - - static const char *g_tsp_tdp_reg_name[] = { --- -2.45.0.windows.1 - diff --git a/0103-hikptool-roce-Support-to-print-u64-reg_data.patch b/0103-hikptool-roce-Support-to-print-u64-reg_data.patch deleted file mode 100644 index 0c0ba73..0000000 --- a/0103-hikptool-roce-Support-to-print-u64-reg_data.patch +++ /dev/null @@ -1,198 +0,0 @@ -From 2c29a135c0d23978e1c98d69b42924564aee1635 Mon Sep 17 00:00:00 2001 -From: wenglianfa -Date: Thu, 3 Jul 2025 17:25:08 +0800 -Subject: [PATCH 103/104] hikptool/roce: Support to print u64 reg_data - -Support to print u64 reg_data. - -Signed-off-by: wenglianfa ---- - .../roce_ext_common/hikp_roce_ext_common.c | 61 +++++++++++++------ - .../roce_ext_common/hikp_roce_ext_common.h | 26 +++++++- - 2 files changed, 66 insertions(+), 21 deletions(-) - -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index fda2cf8..c225ec8 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -12,6 +12,7 @@ - */ - - #include "hikp_roce_ext_common.h" -+#include - - static void hikp_roce_ext_reg_data_free(struct reg_data *reg) - { -@@ -95,9 +96,11 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - struct roce_ext_res_param *roce_ext_res; - struct reg_data *reg = &output->reg; - struct hikp_cmd_ret *cmd_ret; -+ size_t reg_data_offset; - uint32_t remain_block; -- size_t reg_data_size; -- size_t cur_size; -+ size_t offset_size; -+ size_t data_size; -+ void *dst_data; - int ret; - - /* reg_array_length greater than or equal to 0 ensures that cmd_name -@@ -117,6 +120,7 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - - if (block_id == 0) { - res_head->total_block_num = roce_ext_res->head.total_block_num; -+ res_head->flags = roce_ext_res->head.flags; - if (!res_head->total_block_num) { - printf("hikptool roce_%s total_block_num error!\n", - cmd_name); -@@ -124,10 +128,12 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - goto get_data_error; - } - reg->offset = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); -- reg->data = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); -+ output->per_val_size = res_head->flags & ROCE_HIKP_DATA_U64_FLAG ? -+ sizeof(uint64_t) : sizeof(uint32_t); -+ reg->data = calloc(res_head->total_block_num, output->per_val_size); - if ((reg->offset == NULL) || (reg->data == NULL)) { -- printf("hikptool roce_%s alloc log memmory 0x%zx failed!\n", -- cmd_name, res_head->total_block_num * sizeof(uint32_t)); -+ printf("hikptool roce_%s alloc log memmory failed!\n", -+ cmd_name); - ret = -ENOMEM; - hikp_roce_ext_reg_data_free(reg); - goto get_data_error; -@@ -144,20 +150,32 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - goto get_data_error; - } - -- cur_size = res_head->cur_block_num * sizeof(uint32_t); -- /*calculates the size of reg_data in the roce_ext_res_param structure.*/ -- reg_data_size = cmd_ret->rsp_data_num * sizeof(uint32_t) - sizeof(struct roce_ext_head); -- if (cur_size + reg_array_length * sizeof(uint32_t) > reg_data_size) { -- printf("hikptool roce_%s cur size error, cur_size: %zu, reg_data_size: %zu.\n", -- cmd_name, cur_size, reg_data_size); -+ /* -+ * The data structure `roce_ext_res_param_u64` returned by the -+ * firmware is 8-byte aligned, so the offset of the `reg_data` -+ * member needs to be adjusted accordingly. -+ */ -+ if (res_head->flags & ROCE_HIKP_DATA_U64_FLAG) -+ reg_data_offset = offsetof(struct roce_ext_res_param_u64, reg_data); -+ else -+ reg_data_offset = offsetof(struct roce_ext_res_param, reg_data); -+ -+ offset_size = res_head->cur_block_num * sizeof(uint32_t); -+ data_size = res_head->cur_block_num * output->per_val_size; -+ dst_data = reg->data_u32 + block_id * output->per_val_size / sizeof(uint32_t); -+ /* Avoid memcpy out-of-bounds. */ -+ if ((reg_data_offset + data_size) / sizeof(uint32_t) + reg_array_length > cmd_ret->rsp_data_num) { -+ printf("hikptool roce_%s cur size error, data_size: %zu, rsp_data_num: %u.\n", -+ cmd_name, data_size, cmd_ret->rsp_data_num); - ret = -EINVAL; - hikp_roce_ext_reg_data_free(reg); - goto get_data_error; - } - memcpy(reg->offset + block_id, -- (uint32_t *)&roce_ext_res->reg_data, cur_size); -- memcpy(reg->data + block_id, -- (uint32_t *)&roce_ext_res->reg_data + reg_array_length, cur_size); -+ (uint32_t *)&roce_ext_res->head + reg_data_offset / sizeof(uint32_t), -+ offset_size); -+ memcpy(dst_data, (uint32_t *)&roce_ext_res->head + reg_data_offset -+ / sizeof(uint32_t) + reg_array_length, data_size); - - get_data_error: - hikp_cmd_free(&cmd_ret); -@@ -172,15 +190,20 @@ static void hikp_roce_ext_print(enum roce_cmd_type cmd_type, - const char *cmd_name = get_cmd_name(cmd_type); - uint8_t arr_len = output->reg_name.arr_len; - uint32_t *offset = output->reg.offset; -- uint32_t *data = output->reg.data; -+ struct reg_data *reg = &output->reg; -+ const char *name; - uint32_t i; - - printf("**************%s INFO*************\n", cmd_name); - printf("%-40s[addr_offset] : reg_data\n", "reg_name"); -- for (i = 0; i < total_block_num; i++) -- printf("%-40s[0x%08X] : 0x%08X\n", -- i < arr_len ? reg_name[i] : "", -- offset[i], data[i]); -+ for (i = 0; i < total_block_num; i++) { -+ name = i < arr_len ? reg_name[i] : ""; -+ printf("%-40s[0x%08X] : ", name, offset[i]); -+ if (output->res_head.flags & ROCE_HIKP_DATA_U64_FLAG) -+ printf("0x%016lX\n", reg->data_u64[i]); -+ else -+ printf("0x%08X\n", reg->data_u32[i]); -+ } - printf("************************************\n"); - } - -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.h b/net/roce/roce_ext_common/hikp_roce_ext_common.h -index 8568556..6f04024 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.h -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.h -@@ -17,6 +17,7 @@ - #include "hikp_net_lib.h" - - #define ROCE_MAX_REG_NUM (NET_MAX_REQ_DATA_NUM - 1) -+#define ROCE_MAX_U64_REG_NUM 18 - - #define ROCE_HIKP_CAEP_REG_NUM_EXT ROCE_MAX_REG_NUM - #define ROCE_HIKP_GMV_REG_NUM_EXT ROCE_MAX_REG_NUM -@@ -30,11 +31,15 @@ - #define ROCE_HIKP_RST_REG_NUM ROCE_MAX_REG_NUM - #define ROCE_HIKP_GLOBAL_CFG_REG_NUM ROCE_MAX_REG_NUM - #define ROCE_HIKP_BOND_REG_NUM ROCE_MAX_REG_NUM -+#define ROCE_HIKP_DFX_STA_NUM_EXT ROCE_MAX_U64_REG_NUM -+ -+#define ROCE_HIKP_DATA_U64_FLAG 1 << 0 - - struct roce_ext_head { - uint8_t total_block_num; - uint8_t cur_block_num; -- uint16_t reserved; -+ uint8_t flags; -+ uint8_t reserved; - }; - - struct roce_ext_res_param { -@@ -42,9 +47,25 @@ struct roce_ext_res_param { - uint32_t reg_data[0]; - }; - -+struct roce_ext_res_data_u64 { -+ uint32_t offset[ROCE_MAX_U64_REG_NUM]; -+ uint64_t data[ROCE_MAX_U64_REG_NUM]; -+ uint32_t rsv[4]; -+}; -+ -+struct roce_ext_res_param_u64 { -+ struct roce_ext_head head; -+ uint32_t rsv; -+ struct roce_ext_res_data_u64 reg_data; -+}; -+ - struct reg_data { - uint32_t *offset; -- uint32_t *data; -+ union { -+ void *data; -+ uint32_t *data_u32; -+ uint64_t *data_u64; -+ }; - }; - - struct roce_ext_reg_name { -@@ -55,6 +76,7 @@ struct roce_ext_reg_name { - struct roce_ext_res_output { - struct roce_ext_head res_head; - struct reg_data reg; -+ uint32_t per_val_size; - struct roce_ext_reg_name reg_name; - }; - --- -2.33.0 - diff --git a/0104-hikptool-roce-Add-roce_dfx_sta-cmd-for-RoCE-DFX-stat.patch b/0104-hikptool-roce-Add-roce_dfx_sta-cmd-for-RoCE-DFX-stat.patch deleted file mode 100644 index ead99fe..0000000 --- a/0104-hikptool-roce-Add-roce_dfx_sta-cmd-for-RoCE-DFX-stat.patch +++ /dev/null @@ -1,248 +0,0 @@ -From 3a0b96217951248fe8a0a85e99220b33bd93ee31 Mon Sep 17 00:00:00 2001 -From: wenglianfa -Date: Wed, 2 Jul 2025 11:46:15 +0800 -Subject: [PATCH 104/104] hikptool/roce: Add roce_dfx_sta cmd for RoCE DFX - statistics - -Add roce_dfx_sta cmd for RoCE DFX statistics. - -Example: -hikptool roce_dfx_sta -i eth1 - -Signed-off-by: wenglianfa ---- - info_collect/hikp_collect_roce.c | 22 ++++ - net/hikp_net_lib.h | 1 + - net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c | 107 ++++++++++++++++++ - net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h | 33 ++++++ - .../roce_ext_common/hikp_roce_ext_common.c | 1 + - 5 files changed, 164 insertions(+) - create mode 100644 net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c - create mode 100644 net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h - -diff --git a/info_collect/hikp_collect_roce.c b/info_collect/hikp_collect_roce.c -index baf2899..01d773b 100644 ---- a/info_collect/hikp_collect_roce.c -+++ b/info_collect/hikp_collect_roce.c -@@ -26,6 +26,7 @@ - #include "hikp_roce_tsp.h" - #include "hikp_roce_scc.h" - #include "hikp_roce_gmv.h" -+#include "hikp_roce_dfx_sta.h" - - static void collect_roce_devinfo_log(void) - { -@@ -125,6 +126,26 @@ static int collect_hikp_roce_gmv_log(void *nic_name) - return 0; - } - -+static int collect_hikp_roce_dfx_sta_log(void *nic_name) -+{ -+ struct major_cmd_ctrl self = {0}; -+ struct hikp_cmd_type type = {0}; -+ int ret; -+ -+ self.cmd_ptr = &type; -+ ret = hikp_roce_set_dfx_sta_bdf((char *)nic_name); -+ if (ret) { -+ HIKP_ERROR_PRINT("failed to set roce_dfx_sta bdf for %s.\n", -+ (char *)nic_name); -+ return ret; -+ } -+ -+ printf("hikptool roce_dfx_sta -i %s\n", (char *)nic_name); -+ hikp_roce_dfx_sta_execute(&self); -+ -+ return 0; -+} -+ - static int collect_hikp_roce_scc_log(void *nic_name) - { - struct major_cmd_ctrl self = {0}; -@@ -466,6 +487,7 @@ static int collect_one_roce_hikp_log(void *net_name) - { "roce_tsp", collect_hikp_roce_tsp_log }, - { "roce_scc", collect_hikp_roce_scc_log }, - { "roce_gmv", collect_hikp_roce_gmv_log }, -+ { "roce_dfx_sta", collect_hikp_roce_dfx_sta_log }, - }; - size_t i; - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index 7ebabfa..aa700ab 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -103,6 +103,7 @@ enum roce_cmd_type { - GET_ROCEE_RST_CMD, - GET_ROCEE_GLOBAL_CFG_CMD, - GET_ROCEE_BOND_CMD, -+ GET_ROCEE_DFX_STA_CMD, - }; - - enum ub_cmd_type { -diff --git a/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c -new file mode 100644 -index 0000000..b74507c ---- /dev/null -+++ b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c -@@ -0,0 +1,107 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include "hikp_roce_dfx_sta.h" -+ -+static struct cmd_roce_dfx_sta_param_t g_roce_dfx_sta_param_t = { 0 }; -+ -+int hikp_roce_set_dfx_sta_bdf(char *nic_name) -+{ -+ return tool_check_and_get_valid_bdf_id(nic_name, -+ &g_roce_dfx_sta_param_t.target); -+} -+ -+static int hikp_roce_dfx_sta_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(argv); -+ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf(" Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", "device target, e.g. eth0"); -+ printf(" %s, %-25s %s\n", "-c", "--clear=", "clear param count registers"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static int hikp_roce_dfx_sta_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_roce_dfx_sta_param_t.target)); -+ if (self->err_no != 0) -+ snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); -+ -+ return self->err_no; -+} -+ -+static int hikp_roce_dfx_sta_clear_set(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ HIKP_SET_USED(argv); -+ -+ g_roce_dfx_sta_param_t.reset_flag = 1; -+ return 0; -+} -+ -+/* DON'T change the order of this array or add entries between! */ -+static const char *g_dfx_sta_reg_name[] = { -+ "PKT_RNR_STA", -+ "PKT_RTY_STA", -+ "MSN_RTY_STA", -+}; -+ -+static int hikp_roce_dfx_sta_get_data(struct hikp_cmd_ret **cmd_ret, -+ uint32_t block_id, -+ struct roce_ext_reg_name *reg_name) -+{ -+ struct hikp_cmd_header req_header = { 0 }; -+ struct roce_dfx_sta_req_param req_data; -+ uint32_t req_size; -+ int ret; -+ -+ reg_name->reg_name = g_dfx_sta_reg_name; -+ reg_name->arr_len = HIKP_ARRAY_SIZE(g_dfx_sta_reg_name); -+ -+ req_data.reset_flag = g_roce_dfx_sta_param_t.reset_flag; -+ req_data.bdf = g_roce_dfx_sta_param_t.target.bdf; -+ req_data.block_id = block_id; -+ -+ req_size = sizeof(struct roce_dfx_sta_req_param); -+ hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_DFX_STA_CMD, 0); -+ *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, req_size); -+ ret = hikp_rsp_normal_check(*cmd_ret); -+ if (ret) -+ printf("hikptool roce_dfx_sta get cmd data failed, ret: %d\n", ret); -+ -+ return ret; -+} -+ -+void hikp_roce_dfx_sta_execute(struct major_cmd_ctrl *self) -+{ -+ hikp_roce_ext_execute(self, GET_ROCEE_DFX_STA_CMD, hikp_roce_dfx_sta_get_data); -+} -+ -+static void cmd_roce_dfx_sta_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = hikp_roce_dfx_sta_execute; -+ -+ cmd_option_register("-h", "--help", false, hikp_roce_dfx_sta_help); -+ cmd_option_register("-i", "--interface", true, hikp_roce_dfx_sta_target); -+ cmd_option_register("-c", "--clear", false, hikp_roce_dfx_sta_clear_set); -+} -+ -+HIKP_CMD_DECLARE("roce_dfx_sta", "get or clear RoCE dfx statistics", cmd_roce_dfx_sta_init); -diff --git a/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h -new file mode 100644 -index 0000000..b515356 ---- /dev/null -+++ b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h -@@ -0,0 +1,33 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_ROCE_DFX_STA_H -+#define HIKP_ROCE_DFX_STA_H -+ -+#include "hikp_roce_ext_common.h" -+ -+struct cmd_roce_dfx_sta_param_t { -+ uint8_t reset_flag; -+ struct tool_target target; -+}; -+ -+struct roce_dfx_sta_req_param { -+ struct bdf_t bdf; -+ uint32_t block_id; -+ uint8_t reset_flag; -+}; -+ -+int hikp_roce_set_dfx_sta_bdf(char *nic_name); -+void hikp_roce_dfx_sta_execute(struct major_cmd_ctrl *self); -+ -+#endif /* HIKP_ROCE_DFX_STA_H */ -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index c225ec8..ac6c8fb 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -44,6 +44,7 @@ static const struct cmd_type_info { - {GET_ROCEE_RST_CMD, "RST", ROCE_HIKP_RST_REG_NUM}, - {GET_ROCEE_GLOBAL_CFG_CMD, "GLOBAL_CFG", ROCE_HIKP_GLOBAL_CFG_REG_NUM}, - {GET_ROCEE_BOND_CMD, "BOND", ROCE_HIKP_BOND_REG_NUM}, -+ {GET_ROCEE_DFX_STA_CMD, "DFX_STA", ROCE_HIKP_DFX_STA_NUM_EXT}, - }; - - static int get_cmd_info_table_idx(enum roce_cmd_type cmd_type) --- -2.33.0 - diff --git a/0105-hikptool-Fix-ASAN-compilation-warnings.patch b/0105-hikptool-Fix-ASAN-compilation-warnings.patch deleted file mode 100644 index b4a1b11..0000000 --- a/0105-hikptool-Fix-ASAN-compilation-warnings.patch +++ /dev/null @@ -1,72 +0,0 @@ -From b5c30aa2248f8919d3da7fa5288cd6bd5b2bd606 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Mon, 28 Jul 2025 11:40:11 +0800 -Subject: [PATCH 1/3] hikptool: Fix ASAN compilation warnings - -Add a 64-bit alignment flag to ensure -the alignment of the data field segment. - -Signed-off-by: veega2022 ---- - libhikptdev/include/hikptdev_plug.h | 2 +- - net/nic/nic_fd/hikp_nic_fd.c | 10 +++++++++----- - 2 files changed, 8 insertions(+), 4 deletions(-) - -diff --git a/libhikptdev/include/hikptdev_plug.h b/libhikptdev/include/hikptdev_plug.h -index ba9931f..7dad632 100644 ---- a/libhikptdev/include/hikptdev_plug.h -+++ b/libhikptdev/include/hikptdev_plug.h -@@ -27,7 +27,7 @@ struct hikp_cmd_ret { - uint32_t status; - uint32_t version; - uint32_t rsp_data_num; -- uint32_t rsp_data[0]; -+ uint32_t rsp_data[0] __attribute__((aligned(__SIZEOF_LONG__))); - }; - - /* Module code */ -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index f581553..dd0a73a 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -247,6 +247,7 @@ static void hikp_nic_print_tuple(const struct key_info *tuple_key, - #define HIKP_NIC_FD_TUPLE_KEY_LEN_6_BYTES 6 - #define HIKP_NIC_FD_TUPLE_KEY_LEN_4_BYTES 4 - #define HIKP_NIC_FD_TUN_VNI_LEN 3 -+ uint32_t temp_value = 0; - uint32_t tun_vni = 0; - uint64_t mask = 0; - uint8_t i; -@@ -271,7 +272,8 @@ static void hikp_nic_print_tuple(const struct key_info *tuple_key, - case OUTER_ETH_TYPE: - case INNER_ETH_TYPE: - printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); -- printf("0x%x\n", *(uint16_t *)tcam_y); -+ memcpy(&temp_value, tcam_y, sizeof(uint16_t)); -+ printf("0x%x\n", temp_value); - break; - case OUTER_VLAN_TAG_FST: - case OUTER_VLAN_TAG_SEC: -@@ -286,7 +288,8 @@ static void hikp_nic_print_tuple(const struct key_info *tuple_key, - case INNER_SRC_PORT: - case INNER_DST_PORT: - printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); -- printf("%u\n", *(uint16_t *)tcam_y); -+ memcpy(&temp_value, tcam_y, sizeof(uint16_t)); -+ printf("%u\n", temp_value); - break; - case OUTER_IP_TOS: - case INNER_IP_TOS: -@@ -306,7 +309,8 @@ static void hikp_nic_print_tuple(const struct key_info *tuple_key, - case OUTER_L4_RSV: - case INNER_L4_RSV: - printf("\t %s[mask=0x%" PRIx64 "]: ", tuple_key->key_name, mask); -- printf("%u\n", *(uint32_t *)tcam_y); -+ memcpy(&temp_value, tcam_y, sizeof(uint32_t)); -+ printf("%u\n", temp_value); - break; - case OUTER_TUN_VNI: - for (i = 0; i < HIKP_NIC_FD_TUN_VNI_LEN; i++) --- -2.45.0.windows.1 - diff --git a/0106-hikptool-Add-serdes-module-submodule-dump-types.patch b/0106-hikptool-Add-serdes-module-submodule-dump-types.patch deleted file mode 100644 index 6e9a705..0000000 --- a/0106-hikptool-Add-serdes-module-submodule-dump-types.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 0d82e543f2fcf08c5a6b90a27af8d00f44e830db Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Mon, 28 Jul 2025 11:45:28 +0800 -Subject: [PATCH 2/3] hikptool: Add serdes module submodule dump types - -Add serdes module submodule dump types, -including CS and DS types. - -Signed-off-by: wujinzi ---- - serdes/hikp_serdes.c | 3 ++- - serdes/hikp_serdes.h | 5 +++++ - 2 files changed, 7 insertions(+), 1 deletion(-) - -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index 01776df..f07f1b6 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -401,7 +401,8 @@ static int cmd_serdes_dump_help(struct major_cmd_ctrl *self, const char *argv) - - static int cmd_serdes_dump_subcmds(struct major_cmd_ctrl *self, const char *argv) - { -- const char *set_cmds[HILINK_DUMP_TYPE_END] = { "cs", "ds", "csds", "ram", "subctrl"}; -+ const char *set_cmds[HILINK_DUMP_TYPE_END] = { "cs", "ds", "csds", "ram", "subctrl", -+ "cs1", "cs2", "ds1", "ds2", "ds3"}; - uint8_t i; - - for (i = 0; i < HILINK_DUMP_TYPE_END; i++) { -diff --git a/serdes/hikp_serdes.h b/serdes/hikp_serdes.h -index 4ea969d..59aea69 100644 ---- a/serdes/hikp_serdes.h -+++ b/serdes/hikp_serdes.h -@@ -76,6 +76,11 @@ enum hilink_dump_type_e { - HILINK_SERDES_REG_CSDS, - HILINK_SERDES_REG_RAM, - HILINK_SUBCTRL_REG, -+ HILINK_SERDES_REG_CS_PART1 = 5, -+ HILINK_SERDES_REG_CS_PART2, -+ HILINK_SERDES_REG_DS_PART1, -+ HILINK_SERDES_REG_DS_PART2, -+ HILINK_SERDES_REG_DS_PART3, - HILINK_DUMP_TYPE_END - }; - --- -2.45.0.windows.1 - diff --git a/0107-hikptool-Optimize-the-ROCE-SCC-module-register-dump-.patch b/0107-hikptool-Optimize-the-ROCE-SCC-module-register-dump-.patch deleted file mode 100644 index 37c6821..0000000 --- a/0107-hikptool-Optimize-the-ROCE-SCC-module-register-dump-.patch +++ /dev/null @@ -1,194 +0,0 @@ -From a638d6fd56936237374349ad4050a0d9b6ea0226 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Mon, 28 Jul 2025 12:02:55 +0800 -Subject: [PATCH 3/3] hikptool: Optimize the ROCE SCC module register dump - display - -Add ROCE_SCC CFG option command parsing display. -ROCE_SCC common option adds 2 register dumps. - -Signed-off-by: veega2022 ---- - info_collect/hikp_collect_roce.c | 3 +- - net/roce/roce_scc/hikp_roce_scc.c | 60 +++++++++++++++++++++++++++++++ - net/roce/roce_scc/hikp_roce_scc.h | 15 ++++++++ - 3 files changed, 77 insertions(+), 1 deletion(-) - -diff --git a/info_collect/hikp_collect_roce.c b/info_collect/hikp_collect_roce.c -index 01d773b..8b2215a 100644 ---- a/info_collect/hikp_collect_roce.c -+++ b/info_collect/hikp_collect_roce.c -@@ -180,8 +180,9 @@ static int collect_hikp_roce_scc_log(void *nic_name) - hikp_roce_set_scc_submodule(LDCP); - hikp_roce_scc_execute(&self); - -- printf("hikptool roce_scc -i %s -m CFG\n", (char *)nic_name); -+ printf("hikptool roce_scc -i %s -m CFG -v\n", (char *)nic_name); - hikp_roce_set_scc_submodule(CFG); -+ hikp_roce_set_scc_verbose_en(0x1); - hikp_roce_scc_execute(&self); - - return 0; -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index 428beda..b03ba07 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -34,6 +34,11 @@ void hikp_roce_set_scc_submodule(uint32_t module) - g_roce_scc_param_t.sub_cmd = module; - } - -+void hikp_roce_set_scc_verbose_en(uint8_t verbose_en) -+{ -+ g_roce_scc_param_t.verbose_flag = verbose_en; -+} -+ - static int hikp_roce_scc_help(struct major_cmd_ctrl *self, const char *argv) - { - HIKP_SET_USED(argv); -@@ -47,6 +52,8 @@ static int hikp_roce_scc_help(struct major_cmd_ctrl *self, const char *argv) - "COMMON/DCQCN/DIP/HC3/LDCP/CFG"); - printf(" %s, %-25s %s\n", "-c", "--clear=", - "[Only Work for COMMON]clear param count registers"); -+ printf(" %s, %-25s %s\n", "-v", "--verbose=", -+ "[Only Work for CFG]see more information"); - printf("\n"); - - return 0; -@@ -92,6 +99,23 @@ static int hikp_roce_scc_clear_set(struct major_cmd_ctrl *self, const char *argv - return 0; - } - -+static int hikp_roce_scc_verbose_set(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(argv); -+ -+ /* Currently, only the cfg subcommand is supported for parsing. */ -+ self->err_no = (g_roce_scc_param_t.sub_cmd == CFG) ? 0 : -EINVAL; -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), -+ "only the cfg subcommand is supported for parsing."); -+ return -EINVAL; -+ } -+ -+ hikp_roce_set_scc_verbose_en(0x1); -+ -+ return 0; -+} -+ - static int hikp_roce_scc_clear_module_check(void) - { - if (g_roce_scc_param_t.sub_cmd == SCC_COMMON) -@@ -266,6 +290,8 @@ static const char *g_scc_common_reg_name[] = { - "SCC_OUTPUT_RSP_CNT", - "SCC_INOUT_CNT_CFG", - "SCC_CUR_PROCESS_TIME", -+ "SCC_AVE_PROCESS_TOTAL_TIME", -+ "SCC_AVE_PROCESS_TOTAL_CNT", - }; - - static const char *g_scc_dcqcn_reg_name[] = { -@@ -319,9 +345,35 @@ static const struct reg_name_info { - {CFG, g_scc_cfg_reg_name, HIKP_ARRAY_SIZE(g_scc_cfg_reg_name)}, - }; - -+struct roce_scc_parse_info { -+ char *field_offset; -+ uint32_t mask_offset; -+ uint32_t shift_offset; -+} g_scc_parse_info[] = { -+ {"ROCEE_SCC_SCH_EN", ROCEE_SCC_SCH_EN_MASK, ROCEE_SCC_SCH_EN_SHIFT}, -+ {"ROCEE_TM_SCH_EN", ROCEE_TM_SCH_EN_MASK, ROCEE_TM_SCH_EN_SHIFT}, -+ {"ROCEE_SCH_UNIT_VALUE", ROCEE_SCH_UNIT_VALUE_MASK, ROCEE_SCH_UNIT_VALUE_SHIFT}, -+ {"ROCEE_SCC_WL_CFG", ROCEE_SCC_WL_CFG_MASK, ROCEE_SCC_WL_CFG_SHIFT}, -+ {"ROCEE_SCC_TOKEN_VALUE", ROCEE_SCC_TOKEN_VALUE_MASK, ROCEE_SCC_TOKEN_VALUE_SHIFT}, -+}; -+ -+static void hikp_roce_scc_parse(const uint32_t *reg_arr, uint8_t reg_len, uint32_t *parse_data, -+ uint8_t parse_data_len) -+{ -+ uint32_t parse_id = 0; -+ uint8_t reg_id; -+ -+ for (reg_id = 0; reg_id < reg_len; reg_id++) -+ for (; parse_id < parse_data_len; parse_id++) -+ parse_data[parse_id] = -+ (reg_arr[reg_id] & g_scc_parse_info[parse_id].mask_offset) >> -+ g_scc_parse_info[parse_id].shift_offset; -+} -+ - static void hikp_roce_scc_print(uint8_t total_block_num, - const uint32_t *offset, const uint32_t *data) - { -+ uint32_t parse_data[MAX_PARSE_NUM] = {0}; - const char **reg_name; - uint8_t arr_len; - uint32_t i; -@@ -346,6 +398,13 @@ static void hikp_roce_scc_print(uint8_t total_block_num, - printf("%-40s[0x%08X] : 0x%08X\n", - i < arr_len ? reg_name[i] : "", - offset[i], data[i]); -+ -+ if (g_roce_scc_param_t.verbose_flag) { -+ hikp_roce_scc_parse(data, total_block_num, parse_data, MAX_PARSE_NUM); -+ for (i = 0; i < MAX_PARSE_NUM; i++) -+ printf("%-40s : 0x%08X\n", -+ g_scc_parse_info[i].field_offset, parse_data[i]); -+ } - printf("***********************************\n"); - } - -@@ -413,6 +472,7 @@ static void cmd_roce_scc_init(void) - cmd_option_register("-i", "--interface", true, hikp_roce_scc_target); - cmd_option_register("-m", "--module", true, hikp_roce_scc_module_select); - cmd_option_register("-c", "--clear", false, hikp_roce_scc_clear_set); -+ cmd_option_register("-v", "--verbose", false, hikp_roce_scc_verbose_set); - } - - HIKP_CMD_DECLARE("roce_scc", "get or clear roce_scc registers information", cmd_roce_scc_init); -diff --git a/net/roce/roce_scc/hikp_roce_scc.h b/net/roce/roce_scc/hikp_roce_scc.h -index b86b59a..8e56146 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.h -+++ b/net/roce/roce_scc/hikp_roce_scc.h -@@ -23,6 +23,18 @@ - #x, x \ - } - -+#define MAX_PARSE_NUM 5 -+#define ROCEE_SCC_SCH_EN_MASK GENMASK(24, 24) -+#define ROCEE_TM_SCH_EN_MASK GENMASK(23, 23) -+#define ROCEE_SCH_UNIT_VALUE_MASK GENMASK(22, 16) -+#define ROCEE_SCC_WL_CFG_MASK GENMASK(15, 12) -+#define ROCEE_SCC_TOKEN_VALUE_MASK GENMASK(11, 8) -+#define ROCEE_SCC_SCH_EN_SHIFT 24 -+#define ROCEE_TM_SCH_EN_SHIFT 23 -+#define ROCEE_SCH_UNIT_VALUE_SHIFT 16 -+#define ROCEE_SCC_WL_CFG_SHIFT 12 -+#define ROCEE_SCC_TOKEN_VALUE_SHIFT 8 -+ - struct roce_scc_req_param { - struct bdf_t bdf; - uint8_t reset_flag; -@@ -33,6 +45,7 @@ struct cmd_roce_scc_param_t { - struct tool_target target; - uint8_t reset_flag; - uint32_t sub_cmd; -+ uint8_t verbose_flag; - }; - - struct roce_scc_head { -@@ -64,10 +77,12 @@ enum roce_scc_type { - HC3, - LDCP, - CFG, -+ VERBOSE, - }; - - int hikp_roce_set_scc_bdf(char *nic_name); - void hikp_roce_set_scc_submodule(uint32_t module); - void hikp_roce_scc_execute(struct major_cmd_ctrl *self); -+void hikp_roce_set_scc_verbose_en(uint8_t verbose_en); - - #endif /* HIKP_ROCE_SCC_H */ --- -2.45.0.windows.1 - diff --git a/0108-hikptool-solve-some-code-review-comments.patch b/0108-hikptool-solve-some-code-review-comments.patch deleted file mode 100644 index 70c0a82..0000000 --- a/0108-hikptool-solve-some-code-review-comments.patch +++ /dev/null @@ -1,881 +0,0 @@ -From 8f79cb062d73d3926c202ef0405aba10a0238609 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 26 Aug 2025 19:15:14 +0800 -Subject: [PATCH] hikptool: solve some code review comments - -Code review comments include: -1. Spelling errors in words -2. Unreasonable buffer validation -3. Insufficiently clear print information for exception branches -4. No validation of function return values -5. Optimization of large functions - -Signed-off-by: veega2022 ---- - CMakeLists.txt | 4 +- - hccs/hikp_hccs.c | 26 ++- - info_collect/hikp_collect_serdes.c | 2 +- - libhikptdev/src/rciep/hikpt_rciep.c | 5 +- - net/hikp_net_lib.c | 2 +- - net/nic/nic_fd/hikp_nic_fd.c | 18 +- - net/nic/nic_fd/hikp_nic_fd.h | 2 +- - net/nic/nic_info/hikp_nic_info.c | 2 +- - net/nic/nic_log/hikp_nic_log.c | 2 +- - net/nic/nic_ppp/hikp_nic_ppp.c | 10 +- - net/nic/nic_ppp/hikp_nic_ppp.h | 4 +- - net/nic/nic_torus/hikp_nic_torus.c | 2 +- - .../roce_ext_common/hikp_roce_ext_common.c | 162 +++++++++++------- - net/roce/roce_scc/hikp_roce_scc.c | 2 +- - net/roce/roce_scc/hikp_roce_scc.h | 1 - - net/roce/roce_trp/hikp_roce_trp.c | 2 +- - net/roh/hikp_roh_mac.c | 6 +- - pcie/func_lib/pcie_func/pcie_reg_dump.c | 5 +- - pcie/func_lib/pcie_func/pcie_reg_read.c | 2 +- - pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c | 2 +- - sas/user_cmd/cmd_code/sas_cmd_anacq.c | 4 +- - sas/user_cmd/cmd_code/sas_cmd_anadq.c | 4 +- - sas/user_cmd/cmd_code/sas_cmd_dev.c | 2 +- - sas/user_cmd/cmd_code/sas_cmd_dqe.c | 2 +- - serdes/hikp_serdes.c | 28 ++- - socip/hikp_socip_dumpreg.c | 6 +- - tool_lib/tool_lib.c | 8 +- - 27 files changed, 178 insertions(+), 137 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 386cc28..86053a1 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -9,6 +9,8 @@ - # - # See the Mulan PSL v2 for more details. - -+cmake_minimum_required(VERSION 3.0.0) -+ - project(hikptool C) - - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ -@@ -61,7 +63,7 @@ target_include_directories(hikptool PRIVATE ${HIKPTOOL_HEADER_DIR}) - target_link_directories(hikptool PRIVATE ${CMAKE_INSTALL_PREFIX}/lib) - target_link_libraries(hikptool PRIVATE KPTDEV_SO) - if (ENABLE_STATIC) -- # I don¡¯t know why, but once you add double quotes to these -+ # I don't know why, but once you add double quotes to these - # link parameters, an error will be reported. - set(EXT_LINK_FLAGS -static-libgcc -static-libstdc++ -static) - set_target_properties(hikptool PROPERTIES LINK_SEARCH_START_STATIC ON) -diff --git a/hccs/hikp_hccs.c b/hccs/hikp_hccs.c -index d979aad..f6ef003 100644 ---- a/hccs/hikp_hccs.c -+++ b/hccs/hikp_hccs.c -@@ -11,6 +11,7 @@ - * See the Mulan PSL v2 for more details. - */ - -+#include - #include - #include - #include -@@ -613,39 +614,32 @@ static void hikp_hccs_show_port_dfx_info(union hccs_feature_info *feature_info) - size_t vld_size; - - vld_size = (size_t)info_vld->vld_size; -- if (vld_size >= sizeof(info->link_fsm)) { -+ if (vld_size > offsetof(struct hccs_port_dfx_info, link_fsm)) { - printf("%-16s\t%s\n", "link_fsm", hikp_hccs_link_fsm_to_str(info->link_fsm)); -- vld_size -= sizeof(info->link_fsm); - } - -- if (vld_size >= sizeof(info->cur_lane_num)) { -+ if (vld_size > offsetof(struct hccs_port_dfx_info, cur_lane_num)) { - printf("%-16s\t%u\n", "cur_lane_num", info->cur_lane_num); -- vld_size -= sizeof(info->cur_lane_num); - } - -- if (vld_size >= sizeof(info->lane_mask)) { -+ if (vld_size > offsetof(struct hccs_port_dfx_info, lane_mask)) { - printf("%-16s\t0x%x\n", "lane_mask", info->lane_mask); -- vld_size -= sizeof(info->lane_mask); - } - -- if (vld_size >= sizeof(info->crc_err_cnt)) { -+ if (vld_size > offsetof(struct hccs_port_dfx_info, crc_err_cnt)) { - printf("%-16s\t%u\n", "crc_err_cnt", info->crc_err_cnt); -- vld_size -= sizeof(info->crc_err_cnt); - } - -- if (vld_size >= sizeof(info->retry_cnt)) { -+ if (vld_size > offsetof(struct hccs_port_dfx_info, retry_cnt)) { - printf("%-16s\t%u\n", "retry_cnt", info->retry_cnt); -- vld_size -= sizeof(info->retry_cnt); - } - -- if (vld_size >= sizeof(info->phy_reinit_cnt)) { -+ if (vld_size > offsetof(struct hccs_port_dfx_info, phy_reinit_cnt)) { - printf("%-16s\t%u\n", "phy_reinit_cnt", info->phy_reinit_cnt); -- vld_size -= sizeof(info->phy_reinit_cnt); - } - -- if (vld_size >= sizeof(info->tx_credit)) { -+ if (vld_size > offsetof(struct hccs_port_dfx_info, tx_credit)) { - printf("%-16s\t%u\n", "tx_credit", info->tx_credit); -- vld_size -= sizeof(info->tx_credit); - } - } - -@@ -748,7 +742,7 @@ static int hikp_hccs_cmd_parse_die(struct major_cmd_ctrl *self, const char *argv - self->err_no = string_toui(argv, &die_id); - if (self->err_no) { - snprintf(self->err_str, sizeof(self->err_str), -- "Failed to parse -d/--die_id parameter."); -+ "Failed to parse -d/--die_id parameter."); - return self->err_no; - } - -@@ -778,7 +772,7 @@ static int hikp_hccs_cmd_parse_port(struct major_cmd_ctrl *self, const char *arg - - if (port_id > UINT8_MAX) { - snprintf(self->err_str, sizeof(self->err_str), -- "port id should not be greater %u.", UINT8_MAX); -+ "port id should not be greater than %u.", UINT8_MAX); - self->err_no = -EINVAL; - return self->err_no; - } -diff --git a/info_collect/hikp_collect_serdes.c b/info_collect/hikp_collect_serdes.c -index 31f29b3..ff58629 100644 ---- a/info_collect/hikp_collect_serdes.c -+++ b/info_collect/hikp_collect_serdes.c -@@ -210,7 +210,7 @@ static void collect_serdes_dump_log(void) - log_cmd.die_id = j; - ret = snprintf(log_name, MAX_LOG_NAME_LEN, "serdes_dump_c%ud%u", i, j); - if (ret < 0 || (uint32_t)(ret) >= MAX_LOG_NAME_LEN) { -- HIKP_ERROR_PRINT("create serdes_info log name failed\n"); -+ HIKP_ERROR_PRINT("create serdes_dump log name failed\n"); - break; - } - ret = hikp_collect_log(GROUP_SERDES, log_name, -diff --git a/libhikptdev/src/rciep/hikpt_rciep.c b/libhikptdev/src/rciep/hikpt_rciep.c -index 88ac16e..5cdf258 100644 ---- a/libhikptdev/src/rciep/hikpt_rciep.c -+++ b/libhikptdev/src/rciep/hikpt_rciep.c -@@ -73,7 +73,8 @@ static int hikp_try_lock(void) - count--; - usleep(LOCK_CHECK_GAP_US); - } while (count); -- printf("dev lock by other process:%u.\n", g_hikp_req->field.pid_record); -+ printf("try to lock failed, lock may be occupied by another process: %u, error: %s\n", -+ g_hikp_req->field.pid_record, strerror(errno)); - - return -EBUSY; - } -@@ -187,7 +188,7 @@ static int hikp_req_first_round(uint32_t *req_data, uint32_t rep_num, uint32_t * - req_issue(); /* On the first round, an interrupt is triggered. */ - *cpl_status = hikp_wait_for_cpl_status(); - if (*cpl_status != HIKP_CPL_BY_TF && *cpl_status != HIKP_CPL_BY_IMU) { -- printf("First round failed. Error code:%u.\n", *cpl_status); -+ printf("First round failed. Error code:0x%X.\n", *cpl_status); - return RCIEP_FAIL; - } - -diff --git a/net/hikp_net_lib.c b/net/hikp_net_lib.c -index 7646aad..91c00d9 100644 ---- a/net/hikp_net_lib.c -+++ b/net/hikp_net_lib.c -@@ -97,7 +97,7 @@ static bool check_and_parse_domain_bdf_id(const char *bus_info, struct bdf_t *bd - if (strlen(bus_info) >= IFNAMSIZ) - return false; - -- /* pci_id: 0000:bd:00.0 ==> doman:bus:device.function add -+ /* pci_id: 0000:bd:00.0 ==> domain:bus:device.function add - * remains here to solve such input: 0000:bd:00.0abcdef - */ - retval = sscanf(bus_info, "%x:%x:%x.%u%s", &domain, &bus, &dev, &fun, remains); -diff --git a/net/nic/nic_fd/hikp_nic_fd.c b/net/nic/nic_fd/hikp_nic_fd.c -index 891368a..8a2bfb3 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.c -+++ b/net/nic/nic_fd/hikp_nic_fd.c -@@ -26,7 +26,7 @@ struct key_info { - - static const struct key_info g_meta_data_key_info[] = { - {"packet_type_id", PACKET_TYPE_ID, 6}, -- {"fragement", IP_FRAGEMENT, 1}, -+ {"fragment", IP_FRAGMENT, 1}, - {"roce_type", ROCE_TYPE, 1}, - {"next_key", NEXT_KEY, 5}, - {"vlan_num", VLAN_NUMBER, 2}, -@@ -169,7 +169,7 @@ static void hikp_nic_show_fd_key_info(struct nic_fd_hw_info *hw_info) - printf(" outer_dest_ipv6_word_en: 0x%x\n", key_cfg->outer_dest_ipv6_word_en); - - if (key_cfg->key_select == HNS3_FD_KEY_BASE_ON_PTYPE) { -- HIKP_WARN_PRINT("Unsupport for parsing packet type key.\n"); -+ HIKP_WARN_PRINT("Unsupported for parsing packet type key.\n"); - continue; - } - -@@ -333,7 +333,7 @@ static void hikp_nic_print_meta_data(uint16_t type, uint32_t val) - case NEXT_KEY: - printf("%u", val); - break; -- case IP_FRAGEMENT: -+ case IP_FRAGMENT: - printf("%s", val == 0 ? "NON-IP frag packet" : "IP frag packet"); - break; - case ROCE_TYPE: -@@ -676,14 +676,14 @@ static int hikp_nic_query_fd_rules(struct hikp_cmd_header *req_header, const str - } - if (rsp_head.cur_blk_entry_cnt + entry_cnt > g_fd_hw_info.alloc.stage_entry_num[stage]) { - HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " -- "is over the maximum entry nubmer (%u) of this stage.", -+ "is over the maximum entry number (%u) of this stage.", - rsp_head.cur_blk_entry_cnt + entry_cnt, idx, - g_fd_hw_info.alloc.stage_entry_num[stage]); - return -EINVAL; - } - entry_cnt += rsp_head.cur_blk_entry_cnt; - if (rsp_head.next_entry_idx <= idx) { -- HIKP_ERROR_PRINT("The next entry index (%u) is less than or equal with the curent(%u).\n", -+ HIKP_ERROR_PRINT("The next entry index (%u) is less than or equal with the current(%u).\n", - rsp_head.next_entry_idx, idx); - return -EINVAL; - } -@@ -735,14 +735,14 @@ static int hikp_nic_query_fd_counter(struct hikp_cmd_header *req_header, const s - } - if (rsp_head.cur_blk_entry_cnt + entry_size > g_fd_hw_info.alloc.stage_counter_num[stage]) { - HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " -- "is over the maximum counter nubmer (%u) of this stage.", -+ "is over the maximum counter number (%u) of this stage.", - rsp_head.cur_blk_entry_cnt + entry_size, idx, - g_fd_hw_info.alloc.stage_counter_num[stage]); - return -EINVAL; - } - entry_size += rsp_head.cur_blk_entry_cnt; - if (rsp_head.next_entry_idx <= idx) { -- HIKP_ERROR_PRINT("The next entry index (%u) is less than or equal with the curent(%u).\n", -+ HIKP_ERROR_PRINT("The next entry index (%u) is less than or equal with the current(%u).\n", - rsp_head.next_entry_idx, idx); - return -EINVAL; - } -@@ -856,7 +856,7 @@ static int hikp_nic_check_fd_hw_info(const struct nic_fd_hw_info *hw_info, - } - if (hw_info->mode > FD_MODE_DEPTH_2K_WIDTH_200B_STAGE_2) - HIKP_WARN_PRINT("Unknown fd mode(%u), " -- "unsupport for displaying meta data info.\n", -+ "unsupported for displaying meta data info.\n", - hw_info->mode); - - for (i = 0; i < NIC_FD_STAGE_NUM; i++) { -@@ -1080,7 +1080,7 @@ static int hikp_nic_cmd_fd_parse_stage(struct major_cmd_ctrl *self, const char * - - if (stage_no - 1 == NIC_FD_STAGE_2) { - snprintf(self->err_str, sizeof(self->err_str), -- "unsupport for querying stage%u entry!", stage_no); -+ "unsupported for querying stage%u entry!", stage_no); - self->err_no = -EOPNOTSUPP; - return self->err_no; - } -diff --git a/net/nic/nic_fd/hikp_nic_fd.h b/net/nic/nic_fd/hikp_nic_fd.h -index 98577ff..7b1331d 100644 ---- a/net/nic/nic_fd/hikp_nic_fd.h -+++ b/net/nic/nic_fd/hikp_nic_fd.h -@@ -56,7 +56,7 @@ enum nic_fd_tuple { - - enum nic_fd_meta_data { - PACKET_TYPE_ID = 0, -- IP_FRAGEMENT, -+ IP_FRAGMENT, - ROCE_TYPE, - NEXT_KEY, - VLAN_NUMBER, -diff --git a/net/nic/nic_info/hikp_nic_info.c b/net/nic/nic_info/hikp_nic_info.c -index b05d6ef..a1985a9 100644 ---- a/net/nic/nic_info/hikp_nic_info.c -+++ b/net/nic/nic_info/hikp_nic_info.c -@@ -249,7 +249,7 @@ static int hikp_nic_traverse_all_hns3_dev_and_get_info(void) - - sockfd = hikp_net_creat_sock(); - if (sockfd < MIN_SOCKFD) { -- HIKP_ERROR_PRINT("creat sockfd failed, sockfd is %d.\n", sockfd); -+ HIKP_ERROR_PRINT("create sockfd failed, sockfd is %d.\n", sockfd); - return -EIO; - } - ret = getifaddrs(&ifa_lst); -diff --git a/net/nic/nic_log/hikp_nic_log.c b/net/nic/nic_log/hikp_nic_log.c -index 4dd2721..d2af181 100644 ---- a/net/nic/nic_log/hikp_nic_log.c -+++ b/net/nic/nic_log/hikp_nic_log.c -@@ -64,7 +64,7 @@ static int hikp_nic_write_data_to_file(uint8_t *data, uint32_t len) - - rc = snprintf(g_log_path, sizeof(g_log_path), HIKP_LOG_DIR_PATH"%s", file_name); - if (rc < 0) { -- HIKP_ERROR_PRINT("creat log file path fail.\n"); -+ HIKP_ERROR_PRINT("create log file path fail.\n"); - return -EIO; - } - -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.c b/net/nic/nic_ppp/hikp_nic_ppp.c -index 43a9000..d5cf61f 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.c -+++ b/net/nic/nic_ppp/hikp_nic_ppp.c -@@ -555,7 +555,7 @@ static int hikp_nic_ppp_query_uc_mac_addr(struct hikp_cmd_header *req_header, - } - if (entry_size + rsp_head.cur_blk_entry_cnt > max_hw_entry_size) { - HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " -- "is over the maximum entry nubmer (%u) of unicast MAC table.\n", -+ "is over the maximum entry number (%u) of unicast MAC table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, max_hw_entry_size); - return -EINVAL; - } -@@ -597,7 +597,7 @@ static int hikp_nic_ppp_query_mc_mac_addr(struct hikp_cmd_header *req_header, - } - if (entry_size + rsp_head.cur_blk_entry_cnt > max_hw_entry_size) { - HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " -- "is over the maximum entry nubmer (%u) of multicast MAC table.\n", -+ "is over the maximum entry number (%u) of multicast MAC table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, max_hw_entry_size); - return -EINVAL; - } -@@ -668,7 +668,7 @@ static int hikp_nic_ppp_query_vf_vlan_tbl(struct hikp_cmd_header *req_header, - } - if (entry_size + rsp_head.cur_blk_entry_cnt > hw_entry_size) { - HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " -- "is over the maximum entry nubmer (%u) of VF VLAN table.\n", -+ "is over the maximum entry number (%u) of VF VLAN table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, hw_entry_size); - return -EINVAL; - } -@@ -709,7 +709,7 @@ static int hikp_nic_ppp_query_port_vlan_tbl(struct hikp_cmd_header *req_header, - } - if (entry_size + rsp_head.cur_blk_entry_cnt > hw_entry_size) { - HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " -- "is over the maximum entry nubmer (%u) of port VLAN table.\n", -+ "is over the maximum entry number (%u) of port VLAN table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, hw_entry_size); - return -EINVAL; - } -@@ -771,7 +771,7 @@ static int hikp_nic_query_mng_tbl(struct hikp_cmd_header *req_header, - } - if (entry_size + rsp_head.cur_blk_entry_cnt > g_ppp_hw_res.mng_tbl_size) { - HIKP_ERROR_PRINT("The sum of entry number (%u) after block-%u " -- "is over the maximum entry nubmer (%u) of manager table.\n", -+ "is over the maximum entry number (%u) of manager table.\n", - entry_size + rsp_head.cur_blk_entry_cnt, idx, g_ppp_hw_res.mng_tbl_size); - return -EINVAL; - } -diff --git a/net/nic/nic_ppp/hikp_nic_ppp.h b/net/nic/nic_ppp/hikp_nic_ppp.h -index 229e019..e2ee79b 100644 ---- a/net/nic/nic_ppp/hikp_nic_ppp.h -+++ b/net/nic/nic_ppp/hikp_nic_ppp.h -@@ -40,7 +40,7 @@ struct hikp_nic_ppp_hw_resources { - uint32_t rsv1[10]; - }; - --/* struct mac_vlan_uc_entry::e_vport field defination: -+/* struct mac_vlan_uc_entry::e_vport field definition: - * bit[0-2]: pf_id - * bit[3-10]: vf_id - */ -@@ -148,7 +148,7 @@ struct nic_mng_tbl { - struct func_vlan_offload_cfg { - uint16_t vlan_fe; - uint16_t pvid; -- uint8_t port_vlan_bypass; /* 0: off, 1: on, 2: unsupport port vlan */ -+ uint8_t port_vlan_bypass; /* 0: off, 1: on, 2: unsupported port vlan */ - uint8_t accept_tag1; - uint8_t accept_tag2; - uint8_t accept_untag1; -diff --git a/net/nic/nic_torus/hikp_nic_torus.c b/net/nic/nic_torus/hikp_nic_torus.c -index 7ad5211..ef8454f 100644 ---- a/net/nic/nic_torus/hikp_nic_torus.c -+++ b/net/nic/nic_torus/hikp_nic_torus.c -@@ -123,7 +123,7 @@ static void hikp_nic_torus_show(const struct nic_torus_info *info) - printf("ssu_pause_time_out_en: %u\n", info->pause_time_out_en); - printf("vlan_fe: 0x%x (for port vlan)\n", info->vlan_fe); - printf("ets_tcg0_mapping: 0x%x\n", info->ets_tcg0_mapping); -- printf("ets_tcg0_mapping is showed as 0xff if ncl_config forward bit is setted to 1\n"); -+ printf("ets_tcg0_mapping is showed as 0xff if ncl_config forward bit is set to 1\n"); - - hikp_nic_torus_switch_param_show(info); - -diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c -index ac6c8fb..102a0dc 100644 ---- a/net/roce/roce_ext_common/hikp_roce_ext_common.c -+++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c -@@ -83,6 +83,100 @@ static int get_cmd_reg_array_length(enum roce_cmd_type cmd_type) - return idx; - } - -+static int fill_output(struct hikp_cmd_ret *cmd_ret, -+ const char *cmd_name, -+ uint32_t block_id, -+ struct roce_ext_res_output *output) -+{ -+ struct roce_ext_res_param *roce_ext_res = (struct roce_ext_res_param *)cmd_ret->rsp_data; -+ struct roce_ext_head *res_head = &output->res_head; -+ struct reg_data *reg = &output->reg; -+ -+ res_head->cur_block_num = roce_ext_res->head.cur_block_num; -+ -+ if (block_id != 0) -+ return 0; -+ -+ res_head->total_block_num = roce_ext_res->head.total_block_num; -+ res_head->flags = roce_ext_res->head.flags; -+ if (!res_head->total_block_num) { -+ printf("hikptool roce_%s total_block_num error!\n", cmd_name); -+ return -EINVAL; -+ } -+ -+ size_t per_val_size = res_head->flags & ROCE_HIKP_DATA_U64_FLAG ? -+ sizeof(uint64_t) : sizeof(uint32_t); -+ reg->offset = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); -+ output->per_val_size = per_val_size; -+ reg->data = calloc(res_head->total_block_num, per_val_size); -+ if (!reg->offset || !reg->data) { -+ printf("hikptool roce_%s alloc log memory failed!\n", cmd_name); -+ hikp_roce_ext_reg_data_free(reg); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+static int validate_block_numbers(const struct roce_ext_head *res_head, -+ const char *cmd_name, -+ uint32_t block_id) -+{ -+ uint32_t remain_block = res_head->total_block_num - block_id; -+ -+ if (!res_head->cur_block_num || res_head->cur_block_num > remain_block) { -+ printf("hikptool roce_%s block size error, cur: %u, total: %u, remain: %u.\n", -+ cmd_name, res_head->cur_block_num, -+ res_head->total_block_num, remain_block); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static int copy_data_from_response(struct hikp_cmd_ret *cmd_ret, -+ struct roce_ext_res_output *output, -+ int reg_array_length, -+ const char *cmd_name, -+ uint32_t block_id) -+{ -+ struct roce_ext_res_param *roce_ext_res = (struct roce_ext_res_param *)cmd_ret->rsp_data; -+ struct roce_ext_head *res_head = &output->res_head; -+ struct reg_data *reg = &output->reg; -+ size_t reg_data_offset; -+ size_t offset_size; -+ size_t data_size; -+ void *dst_data; -+ -+ /* -+ * The data structure `roce_ext_res_param_u64` returned by the -+ * firmware is 8-byte aligned, so the offset of the `reg_data` -+ * member needs to be adjusted accordingly. -+ */ -+ if (res_head->flags & ROCE_HIKP_DATA_U64_FLAG) -+ reg_data_offset = offsetof(struct roce_ext_res_param_u64, reg_data); -+ else -+ reg_data_offset = offsetof(struct roce_ext_res_param, reg_data); -+ -+ offset_size = res_head->cur_block_num * sizeof(uint32_t); -+ data_size = res_head->cur_block_num * output->per_val_size; -+ dst_data = reg->data_u32 + block_id * output->per_val_size / sizeof(uint32_t); -+ if ((reg_data_offset + data_size) / sizeof(uint32_t) + (size_t)reg_array_length > cmd_ret->rsp_data_num) { -+ printf("hikptool roce_%s cur size error, data_size: %zu, rsp_data_num: %u.\n", -+ cmd_name, data_size, cmd_ret->rsp_data_num); -+ return -EINVAL; -+ } -+ -+ memcpy(reg->offset + block_id, -+ (uint32_t *)&roce_ext_res->head + reg_data_offset / sizeof(uint32_t), -+ offset_size); -+ -+ memcpy(dst_data, (uint32_t *)&roce_ext_res->head + reg_data_offset / sizeof(uint32_t) + reg_array_length, -+ data_size); -+ -+ return 0; -+} -+ - static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - uint32_t block_id, - struct roce_ext_res_output *output, -@@ -94,14 +188,8 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - struct roce_ext_reg_name *reg_name = &output->reg_name; - struct roce_ext_head *res_head = &output->res_head; - const char *cmd_name = get_cmd_name(cmd_type); -- struct roce_ext_res_param *roce_ext_res; - struct reg_data *reg = &output->reg; - struct hikp_cmd_ret *cmd_ret; -- size_t reg_data_offset; -- uint32_t remain_block; -- size_t offset_size; -- size_t data_size; -- void *dst_data; - int ret; - - /* reg_array_length greater than or equal to 0 ensures that cmd_name -@@ -116,67 +204,19 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, - goto get_data_error; - } - -- roce_ext_res = (struct roce_ext_res_param *)cmd_ret->rsp_data; -- res_head->cur_block_num = roce_ext_res->head.cur_block_num; -- -- if (block_id == 0) { -- res_head->total_block_num = roce_ext_res->head.total_block_num; -- res_head->flags = roce_ext_res->head.flags; -- if (!res_head->total_block_num) { -- printf("hikptool roce_%s total_block_num error!\n", -- cmd_name); -- ret = -EINVAL; -- goto get_data_error; -- } -- reg->offset = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); -- output->per_val_size = res_head->flags & ROCE_HIKP_DATA_U64_FLAG ? -- sizeof(uint64_t) : sizeof(uint32_t); -- reg->data = calloc(res_head->total_block_num, output->per_val_size); -- if ((reg->offset == NULL) || (reg->data == NULL)) { -- printf("hikptool roce_%s alloc log memmory failed!\n", -- cmd_name); -- ret = -ENOMEM; -- hikp_roce_ext_reg_data_free(reg); -- goto get_data_error; -- } -- } -+ ret = fill_output(cmd_ret, cmd_name, block_id, output); -+ if (ret) -+ goto get_data_error; - -- remain_block = res_head->total_block_num - block_id; -- if (!res_head->cur_block_num || res_head->cur_block_num > remain_block) { -- printf("hikptool roce_%s block size error, cur: %u, total: %u, remain: %u.\n", -- cmd_name, res_head->cur_block_num, -- res_head->total_block_num, remain_block); -- ret = -EINVAL; -+ ret = validate_block_numbers(res_head, cmd_name, block_id); -+ if (ret) { - hikp_roce_ext_reg_data_free(reg); - goto get_data_error; - } - -- /* -- * The data structure `roce_ext_res_param_u64` returned by the -- * firmware is 8-byte aligned, so the offset of the `reg_data` -- * member needs to be adjusted accordingly. -- */ -- if (res_head->flags & ROCE_HIKP_DATA_U64_FLAG) -- reg_data_offset = offsetof(struct roce_ext_res_param_u64, reg_data); -- else -- reg_data_offset = offsetof(struct roce_ext_res_param, reg_data); -- -- offset_size = res_head->cur_block_num * sizeof(uint32_t); -- data_size = res_head->cur_block_num * output->per_val_size; -- dst_data = reg->data_u32 + block_id * output->per_val_size / sizeof(uint32_t); -- /* Avoid memcpy out-of-bounds. */ -- if ((reg_data_offset + data_size) / sizeof(uint32_t) + reg_array_length > cmd_ret->rsp_data_num) { -- printf("hikptool roce_%s cur size error, data_size: %zu, rsp_data_num: %u.\n", -- cmd_name, data_size, cmd_ret->rsp_data_num); -- ret = -EINVAL; -+ ret = copy_data_from_response(cmd_ret, output, reg_array_length, cmd_name, block_id); -+ if (ret) - hikp_roce_ext_reg_data_free(reg); -- goto get_data_error; -- } -- memcpy(reg->offset + block_id, -- (uint32_t *)&roce_ext_res->head + reg_data_offset / sizeof(uint32_t), -- offset_size); -- memcpy(dst_data, (uint32_t *)&roce_ext_res->head + reg_data_offset -- / sizeof(uint32_t) + reg_array_length, data_size); - - get_data_error: - hikp_cmd_free(&cmd_ret); -diff --git a/net/roce/roce_scc/hikp_roce_scc.c b/net/roce/roce_scc/hikp_roce_scc.c -index b03ba07..9440180 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.c -+++ b/net/roce/roce_scc/hikp_roce_scc.c -@@ -187,7 +187,7 @@ static int hikp_roce_scc_get_total_data_num(struct roce_scc_head *res_head, - *offset = (uint32_t *)calloc(1, max_size); - *data = (uint32_t *)calloc(1, max_size); - if ((*offset == NULL) || (*data == NULL)) { -- printf("hikptool roce_scc alloc log memmory 0x%zx failed\n", max_size); -+ printf("hikptool roce_scc alloc log memory 0x%zx failed\n", max_size); - ret = -ENOMEM; - goto get_data_error; - } -diff --git a/net/roce/roce_scc/hikp_roce_scc.h b/net/roce/roce_scc/hikp_roce_scc.h -index 8e56146..f6f3ec4 100644 ---- a/net/roce/roce_scc/hikp_roce_scc.h -+++ b/net/roce/roce_scc/hikp_roce_scc.h -@@ -77,7 +77,6 @@ enum roce_scc_type { - HC3, - LDCP, - CFG, -- VERBOSE, - }; - - int hikp_roce_set_scc_bdf(char *nic_name); -diff --git a/net/roce/roce_trp/hikp_roce_trp.c b/net/roce/roce_trp/hikp_roce_trp.c -index 8b34409..2c52822 100644 ---- a/net/roce/roce_trp/hikp_roce_trp.c -+++ b/net/roce/roce_trp/hikp_roce_trp.c -@@ -185,7 +185,7 @@ static int hikp_roce_trp_get_total_data_num(struct roce_trp_head *res_head, - *offset = (uint32_t *)calloc(1, max_size); - *data = (uint32_t *)calloc(1, max_size); - if ((*offset == NULL) || (*data == NULL)) { -- printf("hikptool roce_trp alloc log memmory 0x%zx failed\n", max_size); -+ printf("hikptool roce_trp alloc log memory 0x%zx failed\n", max_size); - hikp_roce_trp_reg_data_free(offset, data); - ret = -ENOMEM; - goto get_data_error; -diff --git a/net/roh/hikp_roh_mac.c b/net/roh/hikp_roh_mac.c -index e16a3db..81334da 100644 ---- a/net/roh/hikp_roh_mac.c -+++ b/net/roh/hikp_roh_mac.c -@@ -162,16 +162,16 @@ static int hikp_roh_build_cam(struct major_cmd_ctrl *self, struct cam_table_entr - struct hikp_cmd_header req_header = { 0 }; - struct hikp_cmd_ret *cmd_ret = NULL; - int block_num; -+ int addition; - int reg_num; -- int addtion; - int index; - - reg_num = hikp_roh_get_cam_reg_num(self); - if (reg_num < 0) - return -EIO; - -- addtion = reg_num % RESPONSE_DATA_NUMBER_MAX ? 1 : 0; -- block_num = reg_num / RESPONSE_DATA_NUMBER_MAX + addtion; -+ addition = reg_num % RESPONSE_DATA_NUMBER_MAX ? 1 : 0; -+ block_num = reg_num / RESPONSE_DATA_NUMBER_MAX + addition; - - for (int i = 0; i < block_num; i++) { - req_data.bdf = g_roh_mac_param.target.bdf; -diff --git a/pcie/func_lib/pcie_func/pcie_reg_dump.c b/pcie/func_lib/pcie_func/pcie_reg_dump.c -index f7ec2b3..c38d0e5 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_dump.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_dump.c -@@ -417,8 +417,9 @@ static int pcie_create_dumpreg_log_file(uint32_t port_id, uint32_t dump_level) - static void pcie_close_dumpreg_log_file(void) - { - fclose(g_pcie_dumpreg_fd); -- /* Revoke write permission of file */ -- chmod(dumpreg_log_file, 0400); -+ /* Set the file permission to 0400 */ -+ if (chmod(dumpreg_log_file, 0400)) -+ Err("chmod %s failed, errno is %d\n", dumpreg_log_file, errno); - g_pcie_dumpreg_fd = NULL; - } - -diff --git a/pcie/func_lib/pcie_func/pcie_reg_read.c b/pcie/func_lib/pcie_func/pcie_reg_read.c -index c04c3d9..619f8e8 100644 ---- a/pcie/func_lib/pcie_func/pcie_reg_read.c -+++ b/pcie/func_lib/pcie_func/pcie_reg_read.c -@@ -70,7 +70,7 @@ static int pcie_reg_read_result_show(const struct hikp_cmd_ret *cmd_ret) - cmd_ret->rsp_data_num); - return -EINVAL; - } -- Info("RIGISTER VALUE[0x%08x].\n", cmd_ret->rsp_data[0]); -+ Info("REGISTER VALUE[0x%08x].\n", cmd_ret->rsp_data[0]); - - return 0; - } -diff --git a/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c b/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c -index 7b0efde..d89f223 100644 ---- a/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c -+++ b/pcie/usr_cmd/cmd_analysis/pcie_cmd_trace.c -@@ -86,7 +86,7 @@ static int pcie_trace_mode_set(struct major_cmd_ctrl *self, const char *argv) - g_trace_cmd.cmd_type = TRACE_MODE; - ret = string_toui(argv, &val); - if (ret || val > 1) { -- printf("tarce mode set err %d\n", ret); -+ printf("trace mode set err %d\n", ret); - return -EINVAL; - } - g_trace_cmd.trace_mode_val = val; -diff --git a/sas/user_cmd/cmd_code/sas_cmd_anacq.c b/sas/user_cmd/cmd_code/sas_cmd_anacq.c -index bdaaa42..4d9a750 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_anacq.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_anacq.c -@@ -27,8 +27,8 @@ static int sas_anacq_help(struct major_cmd_ctrl *self, const char *argv) - printf(" %s, %-25s %s\n", "-d", "--dieid", "please input die id[x] first\n"); - printf("\n Options:\n\n"); - printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); -- printf(" %s, %-25s %s\n", "-p", "--pointer", "dispaly cq queue read/write pointer\n"); -- printf(" %s, %-25s %s\n", "-s", "--number", "dispaly cq number\n"); -+ printf(" %s, %-25s %s\n", "-p", "--pointer", "display cq queue read/write pointer\n"); -+ printf(" %s, %-25s %s\n", "-s", "--number", "display cq number\n"); - printf("\n"); - - return 0; -diff --git a/sas/user_cmd/cmd_code/sas_cmd_anadq.c b/sas/user_cmd/cmd_code/sas_cmd_anadq.c -index bff2c71..176cfa3 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_anadq.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_anadq.c -@@ -27,8 +27,8 @@ static int sas_anadq_help(struct major_cmd_ctrl *self, const char *argv) - printf(" %s, %-25s %s\n", "-d", "--dieid", "please input die id[x] first\n"); - printf("\n Options:\n\n"); - printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); -- printf(" %s, %-25s %s\n", "-p", "--pointer", "dispaly dq queue read/write pointer\n"); -- printf(" %s, %-25s %s\n", "-s", "--number", "dispaly dq number\n"); -+ printf(" %s, %-25s %s\n", "-p", "--pointer", "display dq queue read/write pointer\n"); -+ printf(" %s, %-25s %s\n", "-s", "--number", "display dq number\n"); - printf("\n"); - - return 0; -diff --git a/sas/user_cmd/cmd_code/sas_cmd_dev.c b/sas/user_cmd/cmd_code/sas_cmd_dev.c -index 879e764..06832ce 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_dev.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_dev.c -@@ -27,7 +27,7 @@ static int sas_dev_help(struct major_cmd_ctrl *self, const char *argv) - printf(" %s, %-25s %s\n", "-d", "--dieid", "please input die id[x] first\n"); - printf("\n Options:\n\n"); - printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); -- printf(" %s, %-25s %s\n", "-l", "--link", "dispaly device type and speed\n"); -+ printf(" %s, %-25s %s\n", "-l", "--link", "display device type and speed\n"); - printf("\n"); - - return 0; -diff --git a/sas/user_cmd/cmd_code/sas_cmd_dqe.c b/sas/user_cmd/cmd_code/sas_cmd_dqe.c -index 5a85468..b914f54 100644 ---- a/sas/user_cmd/cmd_code/sas_cmd_dqe.c -+++ b/sas/user_cmd/cmd_code/sas_cmd_dqe.c -@@ -28,7 +28,7 @@ static int sas_dqe_help(struct major_cmd_ctrl *self, const char *argv) - printf(" %s, %-25s %s\n", "-q", "--queue", "please input queue id[x] first\n"); - printf("\n Options:\n\n"); - printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); -- printf(" %s, %-25s %s\n", "-i", "--info", "dispaly the dqe detail information\n"); -+ printf(" %s, %-25s %s\n", "-i", "--info", "display the dqe detail information\n"); - printf("\n"); - - return 0; -diff --git a/serdes/hikp_serdes.c b/serdes/hikp_serdes.c -index f07f1b6..39d46af 100644 ---- a/serdes/hikp_serdes.c -+++ b/serdes/hikp_serdes.c -@@ -130,7 +130,7 @@ static int cmd_serdes_key_info_pro(struct major_cmd_ctrl *self, const char *argv - - #define USEMODE_SSC_STR_MAXLEN 20 - static void hikp_serdes_brief_info_print(struct cmd_serdes_param *cmd, -- const struct hilink_brief_info *data, uint32_t data_size) -+ const struct hilink_brief_info *data) - { - uint8_t ds_id; - uint8_t start_sds_id = cmd->start_sds_id; -@@ -144,11 +144,6 @@ static void hikp_serdes_brief_info_print(struct cmd_serdes_param *cmd, - "nossc", "ssc", "mssc_in", "mssc_s", "mssc_n", "mssc_w", "mssc_e" - }; - -- if (data_size != sds_num) { -- printf("serdes brief info data size is wrong.\n"); -- return; -- } -- - for (ds_id = 0; ds_id < sds_num; ds_id++) { - if (data[ds_id].usemode >= HILINK_USE_MODE_END) { - printf("usemode[%u] is out of range.\n", data[ds_id].usemode); -@@ -204,17 +199,13 @@ static void hikp_serdes_brief_info_print(struct cmd_serdes_param *cmd, - "--------------------------------\n") - - static void hikp_serdes_detail_info_print(struct cmd_serdes_param *cmd, -- const struct hilink_detail_info *data, uint32_t data_size) -+ const struct hilink_detail_info *data) - { - uint32_t i; - uint8_t ds_id; - uint8_t start_sds_id = cmd->start_sds_id; - uint8_t sds_num = cmd->sds_num; - -- if (data_size != sds_num) { -- printf("serdes detail info data size is wrong.\n"); -- return; -- } - printf(KEY_INFO_TITLE); - for (ds_id = 0; ds_id < sds_num; ds_id++) { - printf("chip%u (M%u,ds%d) [%3d,%3d,%3u,%3d,%3d]", -@@ -341,13 +332,20 @@ static void hikp_serdes_info_print(struct cmd_serdes_param *cmd) - struct hilink_detail_info *detail_info_data = NULL; - - if (cmd->sub_cmd > 0) { -+ if (g_out_put.result_offset != cmd->sds_num * sizeof(struct hilink_detail_info)) { -+ printf("serdes detail info data size is wrong.\n"); -+ return; -+ } - detail_info_data = (struct hilink_detail_info *)g_out_put.out_str; -- hikp_serdes_detail_info_print(cmd, detail_info_data, -- g_out_put.result_offset / sizeof(struct hilink_detail_info)); -+ hikp_serdes_detail_info_print(cmd, detail_info_data); - } else { -+ if (g_out_put.result_offset != cmd->sds_num * sizeof(struct hilink_brief_info)) { -+ printf("serdes brief info data size is wrong.\n"); -+ return; -+ } -+ - brief_info_data = (struct hilink_brief_info *)g_out_put.out_str; -- hikp_serdes_brief_info_print(cmd, brief_info_data, -- g_out_put.result_offset / sizeof(struct hilink_brief_info)); -+ hikp_serdes_brief_info_print(cmd, brief_info_data); - } - } - -diff --git a/socip/hikp_socip_dumpreg.c b/socip/hikp_socip_dumpreg.c -index b3b3ed7..6d94f4a 100644 ---- a/socip/hikp_socip_dumpreg.c -+++ b/socip/hikp_socip_dumpreg.c -@@ -25,7 +25,7 @@ enum { - - struct dump_reg_param_t { - uint8_t val; -- bool is_vaild; -+ bool is_valid; - }; - - static const char *g_param_desc[SOCIP_DUMP_REG_PARAM_NUM] = { -@@ -65,7 +65,7 @@ static int get_param(struct major_cmd_ctrl *self, const char *argv, uint32_t ind - self->err_no = -EINVAL; - return -EINVAL; - } -- param->is_vaild = true; -+ param->is_valid = true; - - return 0; - } -@@ -97,7 +97,7 @@ static bool check_socip_dumpreg_param(void) - uint32_t i; - - for (i = 0; i < HIKP_ARRAY_SIZE(g_dump_reg_param); i++) { -- if (!param->is_vaild) { -+ if (!param->is_valid) { - ret = false; - HIKP_ERROR_PRINT("%s is not set\n", g_param_desc[i]); - } -diff --git a/tool_lib/tool_lib.c b/tool_lib/tool_lib.c -index 3dc5dad..559c558 100644 ---- a/tool_lib/tool_lib.c -+++ b/tool_lib/tool_lib.c -@@ -23,6 +23,7 @@ uint32_t get_chip_type(void) - uint32_t chip_type = CHIP_UNKNOW; - uint64_t midr_el1; - uint32_t part_num; -+ char *end = NULL; - FILE *file; - - file = fopen(MIDR_EL1_PATH, "r"); -@@ -38,7 +39,12 @@ uint32_t get_chip_type(void) - } - - fclose(file); -- midr_el1 = strtoul(midr_buffer, NULL, MIDR_HEX_TYPE); -+ midr_el1 = strtoul(midr_buffer, &end, MIDR_HEX_TYPE); -+ if ((end <= midr_buffer) || (midr_el1 == ULONG_MAX)) { -+ HIKP_ERROR_PRINT("Get chip type failed: %d\n", errno); -+ return chip_type; -+ } -+ - part_num = (midr_el1 & 0xffff) >> PART_NUM_OFFSET; - (void)snprintf(part_num_str, MIDR_BUFFER_SIZE, "%x", part_num); - --- -2.25.1 - diff --git a/0109-hikptool-optimization-tool-help-information.patch b/0109-hikptool-optimization-tool-help-information.patch deleted file mode 100644 index 9be43fd..0000000 --- a/0109-hikptool-optimization-tool-help-information.patch +++ /dev/null @@ -1,238 +0,0 @@ -From c72ca6bfc60bca9543beb4f39328099cac094c15 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Tue, 26 Aug 2025 19:29:41 +0800 -Subject: [PATCH 2/2] hikptool: optimization tool help information - -Based on the actual hardware platform, -display the supported commands; -if the current hardware does not support a command, -it will not be displayed, and the user will -be prompted with an error message if they input that command. - -Signed-off-by: veega2022 ---- - hikp_init_main.c | 148 +++++++++++++++++++++++++++++++++++++++++++- - tool_lib/tool_cmd.h | 5 ++ - tool_lib/tool_lib.c | 2 + - tool_lib/tool_lib.h | 1 + - 4 files changed, 154 insertions(+), 2 deletions(-) - -diff --git a/hikp_init_main.c b/hikp_init_main.c -index e159ad9..7b63e9b 100644 ---- a/hikp_init_main.c -+++ b/hikp_init_main.c -@@ -19,9 +19,149 @@ - /* hikptool command adapter */ - struct cmd_adapter g_tool = { 0 }; - -+static const char *g_cxl_cmd_list[] = { -+ "cxl_cpa", "cxl_dl", "cxl_membar", "cxl_rcrb", -+}; -+ -+static const char *g_hccs_cmd_list[] = { -+ "hccs", -+}; -+ -+static const char *g_log_collect_cmd_list[] = { -+ "info_collect", -+}; -+ -+static const char *g_nic_cmd_list[] = { -+ "nic_dfx", "nic_fd", "nic_fec", "nic_gro", "nic_info", -+ "nic_log", "nic_mac", "nic_ncsi", "nic_notify_pkt", "nic_port", -+ "nic_port_fault", "nic_ppp", "nic_qos", "nic_queue", "nic_rss", -+ "nic_torus", "nic_xsfp", -+}; -+ -+static const char *g_pcie_cmd_list[] = { -+ "pcie_dumpreg", "pcie_info", "pcie_regrd", "pcie_trace", -+}; -+ -+static const char *g_roce_cmd_list[] = { -+ "roce_bond", "roce_caep", "roce_dfx_sta", "roce_global_cfg", "roce_gmv", -+ "roce_mdb", "roce_pkt", "roce_qmm", "roce_rst", "roce_scc", -+ "roce_timer", "roce_trp", "roce_tsp", -+}; -+ -+static const char *g_roh_cmd_list[] = { -+ "roh_mac", "roh_show_bp", "roh_show_mib", -+}; -+ -+static const char *g_sas_cmd_list[] = { -+ "sas_anacq", "sas_anadq", "sas_dev", "sas_dqe", "sas_dump", "sas_errcode", -+}; -+ -+static const char *g_sata_cmd_list[] = { -+ "sata_dump", -+}; -+ -+static const char *g_serdes_cmd_list[] = { -+ "serdes_dump", "serdes_info", -+}; -+ -+static const char *g_socip_cmd_list[] = { -+ "socip_dumpreg", -+}; -+ -+static const char *g_core_ring_cmd_list[] = { -+ "cpu_ring", -+}; -+ -+static const char *g_sdma_cmd_list[] = { -+ "sdma_dump", -+}; -+ -+static const char *g_ub_cmd_list[] = { -+ "ub_bp", "ub_crd", "ub_dfx", "ub_info", "ub_link", "unic_ppp", -+}; -+ -+static const char *g_ras_cmd_list[] = { -+ "bbox_export", -+}; -+ -+const struct cmd_list_info g_chip_hip09_hip10_cmd_list[] = { -+ {g_cxl_cmd_list, HIKP_ARRAY_SIZE(g_cxl_cmd_list)}, -+ {g_hccs_cmd_list, HIKP_ARRAY_SIZE(g_hccs_cmd_list)}, -+ {g_log_collect_cmd_list, HIKP_ARRAY_SIZE(g_log_collect_cmd_list)}, -+ {g_nic_cmd_list, HIKP_ARRAY_SIZE(g_nic_cmd_list)}, -+ {g_pcie_cmd_list, HIKP_ARRAY_SIZE(g_pcie_cmd_list)}, -+ {g_roce_cmd_list, HIKP_ARRAY_SIZE(g_roce_cmd_list)}, -+ {g_roh_cmd_list, HIKP_ARRAY_SIZE(g_roh_cmd_list)}, -+ {g_sas_cmd_list, HIKP_ARRAY_SIZE(g_sas_cmd_list)}, -+ {g_sata_cmd_list, HIKP_ARRAY_SIZE(g_sata_cmd_list)}, -+ {g_serdes_cmd_list, HIKP_ARRAY_SIZE(g_serdes_cmd_list)}, -+ {g_socip_cmd_list, HIKP_ARRAY_SIZE(g_socip_cmd_list)}, -+}; -+ -+const struct cmd_list_info g_chip_hip11_cmd_list[] = { -+ {g_core_ring_cmd_list, HIKP_ARRAY_SIZE(g_core_ring_cmd_list)}, -+ {g_log_collect_cmd_list, HIKP_ARRAY_SIZE(g_log_collect_cmd_list)}, -+ {g_nic_cmd_list, HIKP_ARRAY_SIZE(g_nic_cmd_list)}, -+ {g_pcie_cmd_list, HIKP_ARRAY_SIZE(g_pcie_cmd_list)}, -+ {g_roce_cmd_list, HIKP_ARRAY_SIZE(g_roce_cmd_list)}, -+ {g_roh_cmd_list, HIKP_ARRAY_SIZE(g_roh_cmd_list)}, -+ {g_sata_cmd_list, HIKP_ARRAY_SIZE(g_sata_cmd_list)}, -+ {g_sdma_cmd_list, HIKP_ARRAY_SIZE(g_sdma_cmd_list)}, -+ {g_serdes_cmd_list, HIKP_ARRAY_SIZE(g_serdes_cmd_list)}, -+ {g_socip_cmd_list, HIKP_ARRAY_SIZE(g_socip_cmd_list)}, -+ {g_ub_cmd_list, HIKP_ARRAY_SIZE(g_ub_cmd_list)}, -+}; -+ -+const struct cmd_list_info g_chip_hip12_cmd_list[] = { -+ {g_ras_cmd_list, HIKP_ARRAY_SIZE(g_ras_cmd_list)}, -+ {g_hccs_cmd_list, HIKP_ARRAY_SIZE(g_hccs_cmd_list)}, -+ {g_log_collect_cmd_list, HIKP_ARRAY_SIZE(g_log_collect_cmd_list)}, -+ {g_pcie_cmd_list, HIKP_ARRAY_SIZE(g_pcie_cmd_list)}, -+ {g_serdes_cmd_list, HIKP_ARRAY_SIZE(g_serdes_cmd_list)}, -+ {g_socip_cmd_list, HIKP_ARRAY_SIZE(g_socip_cmd_list)}, -+}; -+ -+static bool cmd_is_support(const char *cmd_name, struct cmd_list_info *cmd_info, size_t len) -+{ -+ for (size_t i = 0; i < len; i++) -+ for (size_t j = 0; j < cmd_info[i].list_len; j++) -+ if (strcmp(cmd_info[i].cmd_list[j], cmd_name) == 0) -+ return true; -+ -+ return false; -+} -+ -+static bool check_cmd_is_support(const char *cmd_name) -+{ -+ uint32_t chip_type = get_chip_type(); -+ bool is_support = true; -+ -+ switch (chip_type) { -+ case CHIP_HIP09: -+ case CHIP_HIP10: -+ case CHIP_HIP10C: -+ is_support = cmd_is_support(cmd_name, g_chip_hip09_hip10_cmd_list, -+ HIKP_ARRAY_SIZE(g_chip_hip09_hip10_cmd_list)); -+ break; -+ case CHIP_HIP11: -+ is_support = cmd_is_support(cmd_name, g_chip_hip11_cmd_list, -+ HIKP_ARRAY_SIZE(g_chip_hip11_cmd_list)); -+ break; -+ case CHIP_HIP12: -+ is_support = cmd_is_support(cmd_name, g_chip_hip12_cmd_list, -+ HIKP_ARRAY_SIZE(g_chip_hip12_cmd_list)); -+ break; -+ default: -+ break; -+ } -+ -+ /* Unrecognized hardware type, default display supported */ -+ return is_support; -+} -+ - static void show_tool_version(const struct cmd_adapter *adapter) - { -- printf("%s version %s Huawei\n", adapter->name, adapter->version); -+ printf("%s version %s Huawei HW(%u)\n", adapter->name, adapter->version, get_chip_type()); - } - - static int cmp(const void *a, const void *b) -@@ -52,7 +192,8 @@ static void show_tool_help(const struct cmd_adapter *adapter) - qsort(start_cmd_ptr, end_cmd_ptr - start_cmd_ptr, - sizeof(struct hikp_cmd_type), (const void *)cmp); - for (cmd_ptr = start_cmd_ptr; cmd_ptr < end_cmd_ptr; cmd_ptr++) -- printf(" %-23s %s\n", cmd_ptr->name, cmd_ptr->help_info); -+ if (check_cmd_is_support(cmd_ptr->name)) -+ printf(" %-23s %s\n", cmd_ptr->name, cmd_ptr->help_info); - - printf("\n"); - } -@@ -92,6 +233,9 @@ static int parse_and_init_cmd(const char *arg) - if (strnlen(cmd_ptr->name, MAX_CMD_LEN) != strnlen(arg, MAX_CMD_LEN)) - continue; - -+ if (!check_cmd_is_support(cmd_ptr->name)) -+ continue; -+ - if ((strncmp(arg, cmd_ptr->name, - strnlen(cmd_ptr->name, MAX_CMD_LEN - 1) + 1) == 0) && cmd_ptr->cmd_init) { - g_tool.p_major_cmd.cmd_ptr = cmd_ptr; -diff --git a/tool_lib/tool_cmd.h b/tool_lib/tool_cmd.h -index 1aaaf22..87df2d7 100644 ---- a/tool_lib/tool_cmd.h -+++ b/tool_lib/tool_cmd.h -@@ -67,6 +67,11 @@ struct cmd_adapter { - struct major_cmd_ctrl p_major_cmd; - }; - -+struct cmd_list_info { -+ const char **cmd_list; -+ size_t list_len; -+}; -+ - extern int _s_cmd_data; - extern int _e_cmd_data; - extern struct cmd_adapter g_tool; -diff --git a/tool_lib/tool_lib.c b/tool_lib/tool_lib.c -index 559c558..f5facd5 100644 ---- a/tool_lib/tool_lib.c -+++ b/tool_lib/tool_lib.c -@@ -56,6 +56,8 @@ uint32_t get_chip_type(void) - chip_type = CHIP_HIP10C; - else if (strcmp(part_num_str, "d22") == 0) - chip_type = CHIP_HIP11; -+ else if (strcmp(part_num_str, "d06") == 0) -+ chip_type = CHIP_HIP12; - else - chip_type = CHIP_UNKNOW; - -diff --git a/tool_lib/tool_lib.h b/tool_lib/tool_lib.h -index d4accf1..b7b756c 100644 ---- a/tool_lib/tool_lib.h -+++ b/tool_lib/tool_lib.h -@@ -106,6 +106,7 @@ enum chip_type { - CHIP_HIP10, - CHIP_HIP10C, - CHIP_HIP11, -+ CHIP_HIP12, - CHIP_UNKNOW, - }; - --- -2.45.0.windows.1 - diff --git a/0110-hikptool-ras-do-some-cleanup-and-refactoring-of-rasd.patch b/0110-hikptool-ras-do-some-cleanup-and-refactoring-of-rasd.patch deleted file mode 100644 index 28066b8..0000000 --- a/0110-hikptool-ras-do-some-cleanup-and-refactoring-of-rasd.patch +++ /dev/null @@ -1,875 +0,0 @@ -From bfd5326b0abb9d6f54333f8f9090fd8cabc17061 Mon Sep 17 00:00:00 2001 -From: Junhao He -Date: Tue, 16 Sep 2025 16:59:56 +0800 -Subject: [PATCH] hikptool: ras: do some cleanup and refactoring of rasdfx dump - -cleanup: -1) Add a macro to simplify obtaining the packet size -2) Remove redundant checks for cmd and size, as they are always true -3) Use memcpy instead of for loop statements -4) Remove the redundant initialization of ras_rsp_data to 0 -5) Other minor cleanup - -refactor: -During the dump file process, do not repeatedly open and close the file -No need to subtract the packet header length, then simplify the code for -obtaining the file buffer size. - -Add helper of ras_get_rasdfx_header -Add a check to verify if cmd_ret->rsp_data_num is 0 -Add a check to verify whether f_header.pkt_num exceeds the maximum value - -The header.pkt_length indicates the size in bytes, which needs to be -converted to DWORD size, and then compared with DFX_REG_PACKET_HEAD_LEN -to address potential division by zero issues. - -Refactoring of parseing payload. - -Signed-off-by: Junhao He ---- - ras/ras_func/ras_common.h | 26 -- - ras/ras_func/ras_dump_data.c | 468 +++++++++++++------------------ - ras/ras_func/ras_dump_data.h | 90 +++--- - ras/user_cmd/ras_cmd_dump.c | 35 +-- - ras/user_cmd/ras_tools_include.h | 25 -- - 5 files changed, 243 insertions(+), 401 deletions(-) - delete mode 100644 ras/ras_func/ras_common.h - delete mode 100644 ras/user_cmd/ras_tools_include.h - -diff --git a/ras/ras_func/ras_common.h b/ras/ras_func/ras_common.h -deleted file mode 100644 -index 0931ed9..0000000 ---- a/ras/ras_func/ras_common.h -+++ /dev/null -@@ -1,26 +0,0 @@ --/* -- * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -- * Hikptool is licensed under Mulan PSL v2. -- * You can use this software according to the terms and conditions of the Mulan PSL v2. -- * You may obtain a copy of Mulan PSL v2 at: -- * http://license.coscl.org.cn/MulanPSL2 -- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -- * -- * See the Mulan PSL v2 for more details. -- */ -- --#ifndef RAS_COMMON_H --#define RAS_COMMON_H -- --enum { -- RAS_DUMP, --}; -- --enum ras_dump_cmd_type { -- DUMP_DFX = 0, -- DUMP_CLEAR, --}; -- --#endif /* RAS_COMMON_H */ -diff --git a/ras/ras_func/ras_dump_data.c b/ras/ras_func/ras_dump_data.c -index 7ab7d6b..2d0f274 100644 ---- a/ras/ras_func/ras_dump_data.c -+++ b/ras/ras_func/ras_dump_data.c -@@ -13,377 +13,299 @@ - #include - #include - #include -+#include - #include - #include - #include - #include - #include "hikptdev_plug.h" - #include "op_logs.h" --#include "ras_common.h" -+#include "hikpt_rciep.h" -+#include "tool_lib.h" - #include "ras_dump_data.h" - --static struct dfx_reg_dump_header header; -+static void __attribute__((format(printf, 2, 3))) __THROWNL -+rasdfx_wr2buf(struct file_seq *s, const char *fmt, ...); - --static int ras_get_data(uint32_t ras_cmd_type, struct ras_dump_req_para *req_data, -- struct ras_rsp *ras_rsp_data) --{ -- uint32_t i; -- struct hikp_cmd_ret *cmd_ret; -- struct hikp_cmd_header req_header; -+#define RAS_DUMP 0 - -- hikp_cmd_init(&req_header, RAS_MOD, RAS_DUMP, ras_cmd_type); -- cmd_ret = hikp_cmd_alloc(&req_header, req_data, RAS_REQ_DATA_LEN); -- if (cmd_ret == NULL || cmd_ret->status != 0 || -- cmd_ret->rsp_data_num > HIKP_RSP_ALL_DATA_MAX) { -- printf("hikp_data_proc err\n"); -- hikp_cmd_free(&cmd_ret); -- return -1; -- } -+#define RASDFX_FILE_HEADER_LEN 6 -+#define MAX_DFX_PACKET_LEN 256 -+#define DFX_REG_PACKET_HEAD_LEN 3U - -- ras_rsp_data->rsp_data_num = cmd_ret->rsp_data_num; -- for (i = 0; i < ras_rsp_data->rsp_data_num; i++) { -- ras_rsp_data->rsp_data[i] = cmd_ret->rsp_data[i]; -- } -+#define DFX_DATA_CLEARED_MAGIC 0 -+#define DFX_DATA_DUMPED_MAGIC 0x5aa5a55a - -- hikp_cmd_free(&cmd_ret); -- return 0; --} -+#define RASDFX_PACKET_HEAD_SIZE 256 -+#define RASDFX_PACKET_SIZE(reg_num) (RASDFX_PACKET_HEAD_SIZE + (reg_num) * 10) -+#define RASDFX_PACKET_NUM_MAX 1000000 - --static void ras_print_time(struct file_seq *s) -+static void __THROWNL rasdfx_wr2buf(struct file_seq *s, const char *fmt, ...) - { -- time_t time_seconds = time(0); -- struct tm timeinfo; -- -- (void)localtime_r(&time_seconds, &timeinfo); -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Time: %d-%d-%d %d:%d:%d\n", -- timeinfo.tm_year + START_YEAR, timeinfo.tm_mon + 1, timeinfo.tm_mday, -- timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); -+ size_t size = s->buf_size - s->buf_offs; -+ va_list argp; -+ int len; -+ -+ va_start(argp, fmt); -+ len = vsnprintf(s->buf + s->buf_offs, size, fmt, argp); -+ va_end(argp); -+ -+ if (len < 0 || (size_t)len >= size) -+ HIKP_WARN_PRINT("rasdfx_wr2buf failed, the dfx data is incomplete\n"); -+ else -+ s->buf_offs += (size_t)len; - } - --static int ras_parse_data(uint32_t *reg_save, uint32_t reg_num, uint32_t reg_off, struct file_seq *s) -+static struct hikp_cmd_ret *ras_get_rsp_data(struct ras_dump_cmd *cmd) - { -- uint32_t i, j; -- uint32_t cycle; -- uint32_t reg_count, pkt_reg_num; -- uint32_t off = reg_off; -- -- pkt_reg_num = header.pkt_length / sizeof(uint32_t); -- cycle = reg_num / pkt_reg_num; -- if (!cycle) -- return -1; -- -- for (i = 0; i < cycle; i++) { -- if ((off + pkt_reg_num) > HIKP_RSP_ALL_DATA_MAX) { -- HIKP_ERROR_PRINT("off is %u, pkt_reg_num is %u,\ -- reg_save index will exceed max reg_save length\n", -- off, pkt_reg_num); -- return -1; -- } -- -- ras_print_time(s); -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Socket: 0X%hhX\t", -- (reg_save[off + DFX_HEAD_INFO_DW0] >> DFX_HEAD_SKT_ID_OFF) & 0xff); -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "DIE: 0X%hhX\t", -- (reg_save[off + DFX_HEAD_INFO_DW0] >> DFX_HEAD_DIE_ID_OFF) & 0xff); -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Module: 0X%hhX\t", -- (reg_save[off + DFX_HEAD_INFO_DW1] >> DFX_HEAD_MODULE_ID_OFF) & 0xff); -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Sub Module: 0X%hhX\t", -- (reg_save[off + DFX_HEAD_INFO_DW1] >> DFX_HEAD_SUBMODULE_ID_OFF) & 0xff); -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "SequenceNum: 0X%hhX\t", -- (reg_save[off + DFX_HEAD_INFO_DW1] >> DFX_HEAD_SEQUENCE_NUM_OFF) & 0xff); -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "Version: 0X%hhX\n", -- (reg_save[off + DFX_HEAD_INFO_DW0] >> DFX_HEAD_VERSION_OFF) & 0xff); -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, -- "----------------------- DFX REGISTER DUMP -----------------------\n"); -- -- reg_count = (reg_save[off + DFX_HEAD_INFO_DW1] >> DFX_HEAD_REG_COUNT_OFF) & 0xff; -- if (!reg_count || reg_count > pkt_reg_num - DFX_REG_PACKET_HEAD_LEN) { -- HIKP_ERROR_PRINT("reg_count is %u, value is not within the reasonable range(1-%u).\n", -- reg_count, pkt_reg_num - DFX_REG_PACKET_HEAD_LEN); -- return -1; -- } -+ struct hikp_cmd_header req_header; -+ struct hikp_cmd_ret *cmd_ret; - -- for (j = 0; j < reg_count; j++) -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "0X%X\n", -- reg_save[off + DFX_COMMON_MAIN_TEXT_BEGIN + j]); -+ hikp_cmd_init(&req_header, RAS_MOD, RAS_DUMP, cmd->cmd_type); -+ cmd_ret = hikp_cmd_alloc(&req_header, &cmd->cmd_id, sizeof(cmd->cmd_id)); -+ if (!cmd_ret) { -+ HIKP_ERROR_PRINT("alloc cmd failed, cmd: %u\n", cmd->cmd_id); -+ return NULL; -+ } - -- s->len += snprintf(s->buffer + s->len, s->buffer_size - s->len, "\n"); -- off += pkt_reg_num; -+ if (cmd_ret->status) { -+ HIKP_ERROR_PRINT("hikp_data_proc err, status: %u\n", cmd_ret->status); -+ hikp_cmd_free(&cmd_ret); -+ return NULL; - } - -- return 0; -+ return cmd_ret; - } - --static int ras_generate_file_name(struct file_seq *s) -+static int ras_get_rasdfx_header(struct ras_dump_cmd *cmd, struct rasdfx_file_header *f_header) - { -- time_t time_seconds = time(0); -- struct tm timeinfo; -- int ret; -+ struct hikp_cmd_ret *cmd_ret; - -- (void)localtime_r(&time_seconds, &timeinfo); -- ret = snprintf(s->file_name, MAX_LOG_NAME_LEN, "rasdfx_%d_%d_%d_%d_%d_%d.log", -- timeinfo.tm_year + START_YEAR, timeinfo.tm_mon + 1, timeinfo.tm_mday, -- timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); -- if (ret < 0 || (uint32_t)ret >= MAX_LOG_NAME_LEN) { -- HIKP_ERROR_PRINT("generate file name failed, errno is %d\n", errno); -- return -errno; -+ cmd->cmd_id = 0; -+ cmd_ret = ras_get_rsp_data(cmd); -+ if (!cmd_ret) -+ return -ENOMEM; -+ -+ if (cmd_ret->rsp_data_num != RASDFX_FILE_HEADER_LEN) { -+ HIKP_ERROR_PRINT("invalid number of response data: %u\n", cmd_ret->rsp_data_num); -+ hikp_cmd_free(&cmd_ret); -+ return -1; - } - -+ memcpy(f_header, cmd_ret->rsp_data, sizeof(struct rasdfx_file_header)); -+ hikp_cmd_free(&cmd_ret); -+ - return 0; - } - --static int ras_store_data(struct file_seq *s) -+static bool ras_check_header(struct rasdfx_file_header *f_header) - { -- char file_path[OP_LOG_FILE_PATH_MAXLEN]; -- size_t write_cnt; -- FILE *fp; -- int rc; -- -- rc = snprintf(file_path, sizeof(file_path), HIKP_LOG_DIR_PATH"%s", s->file_name); -- if (rc < 0) { -- HIKP_ERROR_PRINT("creat log file path fail.\n"); -- return -EIO; -+ if (f_header->pkt_size_dwords % REP_DATA_BLK_SIZE) { -+ HIKP_ERROR_PRINT("packet size is not aligned: %u\n", f_header->pkt_size_dwords); -+ return false; - } - -- fp = fopen(file_path, "a"); -- if (fp == NULL) { -- HIKP_ERROR_PRINT("open %s failed, errno is %d\n", file_path, errno); -- return -errno; -+ /* Converted to DWORD units to simplify subsequent calculations */ -+ f_header->pkt_size_dwords = f_header->pkt_size_dwords / REP_DATA_BLK_SIZE; -+ if (f_header->pkt_size_dwords < DFX_REG_PACKET_HEAD_LEN || -+ f_header->pkt_size_dwords > MAX_DFX_PACKET_LEN) { -+ HIKP_ERROR_PRINT("packet size is out of bounds: %u\n", f_header->pkt_size_dwords); -+ return false; - } - -- write_cnt = fwrite(s->buffer, 1, s->len, fp); -- if (write_cnt != (uint32_t)s->len) { -- fclose(fp); -- HIKP_ERROR_PRINT("write %s failed, write cnt %zu.\n", file_path, write_cnt); -- return -EAGAIN; -- } -- -- printf("dump imp log completed, log file: %s.\n", file_path); -- /* Set the file permission to 0440 */ -- if (chmod(file_path, 0440)) -- HIKP_ERROR_PRINT("chmod %s failed, errno is %d\n", file_path, errno); -- -- if (fclose(fp)) { -- HIKP_ERROR_PRINT("close %s failed, errno is %d\n", file_path, errno); -- return -errno; -+ if (f_header->pkt_num == 0 || f_header->pkt_num > RASDFX_PACKET_NUM_MAX) { -+ HIKP_ERROR_PRINT("packet number is out of bounds: %u\n", f_header->pkt_num); -+ return false; - } - -- s->len = 0; -- -- return 0; -+ return true; - } - --static int file_seq_init(struct file_seq *s, uint32_t size) -+static int ras_open_rasdfx_file_seq(struct file_seq *s, struct rasdfx_file_header *f_header) - { -- if (!size) -- return -1; -+ char file_path[OP_LOG_FILE_PATH_MAXLEN]; -+ time_t time_seconds = time(0); -+ struct tm timeinfo; - -- s->buffer_size = size; -- s->len = 0; -- s->buffer = (char*)malloc(s->buffer_size); -- if (!s->buffer) -- return -1; -+ s->buf_offs = 0; -+ s->buf_size = RASDFX_PACKET_SIZE(f_header->pkt_size_dwords); -+ s->buf = (char *)malloc(s->buf_size); -+ if (!s->buf) { -+ HIKP_ERROR_PRINT("malloc file_seq buffer is failed\n"); -+ return -ENOMEM; -+ } -+ -+ (void)localtime_r(&time_seconds, &timeinfo); -+ snprintf(file_path, sizeof(file_path), "%srasdfx_%04d_%02d_%02d_%02d_%02d_%02d.log", -+ HIKP_LOG_DIR_PATH, timeinfo.tm_year + START_YEAR, timeinfo.tm_mon + 1, -+ timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); -+ -+ // creat and open file, set file permissiion 0440 -+ s->fd = open(file_path, O_WRONLY | O_CREAT, S_IRUSR | S_IRGRP); -+ if (s->fd < 0) { -+ HIKP_ERROR_PRINT("open %s failed: %s\n", file_path, strerror(errno)); -+ free(s->buf); -+ return -errno; -+ } - -+ printf("dump dfx log start, log file: %s\n", file_path); - return 0; - } - --static void file_seq_destroy(struct file_seq *s) -+static void ras_close_rasdfx_file_seq(struct file_seq *s) - { -- free(s->buffer); -- s->buffer = NULL; -+ (void)close(s->fd); -+ free(s->buf); - } - --static void ras_rsp_init(struct ras_rsp *ras_rsp_data) -+static void ras_parse_rasdfx_pkt_header(struct file_seq *s, struct rasdfx_pkt *pkt) - { -- ras_rsp_data->first_pkt_begin = 0; -- ras_rsp_data->last_pkt_end = 0; -- ras_rsp_data->rsp_data_num = 0; -- ras_rsp_data->packet_buffer_len = 0; -+ time_t time_seconds = time(0); -+ struct tm timeinfo; - -- memset(ras_rsp_data->rsp_data, 0, sizeof(ras_rsp_data->rsp_data)); -- memset(ras_rsp_data->packet_buffer, 0, sizeof(ras_rsp_data->packet_buffer)); -+ (void)localtime_r(&time_seconds, &timeinfo); -+ rasdfx_wr2buf(s, "Time: %d-%d-%d %d:%d:%d\n", -+ timeinfo.tm_year + START_YEAR, timeinfo.tm_mon + 1, timeinfo.tm_mday, -+ timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec); -+ rasdfx_wr2buf(s, "Socket: 0X%hhX ", pkt->dw0.skt_id); -+ rasdfx_wr2buf(s, "DIE: 0X%hhX ", pkt->dw0.die_id); -+ rasdfx_wr2buf(s, "Module: 0X%hhX ", pkt->dw1.module_id); -+ rasdfx_wr2buf(s, "Sub Module: 0X%hhX ", pkt->dw1.submodule_id); -+ rasdfx_wr2buf(s, "SequenceNum: 0X%hhX ", pkt->dw1.sequence_num); -+ rasdfx_wr2buf(s, "Version: 0X%hhX\n", pkt->dw0.version); -+ rasdfx_wr2buf(s, "----------------------- DFX REGISTER DUMP -----------------------\n"); - } - --static int parse_packet_buffer_data(struct ras_rsp *ras_rsp_data, -- uint32_t pkt_reg_num, struct file_seq *s) -+static int ras_parse_rasdfx_payload(struct file_seq *s, uint32_t *buf, -+ struct rasdfx_file_header *f_header) - { -- int ret; -- -- if (pkt_reg_num > MAX_DFX_PACKET_LEN) { -- HIKP_ERROR_PRINT("pkt_reg_num is %u, has exceeded max packet length\n", pkt_reg_num); -- return -1; -- } -+ struct rasdfx_pkt *pkt = (struct rasdfx_pkt *)buf; -+ uint32_t reg_offs, i; -+ ssize_t write_cnt; - -- if (ras_rsp_data->packet_buffer_len) { -- uint32_t rest_pkt_length; -+ rasdfx_wr2buf(s, "SocID: %u\n\n", pkt->dw0.soc_id); - -- rest_pkt_length = pkt_reg_num - ras_rsp_data->packet_buffer_len; -- memcpy(ras_rsp_data->packet_buffer + ras_rsp_data->packet_buffer_len, -- ras_rsp_data->rsp_data, rest_pkt_length); -- -- ras_rsp_data->first_pkt_begin = rest_pkt_length; -- ret = ras_parse_data(ras_rsp_data->packet_buffer, pkt_reg_num, 0, s); -- if (ret) { -- HIKP_ERROR_PRINT("ras parse packet_buffer_data is failed\n"); -- return ret; -+ for (i = 0; i < f_header->pkt_num; i++) { -+ ras_parse_rasdfx_pkt_header(s, pkt); -+ if (pkt->dw1.reg_count > f_header->pkt_size_dwords - DFX_REG_PACKET_HEAD_LEN) { -+ HIKP_ERROR_PRINT("ras dfx register number is incorrect\n"); -+ return -1; - } -- } else { -- ras_rsp_data->first_pkt_begin = 0; -- } - -- if (ras_rsp_data->first_pkt_begin == ras_rsp_data->rsp_data_num) -- return 0; -+ for (reg_offs = 0; reg_offs < pkt->dw1.reg_count; reg_offs++) -+ rasdfx_wr2buf(s, "0X%08X\n", pkt->reg_base[reg_offs]); -+ rasdfx_wr2buf(s, "\n"); - -- ras_rsp_data->packet_buffer_len = -- (ras_rsp_data->rsp_data_num - ras_rsp_data->first_pkt_begin) % pkt_reg_num; -- ras_rsp_data->last_pkt_end = ras_rsp_data->rsp_data_num - ras_rsp_data->packet_buffer_len - 1; -- ras_rsp_data->rsp_data_num = ras_rsp_data->last_pkt_end - ras_rsp_data->first_pkt_begin + 1; -+ write_cnt = write(s->fd, s->buf, s->buf_offs); -+ if (write_cnt != (ssize_t)s->buf_offs) { -+ HIKP_ERROR_PRINT("write rasdfx file failed: %s\n", strerror(errno)); -+ return -1; -+ } - -- memcpy(ras_rsp_data->packet_buffer, ras_rsp_data->rsp_data + ras_rsp_data->last_pkt_end + 1, -- ras_rsp_data->packet_buffer_len); -+ s->buf_offs = 0; -+ pkt = (struct rasdfx_pkt *)((uint32_t *)pkt + f_header->pkt_size_dwords); -+ } - - return 0; - } - --static int ras_dump_pkt_pre(struct ras_rsp *ras_rsp_data, struct file_seq *s) -+static int ras_dump_data_into_buf(struct ras_dump_cmd *cmd, uint32_t *buf, uint32_t buf_max) - { -- int ret; -- uint32_t reg_num, max_pkt_num, s_buffer_size; -- -- max_pkt_num = (HIKP_RSP_DATA_SIZE_MAX / header.pkt_length) + 1; -- reg_num = header.pkt_length / sizeof(uint32_t) - DFX_REG_PACKET_HEAD_LEN; -- s_buffer_size = max_pkt_num * -- (reg_num * DFX_FILE_SINGLE_REG_SIZE + DFX_FILE_SINGLE_PACKET_HEAD_SIZE); -- ras_rsp_data->rsp_data_num = 0; -+ struct hikp_cmd_ret *cmd_ret; -+ uint32_t copy_len = 0; -+ uint32_t data_num; -+ -+ while (copy_len < buf_max) { -+ cmd->cmd_id++; -+ cmd_ret = ras_get_rsp_data(cmd); -+ if (!cmd_ret) -+ return -ENOMEM; -+ -+ data_num = cmd_ret->rsp_data_num; -+ if (data_num == 0 || data_num > HIKP_RSP_ALL_DATA_MAX) { -+ HIKP_ERROR_PRINT("invalid response data number: %u\n", data_num); -+ hikp_cmd_free(&cmd_ret); -+ return -1; -+ } - -- ret = file_seq_init(s, s_buffer_size); -- if (ret) { -- HIKP_ERROR_PRINT("malloc file_seq buffer is failed\n"); -- return ret; -- } -+ if (copy_len + data_num > buf_max) { -+ HIKP_ERROR_PRINT("response data is more than expected\n"); -+ hikp_cmd_free(&cmd_ret); -+ return -1; -+ } - -- ret = ras_generate_file_name(s); -- if (ret) { -- HIKP_ERROR_PRINT("ras generate file name is failed\n"); -- file_seq_destroy(s); -- return ret; -+ memcpy(buf + copy_len, cmd_ret->rsp_data, data_num * REP_DATA_BLK_SIZE); -+ copy_len += data_num; -+ hikp_cmd_free(&cmd_ret); - } - -- return ret; -+ return 0; - } - --static int ras_dump_packet(struct tool_ras_cmd *cmd, struct ras_rsp *ras_rsp_data, -- struct ras_dump_req_para *req_data) -+static int ras_get_rasdfx_payload(struct ras_dump_cmd *cmd, struct rasdfx_file_header *f_header) - { -- int ret; -- uint32_t i, cmd_num; -- bool has_printed_socid = false; -+ uint32_t buf_max = f_header->pkt_size_dwords * f_header->pkt_num; -+ uint32_t *total_buf; - struct file_seq s; -+ int ret; - -- ret = ras_dump_pkt_pre(ras_rsp_data, &s); -- if (ret) -- return ret; -- -- cmd_num = (header.pkt_num * header.pkt_length + -- HIKP_RSP_DATA_SIZE_MAX - 1) / HIKP_RSP_DATA_SIZE_MAX; -- /* 0: get header info; 1-n: get packet data */ -- for (i = 0; i < cmd_num; i++) { -- req_data->cmd_id = i + 1; -- ret = ras_get_data(cmd->ras_cmd_type, req_data, ras_rsp_data); -- if (ret) { -- HIKP_ERROR_PRINT("ras dump cmd %u is failed\n", req_data->cmd_id); -- goto err_out_free; -- } -- -- if (!has_printed_socid) { -- s.len += snprintf(s.buffer + s.len, s.buffer_size - s.len, "SocID: %hhX\n", -- (ras_rsp_data->rsp_data[DFX_HEAD_INFO_DW0] >> DFX_HEAD_SOC_ID_OFF) & 0xff); -- s.len += snprintf(s.buffer + s.len, s.buffer_size - s.len, "\n"); -+ total_buf = (uint32_t *)malloc(buf_max * REP_DATA_BLK_SIZE); -+ if (!total_buf) { -+ HIKP_ERROR_PRINT("malloc total_buf failed\n"); -+ return -ENOMEM; -+ } - -- has_printed_socid = true; -- } -+ ret = ras_dump_data_into_buf(cmd, total_buf, buf_max); -+ if (ret) -+ goto release_total_buf; - -- ret = parse_packet_buffer_data(ras_rsp_data, header.pkt_length / sizeof(uint32_t), &s); -- if (ret) { -- HIKP_ERROR_PRINT("ras parse packet buffer data is failed\n"); -- goto err_out_free; -- } -+ ret = ras_open_rasdfx_file_seq(&s, f_header); -+ if (ret) -+ goto release_total_buf; - -- if (ras_rsp_data->first_pkt_begin != ras_rsp_data->rsp_data_num) { -- ret = ras_parse_data(ras_rsp_data->rsp_data, ras_rsp_data->rsp_data_num, -- ras_rsp_data->first_pkt_begin, &s); -- if (ret) { -- HIKP_ERROR_PRINT("ras parse rsp_data is failed\n"); -- goto err_out_free; -- } -- } -+ ret = ras_parse_rasdfx_payload(&s, total_buf, f_header); - -- ret = ras_store_data(&s); -- if (ret) { -- HIKP_ERROR_PRINT("ras store rsp_data is failed\n"); -- goto err_out_free; -- } -- } -- --err_out_free: -- file_seq_destroy(&s); -+ ras_close_rasdfx_file_seq(&s); -+release_total_buf: -+ free(total_buf); - return ret; - } - --int ras_data_dump(struct tool_ras_cmd *cmd) -+int ras_data_dump(void) - { -+ struct ras_dump_cmd cmd = { .cmd_type = DUMP_DFX }; -+ struct rasdfx_file_header f_header; - int ret; -- struct ras_rsp ras_rsp_data; -- struct ras_dump_req_para req_data = {0}; -- -- if (cmd == NULL) -- return -ENOSPC; - -- ras_rsp_init(&ras_rsp_data); -- ret = ras_get_data(cmd->ras_cmd_type, &req_data, &ras_rsp_data); -- if (ret || (ras_rsp_data.rsp_data_num != DFX_REG_DUMP_HEADER_LEN)) { -- HIKP_ERROR_PRINT("ras dump header is failed, rsp_data_num is %u\n", -- ras_rsp_data.rsp_data_num); -- return -1; -- } -+ ret = ras_get_rasdfx_header(&cmd, &f_header); -+ if (ret) -+ return ret; - -- if (!ras_rsp_data.rsp_data[HEAD_MAGIC]) { -- HIKP_ERROR_PRINT("ras dfx dump is failed, data does not exist or has been cleared.\n"); -+ if (f_header.head_magic != DFX_DATA_DUMPED_MAGIC) { -+ HIKP_ERROR_PRINT("data does not exist or has been cleared.\n"); - return -1; - } - -- header.pkt_num = ras_rsp_data.rsp_data[PKT_NUM]; -- header.pkt_length = ras_rsp_data.rsp_data[PKT_LENGTH]; -- if (header.pkt_num == 0 || header.pkt_length < DFX_REG_PACKET_HEAD_LEN) { -- HIKP_ERROR_PRINT("ras dfx dump is failed, pkt_num is %u, pkt_length is %u\n", -- header.pkt_num, header.pkt_length); -+ if (!ras_check_header(&f_header)) - return -1; -- } - -- ret = ras_dump_packet(cmd, &ras_rsp_data, &req_data); -- if (ret) -- HIKP_ERROR_PRINT("ras dump packet is failed\n"); -- -- return ret; -+ return ras_get_rasdfx_payload(&cmd, &f_header); - } - --int ras_data_clear(struct tool_ras_cmd *cmd) -+int ras_data_clear(void) - { -+ struct ras_dump_cmd cmd = { .cmd_type = DUMP_CLEAR }; -+ struct rasdfx_file_header f_header; - int ret; -- struct ras_rsp ras_rsp_data; -- struct ras_dump_req_para req_data = { 0 }; - -- if (cmd == NULL) -- return -ENOSPC; -+ ret = ras_get_rasdfx_header(&cmd, &f_header); -+ if (ret) -+ return ret; - -- ras_rsp_init(&ras_rsp_data); -- ret = ras_get_data(cmd->ras_cmd_type, &req_data, &ras_rsp_data); -- if (ret || ras_rsp_data.rsp_data_num != DFX_REG_DUMP_HEADER_LEN || -- ras_rsp_data.rsp_data[HEAD_MAGIC] != DFX_DATA_IS_CLEARED) { -+ if (f_header.head_magic != DFX_DATA_CLEARED_MAGIC) { - HIKP_ERROR_PRINT("ras dfx data clear is failed\n"); - return -1; - } - - return 0; - } -- -diff --git a/ras/ras_func/ras_dump_data.h b/ras/ras_func/ras_dump_data.h -index 4c54ffe..ef4a00f 100644 ---- a/ras/ras_func/ras_dump_data.h -+++ b/ras/ras_func/ras_dump_data.h -@@ -11,78 +11,60 @@ - * See the Mulan PSL v2 for more details. - */ - --#ifndef RAS_DUMP_REG_H --#define RAS_DUMP_REG_H -+#ifndef RAS_DUMP_DATA_H -+#define RAS_DUMP_DATA_H - --#include "ras_tools_include.h" --#include "hikpt_rciep.h" --#include "tool_lib.h" -+#include - --#define RAS_FILE_HEAD_BUF_LEN 256 --#define MAX_DFX_PACKET_LEN 256 --#define RAS_REQ_DATA_LEN 4 --#define DFX_REG_DUMP_HEADER_LEN 6 --#define DFX_REG_PACKET_HEAD_LEN 3 -- --struct dfx_reg_dump_header { -+struct rasdfx_file_header { - uint32_t head_magic; // 文件头的magic数字,特定值表示有效记录。 - uint32_t version; // 存储格å¼ç‰ˆæœ¬ - uint32_t cap_bits; // bit0表示是å¦å¼€å¯crc,其余bitä¿ç•™ã€‚ - uint32_t pkt_num; // packetæ•°é‡ -- uint32_t pkt_length; // å•个packetå ç”¨å†…存空间,å•ä½bytes -+ uint32_t pkt_size_dwords; // å•个packet内DWord个数,å•ä½4bytes - uint32_t reserved; - }; - --struct file_seq { -- char *buffer; -- uint32_t buffer_size; -- int len; -- char file_name[MAX_LOG_NAME_LEN]; --}; -- --struct ras_rsp { -- uint32_t rsp_data[HIKP_RSP_ALL_DATA_MAX]; -- uint32_t first_pkt_begin; -- uint32_t last_pkt_end; -- uint32_t rsp_data_num; -- uint32_t packet_buffer[MAX_DFX_PACKET_LEN]; -- uint32_t packet_buffer_len; -+struct rasdfx_pkt_header_dw0 { -+ uint32_t version : 8; -+ uint32_t soc_id : 8; -+ uint32_t skt_id : 8; -+ uint32_t die_id : 8; - }; - --struct ras_dump_req_para { -- uint32_t cmd_id; -+struct rasdfx_pkt_header_dw1 { -+ uint32_t module_id : 8; -+ uint32_t submodule_id : 8; -+ uint32_t sequence_num : 8; -+ uint32_t reg_count : 8; - }; - --enum reg_dump_header_index { -- HEAD_MAGIC, -- VERSION, -- CAP_BITS, -- PKT_NUM, -- PKT_LENGTH -+struct rasdfx_pkt { -+ struct rasdfx_pkt_header_dw0 dw0; -+ struct rasdfx_pkt_header_dw1 dw1; -+ uint32_t reserved; -+ uint32_t reg_base[0]; - }; - --enum dfx_packet_index { -- DFX_HEAD_INFO_DW0, -- DFX_HEAD_INFO_DW1, -- DFX_COMMON_MAIN_TEXT_BEGIN = 3 -+struct file_seq { -+ int fd; -+ char *buf; -+ size_t buf_size; -+ size_t buf_offs; - }; - --#define DFX_HEAD_VERSION_OFF 0 --#define DFX_HEAD_SOC_ID_OFF 8 --#define DFX_HEAD_SKT_ID_OFF 16 --#define DFX_HEAD_DIE_ID_OFF 24 --#define DFX_HEAD_MODULE_ID_OFF 0 --#define DFX_HEAD_SUBMODULE_ID_OFF 8 --#define DFX_HEAD_SEQUENCE_NUM_OFF 16 --#define DFX_HEAD_REG_COUNT_OFF 24 -+enum ras_dump_cmd_type { -+ DUMP_DFX, -+ DUMP_CLEAR -+ }; - --#define DFX_DATA_IS_CLEARED 0 -- --#define DFX_FILE_SINGLE_PACKET_HEAD_SIZE 256 --#define DFX_FILE_SINGLE_REG_SIZE 10 -+struct ras_dump_cmd { -+ enum ras_dump_cmd_type cmd_type; -+ uint32_t cmd_id; /* 0: get header info, 1-n: get packet data */ -+}; - -+int ras_data_dump(void); -+int ras_data_clear(void); - --int ras_data_dump(struct tool_ras_cmd *cmd); --int ras_data_clear(struct tool_ras_cmd *cmd); -+#endif /* RAS_DUMP_DATA_H */ - --#endif /* RAS_DUMP_REG_H */ -diff --git a/ras/user_cmd/ras_cmd_dump.c b/ras/user_cmd/ras_cmd_dump.c -index 14fa0cf..a9f1d85 100644 ---- a/ras/user_cmd/ras_cmd_dump.c -+++ b/ras/user_cmd/ras_cmd_dump.c -@@ -13,11 +13,12 @@ - - #include - #include "tool_cmd.h" --#include "ras_tools_include.h" -+#include "hikptdev_plug.h" -+#include "tool_lib.h" - #include "ras_dump_data.h" - --struct tool_ras_cmd g_ras_dump_cmd = { -- .ras_cmd_type = DUMP_DFX, -+struct ras_dump_cmd g_cmd = { -+ .cmd_type = DUMP_DFX - }; - - static int ras_dump_help(struct major_cmd_ctrl *self, const char *argv) -@@ -34,33 +35,21 @@ static int ras_dump_help(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - --static enum ras_dump_cmd_type ras_get_cmd_type(void) --{ -- return g_ras_dump_cmd.ras_cmd_type; --} -- --static void ras_set_cmd_type(enum ras_dump_cmd_type type) --{ -- g_ras_dump_cmd.ras_cmd_type = type; --} -- - static int ras_set_clear(struct major_cmd_ctrl *self, const char *argv) - { - HIKP_SET_USED(self); - HIKP_SET_USED(argv); - -- ras_set_cmd_type(DUMP_CLEAR); -+ g_cmd.cmd_type = DUMP_CLEAR; - return 0; - } - --static int ras_dump_execute_process(void) -+static int ras_dump_execute_process(enum ras_dump_cmd_type cmd_type) - { -- if (ras_get_cmd_type() == DUMP_DFX) -- return ras_data_dump(&g_ras_dump_cmd); -- else if (ras_get_cmd_type() == DUMP_CLEAR) -- return ras_data_clear(&g_ras_dump_cmd); -+ if (cmd_type == DUMP_CLEAR) -+ return ras_data_clear(); - else -- return -EINVAL; -+ return ras_data_dump(); - } - - static void ras_dump_execute(struct major_cmd_ctrl *self) -@@ -75,12 +64,12 @@ static void ras_dump_execute(struct major_cmd_ctrl *self) - "ras dfx data clear error." - }; - -- ret = ras_dump_execute_process(); -+ ret = ras_dump_execute_process(g_cmd.cmd_type); - if (ret == 0) { -- printf("%s\n", suc_msg[ras_get_cmd_type()]); -+ printf("%s\n", suc_msg[g_cmd.cmd_type]); - } else { - snprintf(self->err_str, sizeof(self->err_str), "%s\n", -- err_msg[ras_get_cmd_type()]); -+ err_msg[g_cmd.cmd_type]); - self->err_no = ret; - } - } -diff --git a/ras/user_cmd/ras_tools_include.h b/ras/user_cmd/ras_tools_include.h -deleted file mode 100644 -index 19d9db2..0000000 ---- a/ras/user_cmd/ras_tools_include.h -+++ /dev/null -@@ -1,25 +0,0 @@ --/* -- * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -- * Hikptool is licensed under Mulan PSL v2. -- * You can use this software according to the terms and conditions of the Mulan PSL v2. -- * You may obtain a copy of Mulan PSL v2 at: -- * http://license.coscl.org.cn/MulanPSL2 -- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -- * -- * See the Mulan PSL v2 for more details. -- */ -- --#ifndef RAS_TOOLS_INCLUDE_H --#define RAS_TOOLS_INCLUDE_H -- --#include "hikptdev_plug.h" --#include "tool_lib.h" --#include "ras_common.h" -- --struct tool_ras_cmd { -- enum ras_dump_cmd_type ras_cmd_type; --}; -- --#endif /* RAS_TOOLS_INCLUDE_H */ --- -2.25.1 - diff --git a/0111-hikptool-hccs-Fix-the-usage-description.patch b/0111-hikptool-hccs-Fix-the-usage-description.patch deleted file mode 100644 index 2e9a006..0000000 --- a/0111-hikptool-hccs-Fix-the-usage-description.patch +++ /dev/null @@ -1,42 +0,0 @@ -From c5330c4445ef85eaf98376e52e8b6d95f0281369 Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Wed, 27 Aug 2025 15:21:14 +0800 -Subject: [PATCH 1/2] hikptool:hccs: Fix the usage description - -Fix the usage description to make it more readable. - -Signed-off-by: Huisong Li ---- - hccs/hikp_hccs.c | 14 ++++++++------ - 1 file changed, 8 insertions(+), 6 deletions(-) - -diff --git a/hccs/hikp_hccs.c b/hccs/hikp_hccs.c -index f6ef003..347f76b 100644 ---- a/hccs/hikp_hccs.c -+++ b/hccs/hikp_hccs.c -@@ -71,14 +71,16 @@ static int hikp_hccs_cmd_help(struct major_cmd_ctrl *self, const char *argv) - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); - printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -- printf(" %s, %-25s %s\n", "-c", "--chip_id=", "target chip"); -- printf(" %s, %-25s %s\n", "-d", "--die_id=", "target die"); -- printf(" %s, %-25s %s\n", "-p", "--port_id=", "target port"); -+ printf(" %s, %-25s %s\n", "-c", "--chip_id=", "target chip ID which is from 'X' in chipX"); -+ printf(" %s, %-25s %s\n", "-d", "--die_id=", "target die ID which is from 'Y' in dieY"); -+ printf(" %s, %-25s %s\n", "-p", "--port_id=", "target port ID which from 'Z' in hccsZ"); - printf(" %s\n", - "[-g/--get ]\n" -- " topo : get hccs_typo info, no target specified.\n" -- " fixed_attr : get fixed attributes for port specified by -c X -d X -p X.\n" -- " dfx_info : get dfx info for port specified by -c X -d X -p X.\n"); -+ " topo : get HCCS topology information, no target specified.\n" -+ " fixed_attr : get fixed attributes of one port specified by -c X -d Y -p Z.\n" -+ " dfx_info : get dfx info of one port specified by -c X -d Y -p Z.\n" -+ "\n" -+ " eg: hikptool hccs -g dfx_info -c 0 -d 2 -p 1\n"); - return 0; - } - --- -2.34.1 - diff --git a/0112-hikptool-hccs-enable-HCCS-dfx-for-HIP11.patch b/0112-hikptool-hccs-enable-HCCS-dfx-for-HIP11.patch deleted file mode 100644 index 152e1ce..0000000 --- a/0112-hikptool-hccs-enable-HCCS-dfx-for-HIP11.patch +++ /dev/null @@ -1,25 +0,0 @@ -From e62fbbf6a8a969f6c9d700b1471d9ab53167584c Mon Sep 17 00:00:00 2001 -From: Huisong Li -Date: Fri, 22 Aug 2025 11:56:49 +0800 -Subject: [PATCH 2/2] hikptool:hccs: enable HCCS dfx for HIP11 - -Signed-off-by: Huisong Li ---- - hikp_init_main.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/hikp_init_main.c b/hikp_init_main.c -index 7b63e9b..acbed8c 100644 ---- a/hikp_init_main.c -+++ b/hikp_init_main.c -@@ -100,6 +100,7 @@ const struct cmd_list_info g_chip_hip09_hip10_cmd_list[] = { - - const struct cmd_list_info g_chip_hip11_cmd_list[] = { - {g_core_ring_cmd_list, HIKP_ARRAY_SIZE(g_core_ring_cmd_list)}, -+ {g_hccs_cmd_list, HIKP_ARRAY_SIZE(g_hccs_cmd_list)}, - {g_log_collect_cmd_list, HIKP_ARRAY_SIZE(g_log_collect_cmd_list)}, - {g_nic_cmd_list, HIKP_ARRAY_SIZE(g_nic_cmd_list)}, - {g_pcie_cmd_list, HIKP_ARRAY_SIZE(g_pcie_cmd_list)}, --- -2.34.1 - diff --git a/0113-hikptool-Add-the-nic_led-command-implementation.patch b/0113-hikptool-Add-the-nic_led-command-implementation.patch deleted file mode 100644 index af2a759..0000000 --- a/0113-hikptool-Add-the-nic_led-command-implementation.patch +++ /dev/null @@ -1,253 +0,0 @@ -From c046a19e9e7a8faa258ceb2c9aaa9af3a67ba49a Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 8 Oct 2025 11:11:01 +0800 -Subject: [PATCH 1/6] hikptool: Add the nic_led command implementation - -A new command nic_leg has been added, -which supports querying the light configuration -and status of specified ports. - -Usage: hikptool nic_led -i ethxx - -Signed-off-by: veega2022 ---- - hikp_init_main.c | 2 +- - net/hikp_net_lib.h | 1 + - net/nic/nic_led/hikp_nic_led.c | 128 +++++++++++++++++++++++++++++++++ - net/nic/nic_led/hikp_nic_led.h | 64 +++++++++++++++++ - 4 files changed, 194 insertions(+), 1 deletion(-) - create mode 100644 net/nic/nic_led/hikp_nic_led.c - create mode 100644 net/nic/nic_led/hikp_nic_led.h - -diff --git a/hikp_init_main.c b/hikp_init_main.c -index acbed8c..d52d603 100644 ---- a/hikp_init_main.c -+++ b/hikp_init_main.c -@@ -35,7 +35,7 @@ static const char *g_nic_cmd_list[] = { - "nic_dfx", "nic_fd", "nic_fec", "nic_gro", "nic_info", - "nic_log", "nic_mac", "nic_ncsi", "nic_notify_pkt", "nic_port", - "nic_port_fault", "nic_ppp", "nic_qos", "nic_queue", "nic_rss", -- "nic_torus", "nic_xsfp", -+ "nic_torus", "nic_xsfp", "nic_led", - }; - - static const char *g_pcie_cmd_list[] = { -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index aa700ab..f1c40f6 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -82,6 +82,7 @@ enum nic_cmd_type { - GET_NOTIFY_PKT_CMD, - GET_TORUS_INFO_CMD = 0xD, - GET_PORT_FAULT_STATUS = 0xE, -+ GET_PORT_LED_CFG = 0xF, - }; - - enum roh_cmd_type { -diff --git a/net/nic/nic_led/hikp_nic_led.c b/net/nic/nic_led/hikp_nic_led.c -new file mode 100644 -index 0000000..725a451 ---- /dev/null -+++ b/net/nic/nic_led/hikp_nic_led.c -@@ -0,0 +1,128 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include "hikp_nic_led.h" -+ -+static struct nic_led_cmd_info g_led_cmd_info = {0}; -+ -+static const char *nic_led_cmd_get_speed_status(uint8_t speed_led) -+{ -+ struct speed_status led_speed[] = { -+ {SPEED_1G_BLINK, "1G"}, -+ {SPEED_10G_BLINK, "10G"}, -+ {SPEED_25G_BLINK, "25G"}, -+ {SPEED_40G_BLINK, "40G"}, -+ {SPEED_50G_BLINK, "50G"}, -+ {SPEED_100G_BLINK, "100G"}, -+ {SPEED_200G_BLINK, "200G"}, -+ {SPEED_NO_LINK_BLINK, "NO_LINK"}, -+ {SPEED_TEST_BLINK, "TEST_MODE"}, -+ {SPEED_ERROR_BLINK, "ERROR_MODE"}, -+ }; -+ size_t size = HIKP_ARRAY_SIZE(led_speed); -+ -+ for (size_t i = 0; i < size; i++) { -+ if (speed_led == led_speed[i].status) -+ return led_speed[i].speed; -+ } -+ -+ return "unknown"; -+} -+ -+static bool nic_led_cmd_param_check(struct major_cmd_ctrl *self) -+{ -+ if ((g_led_cmd_info.cmd_flag & LED_PORT_TARGET_BIT) == 0) { -+ self->err_no = -EINVAL; -+ snprintf(self->err_str, sizeof(self->err_str), "Need port id."); -+ return false; -+ } -+ -+ return true; -+} -+ -+static void nic_led_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ struct hikp_cmd_header header = { 0 }; -+ struct nic_led_resp *led_rsp = NULL; -+ struct nic_led_req_para req = { 0 }; -+ struct hikp_cmd_ret *cmd_ret; -+ -+ if (!nic_led_cmd_param_check(self)) -+ return; -+ -+ req.bdf = g_led_cmd_info.port_dev.bdf; -+ hikp_cmd_init(&header, NIC_MOD, GET_PORT_LED_CFG, NIC_LED_CFG_DUMP); -+ cmd_ret = hikp_cmd_alloc(&header, &req, sizeof(req)); -+ self->err_no = hikp_rsp_normal_check(cmd_ret); -+ if (self->err_no) { -+ snprintf(self->err_str, sizeof(self->err_str), "Get led dfx info failed."); -+ goto ERR_OUT; -+ } -+ -+ led_rsp = (struct nic_led_resp *)cmd_ret->rsp_data; -+ printf("%-40s: %u\n", "led_en", led_rsp->led_en); -+ printf("%-40s: %s\n", "speed_led", nic_led_cmd_get_speed_status(led_rsp->speed_led_status)); -+ printf("%-40s: 0x%x(0x%x)\n", "led_err_status(sw_status)", -+ led_rsp->hw_err_mode, led_rsp->sw_err_mode); -+ printf("%-40s: 0x%x(0x%x)\n", "led_locate_status(sw_status)", -+ led_rsp->hw_locate_mode, led_rsp->sw_locate_mode); -+ printf("%-40s: 0x%x(0x%x)\n", "led_active_status(sw_status)", -+ led_rsp->hw_active_mode, led_rsp->sw_active_mode); -+ -+ERR_OUT: -+ hikp_cmd_free(&cmd_ret); -+} -+ -+static int nic_led_cmd_help(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(argv); -+ -+ printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i "); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %s, %-25s %s\n", "-i", "--interface=", -+ "device target or bdf id, e.g. eth0~3 or 0000:35:00.0"); -+ -+ return 0; -+} -+ -+static int nic_led_get_target(struct major_cmd_ctrl *self, const char *argv) -+{ -+ self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_led_cmd_info.port_dev); -+ if (self->err_no != 0) { -+ snprintf(self->err_str, sizeof(self->err_str), "unknown device!"); -+ return self->err_no; -+ } -+ -+ g_led_cmd_info.cmd_flag |= LED_PORT_TARGET_BIT; -+ -+ return 0; -+} -+ -+static void cmd_nic_led_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = nic_led_cmd_execute; -+ -+ cmd_option_register("-h", "--help", false, nic_led_cmd_help); -+ cmd_option_register("-i", "--interface", true, nic_led_get_target); -+} -+ -+HIKP_CMD_DECLARE("nic_led", "dump led configuration of port!", cmd_nic_led_init); -diff --git a/net/nic/nic_led/hikp_nic_led.h b/net/nic/nic_led/hikp_nic_led.h -new file mode 100644 -index 0000000..4f05ae5 ---- /dev/null -+++ b/net/nic/nic_led/hikp_nic_led.h -@@ -0,0 +1,64 @@ -+/* -+ * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. -+ * Hikptool is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ * http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#ifndef HIKP_NIC_LED_H -+#define HIKP_NIC_LED_H -+ -+#include "hikp_net_lib.h" -+ -+enum nic_led_sub_cmd_type { -+ NIC_LED_CFG_DUMP = 1, -+}; -+ -+#define LED_PORT_TARGET_BIT HI_BIT(0) -+ -+struct speed_status { -+ uint8_t status; -+ const char *speed; -+}; -+ -+#define SPEED_1G_BLINK 0x0 -+#define SPEED_10G_BLINK 0x1 -+#define SPEED_25G_BLINK 0x8 -+#define SPEED_40G_BLINK 0x2 -+#define SPEED_50G_BLINK 0x6 -+#define SPEED_100G_BLINK 0xa -+#define SPEED_200G_BLINK 0x16 -+#define SPEED_NO_LINK_BLINK 0x10 -+#define SPEED_TEST_BLINK 0xe -+#define SPEED_ERROR_BLINK 0x9 -+ -+struct nic_led_req_para { -+ struct bdf_t bdf; -+ uint32_t rsvd[2]; -+}; -+ -+struct nic_led_resp { -+ uint8_t led_en; -+ uint8_t hw_err_mode; -+ uint8_t hw_locate_mode; -+ uint8_t hw_active_mode; -+ uint8_t sw_err_mode; -+ uint8_t sw_locate_mode; -+ uint8_t sw_active_mode; -+ uint8_t speed_led_status; -+ -+ uint32_t rsvd[58]; -+}; -+ -+struct nic_led_cmd_info { -+ struct tool_target port_dev; -+ uint32_t cmd_flag; -+}; -+ -+#endif /* HIKP_NIC_LED_H */ --- -2.45.0.windows.1 - diff --git a/0114-hikptool-Add-dfx-to-roce_dfx_sta.patch b/0114-hikptool-Add-dfx-to-roce_dfx_sta.patch deleted file mode 100644 index 2b4a708..0000000 --- a/0114-hikptool-Add-dfx-to-roce_dfx_sta.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 506656a17485d36cfcb530891ce440dbb86008c6 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 8 Oct 2025 11:14:00 +0800 -Subject: [PATCH 2/6] hikptool: Add dfx to roce_dfx_sta - -Add two dfx to roce_dfx_sta commands: - -LENGTH_ERR - this is for scenarios where the incoming packet size -exceeds PMTU. -RQ_RNR - this is for RNR scenarios on server side. -These two dfx are mostly added for UD since in this case packets will -be silently dropped, but they also apply to RC. - -Signed-off-by: Junxian Huang huangjunxian6@hisilicon.com ---- - net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c -index b74507c..98337a3 100644 ---- a/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c -+++ b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c -@@ -59,6 +59,8 @@ static const char *g_dfx_sta_reg_name[] = { - "PKT_RNR_STA", - "PKT_RTY_STA", - "MSN_RTY_STA", -+ "LENGTH_ERR", -+ "RQ_RNR", - }; - - static int hikp_roce_dfx_sta_get_data(struct hikp_cmd_ret **cmd_ret, --- -2.45.0.windows.1 - diff --git a/0115-hikptool-Add-new-dump-ncsi-table-entry-configuration.patch b/0115-hikptool-Add-new-dump-ncsi-table-entry-configuration.patch deleted file mode 100644 index e819796..0000000 --- a/0115-hikptool-Add-new-dump-ncsi-table-entry-configuration.patch +++ /dev/null @@ -1,472 +0,0 @@ -From e74538f5d6e92872a811e76cb6dd48461f396d67 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 8 Oct 2025 11:19:20 +0800 -Subject: [PATCH 3/6] hikptool: Add new dump ncsi table entry configuration - -The nic_ncsi command has been updated with -a new -d option, which supports dumping the -configuration of specified module entries. - -The usage is as follows: - -hikptool nic_ncsi -i ethxx -d [module name] - -Supported module names include: tx_mac, smac, dmac, etc. - -Signed-off-by: veega2022 ---- - net/hikp_net_lib.h | 9 ++ - net/nic/nic_ncsi/hikp_nic_ncsi.c | 245 +++++++++++++++++++++++++++++-- - net/nic/nic_ncsi/hikp_nic_ncsi.h | 108 +++++++++++++- - 3 files changed, 352 insertions(+), 10 deletions(-) - -diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h -index f1c40f6..e855d4e 100644 ---- a/net/hikp_net_lib.h -+++ b/net/hikp_net_lib.h -@@ -83,6 +83,7 @@ enum nic_cmd_type { - GET_TORUS_INFO_CMD = 0xD, - GET_PORT_FAULT_STATUS = 0xE, - GET_PORT_LED_CFG = 0xF, -+ GET_NCSI_TABLE_ENTRY_INFO_CMD = 0x10, - }; - - enum roh_cmd_type { -@@ -120,6 +121,14 @@ enum nic_get_ncsi_sub_cmd { - NIC_NCSI_GET_DFX_INFO, - }; - -+enum nic_get_ncsi_entry_sub_cmd { -+ NIC_NCSI_GET_BUF_STATUS = 1, -+ NIC_NCSI_GET_VLAN_FILTER_TBL, -+ NIC_NCSI_GET_ETHER_FILTER_TBL, -+ NIC_NCSI_GET_DMAC_FILTER_TBL, -+ NIC_NCSI_GET_SMAC_FILTER_TBL, -+}; -+ - #define HIKP_MAX_PF_NUM 8 - #define HIKP_NIC_MAX_FUNC_NUM 256 - -diff --git a/net/nic/nic_ncsi/hikp_nic_ncsi.c b/net/nic/nic_ncsi/hikp_nic_ncsi.c -index 955e456..44d8e53 100644 ---- a/net/nic/nic_ncsi/hikp_nic_ncsi.c -+++ b/net/nic/nic_ncsi/hikp_nic_ncsi.c -@@ -48,18 +48,12 @@ static void nic_ncsi_cmd_print_dfx_info(struct nic_ncsi_cmd_resp *ncsi_info) - printf("\tncsi_ub_to_eth_lldp: %u\n", ncsi_info->ncsi_dfx.ncsi_ub_to_eth_lldp); - } - --static void nic_ncsi_cmd_execute(struct major_cmd_ctrl *self) -+static void nic_ncsi_cmd_get_cnt_dfx(struct major_cmd_ctrl *self) - { - struct hikp_cmd_ret *cmd_resp = NULL; - struct hikp_cmd_header req_header = {0}; - struct nic_ncsi_cmd_req ncsi_req = {0}; - -- if (!g_ncsi_cmd_info.port_flag) { -- self->err_no = -EINVAL; -- snprintf(self->err_str, sizeof(self->err_str), "Need port id."); -- return; -- } -- - memcpy(&ncsi_req.bdf, &g_ncsi_cmd_info.target.bdf, sizeof(ncsi_req.bdf)); - hikp_cmd_init(&req_header, NIC_MOD, GET_NCSI_INFO_CMD, NIC_NCSI_GET_DFX_INFO); - cmd_resp = hikp_cmd_alloc(&req_header, &ncsi_req, sizeof(ncsi_req)); -@@ -75,6 +69,226 @@ ERR_OUT: - hikp_cmd_free(&cmd_resp); - } - -+static int nic_ncsi_cmd_get_entry_response_data(struct major_cmd_ctrl *self, uint32_t sub_cmd, -+ struct hikp_cmd_ret **cmd_resp) -+{ -+ struct hikp_cmd_header req_header = {0}; -+ struct nic_ncsi_cmd_req ncsi_req = {0}; -+ -+ memcpy(&ncsi_req.bdf, &g_ncsi_cmd_info.target.bdf, sizeof(ncsi_req.bdf)); -+ hikp_cmd_init(&req_header, NIC_MOD, GET_NCSI_TABLE_ENTRY_INFO_CMD, sub_cmd); -+ *cmd_resp = hikp_cmd_alloc(&req_header, &ncsi_req, sizeof(ncsi_req)); -+ self->err_no = hikp_rsp_normal_check(*cmd_resp); -+ if (self->err_no) -+ snprintf(self->err_str, sizeof(self->err_str), -+ "Get ncsi filter(0x%x) info failed.", sub_cmd); -+ -+ return self->err_no; -+} -+ -+static void nic_ncsi_cmd_show_tx_buf_status(struct major_cmd_ctrl *self) -+{ -+ struct nic_ncsi_tx_buf_resp *tx_buf_rsp; -+ struct hikp_cmd_ret *cmd_resp = NULL; -+ int ret; -+ -+ ret = nic_ncsi_cmd_get_entry_response_data(self, NIC_NCSI_GET_BUF_STATUS, &cmd_resp); -+ if (ret) -+ goto ERR_OUT; -+ -+ tx_buf_rsp = (struct nic_ncsi_tx_buf_resp *)cmd_resp->rsp_data; -+ printf("ncsi tx buffer status:\n"); -+ printf("%-30s: %u\n", "tx_buf_empty", tx_buf_rsp->tx_buf_empty); -+ printf("%-30s: %u\n", "ctrl_sof", tx_buf_rsp->ctrl_sof); -+ printf("%-30s: %u\n", "ctrl_eof", tx_buf_rsp->ctrl_eof); -+ printf("%-30s: %u\n", "ctrl_err", tx_buf_rsp->ctrl_err); -+ printf("%-30s: %u\n", "ctrl_byte_sel", tx_buf_rsp->ctrl_byte_sel); -+ -+ERR_OUT: -+ hikp_cmd_free(&cmd_resp); -+} -+ -+static void nic_ncsi_cmd_show_vlan_filter_cfg(struct major_cmd_ctrl *self) -+{ -+ struct nic_ncsi_vlan_filter_resp *vlan_rsp = NULL; -+ struct hikp_cmd_ret *cmd_resp = NULL; -+ int ret; -+ -+ ret = nic_ncsi_cmd_get_entry_response_data(self, NIC_NCSI_GET_VLAN_FILTER_TBL, &cmd_resp); -+ if (ret) -+ goto ERR_OUT; -+ -+ vlan_rsp = (struct nic_ncsi_vlan_filter_resp *)cmd_resp->rsp_data; -+ printf("vlan filter config:\n"); -+ printf("%-30s: 0x%x\n", "filter_enable",vlan_rsp->filter_en_map); -+ printf("%-30s: 0x%x\n", "filter_type", vlan_rsp->filer_type); -+ printf("%-30s: 0x%x\n", "entry_to_bmc", vlan_rsp->entry_to_bmc_map); -+ printf("%-30s: 0x%x\n", "entry_to_bmc_only", vlan_rsp->entry_to_bmc_only_map); -+ -+ printf("enabled entries:\n"); -+ printf("%5s |%10s\n", "id", "vlan_id"); -+ for (uint32_t i = 0; i < NIC_NCSI_VLAN_ENTRY_NUM; i++) { -+ if (!vlan_rsp->entry[i].entry_en) -+ continue; -+ printf("%5u |%10u\n", i, vlan_rsp->entry[i].vlan_id); -+ } -+ -+ERR_OUT: -+ hikp_cmd_free(&cmd_resp); -+} -+ -+static void nic_ncsi_cmd_show_ether_filter_cfg(struct major_cmd_ctrl *self) -+{ -+ struct nic_ncsi_ether_filter_resp *ether_rsp = NULL; -+ struct hikp_cmd_ret *cmd_resp = NULL; -+ int ret; -+ -+ ret = nic_ncsi_cmd_get_entry_response_data(self, NIC_NCSI_GET_ETHER_FILTER_TBL, &cmd_resp); -+ if (ret) -+ goto ERR_OUT; -+ -+ ether_rsp = (struct nic_ncsi_ether_filter_resp *)cmd_resp->rsp_data; -+ printf("ether filter config:\n"); -+ printf("%-30s: 0x%x\n", "filter_enable", ether_rsp->ether_en_map); -+ printf("%-30s: 0x%x\n", "entry_to_bmc", ether_rsp->entry_to_bmc_map); -+ printf("%-30s: 0x%x\n", "entry_to_bmc_only", ether_rsp->entry_to_bmc_only_map); -+ -+ printf("enabled entries:\n"); -+ printf("%5s |%13s\n", "id", "ether_type"); -+ for (uint32_t i = 0; i < NIC_NCSI_ETHER_ENTRY_NUM; i++) { -+ if (!ether_rsp->entry[i].entry_en) -+ continue; -+ -+ printf("%5u |%13u\n", i, ether_rsp->entry[i].entry_type); -+ } -+ -+ERR_OUT: -+ hikp_cmd_free(&cmd_resp); -+} -+ -+static void nic_ncsi_cmd_show_dmac_filter_cfg(struct major_cmd_ctrl *self) -+{ -+ struct nic_ncsi_dmac_filter_resp *dmac_rsp = NULL; -+ struct hikp_cmd_ret *cmd_resp = NULL; -+ int ret; -+ -+ ret = nic_ncsi_cmd_get_entry_response_data(self, NIC_NCSI_GET_DMAC_FILTER_TBL, &cmd_resp); -+ if (ret) -+ goto ERR_OUT; -+ -+ dmac_rsp = (struct nic_ncsi_dmac_filter_resp *)cmd_resp->rsp_data; -+ printf("dmac filter config:\n"); -+ printf("%-30s: 0x%x\n", "filter_enable", dmac_rsp->dmac_en_map); -+ printf("%-30s: 0x%x\n", "entry_to_bmc", dmac_rsp->dmac_to_bmc); -+ printf("%-30s: 0x%x\n", "entry_to_bmc_only", dmac_rsp->dmac_to_bmc_only); -+ -+ printf("enabled entries:\n"); -+ printf("%5s |%10s |%10s |%13s\n", "id", "type", "entry_h", "entry_l"); -+ for (uint32_t i = 0; i < NIC_NCSI_DMAC_ENTRY_NUM; i++) { -+ if (!dmac_rsp->entry[i].entry_en) -+ continue; -+ printf("%5u |%10u |%#10x |%#13x\n", -+ i, dmac_rsp->entry[i].entry_type, -+ dmac_rsp->entry[i].entry_cfg_h, dmac_rsp->entry[i].entry_cfg_l); -+ } -+ -+ printf("multicast_filter: %16s(%u)%15s(%u)%16s(%u)%11s(%u)%15s(%u)\n", -+ "ipv6_neighbor", dmac_rsp->mc_ipv6_neighbor_en, -+ "ipv6_route", dmac_rsp->mc_ipv6_route_en, -+ "dhcpv6_relay", dmac_rsp->mc_dhcpv6_relay_en, -+ "to_bmc", dmac_rsp->mc_to_bmc, "to_bmc_only", dmac_rsp->mc_to_bmc_only); -+ -+ printf("broadcast_filter: %16s(%u)%15s(%u)%16s(%u)%11s(%u)%15s(%u)%15s(%u)\n", -+ "arp", dmac_rsp->bc_arp_en, "dhcp_client", dmac_rsp->bc_dhcp_client, -+ "dhcp_server", dmac_rsp->bc_dhcp_server, "netbios", dmac_rsp->bc_netbios_en, -+ "to_bmc", dmac_rsp->bc_to_bmc, "to_bmc_only", dmac_rsp->bc_to_bmc_only); -+ -+ERR_OUT: -+ hikp_cmd_free(&cmd_resp); -+} -+ -+static void nic_ncsi_cmd_show_smac_filter_cfg(struct major_cmd_ctrl *self) -+{ -+ struct nic_ncsi_smac_filter_resp *smac_rsp = NULL; -+ struct hikp_cmd_ret *cmd_resp = NULL; -+ int ret; -+ -+ ret = nic_ncsi_cmd_get_entry_response_data(self, NIC_NCSI_GET_SMAC_FILTER_TBL, &cmd_resp); -+ if (ret) -+ goto ERR_OUT; -+ -+ smac_rsp = (struct nic_ncsi_smac_filter_resp *)cmd_resp->rsp_data; -+ printf("smac filter config:\n"); -+ printf("%-30s: 0x%x\n", "filter_enable", smac_rsp->smac_en_map); -+ printf("%-30s: 0x%x\n", "pt_pkt_enable", smac_rsp->pt_pkt_en); -+ -+ printf("enabled entries:\n"); -+ printf("%5s |%10s |%15s |%10s |%13s\n", -+ "id", "dport", "entry_to_mac", "entry_h", "entry_l"); -+ for (uint32_t i = 0; i < NIC_NCSI_SMAC_ENTRY_NUM; i++) { -+ if (!smac_rsp->entry[i].entry_en) -+ continue; -+ printf("%5u |%10u |%15u |%#10x |%#13x\n", -+ i, smac_rsp->entry[i].entry_dport, -+ smac_rsp->entry[i].entry_to_mac, smac_rsp->entry[i].entry_cfg_h, -+ smac_rsp->entry[i].entry_cfg_l); -+ } -+ -+ERR_OUT: -+ hikp_cmd_free(&cmd_resp); -+} -+ -+static void nic_ncsi_cmd_get_filter_cfg(struct major_cmd_ctrl *self) -+{ -+ struct ncsi_dump_mod_proc mod_info[] = { -+ {"tx_buf", nic_ncsi_cmd_show_tx_buf_status}, -+ {"vlan", nic_ncsi_cmd_show_vlan_filter_cfg}, -+ {"ether", nic_ncsi_cmd_show_ether_filter_cfg}, -+ {"dmac", nic_ncsi_cmd_show_dmac_filter_cfg}, -+ {"smac", nic_ncsi_cmd_show_smac_filter_cfg}, -+ }; -+ uint32_t size = HIKP_ARRAY_SIZE(mod_info); -+ -+ if (!g_ncsi_cmd_info.module_name) { -+ self->err_no = -EPERM; -+ snprintf(self->err_str, sizeof(self->err_str), "dump module is null."); -+ return; -+ } -+ -+ if (strcmp(g_ncsi_cmd_info.module_name, "all") == 0) { -+ for (uint32_t i = 0; i < size; i++) { -+ mod_info[i].show(self); -+ printf("----------------------------------" -+ "------------------------------------------\n"); -+ } -+ } else { -+ for (uint32_t i = 0; i < size; i++) { -+ if (strcmp(g_ncsi_cmd_info.module_name, mod_info[i].name) != 0) -+ continue; -+ -+ return mod_info[i].show(self); -+ } -+ -+ self->err_no = -EINVAL; -+ snprintf(self->err_str, sizeof(self->err_str), -+ "Invalid filter conifg module: %s.", g_ncsi_cmd_info.module_name); -+ } -+} -+ -+static void nic_ncsi_cmd_execute(struct major_cmd_ctrl *self) -+{ -+ if ((g_ncsi_cmd_info.cmd_flag & NCSI_PORT_TARGET_BIT) == 0) { -+ self->err_no = -EINVAL; -+ snprintf(self->err_str, sizeof(self->err_str), "Need port id."); -+ return; -+ } -+ -+ if (g_ncsi_cmd_info.cmd_flag & NCSI_DUMP_MODULE_BIT) -+ nic_ncsi_cmd_get_filter_cfg(self); -+ else -+ nic_ncsi_cmd_get_cnt_dfx(self); -+} -+ - static int nic_ncsi_cmd_get_port_info(struct major_cmd_ctrl *self, const char *argv) - { - self->err_no = tool_check_and_get_valid_bdf_id(argv, &g_ncsi_cmd_info.target); -@@ -82,7 +296,17 @@ static int nic_ncsi_cmd_get_port_info(struct major_cmd_ctrl *self, const char *a - snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); - return self->err_no; - } -- g_ncsi_cmd_info.port_flag = true; -+ g_ncsi_cmd_info.cmd_flag |= NCSI_PORT_TARGET_BIT; -+ -+ return 0; -+} -+ -+static int nic_ncsi_cmd_get_dump_mode(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(self); -+ -+ g_ncsi_cmd_info.cmd_flag |= NCSI_DUMP_MODULE_BIT; -+ g_ncsi_cmd_info.module_name = argv; - - return 0; - } -@@ -97,6 +321,8 @@ static int nic_ncsi_cmd_show_help(struct major_cmd_ctrl *self, const char *argv) - printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); - printf(" %s, %-25s %s\n", "-i", "--interface=", - "device target or bdf id, e.g. eth0~3 or 0000:35:00.0"); -+ printf(" %s, %-25s %s\n", "-d", "--dump", "specify the module name for the dump " -+ "e.g. tx_buf, vlan, ether, dmac, smac, all"); - printf("\n"); - - return 0; -@@ -124,12 +350,13 @@ static void cmd_nic_get_ncsi_init(void) - { - struct major_cmd_ctrl *major_cmd = get_major_cmd(); - -- g_ncsi_cmd_info.port_flag = false; -+ g_ncsi_cmd_info.cmd_flag = 0; - major_cmd->option_count = 0; - major_cmd->execute = nic_ncsi_cmd_execute; - - cmd_option_register("-h", "--help", false, nic_ncsi_cmd_show_help); - cmd_option_register("-i", "--interface", true, nic_ncsi_cmd_get_port_info); -+ cmd_option_register("-d", "--dump", true, nic_ncsi_cmd_get_dump_mode); - } - - HIKP_CMD_DECLARE("nic_ncsi", "query nic port ncsi information", cmd_nic_get_ncsi_init); -diff --git a/net/nic/nic_ncsi/hikp_nic_ncsi.h b/net/nic/nic_ncsi/hikp_nic_ncsi.h -index 56ab653..dfcf974 100644 ---- a/net/nic/nic_ncsi/hikp_nic_ncsi.h -+++ b/net/nic/nic_ncsi/hikp_nic_ncsi.h -@@ -44,14 +44,120 @@ struct nic_ncsi_cmd_resp { - uint32_t rsv1[50]; /* max resp data: 240 Bytes */ - }; - -+struct nic_ncsi_tx_buf_resp { -+ uint8_t tx_buf_empty : 1; -+ uint8_t ctrl_sof : 1; -+ uint8_t ctrl_eof : 1; -+ uint8_t ctrl_err : 1; -+ uint8_t ctrl_byte_sel : 2; -+ uint8_t rsv0 : 2; -+ uint8_t rsv1[7]; -+ uint32_t rsv2[58]; /* max resp data: 240 Bytes */ -+}; -+ -+#define NIC_NCSI_VLAN_ENTRY_NUM 16 -+struct ncsi_vlan_entry { -+ uint32_t vlan_id : 16; -+ uint32_t entry_en : 1; -+ uint32_t rsv : 15; -+}; -+ -+struct nic_ncsi_vlan_filter_resp { -+ uint32_t filter_en_map : 16; -+ uint32_t filer_type : 8; -+ uint32_t rsv0 : 8; -+ uint32_t entry_to_bmc_only_map : 16; -+ uint32_t entry_to_bmc_map : 16; -+ -+ struct ncsi_vlan_entry entry[NIC_NCSI_VLAN_ENTRY_NUM]; -+ uint32_t rsv1[42]; /* max resp data: 240 Bytes */ -+}; -+ -+#define NIC_NCSI_ETHER_ENTRY_NUM 4 -+struct ncsi_ether_entry { -+ uint32_t entry_type : 16; -+ uint32_t entry_en : 1; -+ uint32_t rsv : 15; -+}; -+ -+struct nic_ncsi_ether_filter_resp { -+ uint32_t ether_en_map : 4; -+ uint32_t entry_to_bmc_only_map : 4; -+ uint32_t entry_to_bmc_map : 4; -+ uint32_t rsv0 : 20; -+ uint32_t rsv1; -+ struct ncsi_ether_entry entry[NIC_NCSI_ETHER_ENTRY_NUM]; -+ uint32_t rsv2[54]; /* max resp data: 240 Bytes */ -+}; -+ -+#define NIC_NCSI_DMAC_ENTRY_NUM 8 -+struct ncsi_dmac_entry { -+ uint32_t entry_cfg_l; -+ uint32_t entry_cfg_h : 16; -+ uint32_t entry_type : 2; -+ uint32_t entry_en : 1; -+ uint32_t rsv : 13; -+}; -+ -+struct nic_ncsi_dmac_filter_resp { -+ uint32_t dmac_en_map : 8; -+ uint32_t dmac_to_bmc_only : 8; -+ uint32_t dmac_to_bmc : 8; -+ uint32_t rsv0 : 8; -+ uint32_t mc_ipv6_neighbor_en : 1; -+ uint32_t mc_ipv6_route_en : 1; -+ uint32_t mc_dhcpv6_relay_en : 1; -+ uint32_t mc_to_bmc : 1; -+ uint32_t mc_to_bmc_only : 1; -+ uint32_t rsv1 : 27; -+ uint32_t bc_arp_en : 1; -+ uint32_t bc_dhcp_client : 1; -+ uint32_t bc_dhcp_server : 1; -+ uint32_t bc_netbios_en : 1; -+ uint32_t bc_to_bmc : 1; -+ uint32_t bc_to_bmc_only : 1; -+ uint32_t rsv2 : 26; -+ uint32_t rsv3; -+ struct ncsi_dmac_entry entry[NIC_NCSI_DMAC_ENTRY_NUM]; -+ uint32_t rsv4[40]; /* max resp data: 240 Bytes */ -+}; -+ -+#define NIC_NCSI_SMAC_ENTRY_NUM 8 -+struct ncsi_smac_entry { -+ uint32_t entry_cfg_l; -+ uint32_t entry_cfg_h : 16; -+ uint32_t entry_en : 1; -+ uint32_t entry_dport : 3; -+ uint32_t entry_to_mac : 1; -+ uint32_t rsv : 11; -+}; -+ -+struct nic_ncsi_smac_filter_resp { -+ uint32_t smac_en_map : 8; -+ uint32_t pt_pkt_en : 1; -+ uint32_t rsv0 : 23; -+ uint32_t rsv1; -+ struct ncsi_smac_entry entry[NIC_NCSI_SMAC_ENTRY_NUM]; -+ uint32_t rsv2[42]; /* max resp data: 240 Bytes */ -+}; -+ - struct nic_ncsi_cmd_req { - struct bdf_t bdf; - uint32_t rsv0[30]; /* max req data: 128 Bytes */ - }; - -+struct ncsi_dump_mod_proc { -+ const char *name; -+ void (*show)(struct major_cmd_ctrl *self); -+}; -+ -+#define NCSI_PORT_TARGET_BIT HI_BIT(0) -+#define NCSI_DUMP_MODULE_BIT HI_BIT(1) -+ - struct nic_ncsi_cmd_info { - struct tool_target target; -- bool port_flag; -+ uint32_t cmd_flag; -+ const char *module_name; - }; - - struct nic_ncsi_collect_param { --- -2.45.0.windows.1 - diff --git a/0116-hikptool-Optimize-one-click-log-collection-supported.patch b/0116-hikptool-Optimize-one-click-log-collection-supported.patch deleted file mode 100644 index 6516bd5..0000000 --- a/0116-hikptool-Optimize-one-click-log-collection-supported.patch +++ /dev/null @@ -1,241 +0,0 @@ -From ac7b14bfbff739c826e70b7f2087d0dfee5a27a1 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 8 Oct 2025 11:23:29 +0800 -Subject: [PATCH 4/6] hikptool: Optimize one-click log collection supported - commands - -Depending on the hardware platform, -the corresponding supported collection -commands are displayed, while unsupported -commands are no longer shown and input is -also not supported. - -Signed-off-by: veega2022 ---- - info_collect/hikp_collect_main.c | 165 ++++++++++++++++++++++++++----- - 1 file changed, 143 insertions(+), 22 deletions(-) - -diff --git a/info_collect/hikp_collect_main.c b/info_collect/hikp_collect_main.c -index 46120a5..3571850 100644 ---- a/info_collect/hikp_collect_main.c -+++ b/info_collect/hikp_collect_main.c -@@ -126,7 +126,7 @@ static int info_collect_all(struct major_cmd_ctrl *self, const char *argv) - return 0; - } - --static void collect_all_log(void) -+static void collect_all_log_hip09_10(void) - { - collect_pcie_info(); - collect_acc_log(); -@@ -137,9 +137,49 @@ static void collect_all_log(void) - collect_sata_log(); - collect_serdes_log(); - collect_socip_log(); -+} -+ -+static void collect_all_log_hip11(void) -+{ -+ collect_pcie_info(); -+ collect_imp_log(); -+ collect_nic_log(); -+ collect_roce_log(); -+ collect_sata_log(); -+ collect_serdes_log(); -+ collect_socip_log(); - collect_sdma_log(); - } - -+static void collect_all_log_hip12(void) -+{ -+ collect_pcie_info(); -+ collect_acc_log(); -+ collect_serdes_log(); -+ collect_socip_log(); -+} -+ -+static void collect_all_log(void) -+{ -+ uint32_t chip_type = get_chip_type(); -+ -+ switch (chip_type) { -+ case CHIP_HIP09: -+ case CHIP_HIP10: -+ case CHIP_HIP10C: -+ collect_all_log_hip09_10(); -+ break; -+ case CHIP_HIP11: -+ collect_all_log_hip11(); -+ break; -+ case CHIP_HIP12: -+ collect_all_log_hip12(); -+ break; -+ default: -+ break; -+ } -+} -+ - static int info_collect_excute_funs_call(uint32_t collect_type) - { - const char *type_name[] = {"acc", "imp", "nic", "pcie", "roce", "sas", -@@ -199,7 +239,6 @@ static int info_collect_excute_funs_call(uint32_t collect_type) - return ret; - } - -- - static void info_collect_execute(struct major_cmd_ctrl *self) - { - const char *suc_msg[] = { -@@ -243,38 +282,32 @@ static void info_collect_execute(struct major_cmd_ctrl *self) - } - } - --static int info_collect_help(struct major_cmd_ctrl *self, const char *argv) -+static int info_collect_help_hip09_10(struct major_cmd_ctrl *self, const char *argv) - { - HIKP_SET_USED(argv); - - printf("\n Usage: %s\n", self->cmd_ptr->name); - printf("\n %s\n", self->cmd_ptr->help_info); - printf("\n Options:\n\n"); -- printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); -- printf(" %s, %-25s %s\n", "-acc", "--acc", "collect acc info\n"); -- printf(" %s, %-25s %s\n", "-imp", "--imp", "collect imp info\n"); -- printf(" %s, %-25s %s\n", "-nic", "--nic", "collect nic info\n"); -- printf(" %s, %-25s %s\n", "-pcie", "--pcie", "collect pcie info\n"); -- printf(" %s, %-25s %s\n", "-roce", "--roce", "collect roce info\n"); -- printf(" %s, %-25s %s\n", "-sas", "--sas", "collect sas info\n"); -- printf(" %s, %-25s %s\n", "-sata", "--sata", "collect sata info\n"); -- printf(" %s, %-25s %s\n", "-serdes", "--serdes", "collect serdes info\n"); -- printf(" %s, %-25s %s\n", "-socip", "--socip", "collect socip info\n"); -- printf(" %s, %-25s %s\n", "-sdma", "--sdma", "collect sdma info\n"); -- printf(" %s, %-25s %s\n", "-all", "--all", "collect all info\n"); -+ printf(" %-10s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %-10s, %-25s %s\n", "-acc", "--acc", "collect acc info"); -+ printf(" %-10s, %-25s %s\n", "-imp", "--imp", "collect imp info"); -+ printf(" %-10s, %-25s %s\n", "-nic", "--nic", "collect nic info"); -+ printf(" %-10s, %-25s %s\n", "-pcie", "--pcie", "collect pcie info"); -+ printf(" %-10s, %-25s %s\n", "-roce", "--roce", "collect roce info"); -+ printf(" %-10s, %-25s %s\n", "-sas", "--sas", "collect sas info"); -+ printf(" %-10s, %-25s %s\n", "-sata", "--sata", "collect sata info"); -+ printf(" %-10s, %-25s %s\n", "-serdes", "--serdes", "collect serdes info"); -+ printf(" %-10s, %-25s %s\n", "-socip", "--socip", "collect socip info"); -+ printf(" %-10s, %-25s %s\n", "-all", "--all", "collect all info"); - printf("\n"); - - return 0; - } - --static void cmd_info_collect_init(void) -+static void info_collect_cmd_register_hip09_10(void) - { -- struct major_cmd_ctrl *major_cmd = get_major_cmd(); -- -- major_cmd->option_count = 0; -- major_cmd->execute = info_collect_execute; -- -- cmd_option_register("-h", "--help", false, info_collect_help); -+ cmd_option_register("-h", "--help", false, info_collect_help_hip09_10); - cmd_option_register("-acc", "--acc", false, info_collect_acc); - cmd_option_register("-imp", "--imp", false, info_collect_imp); - cmd_option_register("-nic", "--nic", false, info_collect_nic); -@@ -284,8 +317,96 @@ static void cmd_info_collect_init(void) - cmd_option_register("-sata", "--sata", false, info_collect_sata); - cmd_option_register("-serdes", "--serdes", false, info_collect_serdes); - cmd_option_register("-socip", "--socip", false, info_collect_socip); -+ cmd_option_register("-all", "--all", false, info_collect_all); -+} -+ -+static int info_collect_help_hip11(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(argv); -+ -+ printf("\n Usage: %s\n", self->cmd_ptr->name); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %-10s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %-10s, %-25s %s\n", "-imp", "--imp", "collect imp info"); -+ printf(" %-10s, %-25s %s\n", "-nic", "--nic", "collect nic info"); -+ printf(" %-10s, %-25s %s\n", "-pcie", "--pcie", "collect pcie info"); -+ printf(" %-10s, %-25s %s\n", "-roce", "--roce", "collect roce info"); -+ printf(" %-10s, %-25s %s\n", "-sata", "--sata", "collect sata info"); -+ printf(" %-10s, %-25s %s\n", "-serdes", "--serdes", "collect serdes info"); -+ printf(" %-10s, %-25s %s\n", "-socip", "--socip", "collect socip info"); -+ printf(" %-10s, %-25s %s\n", "-sdma", "--sdma", "collect sdma info"); -+ printf(" %-10s, %-25s %s\n", "-all", "--all", "collect all info"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static void info_collect_cmd_register_hip11(void) -+{ -+ cmd_option_register("-h", "--help", false, info_collect_help_hip11); -+ cmd_option_register("-imp", "--imp", false, info_collect_imp); -+ cmd_option_register("-nic", "--nic", false, info_collect_nic); -+ cmd_option_register("-pcie", "--pcie", false, info_collect_pcie); -+ cmd_option_register("-roce", "--roce", false, info_collect_roce); -+ cmd_option_register("-sata", "--sata", false, info_collect_sata); -+ cmd_option_register("-serdes", "--serdes", false, info_collect_serdes); -+ cmd_option_register("-socip", "--socip", false, info_collect_socip); - cmd_option_register("-sdma", "--sdma", false, info_collect_sdma); - cmd_option_register("-all", "--all", false, info_collect_all); - } - -+static int info_collect_help_hip12(struct major_cmd_ctrl *self, const char *argv) -+{ -+ HIKP_SET_USED(argv); -+ -+ printf("\n Usage: %s\n", self->cmd_ptr->name); -+ printf("\n %s\n", self->cmd_ptr->help_info); -+ printf("\n Options:\n\n"); -+ printf(" %-10s, %-25s %s\n", "-h", "--help", "display this help and exit"); -+ printf(" %-10s, %-25s %s\n", "-acc", "--acc", "collect acc info"); -+ printf(" %-10s, %-25s %s\n", "-pcie", "--pcie", "collect pcie info"); -+ printf(" %-10s, %-25s %s\n", "-serdes", "--serdes", "collect serdes info"); -+ printf(" %-10s, %-25s %s\n", "-socip", "--socip", "collect socip info"); -+ printf(" %-10s, %-25s %s\n", "-all", "--all", "collect all info"); -+ printf("\n"); -+ -+ return 0; -+} -+ -+static void info_collect_cmd_register_hip12(void) -+{ -+ cmd_option_register("-h", "--help", false, info_collect_help_hip12); -+ cmd_option_register("-acc", "--acc", false, info_collect_acc); -+ cmd_option_register("-pcie", "--pcie", false, info_collect_pcie); -+ cmd_option_register("-serdes", "--serdes", false, info_collect_serdes); -+ cmd_option_register("-socip", "--socip", false, info_collect_socip); -+ cmd_option_register("-all", "--all", false, info_collect_all); -+} -+ -+static void cmd_info_collect_init(void) -+{ -+ struct major_cmd_ctrl *major_cmd = get_major_cmd(); -+ uint32_t chip_type = get_chip_type(); -+ -+ major_cmd->option_count = 0; -+ major_cmd->execute = info_collect_execute; -+ -+ switch (chip_type) { -+ case CHIP_HIP09: -+ case CHIP_HIP10: -+ case CHIP_HIP10C: -+ info_collect_cmd_register_hip09_10(); -+ break; -+ case CHIP_HIP11: -+ info_collect_cmd_register_hip11(); -+ break; -+ case CHIP_HIP12: -+ info_collect_cmd_register_hip12(); -+ break; -+ default: -+ break; -+ } -+} -+ - HIKP_CMD_DECLARE("info_collect", "information collect", cmd_info_collect_init); --- -2.45.0.windows.1 - diff --git a/0117-hikptool-Remove-sas_dqe-command.patch b/0117-hikptool-Remove-sas_dqe-command.patch deleted file mode 100644 index 90cd59b..0000000 --- a/0117-hikptool-Remove-sas_dqe-command.patch +++ /dev/null @@ -1,389 +0,0 @@ -From 92d25f5fa6182ea0c6af53a90c94c34264965b70 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 8 Oct 2025 11:31:28 +0800 -Subject: [PATCH 5/6] hikptool: Remove sas_dqe command - -Revmove the sas_dqe command as it is not used in -problem analysis and may cause malfunctions when -executed. The debugfs related functions can be -used instead. - -Signed-off-by: Xingui Yang yangxingui@huawei.com ---- - hikp_init_main.c | 2 +- - sas/sas_func/sas_common.h | 5 -- - sas/sas_func/sas_read_dev.c | 2 +- - sas/sas_func/sas_read_dqe.c | 114 ---------------------------- - sas/sas_func/sas_read_dqe.h | 85 --------------------- - sas/user_cmd/cmd_code/sas_cmd_dqe.c | 106 -------------------------- - 6 files changed, 2 insertions(+), 312 deletions(-) - delete mode 100644 sas/sas_func/sas_read_dqe.c - delete mode 100644 sas/sas_func/sas_read_dqe.h - delete mode 100644 sas/user_cmd/cmd_code/sas_cmd_dqe.c - -diff --git a/hikp_init_main.c b/hikp_init_main.c -index d52d603..72d206f 100644 ---- a/hikp_init_main.c -+++ b/hikp_init_main.c -@@ -53,7 +53,7 @@ static const char *g_roh_cmd_list[] = { - }; - - static const char *g_sas_cmd_list[] = { -- "sas_anacq", "sas_anadq", "sas_dev", "sas_dqe", "sas_dump", "sas_errcode", -+ "sas_anacq", "sas_anadq", "sas_dev", "sas_dump", "sas_errcode", - }; - - static const char *g_sata_cmd_list[] = { -diff --git a/sas/sas_func/sas_common.h b/sas/sas_func/sas_common.h -index 78edf2e..c11b7d4 100644 ---- a/sas/sas_func/sas_common.h -+++ b/sas/sas_func/sas_common.h -@@ -79,9 +79,4 @@ enum sas_dev_cmd_type { - DEV_UNKNOWN_TYPE, - }; - --enum sas_dqe_cmd_type { -- DQE_INFO, -- DQE_UNKNOWN_TYPE, --}; -- - #endif /* SAS_COMMON_H */ -diff --git a/sas/sas_func/sas_read_dev.c b/sas/sas_func/sas_read_dev.c -index dec2935..c541c1c 100644 ---- a/sas/sas_func/sas_read_dev.c -+++ b/sas/sas_func/sas_read_dev.c -@@ -34,7 +34,7 @@ static int sas_get_dev(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint3 - hikp_cmd_init(&req_header, SAS_MOD, SAS_DEV, cmd->sas_cmd_type); - cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); - if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { -- printf("sas_dqe excutes hikp_cmd_alloc err\n"); -+ printf("sas_dev excutes hikp_cmd_alloc err\n"); - hikp_cmd_free(&cmd_ret); - return -EINVAL; - } -diff --git a/sas/sas_func/sas_read_dqe.c b/sas/sas_func/sas_read_dqe.c -deleted file mode 100644 -index ae4ef68..0000000 ---- a/sas/sas_func/sas_read_dqe.c -+++ /dev/null -@@ -1,114 +0,0 @@ --/* -- * Copyright (c) 2022 Hisilicon Technologies Co., Ltd. -- * Hikptool is licensed under Mulan PSL v2. -- * You can use this software according to the terms and conditions of the Mulan PSL v2. -- * You may obtain a copy of Mulan PSL v2 at: -- * http://license.coscl.org.cn/MulanPSL2 -- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -- * -- * See the Mulan PSL v2 for more details. -- */ --#include --#include --#include --#include --#include --#include --#include "hikptdev_plug.h" --#include "sas_common.h" --#include "sas_read_dqe.h" -- --static int sas_get_dqe(const struct tool_sas_cmd *cmd, uint32_t *reg_save, uint32_t *reg_num) --{ -- struct hikp_cmd_header req_header; -- struct hikp_cmd_ret *cmd_ret; -- struct sas_dqe_req_para req_data = { 0 }; -- -- req_data.chip_id = cmd->chip_id; -- req_data.die_id = cmd->die_id; -- req_data.que_id = cmd->que_id; -- req_data.dqe_id = cmd->dqe_id; -- -- hikp_cmd_init(&req_header, SAS_MOD, SAS_DQE, cmd->sas_cmd_type); -- cmd_ret = hikp_cmd_alloc(&req_header, &req_data, sizeof(req_data)); -- if (cmd_ret == NULL || cmd_ret->status != 0 || cmd_ret->rsp_data_num > RESP_MAX_NUM) { -- printf("sas_dqe excutes hikp_cmd_alloc err\n"); -- hikp_cmd_free(&cmd_ret); -- return -EINVAL; -- } -- *reg_num = cmd_ret->rsp_data_num; -- for (uint32_t i = 0; i < *reg_num; i++) -- reg_save[i] = cmd_ret->rsp_data[i]; -- -- hikp_cmd_free(&cmd_ret); -- return 0; --} -- --static void print_dqe_info(const void *reg_save) --{ -- volatile struct hisi_sas_dq_info *dqe = (volatile struct hisi_sas_dq_info *)(reg_save); -- -- printf("The dqe dw0 information as below:\n"); -- printf("abort_flag: %u\n", dqe->dw0.abort_flag); -- printf("abort_devtype: %u\n", dqe->dw0.abort_devtype); -- printf("Rsponse_report: %u\n", dqe->dw0.Rsponse_report); -- printf("TLR_Ctrl: %u\n", dqe->dw0.TLR_Ctrl); -- printf("Phy_ID: %u\n", dqe->dw0.Phy_ID); -- printf("Force_Phy: %u\n", dqe->dw0.Force_Phy); -- printf("PORT: 0x%x\n", dqe->dw0.PORT); -- printf("PRI: %u\n", dqe->dw0.PRI); -- printf("CMD: %u\n", dqe->dw0.CMD); -- -- printf("The dqe dw1 information as below:\n"); -- printf("Non_Busy_Constraint: %u\n", dqe->dw1.Non_Busy_Constraint); -- printf("SSP_Pass_Through: %u\n", dqe->dw1.SSP_Pass_Through); -- printf("DIR: %u\n", dqe->dw1.DIR); -- printf("Reset: %u\n", dqe->dw1.Reset); -- printf("PIR_Present: %u\n", dqe->dw1.PIR_Present); -- printf("Enable_Transport_Layer_Retry: %u\n", dqe->dw1.Enable_Transport_Layer_Retry); -- printf("Verify_Data_Transfer_Length: 0x%x\n", dqe->dw1.Verify_Data_Transfer_Length); -- printf("Frame_Type: %u\n", dqe->dw1.Frame_Type); -- printf("Device_ID: %u\n", dqe->dw1.Device_ID); -- -- printf("The dqe dw2 information as below:\n"); -- printf("Command_Frame_Length: %u\n", dqe->dw2.Command_Frame_Length); -- printf("Leave_Affiliation_Open: %u\n", dqe->dw2.Leave_Affiliation_Open); -- printf("Ncq_Tag: %u\n", dqe->dw2.Ncq_Tag); -- printf("Max_Response_Frame_Length: %u\n", dqe->dw2.Max_Response_Frame_Length); -- printf("Sg_Mode: %u\n", dqe->dw2.Sg_Mode); -- printf("First_Burst: %u\n", dqe->dw2.First_Burst); -- -- printf("Initiator_Port_Transfer_Tag: %u\n", dqe->Initiator_Port_Transfer_Tag); -- printf("Target_Port_Transfer_Tag: %u\n", dqe->Target_Port_Transfer_Tag); -- printf("Data_Transfer_Length: %u\n", dqe->Data_Transfer_Length); -- printf("First_Burst_Num: %u\n", dqe->First_Burst_Num); -- printf("DIF_PRD_Table_Length: %u\n", dqe->DIF_PRD_Table_Length); -- printf("PRD_Table_Length: %u\n", dqe->PRD_Table_Length); -- -- printf("The dqe dw7 information as below:\n"); -- printf("Double_Mode: %u\n", dqe->dw7.Double_Mode); -- printf("Abort_IPTT: %u\n", dqe->dw7.Abort_IPTT); --} -- --int sas_dqe(const struct tool_sas_cmd *cmd) --{ -- int ret; -- uint32_t reg_num = 0; -- uint32_t reg_save[RESP_MAX_NUM] = { 0 }; -- -- if (cmd == NULL) -- return -ENOSPC; -- -- ret = sas_get_dqe(cmd, reg_save, ®_num); -- if (ret) -- return ret; -- -- if (reg_num < REG_NUM_DQE_MAX) { -- printf("SAS dqe is failed\n"); -- return -EINVAL; -- } -- print_dqe_info(reg_save); -- return 0; --} -diff --git a/sas/sas_func/sas_read_dqe.h b/sas/sas_func/sas_read_dqe.h -deleted file mode 100644 -index 95e1ff3..0000000 ---- a/sas/sas_func/sas_read_dqe.h -+++ /dev/null -@@ -1,85 +0,0 @@ --/* -- * Copyright (c) 2022 Hisilicon Technologies Co., Ltd. -- * Hikptool is licensed under Mulan PSL v2. -- * You can use this software according to the terms and conditions of the Mulan PSL v2. -- * You may obtain a copy of Mulan PSL v2 at: -- * http://license.coscl.org.cn/MulanPSL2 -- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -- * -- * See the Mulan PSL v2 for more details. -- */ -- --#ifndef SAS_DQE_H --#define SAS_DQE_H -- --#include "sas_tools_include.h" -- --struct sas_dqe_req_para { -- uint32_t chip_id; -- uint32_t die_id; -- uint32_t que_id; -- uint32_t dqe_id; --}; -- --struct hikp_sas_dqe_dw0 { -- uint32_t abort_flag : 2; -- uint32_t abort_devtype : 1; -- uint32_t Rsvd0 : 2; -- uint32_t Rsponse_report : 1; -- uint32_t TLR_Ctrl : 2; -- uint32_t Phy_ID : 9; -- uint32_t Force_Phy : 1; -- uint32_t PORT : 4; -- uint32_t Rsvd1 : 5; -- uint32_t PRI : 1; -- uint32_t Rsvd5 : 1; -- uint32_t CMD : 3; --}; -- --struct hikp_sas_dqe_dw1 { -- uint32_t Rsvd2 : 3; -- uint32_t Non_Busy_Constraint : 1; -- uint32_t SSP_Pass_Through : 1; -- uint32_t DIR : 2; -- uint32_t Reset : 1; -- uint32_t PIR_Present : 1; -- uint32_t Enable_Transport_Layer_Retry : 1; -- uint32_t Verify_Data_Transfer_Length : 1; -- uint32_t Frame_Type : 5; -- uint32_t Device_ID : 16; --}; -- --struct hikp_sas_dqe_dw2 { -- uint32_t Command_Frame_Length : 9; -- uint32_t Leave_Affiliation_Open : 1; -- uint32_t Ncq_Tag : 5; -- uint32_t Max_Response_Frame_Length : 9; -- uint32_t Sg_Mode : 2; -- uint32_t First_Burst : 1; -- uint32_t Rsvd3 : 5; --}; -- --struct hikp_sas_dqe_dw7 { -- uint32_t Rsvd4 : 15; -- uint32_t Double_Mode : 1; -- uint32_t Abort_IPTT : 16; --}; -- --struct hisi_sas_dq_info { -- struct hikp_sas_dqe_dw0 dw0; -- struct hikp_sas_dqe_dw1 dw1; -- struct hikp_sas_dqe_dw2 dw2; -- uint32_t Initiator_Port_Transfer_Tag : 16; -- uint32_t Target_Port_Transfer_Tag : 16; -- uint32_t Data_Transfer_Length; -- uint32_t First_Burst_Num; -- uint32_t DIF_PRD_Table_Length : 16; -- uint32_t PRD_Table_Length : 16; -- struct hikp_sas_dqe_dw7 dw7; --}; -- --int sas_dqe(const struct tool_sas_cmd *cmd); -- --#endif /* SAS_DQE_H */ -diff --git a/sas/user_cmd/cmd_code/sas_cmd_dqe.c b/sas/user_cmd/cmd_code/sas_cmd_dqe.c -deleted file mode 100644 -index b914f54..0000000 ---- a/sas/user_cmd/cmd_code/sas_cmd_dqe.c -+++ /dev/null -@@ -1,106 +0,0 @@ --/* -- * Copyright (c) 2022 Hisilicon Technologies Co., Ltd. -- * Hikptool is licensed under Mulan PSL v2. -- * You can use this software according to the terms and conditions of the Mulan PSL v2. -- * You may obtain a copy of Mulan PSL v2 at: -- * http://license.coscl.org.cn/MulanPSL2 -- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -- * -- * See the Mulan PSL v2 for more details. -- */ -- --#include --#include "tool_cmd.h" --#include "sas_common.h" --#include "sas_tools_include.h" --#include "sas_read_dqe.h" -- --static int sas_dqe_help(struct major_cmd_ctrl *self, const char *argv) --{ -- HIKP_SET_USED(argv); -- -- printf("\n Usage: %s\n", self->cmd_ptr->name); -- printf("\n %s\n", self->cmd_ptr->help_info); -- printf(" %s, %-25s %s\n", "-c", "--chipid", "please input chip id[x] first\n"); -- printf(" %s, %-25s %s\n", "-d", "--dieid", "please input die id[x] first\n"); -- printf(" %s, %-25s %s\n", "-q", "--queue", "please input queue id[x] first\n"); -- printf("\n Options:\n\n"); -- printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit\n"); -- printf(" %s, %-25s %s\n", "-i", "--info", "display the dqe detail information\n"); -- printf("\n"); -- -- return 0; --} -- --static int sas_dqe_info(struct major_cmd_ctrl *self, const char *argv) --{ -- int ret; -- -- (void)sas_set_cmd_type(DQE_INFO); -- ret = sas_set_dqe_id(self, argv); -- return ret; --} -- --static int sas_set_queue_id(struct major_cmd_ctrl *self, const char *argv) --{ -- int ret; -- -- ret = sas_set_que_id(self, argv); -- if (ret || sas_get_que_id() >= SAS_QUEUE_NUM) { -- snprintf(self->err_str, sizeof(self->err_str), "Invalid queue id."); -- self->err_no = ret; -- return -EINVAL; -- } -- -- return 0; --} -- --static int sas_dqe_excute_funs_call(uint32_t cmd_type) --{ -- if ((cmd_type != SAS_UNKNOW_CMD) && (sas_get_que_id() != (-1))) -- return sas_dqe(sas_get_cmd_p()); -- -- return -EINVAL; --} -- --static void sas_dqe_execute(struct major_cmd_ctrl *self) --{ -- int ret, cmd; -- const char *suc_msg[] = { -- "sas_dqe_info success.", -- }; -- const char *err_msg[] = { -- "sas_dqe_info error.", -- "sas_dqe failed, unknown type", -- }; -- -- cmd = sas_get_cmd_type(); -- ret = sas_dqe_excute_funs_call(cmd); -- (void)sas_set_cmd_type(SAS_UNKNOW_CMD); -- if (ret == 0) { -- printf("%s\n", suc_msg[cmd]); -- } else { -- if (cmd == SAS_UNKNOW_CMD) -- cmd = DQE_UNKNOWN_TYPE; -- snprintf(self->err_str, sizeof(self->err_str), "%s\n", err_msg[cmd]); -- self->err_no = ret; -- } --} -- --static void cmd_sas_dqe_init(void) --{ -- struct major_cmd_ctrl *major_cmd = get_major_cmd(); -- -- major_cmd->option_count = 0; -- major_cmd->execute = sas_dqe_execute; -- -- cmd_option_register("-c", "--chipid", true, sas_set_chip_id); -- cmd_option_register("-d", "--dieid", true, sas_set_die_id); -- cmd_option_register("-h", "--help", false, sas_dqe_help); -- cmd_option_register("-q", "--queue", true, sas_set_queue_id); -- cmd_option_register("-i", "--info", true, sas_dqe_info); --} -- --HIKP_CMD_DECLARE("sas_dqe", "sas dqe information ", cmd_sas_dqe_init); --- -2.45.0.windows.1 - diff --git a/0118-hikptool-Modify-the-version-number-of-the-SO-dynamic.patch b/0118-hikptool-Modify-the-version-number-of-the-SO-dynamic.patch deleted file mode 100644 index 5907ab6..0000000 --- a/0118-hikptool-Modify-the-version-number-of-the-SO-dynamic.patch +++ /dev/null @@ -1,30 +0,0 @@ -From bcba3ee468a1e0932734c8e617fe69ecf21fea74 Mon Sep 17 00:00:00 2001 -From: veega2022 -Date: Wed, 8 Oct 2025 11:38:38 +0800 -Subject: [PATCH 6/6] hikptool: Modify the version number of the SO dynamic - library. - -Ensure that the version number of the tool -matches the version number of the.so file. - -libhikptdev.so.1.0.0 --> libhikptdev.so.1.1.5 - -Signed-off-by: veega2022 ---- - libhikptdev/src/rciep/CMakeLists.txt | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/libhikptdev/src/rciep/CMakeLists.txt b/libhikptdev/src/rciep/CMakeLists.txt -index e3f96c0..057b8f5 100644 ---- a/libhikptdev/src/rciep/CMakeLists.txt -+++ b/libhikptdev/src/rciep/CMakeLists.txt -@@ -23,5 +23,5 @@ target_include_directories(KPTDEV_SO PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../in - - target_link_options(KPTDEV_SO PRIVATE -Wl,-z,relro,-z,now -Wl,-z,noexecstack -fPIE -pie -s) - --set_target_properties(KPTDEV_SO PROPERTIES OUTPUT_NAME ${KPTDEV_SO_NAME} SOVERSION 1 VERSION 1.0.0) -+set_target_properties(KPTDEV_SO PROPERTIES OUTPUT_NAME ${KPTDEV_SO_NAME} SOVERSION 1 VERSION 1.1.5) - install(TARGETS KPTDEV_SO LIBRARY DESTINATION lib OPTIONAL) --- -2.45.0.windows.1 - diff --git a/hikptool-1.1.5.tar.gz b/hikptool-1.1.5.tar.gz deleted file mode 100644 index ebab670a840ed75d87d6918267b90cfc82b98b25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1534781 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
    LOJpOm39*RTCD0`^A1akNs-U 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 z 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≦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≀Rb0|XG@SPSIS6xgPMDX`8FZGlzoAuC#Vu@EYA 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

    ~w4PJ+-_MA-* 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

    a<#u8sdn1hV7_#_~#iyk>$USeA@V;_s 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

    (xR#uG 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 z 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ɮ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

    YaIKEiKA^_ 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%0DV_7Vs`745h3hDnjFo7Z+Gqx2^-Y6 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%0Am*fQG15(6~vcx~>>)i@7!p`ra$(TI_Fb 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∋pk31ydN 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%0A!;P!`TamHcp)g0eLTD(F+cA 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

    -o{=${qn?1d)?aG} zph>-#E6L5-cSXOC^cX?iNwJwGIH%hXZeUE$;h1m+Urfph;k;!YyYWN9EBYwC!d_mR3F z$^O>4*>a9|2hxarS+RF~)f0vv$jf4c|G+BtN5)gzl2%SAZnUMi*HvctT6ex}cON+se+ zp7Jn`k~)BX!(Dllvk*Ma`d|CQ79IQMz!=h{85kzuXD?y1-h7U9MUHUEfU;?A#|Io- z*FPi%lJ;2@3;{-;MW(6qhH(Z7&k4Xim)7H zc`)6oKx(OOO`EOO&_n_Jj?`FS+JR>Sjm@8ZrYY5~I6i&8KBvUv^u@!ckiLI@;JC+3 zRHZ9CD@3D+NS4l5l{Lhqx9#$Apm(a=opORQ#M+F7XHXcqwfHS@19hWeG^R zCWhH>x4GI)j*ROHwJ!Vhnw@va2Hky3Pc=mE}xNWFl&N)0sbZyOo$54lF3iAq^ zTa?}$czQ4rz8>e06|HiTzLXDT&Axg)8nU|z=B`^f90=n0ms(1r*J z6K4*1IjCpKswswYEn7=8RAtc#G)z!;9?@v+{P{o|G>t`Vq8{dP(tdy@Ob)f3@Z-=px6$dTbTjztVJN>x0*o=!G2W zOoKErTQB)-4BWkMfntEp0mv;QM~Q~`s8^X2@{vRqMOsWJZAwI{o4|bIP>v;WS`^?< z<(*2}o4HCE62JxpSk*wt8M;uKkc`3)XCsX8n37hez-v#*?HE&8Wu#7FETcRCX;?e)>fIV&gSS z`Fk6ZMxt1`EBaHFWk1-{b!aOa->R*$LWc4mga`EqH%axPl_@F+0Ef${e;Nbc#1a*w zFey7ddJbm3KnMMf%Q)Dlo{0A(;^Uj4HS7R)_Z*;8l!h}T}DP*~>*C8rLO$2>TIeWXayzPH`UK2f5FuPf=|F)lRxR4r+e z4}_9H|L3n;Kn=gB%Dr{jkVTQl{S3)#l)FSsB{WPSSLv;+c&NuaDp;grx~y(AT%ti7 zi|7f)HA-P2D3@q@|dIQ0~dTMEasi zw$BmxX?H{*9n_Hj(-nY_M#mK&a(O=4Vuq-Vn)(795KH?LpK{FJ ztl|qTswU%6FA);;4;U#~j{aQ&tLU+*JNeqB#~0w{6ip;*l~dvro0VY~6A4~p5t-1@ zPl*Q%;FT)dFQu=_Im@qZ?$A^#g+!mdK7Bimi%=>cBo2}Vts^}0DmE9>GP-AvLYPLQ zR?7|%91mFx$bsNF>A`iN*)p#1db?37O3@P{P6H`O(7O)wKLK!`J){3=fJwp`*AmeE z7jfI1?y=$lcmbVPZExE)5dK{MibMKk3tT&XiPxss2gQ2Buo}qQJ$LsUA0Ele@UjP&FwYM!MY7#-_$m4s##iGpERr%wlPJ$1 zV9_qi(|nt-5$L6nzKI>?LdAj*c40xKVjh+tv);JapUuMq?AcaONA zE#1(;bwG3ALi5pj0k@iO`F*&zf`z*Z0KJLk1eW20YogyHe6k$9FESeFVh}JMJYx6= z6R>P=X&HJSEN8x4>6UW`x0u6m16W$N6(CvQ;-Aht%P|SUhHW^3OlBKozCa@F)>>M@ zqsV4j0hstx15YD?HD4_?0^W*vu5XB)5Hzc=CcILj-wNKD~ zYq>t1ySCj0rwEeyZP$E_=HNlMwJtD2z}Ec0AYJ4aL@ejCwzPC=yZUNrh*f+wkDq?; z?~fe?3bt(&zz%Q;G3J3>Xz=LCXi)|JN+)AV9;iWxOQ;`cfsd($3JRzb*K05#g@QRQ zv9)D`3PDb2&`m1@QNUJOsmie)4D6&8(wri(TF)gxr(_{f*P})7{)|J1<%8maHJo7? ziPkyMoLpKoBUQVTM~7#mYWPk0m6TppkgOaBkET?&MpX&tri!Qnb}Fw!RSl)X>+GtC z(xpwIN+=t?=@(VG`Y5zoMpaG1-xe*_JZ?0bO(uDZsw;$l3#D7N-+ zygjL-*#=!24vrQTE7#n_>1fkvH`4c8xfz2W7Le#Gphr757CNr_`FPPsU5 z6^vI!hNE*>!V`OW_Z+4bgF~1UWnYfLaq^tREEdt&CnywS7Iy4^lF44t4 zQx7LQoHb$GKzNEJ;+j-=q0pzJd^%r6d7$EWbq;gR!<4Smr_KT5(q13p*2#*hLb{j9 zpLi=Z?Oc@4=MRgZmDk7dw4EvERGE5e#E}+_BX3Ey$B&oCTZaF8ZF>I#3aKIyvg;3c z0nJ@)a~n63{!IT0L|b+wnUrnW$!$5dwq%KpS&=BML^+#td{Y!TlqRM~hA)o2N$$7b z^K=6kU}h*$THo!dc4HFL02+;cM`QSC^Pbr>d*jLHX?AfrH|xC(v;BB`+q}tU*)Z#k zN2ZhZE=S|x_##VZfZVE^gL!|8-QHv$CiC%lXtJ3BY&x2yeX|(#)2TUJ47($9e0pF$ zZVT*B5lpa)AzG^HXhB) zcp%Rz$Gz%)HskYoHyfEQ`b_X`5Mf}t^XEj^|6R`Kljn~fS){jm<5_RGHJ)B<^+u0m z3Shp?9-TL>Q*(Osy7S}iNz>r-@yXHK)_!x}9JS4E+pO)LqIJ!@+C6QZ*3FNt&YPpN zjsf(^ZoAWJo|>cAfcwe(&}#43Ibsta%@fo7$MH$?6pv3#>+txX)!eU}R(tQ@Y`@k1 z-n_yX?W2x4XdSjXn5=VzukA*w{rUutn}^MIM+Q4=p6tEBM7ytA2d&Oe9PM?hV_xIm zU30v9(rN9T9qgW%PLWOzvA{orMQXNdl(b@ezd40+i+wH)B9(tB? z?gI2_6Y~eq>HN}fj)FEjZ|n|*aKr6nI{TQf2BWImqdFkpwy(J5f^ z)dFNP9nZ%R5L8R&C<2>hlN^FHX&vMFQ@gDsYzRQQ76FD&3-~@Q<2x%%qRbPns2@OZ zmNLZfSz(@McAfxP@LBS4l;tY|qa|ANo=tq$_OT}#D z*{TJ8tzs*HIJQ!dGFt(}Gm5g6LRPa?2(4^YfR5M-&>>qXXa!pVE@vx+DzOz{a<)>K zB3mhlXDbg>U@L%Gwo-@^TLHkbl>(I53II739OWAfJCtK4yJuB*bw1DqrPUZ$y0&J!Ml4FoJR} z0EoiQMw5l8Z8ytw0Uen2i@>(oLCt%~_~W#nq@xI-MY>3nX?lSrV2}O@lNP95Yq#t| zC*5iH%0LzNp||-F_UbX9t*MKFFCk2{rULH1*bc4-%&GC#_}4``{mii~@VXtZcZH_3 zO9yXrn*M4(!vNw>e5=UBp7#eZ#+&%3ZfLG)nt|U%8g%$L&iZDP#5Ug7_^T`8VqzcUUm}p(IKkWR-0TvXGuSv?eZIDwveo^RvbXK! zs8G@G-e3CZARDEo-P%iD?+}<8lhDY`1*f=jDxplpMA9Bk6B5f$~%De81(ti zBTO4U=Zi|NS3qevH58PrrHo`0>`` zXnrM1KA?{KuF+pSYT!Rt6XQ(Bdyt_BXVEYMIOrS1YkdjtX?eCPI)noY!X=HsgXGkl2GA{@T`?_Op#GyMJ8XXsl9zy}~ixE4B>_9J_O1?m6L-ctA zhL*`!!qLL6j;8H^B!^<^CIfPF$$V5{Tjay`cn;wZ@^k43MW;;I{Fcox$BVi7Iw0fM z%EtF<(-cZ^WFEuO@KLf4ti5UjKPB^C_ex`ATIqEU#EAK-`zblk<|42D0UP=7{PR4W zAqKBS4RBZ9w0<~F_FHe06KL}N$cC2M<@HI(n1;( z$Bn-uNhR~-eTa))cLW;JpxQPPKk|>$Vb&FMQn6`22pwVvj6HjU3r%3)1JJh44pie+ zclIHHyNO0my)1|Lg$Oe@vz~!!kH0feZ_b!Pb${PvG61a)A8yd^tz`qVZZT=>fD^{O zEtMs51kxvqt9KdF8yISXejBvzJR2?GYvP;3^QC#&?1INudDy8MJN%$PMD$Jj^eJ5jWJD6=*_z2w zJL#MqA2iM1%$j5!*35HbQ#GQ}g84G!Hl_&^B-!NSx5;lvHNx$FZXSQS|49(`lU73( z&{rTNR1h7kG+qg`Fd$@eMf|EED~BshTD4vsuLOz#u_NRnPnnyy|(wz2TlJ=+MwDq6O^@}7=a-i7m1 z<9!)wRRVb48aF|q31x%7#uh5B%3>f!r+=oX2a*B>(G|HAxUHcvmTHFO{RcdC} zg9qD4fqO^yWSD+T zhcZOnY=1zK9x&%?^x})7JgFFE8>7sB8%Lu&aif?C0(Kd{a=d45yzT3;ddBepQ;n5h zTQEu$RnwaaL?{?5^i{is7QzTE!ax5w}l3-C2k)%j3!8_DGOK>0v zRg6V1ihg3xUpPxW11sBBnB9h$P46~PQG?A?1vqoDDRI*$m)wY(KhyNM^qA;3n-vo0 z)|2d833X1vz~8O_{mer@TLLX-F5C>F`&8A-(`{Hodp;xnjy8Y$j7Ad1I%uO6%t*dR zI333svKMI{x-;?=ig>@y@Q5GT+8NRxIR5|k*{f{6#e?ONglnJ{285or8WHG`u8jht z$Z$jBAMAi2`v-LDx^O)gu(7_muG@fkB-=3mW$gFQ@_l2&ym-Oj%7%*Zz>qY*QW-m& zjlQ0nf2PxM-CU(zR3>0updITLcmS%N>CAlW4zs>4RQOzoXoD_gJdQj=c;34->xGrl zDHdpa3uO1C*padJ_1fP*bS?61A2e6Q4h)gEdKg*qq^624EBUyWlKL( zW!BE8Y4-y@1cY(NY%yhm)-OZ_A4YC^%VIV+uE#ArTXgu9kEh)e-M*?mg(o>h^VQp*7!O#|??5ef>s7d$}0KifD37^1#PzC4M(Jmljw9$)1aIWoa<)tBQz zSEm({<^BRQ5VdfzVwj*%d{tP~1EoUjA?YEeG^Nt-*s!F`X2~S7YQ;_E34Br6^`p1; z!cp0&=^Dyoirvv_v+}5{N+Yp>yu>cCA*NoELNs&~0#Mnw2G6u)yJZxEY~_V$<>>>G zjmDz}_!ebsZYj(N$1Ty~u3>0$p17~%WuPX`Sh$;i=0P@C9mD3aSj@?Yu{DB#FBQiR z_UJ%Qvyg^BIR#FqYzPq-30P1@9N`gy3W5}}xKK}yT0|tg_7cl69t>tFj~5ED35Wbt z-TWEN97M)fQ7)WN$gza;1%ICZkbZUvh+s||HpoQy%r!Q4rxcd)11PC&*bhIT1UMUePrzOzAtXjn4fW@*DtOg#HXHvkdmdER1y!fDEG~Hlz ziSevqE|(cimDa= zp6M#zU7+j^`o@epvS{eI7l+NxZnD4I*)1MLg^6)LQ=NgBKZDYlu&l~jTx94-7TpBU zn;8-tx=Y6ul(UHozNN*HxSTI3ja8j10qGo*Sq21BC5kkV-atvb z;~+_5_y)5h)q3N>x*rOj>hFPj$ZHrp=HqiiZI6nnY?$`HQj_VDgCG&q*HwDen|xk> z;0LRl2f_*Oe2c~OJ+m$jEvm-c1Q~t8x$WAB{aN({t&Bj%4JWpo{8%pa){ zBNfX?c~zm-)6)Zz>p$n$3amBISODvhkqZ_u_QH7JoF?7Al&{>z4RcpTtSO*`ptg8Z z|Bd}DJ9=`7T~aT{w}5C=)naK~BYgb=7?i0h3plbnEL#S|S6{8?9Uh>NB|&a--RhX# z{bc{-=s0;L1r~}EYT>kyd4xyfBXPZrF%wUFZs>C01L3l^gU;>-#rE z7#Jd`c>;eNiT0W(M6QvTVz3u4Ubs{3<21Ept9M+dS zI3*8(h1@!AvG)o@Y~!BJX{YISA*7%kghvp5Twd|<72_EGriHlLQ&5I8@eCzeglpsi za`e@ykrMQH36Jf-T%IV%ZmDM|yac~aazmnF@`y*c zXiK*n18u7d3McByuRhGKaPw6}Edj9~a+gB%wm9W>SdlW-eSpaim^eO;kG)pJc~Z^< zjERy{^G8|X=f2D6=lQN!mv`O1I7?E|BnL9$x7eXY%yV-Y*)`$-uSpjofVm)V(V$R( zLuY9pZI5vGHtkJNipOtEWx%EPW?)MgtJE)>qIl2zox+3qVjkopNuu*^VV{eGSd&y7 zW=}6pltxgyP#h%Crr{de(5NVY!W|q&&M_+S{hZ=}R)z7NP7$*cP_l%Ug)a^hNLqos zs1iWI8|d*IC6f44dg4K&2uAwb~dUzma6CPSL9Fayjyzq4Hm< zyxo8?i1m=8qFKEjY_VfEDdJK5LyTN7=b{&Sz=XO&2=VgQ_x^WB7~eyxn|+%g&0 z1&CwS4`c=J0)RX`b>W(qTYBENh=?PcF&9xs+!fQxlVZa>q$#pM+#y8s8whJ6inuU` zT8dr;%!^bJg9uK%e1UIY6xU4a3}qfIc(LV{6&sF=8Tqy$W4ajEbyp|k1+>hu;T>MgHfpA7Y`JyC_(AYtXz)>S=3*rr$ zP#)uJc;=|}^L&4b^xD+)$Eg$uAk{j^E^y;WDg$I0ti;DRy!s%^qhOoKB09`#<*CFd zcg+5p97M>-v-qI49w?%pEyiHLq|r9gIr8QNzMH`v)nFmmRw?4iTeU_()PBVE0tWAV z#X6e`%zgAG)KfgY6!`Tylg%|o+hP+1%MXg2va>~0tEf8*YBt@66;+-E$2Q$r>DeK) zHqC5GiJBcxV#AF4==dp+K8GoFuvR!%h#U#$`hvYa!QHsb=9D^1MW3v&f@ep~RTkcX zAvYQI;%Qz|DR@%Fm3zpe!o2`<|LFpgqnJd?`vgWr2^W!AmDkvT5G`bsansKHJ}#Fi`2eacKMo@7vx5V=IW}$HXts_x6BbjUT+z6>VLL;MV!<4icv26}Cfdep zz*|fVoew_<&mbjesi(S8(v!`TlcN)N58yQtfPBY`yrJbB7gIiP*XHoy>g+mz`lQ`L zF=btKnEl490UBVr8R}*^9->2(oLFc3?d}0kuU+6}3kEkH@Hx*n%HI2tgg4wzKPza^YB?zzv zD24OZ!8A=B8s|iQH}`>_rTGGJ1e3M74(&NZI+8KRI?E* z8;ESI0E>vCmCJSl$eV@2DwMd0Qoz|wz7;(HCi!>LI)rq5s(T<+nS5`RI#}ry-u}e% zhCr|IYzl9UqM+Jl?9w^344j_}lnmnH6*{9R^+`~W>bDMAeEa!@j^TvewLi2M?i_V1 zw~jJ%yDgHmg8H-6NIVSos)kGVsU`%DJo;)BpT|2}v9)?bt5P+uw6~ESpx;_6?i!AA z{RYR|CSLAs^a$O;n_l&BqZV=UDsuCGszVC828*!~tLS6!dl>*>u`C)7iMME=PtexE677HEz~bj7U8x-aGd=JLVnOkG7;$Q^q`Q3x`Mql^23^=Fewzm|Lq7o z4$!U%wsX}{X$zG0p}Mz5Lai*XQG%b`;)AdNwg;NL@gz8SQMaKQCT`V(n%^#QT5HzX z?S*D_+=+elonpcDy)uPg7G+;qSEt8+u`jidH?c2KWR4fq!Scta_Sek_{pW?l@lv?g zh%;R*LA3PkHMD-tffi2#x-`(cO3{b;z{T`|)xlK2xs(-5>g^S;aIfhOXqOZP&`Z2w zD9o4lKGig6r0Jn36AP7jg~jy@VK(jIItJ z2n3R7i>rb;Z|6zcz|(00Mkcz88rHcT)#5g*PXC{Il7W(UVYY6tPXh!H;8+Xf(-hdI zf+?`h5p980?I9~#c(D*Fa|I{#->BK$+Df|JJy@#UEkI*OXeR-z72+kn^#6bTX_q8# zW%w5~C|MxR3A=%XRLK8QJeMm~2Mu$r8KL)Ht#ar)=~b)3oEGIcPI-M6GW-Yy(qpOEv_XA>NE0QqVznb}jaB#eNoEn@267DA^2VY&43y7F39fYQX`W zFIuXK9d73^+u8JrAU$ncz$u6aX=Q#lFQI-a)@ehbjh^N={gBuAdsxJKyDjk9C<(FN z1ARH8jBF2oB#~qxZ6H{2AVvi#kp9+Aa4<&hkrWBzi_+q3epOC{mZwc*Q4*n`-VpCu zmX}n^#ys)wKCv9yXts|In}?W`XF|3S;&2mBIc-tqDyJXaxyMq@s@nXlP;2kWg;y!jQo?|P`!bGx<_x7%!-9pnq_-8CodUNwP@nf$Sd|H!q) zBd0^5TFoZD<6kEe?gIL9)qoSkSPeMk03{yiY2T`+_tzk8aixgF2O0JO#=W+xz_I}J zsuR*>B?$g#!;gH69YnfM${Hqq_j#j@tpf8*S}_ zzPXVvq|EO&KzOnKa9@St1NCp$qFIZX+ecqU=JPEGFJ*hImb57pDs`ag-=~0mzY$MY zWw{!rPNt|-Jg&Ae$M$ykT5akQ&d|O2`HWY1cCz?1!ZvcvRxj#C<*G3*{Sj_(g(35Plh)M z^2o?Mcp&I`Xj@9fw=40ZeU~3Vm%hu-7SvRnO&sCYu356`!fQ9Maz`ng9bJC%8HzS zTz)gI%qBE(JJn3eCk%0@o3lz|477fxzI2rl{75~DXKgwJo3mBA%-cb+0R0x$bC+L8?Jn2WC=I00Nx7$Lq_V%?D6`Ii)Z_l^y z(Ui=^SFG1Ysi(XIo19Rjyj52r06I`j#q8#mAO`_FHd1B_omL17lJ0zcx4f!b>WO6X zTk#{_W1YWDTDBvVvko~Hy!&df3wLv^@-244%i2yHn>~0yT~gK%*hQ-$qTG_W0Jqy$ zstCNYc9`;APFlhKb@2Y{ukjiK{Hg=VvvqgE*ljMa1FNi92bQg`d5cvM77dc%dPxPj zN^mqknm7SaFE*D5YS5jGlfJ*~a(r9-UA>Jyc|6qUr4L-BCXHeBrgDv)~T8yv)sxh|^QI2;~CnQTi z(^3pmh~0ILB~*wNdKHR=**Kc)V1-jz+{e1rY&UI4K$Uw8UZoZ(SfOpQ87f`Rk}-Yn zTV!j1rPhEJvNNGE1Hto5X}pKF9R6$TvwdwKFR-BA+fO zP$$&W*SRa2d&A^hW6=#lGh6etl8Ck|k^f8dM_Y(!9k)MpY7;({SkcigoSL(`cHTq? z5*xl0KOD$?HqG{aG=qD9e=!+`wbi$wf|g|Pis=(@jn%(ugO=Jc_g2!vPp%Y1j6d*c z)eC--Q-+q{ETQQ`P{E&Sf#B=ma%lTJe?$Y`ol)E^7X6_U>-}P%d8QXmfqhvi6sLG$ z1Kplt2;6JDHL-941qXnGXcfHuVT<5R)goAK7EDUUp(vqSM%!7un&HO^?m^M=!tyh< ztMo1o%1n!!LteNL-ckxg+renj59ZI)8gPt!R2K3c=~UtS-_G4D_`1SD2xra*i;-M> zRr4HfqiA~1a->)Z>0@p~Mtda$Z zfvGc@C$pY|xSf0u#=22v+JAw>v6KJ44sO0zD+*#xY+SJak{rW#Nz=JKKV+shnEcJPLw z1O`LF9}{hl>MZ;c${v1^yt%%nX;}{Delt#v(80UsTCQ%;6QIICYKAfjx|Z7~50*EXFFgX>j%j-qb;*1Td{5-gvPXTCNP&eqgg!1D>cX@`tl45} z(NUjR_Heo!S@tct0U7q(BU5W;d7#Xj!_fZKvd0cg(;2lrDQrfa;RF1D@ z^2ivTCRvz{XAPHA(;!F&nE>DUrNuq$QLne92-`$Qfe&l*=W)8`}$a!DWTxW>1YJ5L6ZRVM`Z0tgm%7qot zrF%~5O_=wzpcU8DV2*oV4Xp+9=5Bom>F3QW0&2Dv)ew!V4W}0kVaU9gJA0Fmy+N2> zHWqkGo88-1B_7A)>HL9NkjWhtj1rG(yvIV#S8gjT4u}d1MXX_=2o)A;SYc5OH5Q6c zVWEZ<7HU{wv1cw_-?KLe6&5q|k$KC-6oT}h>uw`AwooW6^o5W4u`q{s)RW-^fXV~` zqsNY^3%29Thg1jLrjH)GqfY>x1j$~`Zm0tzbmYFY1-;Pk0KZMAOz8nWG;BsalZ{Nz zJT@*bRxH>;0)Ol{+NVnw!e@`?Y_yy$N+Zh|XE~+reiAg46T|t^#=>2|ovsNudXU zC1BWWKB8oA#e z;lI=a)ikdRg(9LQ4Fcqj5}1pu2!!rkejKL(!catsxGgAji%OD{=tIvi`M%OEvXcZV`RyB%mYy)M$rB zSOUjy!C&Ciy)9x9!GRo)-UCjSFANi zMBs0w%g^V3ToXj^lZDzSz!N(lFpluVw$9QmE|DIfj~E)jVV(BnD+|C?bUg?PKt*~1 zmtlF`&7+W?Vt|_c871Vp+sgpRaD$+ucD>Jo9=={n(`wT6rYm=9EmCd}m@BnCT5eZW zDtxB9n0p=fJ_N6Np(-lC9{ZP$R9zkP#Fk+3 zKiSUDXCfiqwaZO;;|xmM#X9fm|B8Tr{YuwBlU)wOx{tK7AU=Wsn46;K_)V!rMeLlC4?=f_?&d?$;BMo*4UaXHM6lbKfi>a!83bgFJCaX3wucy zcn)Ybm@n<~tI=Riv#a@Ry0F+2tiwXE6GRoGm5gaC;SgT{$}nN#<9hwGAo9Z07xXky zejvM>eq||!;||ttlVf$e6G?SBjRG*>weoypg9vh>z;jl@>uwtLdZJtvc$BC(^%Md^ zhK_RMwNSKX8uRg_APgc!`%D}W$Ih!%#J5cZPoi>8*Z#^;bc9DcUov9#i6B}@I^zGW z`rCTVh|eiv@ygk`u}gTNGkQxsdjF)L^0vOS5iUo)dE6n<8ZuoBLypW#$)S*w?C2;? zb}+97QC(;YajZ0G3m!ofsOFEcC8q22IbOH0i~0b|_yVr79Ax+MLkOkO%SgVCG&+1Z2Sr0w@;tD1 z@_aDL4bC9wJ*mTdlTKMGcpEpSqe`~01SfL0Kv8E)ihTOw1ewAcCKYr-?sH)JpMTYf z(3q}PjW#u&xrvzb%Y4EAM04x2v13e0~f{@&cgo5YBHZz3vM)C(|nosSC}Hg zM3h?%150Dysv8;jcauNa$k)y_^a1?U8jz=1>B%DD3%k*^07$xpbz0rAJ!xj%G%UM0 zMVVjY!H>>pFtHZw6z25xmq1WS<%VWKLmDs~JJd_HYBm;J=Mt2<|A1ElBwFI=v^}2x)?5k zZ4jcUqN9B-)JD(39h*8GPUH?ZIIO<;TxW1Df8eR$Mr1Mp3=h7@kAxdvwV0K)IRiOw zCq*x=E)%!pN|zZdELfH`no8B@0$3@N%!yt0p1AB1H~LR7pD!4+ckfVckmsKu=63K2 zO|pnR(Bmz*1NWh%NaD_b8v>WY_ho1u`ij5Fnhfta(GX_7{8(7=NFd$_FI6HR0JiRL z5^;?U%x;MYSNkJkIai_}KiZ#Bd3pn+2ZKk^d)QQL^ZbhT$5j{)@VMisY?uYJHa*Jm zVFxjJIcg=5i7!^L)7KtWaWTSGR$J)M`5iiGKHD- zPQ{%*PZKb-gBIzF8{AI&+OB;T<~nGS@8CS^rw6|MTE>E>JAETX-!`QoXUXgyCT)7y zIr*y4s?pi-MAYdpKYsIrWEbMXsxQI3sBgOBO`t0JeSlezF$1C^Ub&t)ds@8qd2%); zH8PXQ+?_ByAb=?F+a$W{E?1@AAKws`d-yy3;;YkMuiMMU5ICAg=*s+f$AOsN%~kC0 zy6_;Z^bOD32=AqX3%|pBZ`?5O9ZsykZ?fwV`1^^){@?_taQf$&kPqA$Vh^(5Hz4eb zFfq@P_qE|P@8T?!{TJ!@{DOZ&L6xH<-R)$I>Cb4guL9B#HybnS=Tq}Ofzk0k7wTz& zlOxYpeU0SR{c={Rb;SqdvSW(xCR|Xj6`!5H)G6V3GDW8IU|QKV^%NU-ih$W-cC4G> z6N@!wV-YtGlV|0kJsq^kyq0iS+|T1MXOKepdEt;x8Pec{+NH;T+@qbLb&j7M@*-u#Nu?hCi-wNL~CR`-x? z-K#~KL`e#)(8)?2XKQV0m)HUAo%rvJO#^8u*N3*5Z|3{HnQ=V14&WMQdjHtU`>lm1 z{12EuolapXjcg>>3JSruN;mpm3WJ&B5k$5cyRxNx*jud|kOnYUC?hK9R3%zibxo-t z%_I0c^|^Pt1CF822(Vi$FuJy1%2q(hxo#_|?!jt=5EkvuK&dJ~`AS-;l>uFQ>@4rD zd<4C*rBqO2%^siXBL`60H_q^n&(_-go5|#0dd#)q%~-ehW3DD%0-aA?MX{tgpjQbrfchuCp}BiQ9zpkPEj2aXh11x3JT=kV@bv8{?8E zL2xB&+-MC;`Zi@Tov{U(v1M?DF{#997}FJRx=O(17EcFL!m>tg#@ovv5USgOlAP6o zGt+Gt-&M>$?gji8T=dK&%NVwqu=#qGj)Jc@Cv`hriC>CV$(*n_L1*w6JRSXH^8oIK zAaoke@-x9GIvd7)6yA%mZO848E?V)4?aQ`w9UP!dRWl3teG^=CQrTDTsnPs_$!ZX4 z&F7EL|G7C!YW8d^%F2=U3|8B+VVmZG;SdKjylYz@Hu7I_1CwiLMcF`A+7eu71WH@? z9{IP!v%2uut=5x2dx`$g%y%dKR{L$N!VfIVQ#KEa@Z!bm;Iw_SA9UWYw(b2pxr5i| zQ2R01^^chRJ+3gcmb7GZI9YG z5dI9mV#=y3K!HVjs!pPX6J4_1s6bE%*Q-=1N)rcs4R#tk+wQf!-+nV82_(Bcsrdl* zynE)Ev9J1V=);Xn9#X#BYv=|&xE@_!!yQ*V=7AL8vS2S{EO(qKlpGqc(BY8O?)axf zOBn-KfU-;|7D6UMmclZNeF5vu0`9MK+4nMo07;o*p!cYtWTe0NDFZ(UWEyg@11*t- zY?dAr_#y;!A9Bs5P#~k6_oUr}{{Zr%_PGEbbrRe~wFto1V+y$X_F5<7tE(dDVIWly z4`sR=2I4ArfstR6hI?miU}N99?`Dn(xL!N;3Och5QakW^wy`z_ytCXp zd+P#9JF}H*nH#WgQSLpwwN`V3ESe}{I$-{_cFYa39k7<`g=NkSuvRyV?c7?uf!Anb zWxKGjmX?doTpPEmfwj7IkZmr_m75z|n$FD~I-0$<7MA;-tle5J+~WTX)-%VoZnle= z1M97`wl^kKf@0V(DgvwLD3U20Bo-uOn95j@@Kw8g!9@^fA%j;+hg=T#(;6wo!Zm0Q z>PkN(Ox4Mm;AntoC;iSI5#$LTc)JuWciL^Gea!<`12AysQMd z&~R?V`<$`#p^Ly#y0r2!j64l}{4+{Y;nL$GlF+B$Ui(|SRk$s=Df{dte(D1*U;^J@ z1V3I@Qo$kg_RJ@=7k`gL^2kUo#RK$<#mPeDMl5<1kD@M_1-wPhuE;anD*l_BK>w3MX+1}K31 zACyDP=LEXVYEqVaRpcn-g}(MtCkFs!ys2`8M-N2@(?Yi4o(h(`AH8g&>jJ*_l81Fz zs=fSDM`c<31_TpqC>?b>7mbgq3Ru-Veb8Xy7L!QXDAlP~n855R%5JVSm>!9k-43=F z>%bVWII&_i&4d5d3#1==A45-Mhq6G0i3a!F<>QzxF2G#Pp9nS=Jx2V0Nuye^uPn$k zD=TyG|CXso3~VUH;^@3@PmPYnygVNm)KZw81|ss*(+{#}kYFi~EvQldiK&7{47el( zIybcjYMfzTi6Z?J*kH=i)I*O|Pt~YBgOY#jjN#AsK=x=Aa+SpRTF74@M9iNV>?_x`_WAN~6~AbEt}__r71(P%g#|4$E-M+L+|THJ%bTEYgT^6NF& zv*445uPu-4-up2RvGpU5hg~W?0{*;_O5oQlou>bC=>dG}PuswZXQcLs$E5UW95pn93Y(I1e)%4|vC69B15OHZ_L@ z1yiu7rnD{Wq-=+eAeMHUz|6<6QJ*=aM-ZiyKW(FlM}#L0_J*AkT+kBEh5Uxbhk`dZ zZ}4qsb~{Dp@&?Hc36z6~p3%sAh71beJi%z{Kgn?6?yyF90c}%JZ`v>rer|rniN0(V zgN9romJ7LIE&$<^?}LTj!dy;qXcHfNRU^fi{}~SHrFaDj)fZVoq|% zlUZ>UW)a~3G)umcX*7i-hA@U+m?PSQ^DrlQAFfC-PgVtBb{573iE>D0n0Eu0B%by? zV}vPD2GMnzMLC8uAj@HvSo z!BH!f`|MA(=66(<2avJ%x2NC6uaeq^ZUrkn>7K!9$7;H+?Hzc=Ykhf8*Qc zVDi0{X0PA3d(wJ3!Zu#j?Q7Jp`yf@N_a1cheosOjGVa(<%C&co!KcTW{TK2R>cMi5h7Y@59mHXX~tYMuR?e`&8{-W3)=IyVurrgMP8b7lWHIVfConA6va^ z8k}R@dwOg2&l*gzhb6rc_1+Cfy=zR5$hsO{TD`LdS^d+?n=`BbhF*h4e=w#?>&hB~ z*?54*e$(ook1*Z4>h;Hx*i~m*;$-57t!bw)6v1$7V-NB3 z`P>OMN0Wzzh>OF%=S(Ki+Tb$q!K<*a$~d##IYz4)|LPP7v;&dYGyk@1#&>N$@E~+` zZ!b=q#CIu9qNSTqpr`DG6FGCblk4=u3H?EB`usB8;|B>TR@en0>^rbz!uC|m7Bx+B z?))o^x)uvCcCSnC2>s0G6izGCt%lETFS$ubJ4{c`W~ zBaEu}eXUuQ?csY= zE0BD0LhU*MKb1Jp5X$BOL14%Kw+Ox5E{xV;tefCI2tNjJY(@~Q+k*Zj9KpxvCZiRE z82-FhDM&VTRsulM2IKQZO92lt+qbKheP#Mlg3zc``VwOtcA>*V{Y^T@x_d_Acj=YH zUnWlCfVK9{ieAgxr^4a1!;AFSbQz1Nwze2PCk0>E8s`}tI+e>0{G@h}QEO1&I<>C` z2-0tQWBc^N8rlfP1N-y}L)qim&DD^NXO0AJDNScK3*917$$<}*+Rli|5J+_^NklOs zT^P+BjjEdAft6c8&6;$VM$4 zr3~C8PX=jDVuP+Uw6n@^sCrGaZ+3Wu_02Xaz*{mp$rONjFA~D+8SeMf~Musd0)ZATW&eF6aGYkl9~KgGhR;J+t;hvfq61 zLzem%9?HUrIL;;Jf+6^*EvACcUnRBQ_>uR}PgH&P;}2CjMxi{qDyC+`rv3L%$NTLg z^GMqGfhXY{Wqw1Q{&pGT^!kB;kUl8Al%7hRx;l4UMZf5dWrx91P%b5= zYBouXi`%@oU(^wkR?PtTg!05|zo5iJ)Yl6w|$SRMdr`MK| zYk%7RB+*oboe2f6{L@wM zffBMoz7#J_2`49H!kFBEfP!GFim*z$Dod-o0`$sz8gn^V66{Pt$g1H4Tge3mmXHHS zbA|upt>sm-L;GbO%p3KApcQsZzo85HmeEl<0M~9A&(G2a&O}pQ$z=)@g0K6_x~x}lrP>)Pd52U;0TVLt$U3bM zY0?~zSct-X-R;fvT72T*CSx|~aJtEgqYp31dovIuu}11b03U}HN{=P5`5md zMZ+k0AnE#)MubfgCO&KsagrqRZ3G5JF zc{5OD;30Ei0&47WnVCNXc`hmkeiI*D(V5GpM%Y6*d-}UFXQ^OpX-<>hBo~Ol-d_}r zAtUqPR!LM2{3cl*qazk%OXe&UjT0dw`y18t7#-zuZmB59q5mUEvTU6fM7dEG32#;V z)>fg`MlV*x=;Ce(fIB_R?3K68)XikWVk4`kYZYGrpOD@Pj**M&YEhl@0J1MPa#Zty zLwsRR8QCvT&0VuSXBMNSktv4@X?gKA_gQY_$e@v4t82U_4&8eXsYn<1`7-`c9Rn#| z6#}_{ovznCP+UGe2UmQ=WbP8?s`$B>$0Dg|Qq)en1)B_I>qxIJ@WQ66?mK&UYT4GA zec9{NGkPJz9UBLPW+JE=0h%584Huz0bxz1S?{}}Rt$%L2J;@fTKx>Hm?#RpBWRkZi zwE3Y7nuX{Q>i}*n*z8&TpS#>)fDyqya2F5ygw0M?AZ$vM9$u*IgA&stOa~05juQP zENt|t>}e2xCv{<3m&`Z|3Y)ki4RmO<*gjAygNz&a$I^n_Ik;lEW&!*2`+>|iwoJ`p zC`$T_vXy?&`cq?Is1(UD%+OZGe}%wcE>9fne`f z`+<4W>rf+XAY)IUet^dm6}Us_6V?tG>NrLo4X;ecce7)W?bHIK4t5vfJsPvN!zC*P z%v9Xg(FJPItWXGUYn>NmHohgBaQ^?^;ZqP`coYJY3SsH3HElrvN=EmoR&_%N zYQ&*s5`07tA`AcUA^nag)1GcB$k2}-gKjx+e*LRG2Hjzhfr(F>WggnvGu_ec#TCpP zw%9k-QICBNK`2$$YrzEpDg%SfbjGMLZBCl&opEb!pto|@{0;q=qX1t(puZXtVx#FN zn!bd#E0f&be8~3~7{}bn$Zgyui^f7uJ&c7lG_esr=W5Q9z`-vb#3$k6Vr*VZ~0WX&%YSV$Kgj53@O42G)#^2mG3cuAheXKhAp8^ zA+A#-_~bhxc?-@!2h1_Lp$=6fqHQi&%PYyYk_xeTo66*A;Fq|7s7O&b)mnxsFYyXH zGGV^Q$axLZ<3~*>5_f)#+e&TyR}Jz4 z*vPJYyoW`T^!P^(jDT`N>%VAVN5>2DZNyX%06FMU)^>Q0Y@hW`@mrloio@=2ALS(dk+u&zoF3wc{76y!NU?YB z!8wd{bzjTX+QK{j2MjI-1DHx9OUbo@Oz^eRrCv#45ZUd(%;sHZHkIEht91#|0AhtQ zB8NuhqK0`>G6iuugYBTj-s%Q8iW(!puF=5g!v0{j0LHnlbE#HfHL6f8>Wu-Wa=_zr zX{A;MbkXWw^}AvBpqG|O1q^K}+!fCv0A?>;zz=I}ZFSk}?St-eZFt$$^{UHNuRQ`I zA2^F_N>WIpN%q-K0>J-q5`7}$U<^?Reh8<2iqccK@l%p^;4{gl(INvxCw`cbAcbgx zxLf#0!g0rW3=k3|5PXS~AVqZoWFF5*Fzx^eN3+G4gnz>g`Us;8W@Jt>JS>ZF8@?yu zBtdmB55lZ6CnoX-GyC!-(jVQtu2EQi)e}XsCGER&MbNPCP_;0k-iqAm zerxr1nHUas$vFhEzga8B+vj(~ue%%zyyGJ$e3Mg`E0^NYl*GGg7%%2AT*F1DW#z!{ zL$M_3r*X@2|KcUdrouqb+kr4g&kH zw1ZZw>&CnR82-;h9&T{NV*l<12gvH7nI0PL&^G(;UEAueJL8F?ZC?n-?de)`^Q1T3 zETERvD`8>xdF80OrQ5YPD*2k#Sjbx(Hd-N{ckP)YLdlrUf)M_Mz6mCE#Z3}}gmu_yY*%qrv;lL>v$L{}$FUpy~nNxVb0HV$xcd(2D zcmcIoYj4{|7X2*$in}TtP_iVeZVNA**nncwF;TrB%T0r3LD1w#V#9|@Qck>W_P6i3 z!{KNsD{iw7BS6GEGxvG!W9GPhKyA8A*N<7aToq*bEjsC+oX|~}hf(OK3C)GSO42A@ zh9bw#UWbN7(Boq_;fHmRrV)iXVXsJX5zrXqh6XVdwy~(ML_ctJ~6*>Zs~S%J%2lx*@WNI+2kkZ z%D$q>mgv}@T9Cw}Z^$g4Q$R5unvynZ! zyn&#>YiH=p-!ZpqXHM7ne?Zg0Z0=m%4F@xt-p!_yTbm=nI@}5lf~fmwk!BR92uL8{ z$|&c}#|H=Bgoz(*0zt3xA_&vo>Y_%<5V#%MV}2aRUhfK>dP$?Lkppx9X64BaHd}8m{G?Oa@wQ~_IIt=B!Ab;g$)b_IFL+jx8 zgT@-(D;8GseL{4XdrNUfhdKVePnsR#bKMJOzb>-wMdHPxL(OhTuW(3Y3(pr9*w}hm z=c6#bp9w4JhRGr|PZ3SlGRe-~Cp!$8*kkHa|hj|aKmf(Y&$}3x5NeVJNRIPm3Umvru5N_ZVo?E2uB8-H!LHz#i z0`5%h5PyDmg6~Kq4E1jUu?Q1EH_ne!ckEocqf>V{dE?HUH#hS}|NHOz2aSpa^F!(t zt6wHlx#`*&+U|5Pzi~%{pNIDNAMmnD$@(GAkzcS!o*EBEw!5>NJq4vo{r#kX!OWc6 zi#2$T?}kHApgI9E3OS%JMItf}7E8@oh^2pZXjfhbO;jfPCdtEPf|gijeXALt%6#Am zgFn4OT(@zkNz{?H)LHEl9c@iPq@`Ecomb9GI;we?Bh*^S3Rjg>i6(i-p3NpWg03>R zntmocSp?-t;tLIsSj?Mx(88rDM^2CYoQ>4UJ8*}EFEaOvJfx)up`$r{+w z`U9vRkF;ZWXBmkS^G~&8E?g#AGr{SfWym{B6o-MVn+9XK#PYS~l2YofL4XJ^+4*n`mgMAK`y6$G(_T0jc(j1tU_5vf%7fUW^_t6J#dR3*A z&5%141FYRvzlhq<-oW!1by; z+T)IZblvuDRakieUfS-9QdH+Kz~)jjENUCVBrL2KTS*;~o||Amdt=Yt>$kGHU=*9U zmm?4r;p%QQWtUdggSTesMG#o$DFu{xQ{}tTPIdtm1<4`HG2*0I?5Vb5RU#nn3k{89 zvjBN-tQX9oe!J!|p}RqnNL&mT)zg58UzH2qYEc%2M6xHRo4y`h-x-e1`MC zR0VNP@}zi!x$-_-E|DI^3O6jA&ID@CJ%e2CG3z%hK=~g3G~iCxSf;ph@#KEDPT>qHlsTfuE?E9-UbE18Mwd0rD7Q5ujr7&}mPucMkz((YteM+vFDr$r5&zp{ z|JuYZt*hV$?>rrvROmRIyY1!AGP~xgzl4Xj^2+|ryLjV@WV#nqUrpqHncvporloVd zqq-UUN+-}Wxvr3{QL(K+dr1FZVDs4H#;4{`@#GRMVW=^SSvAt2MJ#Yz+4hlI6pTe# z%qrtRSM5nNHH|d+nGrPU3JNAE{^Ka zDPMo2BC1V5N;&GwL7c(EL!c=OHljV4j-YeE%xH%-L;hM9q%OBBJ!!Cw^|&6L*EV3C zpQ)@6PW|>J;VlH$ZDX1N>F7v#MLwT!{gt=!S_s&uvV?|D{9U=5jxcN*2rK6#H7S{1 z0EenfLOVHum~JbT`O2$%S)Q8+RKf3}vXdWfWb2goF*M6iCVAOaDxFKx{@8Kw>e1^y zaqXY_URtNiA99ZV_@fpdzPrgwZQ~x^`%q%WbcdM?<*kbQr+!7KEa}vp&xXnVS*?Sh z`=!a=Y@B>G-DV!2YzBJk{!NOB$#@yBDc^p>zFogUPNecE+kQ%2aj7UiKI3rubxHi5FIpS-Wp}3opts z@at^hGt7!#^*9RqdF(#n0iSqK-N#2gbVs%=GZ|ao{)V$CGcmd5>S##S)5`HFsMTc8TQ8Eu%$?k(}v5Jx)31wbIQi;8`3k3s1 z5)lb-aVYXS-rv4o&tPzoloLN}t*a7YX8M}Grn}iasnZEv1>4V|w_L^4bdKrl^z4l8 zyvSR7PTH7SF(WQXN)nwGiNj# z-^_pQPYuHNWIF!Eyf&_BJfi-H8vPk|8+6&9nX?xCYR>P*_j3aDv_G1g#*D@{fO|)8 z%+Ym=DH;GVrewUGOpO_ir(_N%1Jk%}kvX~=++UlcTe<{|(RfY+b7;=NY(BFkj4vhMj=D?i4V`?|%oNn;9Pm}(1ZeHCF`cs(@7-Oixwq7`RNR6Ckd@j>j%qo3!72$ z$#Mc$9M`|pYbg=t9Y$Nl|AfC>JGLRo=zcJGm4Rh)hT>m@|1^}8SJRT}WO+gXiS$R6 z6z{Ku&C$n%($Dnjwd@8g3Jd2a8;Fr@dr(hJ3()!GE+A?}jh)yImm=mvVCJw=9RSaD z!?ZG?J>QF)KjtE}XxP89hGRH9e_Rc(t?T>Y#F`qnEy`304*5khTK0M!IAvmzGV2z| z-oHh#Xlluhk3qy+Q1geB(lLFh*J^j>n~7yir{k$LK{U;q4K@NhM8^I6^y%mcT3pfs zks#d82ftC4t;T-Q?ujt8eD<%lF&fV%S6~Rm#7XE=5dhm?l_;qs?H+q?644JAbgIN! zghDj6piHMoKyolgzx3I44sw7|azE4FTz14`&7$4Yu&kwmQ?MbGtK}for{A|U?`N^ZbW&yLCy?BAuSC*ozFLp?&_tRH(9H+@aM>^j~N4r+co-oII6CuV| zc1S0_y%8-iuJNOhg^BjhLiBSwfPQ4~XK)Co8Z(DbtTL^Pi^4xTdU+ZVydHV~W=w?> zd`kVW2z+^s{UN5Kh**t`DnS~-ViAcL-r0br643zsu7y$&3)bOGaDG8(RG`DHoHhwG9JDrxYYzxqklx1~R%@v9M(r!iq7f!nvkC%s3J6%05vH>nqsl|>6_Dh*jCMKQMU#64G`TLJO@@8z zYCJVs#VhGeg^63~jUCiMf3%Crnd&pq2gKqVK?JP2d<@71%#n_S@bI`H7GtC zwcH1<#={~YmKqSBMZjB_GIxX9RGYQNt z$mhJqkU*&9%IfpNP@kOWFU4LHTJx(d=xtRUgUCSClM&gCKkC`HA2sj~}G;Mf?Bt3pVbd z^7C1*Kw~Dml*|XzYYP|PQfQZ?=c5|n04`BgWo((${#prTzN(kf066GC#g-?l(%BT> z*QR`L+rSx7Rt&es+`1gRu}1ep4oh|g`tVJ{4x_XyoF{i1W+hnawrHa?NZMS=>*EV9~Y(MK9!EFuq_MOy2k;$rE zOV$up&6c9D&Azvf*xI3OIV<5jJRcge{jBoe24QS1*7j2A{IGT+KP~-p5M;{iUZve* zv;ZT40UT2&&+Tw4@SHyPidIYx@)gT@q#2bU&=OYQLjoVSnkK(83F&_?#nH2LuLXl?P}ygMO3p?n9V4dBH3& zbAK>s9HU{x=l~WjT}2jYDJQXxMD<(|DpyPUxIhQ{UxsX8rE=s!wU;Xk42~YvQvulu zV-qz#DW5SHB$#^aLu^K>%x3*K!Mbn7-i*a-BKls7#J|>@!7-OT! z?x3NTGCvnWwW?TIT%!=dR8rO@`AUIN^0i_ns zirYAB_qcR`@3b+o0e=xLY)ABvw^@rtI_ZpjKM@vErrjbI(ReF|^yeS^3PC1z6t(E6 zefIZEuts~u^NMzxsqvTVMcXxI`0{rF-ju_C@#MuN=?)O{6tV157lr#t>dL6fXIdmW z%MOWnb^4#5n0kKs1LQXi)Bt>je~?)P(8X)@x5o@Tf1AW|p3XDG2k}`x>$XO%kyJ`Z$f6(mmAK57Lhity_p=Sx{CyxQTgJkdkN)^0HN?K$$m%vZeU#D*Da&jNQ+b%?s}M?1|Xy$E)>HJ zel7}lj=$Hup!{FX(;ADutp|7ky<7ix+Bg#bnfw)6_N9+xfs*vg?dx81k0zwyl>i51 zx4rE?KVwYrmDsFp+VtAq-+rGNNw#ckNH)8dAA*oZGozW&%xEMYAMS}maT=^Xhu-xf z7B%NU9Jh{-#f2AnOV0^>F>#%RA1s4w&y4`ttczYeYtpm}@53q%f~D{x0a(|M+?iPW zGdC2M>!t0B;kYM09y9E_U@aVUts_^&3rvWDdHl%^U12*;5Y9aRTEqc{Fzkjmk+A)l z0Qs30dx0N`V9sNOcyH{_BACXu=L;KiR`@p0a3JjX1u>lbE#i3f;_+j}bkhkUXW0zG z>!#yBW)k51m}X2ax??dOoKJpfk2(VF;b`!4_pEa!27S@)i)wp}-l}-j9(Tue@k@7d zF}RutK#$t}Nw+f=gLA;W6K}fxvpQky0HiY#owvhLXN=*I=w1$c-OgEEbo-~htFvzZ zwRi;_{lP@^x|iJvh)o9g+HZ9G=OYYvE<61RBfIR3PA@>H{i@sRPTmo=^X^2P z?a`!rdev)>#PDh~9E>}p3F2Ywk`mmkjOIZoZUQJ|=0cRqh=3pO?S1e0&T>6-#oyPy z7eVujleDi&>bIO5^j3}D1q{RT-Pl@s)6J21=6p|Fkq}cma*JX50}0^=#pCU( z$p9qmbsQ8>==C%Y%cbICuXwT1%5`T&%N-9powF^AmE%XP%U56n9|jkCNRJf_zUFDK z3ueiY*5=UhGakan#;m6;9>T}Q&@(xNkBywcjlp9zNS`!VEI!*Wk{y}Kb~9=B ztwA4x3w(nxO{0PHa~he?w~(FLtGJAE`>Z{j?4r*wB`nCXl#7zJ&(^D@dz<6pqWflO zUA9lHv#VjR^VYiRzv&Ntp`{wTB@c9d)$0LbzFsb+IPw4&?H)HFiv6 z$Hik$Y3yn7*pD>!W6C?b@sEKw6XcttMeqqBAo@^Sdw%@n*ox5|eW+6+5XIWvCtm!J z9e7)VK_h1jsJn8Y^{3{gMY98Et>nGufzY79G>xUl>$njUaxu_8t@kq#s;QiM8 z;C?>9P-PW@k$J7UABk!`9ro=T_u!|!%D24);=Nx*&$lEtC5vJd)=e;TqnccYv#>*P zxU{G4(qNufN;D};x$lBgK3@={j2rCiRkC80(o|w&X_+jW+|j&iL~umTR2d&_FuavD z%|Diq=z!?xX>#d);JbvGb!AdTAJn9WA>ahbT@`6+P`rF8z_QeGMdD7zNrfO#sZ2xH z{y;4#6Y8skZoCeCGB#5-Id!`J`ev&(?<}fhh4&VdsUjw4=(U~*k*$DCoY((S^x=ld zwB<6%L`>V+k6_2je(EHHZ8q)tltAqgLy3}WU|D>JJ$WGh!68z>aw#4@h^3|HfA~`v zB1BbU$q#V0LHmAe!E3NbqtukP(QJNeIrHmuD@E%mCAutQ%3(QWCTQqI93H9`%MM!5 zS?2wvkzgw!QGu%po!1KMh_9z9Z3yRd20~|1@ae8@XQK}2dk_BkEqUmAtC3x)R zGH|kp9vQiHGqyvltT~;{ksGtyA`1@YwPK(HqC<9=(#jj7Xmt96@$i&HO^^xbLF0rn z{&l1b<_ieUL)T3KX#b{&*~qC&?d3+N{kq-lqsQ3bEpvNMp?pP z>LAy`2L_!6U%nDwzY3naF@_Ymbnx{nla0j7a3n0^#0VH1=Qnp3=lZDjT9$ThJoklA{;eh#M+o48*d@XXrJdOKYyX2EeBz*9ahH(` zYudnNDRjw1@|=`>0dcY8q>A0$#6(-OgCznnj^a+1F0b2uheS5Aa-3<8;E}l}1HDYh{P_jX2~s@+_?8k%n)a=w360D|MnA)=_xvzuD?X4JT^)M4M_h z*kYPwG@1dm8`ZpDqYtqB4Z>V=~`51NIQ1K zh7|Cx2@Wa#|6g=SX=*?J7ljA1-&&Q($pZ*-3)&>ovy#ozSG^Cl4a(@iljP|Pwvn4A z`->+MDC+;yHQ7`;PqwHVQEJP~&?U;7Q)R!Js{@C#4tWWb>?}Or#hy+4d`dbGMbtG0 zTqE59LmmnkN<0zUJdsYF&>aGX<`oqkr5~*1FAW*woUF44#SCKg0YSr9X(}rjHIkvj zyMzsf<~&%>BL&|haI6-e5r3~$8coHNqvt3a9-_}UDxq3KVdMLmJ10vU;udW}C3sx% zRGuOTCPf&JVnn`Ph}lNDP+K1;i2dU=Y6LLb*3;YfWcXek!T8(1QJdnpC-yT0 z>Bv$uIS>tTbdaews^Idi%uqRG(#lIt5OW;CF-n2(kQy8vAQez6<=(O=dS@!!`7J-08f#d*s1KF zIKk3H2FE`EQEkm)0HbV8TQ!S*HlwUtrSsIo282Y4^nyX!qogdJ1h+1u4qa2KY$Tnc zI%$R`!C3^3;_|d$pyz=+Zpw3HbjS8GfOW(-jB-n|V?Y&UJ8~hiMqiEAD+*)oEK4xy zmTV~dn*31W*~q7p7&+a+7mF+0diNptS)&f_U#~7t9CtVoGNks0mPx_y&dcQdBq!M9LWS;;6gT;`n}JrY z9b`$-nYCvR)`W_~yrL)F0_M>&ix^4z6z=j3A~zcyCD^|g-J5J&_K{~aPurX*m_=cE ze1&CW@w8WT{h20~pN7@7XWo%!PR-JB(`y`Bx=E7*hb#vd&{U_^OhsEJLwBltt2YgK znn|IzaGg9#2SW)aZ|0Chl&;f&D_~Wty9kl@rV&Wua(M_bem1{Qz7- zR!`bRm`cTEgg2@QTC$s~%vGF=mWVP)86kV4m_n=Cq>`jeZ@n->bjvWl)&mjSqb2z?shl;JDirCBjB%Slzii% zYVdy7nOu49DcYk~cP*l&a>8>^8q^XC_X)Alf-= zG8ptSv+&FomF^w1&OP5=W~T8fp4cNL>nfE3t|vYj>DP2yWmw2@k3%htjmiB#Z2SG^YLOdBCY7@ zD%BV9=apMDLycQBZq7roDs)l*FPlfjto)puaXsj(6hn#TxVi;2SgJN3hGL z!+-K^2;9a4D_dCM0}5MezZN8JdgM-JEdu7GP0b=Bxm!_-wUpUAchc969rqWi4V%=W zO={65eW32L+m^!4ol|lo(Rj55F~j;RYHJ%>ER)Y&YLppmNVRH5c0aYUcg3noHEL8W z>7`!22uF*cq~5{PoT=?_0oQV-X)TV9$GtJXOQ9OEyy>M`NoAYfu~)traA@Yh5Slii zaL&p>;WV-Vh0U9Tg88RV8B56lW@JoLxGaeGM5yJ`vm&T6pLMY$rnIvN0B~MW?Uu%j z;w>G2)mu+FAEnx+lr=KDw2K9XuQk3VX0s}BtE^P_)^*mgTdG*rWKv{i243=OEJIu3 ztJwp+WIHIKk`Ng=((?7~wkk}}2@NkyXZ-6Lc_q5|w8H}|K5d`O?0Yk1IFsn!Ej<+jM7MiF_4QQxKWMLN9nLmg%K~PoExF5q9CtntaeR57u`q z3tYez(GPZzfTar~OSxb5gSdd?{+JJ939;N$t0+{^K`rGmTL&O+6&iJkP00h@9~{wj z0h`g+j2&U0(k9T^C0j9L(56h=4vqz);Bb^uMptU!qvl`8V)=X2AbhY+UgYg4pd-t@kEBUYs z*PI{mn>D-$Ya#_^e#u^C91$iNbfctWvc&Qr>&LFb=EFPUQ{+91j1;77MKl#SWO9=WmA7uXCDylv(=`>Df4VVn07*AeH zP#SL%d}xLeu_b#OzK7#Gy-q&soZ>f&om$mbKlvlI|Gsv^&jLLvIN<4Ic!OV$;I~!q zJVojNhyMdi=EA_Ug#vg1jaOY$qev8ePJYEL=S3}7lV}{*sd>PJ7)nAYAUk7iZFRNK zB&-A|=r~$i```C=^N|jswev8Mb59>G=ia^z7pHwVg-M#d<;n+Wc(O@)!c~nGk z|&aL?V9j1lHA91 z2R=f(f&t&)f+7w1FPbx;zMtknl&pcL7{V~iw*}B70K9z=@hD9SNJAOx)ZNlINS`>3 z5}>#y!>jNh1EBm?B;5SlaGu>>TvSP)`)T3F=V`t^_mc~G3(R~ZR(Ny61$Q~~erS#k z__ysW|1hTd6qXif7943VqDOG2xrTcNKMZfaTzPPXQY z(0|&F?qb*hV_}#9lfcnfJdS7$xi-jtde$-USSfHrO8|VVuO#)A{BIwW>7> zZ9+^}3YmuW&_fY&XL!ehlP(Ifdr(t`ofLcixTlOdDVlS)r(7OV=1Y&*=IWkIG-tYJ zU7hs%EZJ@0pMFm!JDJ@REDLdU55B|TOo26vU`Kq1VH=#y5FMTM|NYh>Hq$2`35t;8 z;{Ra}yx|Er8O0Ygq;^+W~EbUGyEU+PG=fw;8`r(zSJc+LdA%7!DS9 zYJN3Z!cA@!d@s07UNu*uO;#m38cTFs=USpy1BqTAqT>?%dWa4OC46%Tk1F{0LwIF9 zSj!)xeuLLA{GeFcRI|MOYB+1ZLNc&Q_+`0nasa zc2KrvojY}jqj~yAx=nm&qur|XJ~FT`haUw;WBcpP$I)wheEreV@ue*mcIRzsmhOI( zbQ%0PteUQQ*a{yZF1oIbUm-49tc~9wjvb=zO-aFdQddP7j4ZL)+o7@~VsSm#8hs&v zLz&L*?;{B*Vb09-rEo6;b&=U?&E@#D{9M!Vv-j;-}xN2)F%;Va;Wd3 zgkO#bhiCTot>44fje>)}p*fr;bj!ZU#!%Mz+kj+g&IwWi`SOA%gAlnv4H@8X87^zE zEej$_N>KDkOH1Sugs2{FShzcMHQ7o_FBcmJ*-maSv``r0_Gpz@t8S7I<5y3(r}>@)w46-RsD5 z2qBi|#83FU8c3Tnn$xC&!h9Og47qz76Xl}q;Qz4b6O(0zdGUfZ=_sjq&bp>bwUw;p zpMI#8SVGdFRt02$CG;sST~b{w@5G*V>-UwDv7A-QarPV*q&8kUf2BATr)gHTYhz_a zCc{5Re^pdzfxpXTwF$P*2HynL7{1`QVjWh|{ONP2@NJRqVopl4y4`$=(&AGBesEwT zNxQoh_Vo}s*5gf_%kmVM{UnZ#uYIdU4~C=m4$d}j^)rYaJiNwU%-Nc}(D=^|2{f>6 zM7SnG1T(D1fONOrv+wr#`#~YMaYnX5q|O5cm77+nws>;olIJujd=|a1TtP*0Gze6v z>WF$MmHF;6A=gYQ3DN+yIDSbcb+=16&QMW}T%4k5au(n>9~yz*9ZmafX@MVvq=;Ww zRmOT$HW7-Ug12TIZcy2P;reNYM2S~0Q(0e|1u6FG=uf2-qKPUl@L^ zhyDKm&o=r+v9t(y0mWSVa~esK{#p7fa=DNLWRL;N^YGZ(KnTXf@H#+#oOhz51&!2e z=w`YbTRxBPZ@(|=(Ov!0V{bNYBW4G6Wqp;Em6es5l{L?f59ye?{_bnwUf)DiUDl}G zY`5u+8@d~J>3g(rmN%Zi@vmJc1m#JchSBPTyS;Hg?IPdbkQ)+c9WQiNwD(p{K%@P} z_GmgE(&x6I{owCuiBJ2`q38x3LVq27u>*(f<p|xsmI8 zA^B_3R*1W`zmk6y*{(-6`t0!6I>iCm(Mx7H{@+a$?Or~6rkFli`r&eO;s@6!OYfN& z0-U$G$KuUkPV-5B@vbxL5q?i+ledG5-UUs@)EQHyGso8oopr@^>8yu28Uf2DI^j3)~k z4n~6o23t(<=eRK#_h)GCje6sS02}pY-8UGhb3Paj79SX`KUh#7|L)MVGg}P0m&4AC zrkAtnWZvVIU>@cUFM^Yn(b^Aa>tjJy4n(;LnfTe^;eWW^awcG5k^G(*)UKV$GW6kkZ8^7*we&%8ZRtP5orA&g?c?v<@9^MT z^S0TnQ{~d*CU@;RtIGGf{NBR%RY#IvzYAEBrgmU&HqM6Tqkc^ClP2kO6EVP+>|g+jrO-{JaBecxonaafmykhs zM%_*We>H|Inioy|xlLc(=!Rx1|83%;QyRv1*_L3}=bVTXMCeL>5vW z^ZtOGjRW-;`saEuplf^S#KXl)*@YU#Uz62?5|?Ug>u0bebsdYGAxoCC)lp=<#s$=< z9go6Gq9?kb`Hde$G;{3b4OO2vY3qR3u%@Zo@y42VAb@lC!i}3!3VacZtgY3z(VsDU z%&J)0{;U=E)dFY?(=@|`=9JeeQMGyk)SY2fc;Xrv%Bqo1nPJ^)J~MjFv%Rp<<6gYX zx|d`-2EQ=K*aE~2eWQW*JU3A5#fv6+TcIy8I!j8UCx+sb1r?(iig3zHr|G4|fYH=e z6WU~$*lP!dbGx!uc4Svg1I!--C!*tH`77MjX^+0o+g3#3{)&4UU#>QvEO%8qgq<}} z*u(?o58{86_0|N8d*j&bT%c9|R78gd_;zx&TBDb70-Qv40G7Go7eyil29@LhU&Z;s z;I8LJ)h7vdokpFmHJV`m^N;T6!n(K|O|AFy{E6k zudDc7l=2-1YM);QyXa39j&UQ;vGqw{NL zFy_jo}+`|iqEQ9dXk%-bq_tuPX6_7j%um{-_XFy>k;SG=e$53mcc#_MXO zk^NtI<9{K?*#-WV0{aUwT$ZNM_=i_v8E6#ko;8VDL~WwyM5jbAh<+gYk?1F)p9wA= zT@fvbRzwcbT7j_pQgyKe&0ol+S3=JC_4H|tPje|emyU>+&zi!GT3Fr5utu+y^kOcW zw@1zAw=bzuCl}nIujcQl*}mn^JeiN~@67t0xYhJn)Sy<47b*snte2pi4}TNfnJD;{ zN6E|eL0^>IzGroVJt8sV*iC|8v~n^EqFtz*QXH_V@TSMVuo`a$zfCRnhCf*I!GHCt z1s<0W@&lGn56Meb0D~1d`D|}e0zPWAPs5jV6k@Wla*Pl=dK=gFa7eQr-|b#s8jcTd7DH3nPTWRsddo_$i}2SSBq8 zW&T;|*!zYRUi)+$u@5b6rBWrKXIC6-t~d5I6l-mRO$Z=ukh0=nEzHQHiqYu_i6K~L zn7^7dqQX*$EzN^S!;$RPqmVa$+;8QC%fN-x?|Z@$9DIithUoSi%P!vHu?BMAN)*^$ zxO5OM1Y)|T4r(PVAK*Yu9f1$e`~a#b{=vWa7!f?%u3j)K$TY6uPm$JG8c`Pu+_X4h&qTm_{P>&`G3}YW{o=Y-yjF=5enBgO*G6ADIX?F zHp+qxXCwGPX|i4pO~piTaSra8j2R7T)Mk^NOKbi<8C-s9%-E3#ppY{+C-BqbO{ z*v%7m3-A`XQ5R`6!5l^%zHc=RTHz26-#_EeCYOS|Z;mY}`zDWq=G?#&B>W*p5+u_Y zMi5LT28%hpL$!7$mMpU?R*rBAvO9U+?^_EbRl2>wTWi=G%Ux}#dt#p$QZWL9v_>(!+;rkqMkbo%~s(IJ{bG?r2=Oi zEe7Tm28D-Ra-f&8t|yx@>51vMvO`z~cA3|{GVQTRD7G6~s3OAuO3jp1*fmm;98q`#-Tf3ZI! z|KnXpH|)(SU$$ChyW9G~ifZXi#ne37H7pdpdPP57*62^VpSr~XkFtMaE6OZD<+J0h zd?>5Eg)>cWd*cgh+!^)QMrZf4L0V7wqtKbG7p-yqy{lm-mxDV{L8w9B^xm_~${=^F zH-gdW_zu7woORP_z5_9EJ_C|{9RWM*i6g3H`XGKVa2T^Xzl+uI;jAJ=K`4XMOh!I} z-;2(ohiLesaM9upS*A-Ya`h;zAw9C&A=Rf3SNrN-p{u5XwomwG$dYtc zC=#27R^LY|<9Yf!RmOgW5XFCR!jh5T8pO<4E}x@S6Fu8ph%B~5axi9nYQ_Ue=|Q^k zw~shPpB)qYe9w;v+-{sL>^iMn``YtEz7Sd7ILl9*sl*i+r{I}TtpieK_KJ4?7kuW6 zwaD3m0@)*Eym84R!iV(SS1WMFcPL1Y(4T*14(9kI=WCJ%*l=OVE-;w2f>xGL?wo+&8sD7A7Hl(Vqv!K;2=<_58*)5K8S;uxR`_038Lz~ zl0vc^CL6Hd$i=11Hztb&|TF6nAn|eLtK|2Q?Kq z>W(6Y!>xePO~i5fqTt|LiW0XOSxR}qk)gv~NtRAupD4XTXqj*pVulm077VJP5xLVuD1f)6iK1b4;$X~eSNKZ{rv{r`W**f{E);3Sh*eN3n= z0XDApNjN5!cx01$2Tbe{zz;T#B#9C?-UCt`I7`>8=tmfx$>=#pJl5rSun?-BSyC2dGEhN` ztx-kOy_^;V*BU@H-3xGvTNjS6rAwO+k~LbMt_1qNpt&#(mZKzLw(0++S0Nj3=X$~^ zqi1q0-gVxJfXliVynQ&gR^)Hsx~r?JIM{y>-$~zpeFg@GF_*<;Xx%d(GckoCFw_fL zkuEL#T4XhHL=aMWP=9a!K`zC=Aq9~F{)@5@Da=PFBE(iN%|xWI|FUF63iaQXkC3DM zwJC`kRKCi{(g?ncGi<|Q^NFPTV(}HOX=byng=vB$fnngvx$M4J%Z(j|)(Z<|N+xo? zy%4*=bjYpte@n#3c_kT=G;i6~LeB1(wMy^gvMzGYNoyglumg7lSuA7Fl)F&4n@5g+ zBNtr-z{Y*ObgKAJ6{RpD=^&!qT(Lv`{#|T6uF18=m!sSr)lqoVX#KE9MM9hcL0k=w z$?#ph$iE4z$4G;Cp?mG2q#BVis^*SsPpSzkA6*>j?aSY5H9k*T&C5F{97n(p^cRt7 zT65`6^Va67?B?y7YrN$lTz_n0DX-Hx%T8x!@=W9#zPYvNb>CR$@K7lAc``*kb7zQv z@_jnLWavVAX)8Ksls;c#?G^Im4OEVx(>O&4x{VRCj?}-D-%*SuDIRMZUZouBJjEuw z%CCKr=MgjG9r4ISkCcd!oDd%}xt<(Rt;!VOClN?lB1PnT7~sx?kIMJRf$|BTn5oPn z#tNSz&}&r2(!;(N=6r;}<%NSC@a^a$B+kVfEVhrFNgZ5RlYW2RTc8g8HQ_I0c4Q?= zvZkD05(98ASti5tR|P0{!?A%vLRZGh<)aEaHXUBhA4uE&Da)jgd^wljzyZw6-uvYF zUpx|3O8?xWGD?*0qasn1*@^75tkD$0jms4?GdGMq%(hYA$Q7$7K$Le?u}Qz$uZ^-S zE)p{Sv_S z<123B)F);fIdiko<&BiBgi!p^lPAV-XQJ-$=~KB1fB|Ttlc~DhCz}5{jR##(&uabJ zTUfmw9=D7vTn3>c*ky$h_X3P1N=#*ClPKux&1OjTi_5WU1>oeX#}BepPFH^NBB4;r z-8d_?j}H#kfrDB?Q7#;cdb)!H{Z}GSeR-hdfkG!RBPAuq9}ULUSk&-LG(zJn2xUT= zR}d#8uK}uU_4?qnI1$&x0m}M;5!;{2OEb@*sjMWY=XSS#} z6t%#!&O5Qcq;sPSw-Z)k^Ok0VM^{yu2`zy2Ig_J4RBXLGl&Yi&7)bw)H7QY@wCR-W z2S~o~#bUb7Ct(BWNZdUhv!NFjlcm6aG|sjTE+;Kv*fG;l?_$ug79XZPt3No$4WTe6 z`b6f-V!Q@H2YC{}KQ^x~3rq};f#o$E=j^CFS-nFVy~z|0>gJczDZa86Bz*1yC&V_j zR5?9PT@?La;s&L2KF3450!A~|jyY8zC~HM%fxnq!WegRkX?Di%2a_Bptg`a-cqMLC zh0d@&=A2!c55^bfRcthfYvY6=9`)ggB`YAIa!BsMBXP$FNvKqjlu|qrS1t7A84wSY zk{d2_M~cx0S{oigUk2vPOzu<_+r?0#SS|I#520$({1u+P8GCZi4ggm`sJ~ovW_;F( z;DYbAORUad{I)Y>IfR~4(Zn!`h)o?VsjoOADxQOYO=z>b5;v9cHMr0^4y@b&UJkFH zAd^#PnF-U+1}1Bqc=Ehp)v}WtH+4A3@j7%;$Be*s%2bJsmbaco9Hh_cWOBk5gEf{& z+U&`_#M~!0z&Ybkc%T9+JK2oIVWAYy=E0mLtYErU>KqhjUT!zY50M|)8%sNaFzy+9 zs!wC)PXCS-x6Gc3Yxf&xvn$;kx+q@eBJg(Uv)C@$NdChkx(pGL@rwris6mQ?nb<`^ zuacL$cb*6|MQ$b*&)_^hX|U-AE+ zi8=9OOKF2N8|5%KRXAmgigl$9XW}WF`AExnsUkhKHb>zJWG8f-t%^EZ%wh1E4{DPqX&{70_2+BpQY8kR zeJ}-+a){F+6%g77daP9M;l*_C%D55l?|8fN8i>P>O-_|Rn`dL{;Eex(jp1(b-&HKn z;X(Xoi)vNz}a@$k>9wDB>oy!T^F2iPKNK;Ouqr-$UqCEBe1E z!29=)y%T(ur*UQ%vtWWP{&NF9*J0*X4dDL^5TnTDxU>g&0j*nIbJ|F=zP5kG)b7Pe z_85Z%COBK~1qL~$f`J#Xos?@!C4;b45fUp2f4p1gzn`aPG@}_IIlHIMUThLgcTZ1G ze^1l=?U?<>2J!AK2_By^_F?sr*)7{nKPgile3QyzY@pKh6`4-^ZCXD6PXu%fK%jI2v?lAm)HlN;(hR%>pC#*kV zzw{UQ`U|`0FGhdSA(DVLeIdT?kdI`Ai?CWSUJRyn>K%6;qzRl*&0?TtY zx}J?k&hUhdCWG1*Iw%b9z1{3|{Nk$?C-h*sf#?XzE=pdN1IXKolgoId>m zQaQ@v@={P4_LqHk>`acjomR2TH<;m|OZQ^@_2|g5dkR%s8%)Po>lS!Kb_uZ$oY5_( zdQ{-i+Fk$Fq3`a^WVAdwvd>DmgXv`A43^WmJDAR9&iv@8^=exM{aa@;bSM35PUML1 zEl-IXJz=%o(_j168~hgxhwBE&-5S zkB&Z>D>n;gZlGFr%Y+y#=i?l=SDc;hobNq%a@lr@#edT(>7hHhxyGIyMUk(Vcm=C` zQC-S#bc;JFnBl9->A1MI9759+4l})O6Tk9SkB^(bvBZCDe`Z$e3v;0736v0?Yr6{r zFIxHd>l&_X>!m+P!{v?8A%Fo(cHG6>z3wlddsid(Vzm6w`B(`yE`goZfnA&Ay47&F z8e`W_ALU`Xpa1beS}k#sZzj!FdFvc*T!OP|;07f)y9RD)ZreTpGzk%(FS#b7jI|6;8Z`Q^&_ zc5?hbzZVXZqS0vRPA@MP4kA%Y5KA{3H(0yRUP#2Selr<5mqh86XyF4~6#r*i{F9gz z%Y)*BI~(6D#8)I7ghgO>kAJc(!AP1V`&Gth#})jd8$_F!Hr?YmJvZaN@%Q5+sV zR!?5SeuK+gCBcrevETV&G#dVE#_8xJaEua#ZM@!xzPs{vB?3FwYq>k`kqc3>5Ul+u z3pRnD{C;#KTsmugW+U~Pe79nlIHh=X&o9482PI#*7mSJBR=F`jV-doi_(=J zJp0LgIo0^%cgbSAVS&qK0c+6kqg70)ZgC`wILyBqpbv=~#oHi)7}fbLFgFn&SsFZI zEu_3T@iPAeiFc6kJQ)UleX%|@s1b-Epj@IB!sL?F7a23bu+$GB5VqMzE4peg46-*) zNg}{Qj)Uk23;pOZdt&K+w~Lbui9h9!DcA{pq>;$~Ho=3RXl(u18XN)NO}88O#};ZL ziJ$#niQ~+ylDYv`D-nCE91byqD(6==Dz4z#& z=-Hv_!VRp0gznGFGH>;Sit8cNRpU@Z975aX{Jm|YklKIm5b?GR%F>{p{b(ISslBa# z&r?E~N*Bgsw;FAzz%7Sl1Zk*@W`S@wYril$TrDMaTnD)VCvg<4NFFgf)(Re#+?iU+efF>IKvTUUXn3H2$%qZ zMEnfjv}O-)I*|`NP<%8_n9FDv306em@JDeyXWhmbSeg6JD9=%whyJr4@>B0>Hq1GG zXS2kAhCegYdu_{ZtI>sz8ha^@^5S7XVfY_rUYf!gHv4cC&q%6C)!1U^ui&&-5H;8< za&GgOM8+jL_crY$Z(<+0@MtlR{k6K=u5CzYwR!+2g-h(hfeoJg)eqc9t^gMRpj){N z{BWJJ58is6_-TrizeO#Et}U3!4dyQr~Yrd7+?tGn^`Vcps~NJ-FDnB2$1e^;)7M+=;g z$3iBect@1kdas%|VMz-fStzi~d0+v6aRr1EL>dlU-vJJKF?xK?6+6upTNJ)9G3oic zy+#i=c`Gb`F)@(W6ujtqg;f~Eabc#tPU9SkI;1GZb%FLTE?I4LjvzV=yvHa`;Tn+L zkn->tXxug3s+~(riHlUpT|FUFIlS&&{Nh70zL)M3U*v=(Af6_{7nMFE=K>-*snWuF zy{)@TcfHM__1pBLCn|8)u29re8PPdp>*R~Mf(zA_rnf*Q*z0_Hpc2u%T>Ng=3!v(_=R$6DbL*{wj;pSPWs8k(z7IFWj_D7)s=iP>7 zLm8zO<-W*Zl&cwcAVtl5q|RRGC0q9i z-BWUAQlDE5sNxdqXp%lYu|5GAd}z2~{Gy}U4a&&~bsWFcVWM*y!9oxA?KE(TV&6Lf zcDS>|FYVoJKzwTND(q+6boG&Y4Me8fILs)KuQ_#rUE0`!z#uV+UVU=HmW-DLZrKgW zWhDW=e;xmlMwy3B!-DiA3F4uO!b9MtH6pN}fDqsXAnGKbVVAe>H7rPwBUhiF<4Wes z0zmF$LxRQLwY*CTrTuNYVMBsy|0;Y0r|QeMJ1`)q&NntAH&}Oig?x*9jN)q!iA0uyH39+>#}H8kjRr5G`ZZzwwRrTwcNMcPeJ?{;HG@_jPZ6_n?E5yj zDI$lSPg?iw!aJYajdKJw-P@}W4d;Yl$e%_+JW@UkkTGar!5M$mFh3tJGmHl z6MB#LWZp`~P#TJFO3uQ$(IrYpc?lfj^2kO>5c||!Wl6}jP|-ugqmZZ4!fW0kByT|X z)?9ErgIskoi02>0Cgg%pXxS)a-pd1_R6L&}aViH!xcd2Kl*%kbM~sw6X3KcQPF&wd zVZRkAY3W(bU# z6#K#Bj=c;e=b9~FoAXyTo-UXot?31$HmiaJ$Znq@FnVx>=(RZiZt@QEHpoyqHid8H zeyK!EDy(!{T5y!y7240>)QdfdyTNb{4#zb_w`hf+c1^gWNcH&IZJ=9unPAFbfyP%} zVvnfIP4>Htk&`e*6_TWOFCw|reZ)D!NWm3YqQtKWtzbMdF^>wXW}Xol_ZGT1A%)CC zqLu~!P*7cJR0-i{M639;(Dyg5>~Ay5+ec<}K5JNTU&=q@0R|5e=wb3!1-a$)1daNP zb&L}eAQ(& zyimuZ3`N5$CsA}_+c`aG0L;IPs z&no)Fe#fAG*5e&d#lER%)f#qYQ0Ss#pbOxT!l7z)4GNz+jUFWOo>~#(pD6QFIeE`+ z^e6?Da{tibK0h^`J_MS#OEpYxSl+sMmjp=t=%JrKT*+y)9D&}$AVgi>xKEk9Y2+Ym zT;@We6NG$2(~-&BV#&xhSP!;|O@4|@=kJ;4KW|VQQ=Ol-I!ubG>o?;8ROS){rxX-^ zEXHGILN2Hw&Lk>{G6fjJAq93x zZvuus3LZ!(VH~21PkiJjv|3P(Ln11q$0>g(9>?f>8$7|+ig2kP30hR9C4*Z-^V}kA z8uV1VPbY^kStdtCuOwMPhP2BnMYa}VWa}q6{wBpc%d?9#9g!!)_$nH|Dm6z&jOa+= zu}D;g$PzIhHd6@3X?8DbsD75b@fQH@#H73t8+pY+Z(=W)W<}!yaD0Y!fZ&ZPLKid7 zn?)I?35F_~GSdB_Zj%*yP$d%O_KZ=k5eHHB`m2+134u!AR zWyJ>M7i(xJyN8EZg%E^$=6*VG6vB*ma0L6ZG*B#%;~F=ekE}0@Z3v z%D;HEB3@%EMox;Ns2D3zEaCbTJNbo4C|KBIjOh1dzDVc;Cz4DD5|9HY1tl)%@{ zp)9U1#fSo2Im-u66c_Mk^_b4Z9Xo3^E&J?X#=$O4m|(nt*h0utq^Sg`WvYg(bwJiG zlcmC}mMqPdRPuXB*eVl-1Fa`4hD!A7HWen`cJOLRkI@1$CoV%TTrZrdi+67E^MN<* z^5E)nUt262+Ml;K-WwLN&^WQ^`Ja!$2?Q}SQZ?)VjpR>{u9!kAc-KkU2-S<0BT{$SsjL z|343q@UD+O=>3Og7CkhBdk};4BnS=&VEQbH))M{~Lz{Q+vnGCrLe?8?&7{6Sqr$JS zy&lO9Uhm7^!|+|^qs4+h5qS}@4mbSoW<%`rk!{e$<8E5ASL|^5L1Szgho=~#<>so>fXu@AU&Q^zdz+w@e9#a5X&67V`rZRU67m>V|xH#1V}h#SQu* z^wgqS#vA#NgUOiC-y#VRuk9*(Kw}o&e)DeW35LQ%-itk=|=gBdCmxN{- z8K}%=v|5CxTz1Q~t*5Ho0Eq`${^+gKY)-|@4%X8@_kOsl!xpK0H6}{RDw;ArR;_V% zTh+XZHCyL|@)#v?v@@u?zYv*T#SB{RD&KJ+#X1l`B-`{7ymKh6&`oR4Dq(Q-BFZo@~K{*X4;FD$@!T;s*R7*dXP8 z`$(3_e@IqL;hv&@k}>N9BVe+^EEz5h+t6l(C~bOAFY_bR6DhQuwP8x5y~O8iXlzw+ zQrcJ2$!B)-?aLLulxLBt@u3?{fQTI>+yD944Q#t%+xbwO+yZU|5mRS|9{5YWoV--0 z>Fxav53J;mp^6nHi<~b%EM`Q5pX)ULE4DlY5)}^z;(s+?9Qbd-mi_q`2R|62Uv}j` zB+-7Ez(MByJD30BjDT_&{3t;T-}4`<(Ihh_xS(rlrvKU*j{5HM`^>>O{@2O$ZbF0f z7_8S8E=L#6-261V`fh%>=nuZm#{G#S2Jrc>2l$?^{IMgihyDWH>F@@>vFKkc@FPFD zm-t4%805eF(}Y~mKp4O{8z|5nwr!f?S0@o=W*miYd0NcPijFG>xY;8bHR4H&tk_eT z4yTk?Wcf=T4_aghG_xl1Df$U0lKLplpz?_BMXQ426Gb@J|IpwjgQwCrqR%49xz+wc3j(HLMjLsGJn%iemoBF+G4H2Q@`qk(z6 zanEhI=Y!#gQGRtjack{$x3j&o<6h?DyqC8JeRq+yuls}E;406?sJXT2jwYQgHhY=> zG@J|uJ(rIi>Sq0M)^XE*CmXrrX|L6HXRnUj+a0O<{b1_acr_hoZgPzV<3V@wt~JVB ztKA-qI(h%fO$I1JaW=XcyH>yB(0wPL-44*!J?2+DT5611@)?jqC)$Tu*E`a$CTU@+6eC1x9zPR}N-uZ#U@3ZsM z?+*75_TA};+dFZqd#~_z)qS(~>hRU3`}^U=%hT5v4z1^M{NwEW;1!C`-Qn@s(c!`VraL@&e)M|(@Z@jq8^Aa@y>Lf|$A=f_?BW!U zCym3C7w0HGI6gSJ5Maj#=g(iFqrGnqj}9-sC$txb7w!fA?zywQ^NYjhuaEZ5-P!B& zv(r}x@#MoW8>g?Q{Tu-Ju4un{4GC)Y^LBGM9By5&-n%!Rv?h7mjVGgNd*b5a=JmVg zC>sx^qc-I5iY@#r_ssp%ZM$E;Dz)}-o5R+qb>my;@6ftA-d&57H< zpUsHUn{J%{cZPyq)-R}Dk3!a;j6N)f#0t#|*m|4(@BOKhb@P7aULJmX);u|U-hA=; zB9x)A@^?pjC(XnC=E>{h z=Gnoy!2PnQ%T8JCc<*`h;+rGsdu0`px*EV)6@g@R(B&#wJX`JfoqER^X5mY;=PrB8Uitnn~rbo&Hn4-vrPvr&ma+n<|X3fdAV5>6N6YW ze?{ZaSu$GfExh{3?o6GN{$jHE!FfV{WN(ocONXo8Cah{Nn1PNDUp;?)`udfyO?&IM zdgD2?6xFPvWMpr&v)Byy9)*mjFJ2s-?(H`}uDcjI`h(4`G%IAZ8j#-549ZRGzXl_D z3o|j!dax5Jp6%-vY)or(^>+Opq;H5RY0_O={h{yN>oM%%Q}U&CtOpxkh)|Z{r33G%?A3?SJgL#+2{j7PMQi!e2jmyuJG)h*bvY@pS?b z<^vdC_A*DJZ!N0sfj_>P_TW{p8v z4D(UnZGUy|*I-JfkoYHG!f8nSM~Hc|bvbT&0rW0T#q5vPZj|-lh`!CNwpf+`Hv&T( z@~&GeH*n9Mx$Sj$J5gQCj!?43E--*9z|Lf_*)vsQ*LEvv-MnmJ?eu5{HP>)YB1%Lp zVw%i4s-%a|f<|ynjp*eRR+Yp2tGZmpL*5Y*aH!DYT^-xF?~SdrgNp{!^|t$<0~3Tw zz>Aj853;K6uuF?lFs>TO!CP3ep1R{U8PK=)-nrWtz;nFp!MN+HAt^(FAnwc9MkH@4 zF1EDwKcBgW3aGKGZ-9Hb)lJdL|BPDcn~GM}SJ4r$TB4Vt3#lLAlR=;FfJ1rbJ!A^9 zzf!!SDA2O4Yy7@w=nAR zIF&+6juVy3<4oFr=!B(!mk2i9^ixVo5^6(>M5Uv zy3Za=e}q#;12s0nxc_jg-)0{iBz4t2b*rb|-XLCe6M0NYgTzReMIAtr@?gLKP;~)F z8CI&}D)3G8W(G=*sM~w@i+kJZ!Sen>*Q-fC$Gj)UG6p52^tOE(S zrZ8W*K*h+)d2J=I@WJ+(kg3mTd~hfK?S_ z0T>`#C-oh8Mkk%zbbfvkzu-tDq>_xo;~z^+7?gj>VSf3(ZfN~0y4E5=ac^1kErm)% zsN#J(XfIiu319>Rl@XVXoOoFU)Tqj=QDq0FaHcB8%XqN#humd8Ic^Q#?0oTsb6+)*nFF3sj6iDR+XftAx9vzQ{EjRfzFl-#>k@ zz34xQP!({=6fU-!V9X5|^Oql?EkS+CrC|t@mVoz*gHJvAvlA{vhFx7Q z+4I}dbAD@|*Q{^F6jU<-E#=-`jBdUpft%(Sym=Bi+KXfeHbb>b~V<#g>s0EOcpYGF#c4m6_X7$ z^0rzdZZGB$A~tCOy71h_mWIRva=HmQ=&pq~>zl3`oH>~f#&N6>t2j*BUek2XA<{82 zw`j+ugGH&wx>OC_CcR?0Gi}pgKj8w_hq`3}8^Yb0b_RGnma=9N106!%X(On za~i;=<@T>Y+Sem2^Nf6iNaI#!qs#S7UnQDo546OOH{8D8$+3M7MCJl}0-w1Xf#emY zWQ>PdJMZR5q#<2pV}fZIvLx1^f@s~Ar#j6~b}lYhE4Y{0=o|;}AFX z(LIi7Wknvqjz^E=krvNh(Ex-9d`)7JcU%KQ0zD$op3^Ig$7xJ1s=jFdPE-sF$r`!0 z5|Mg5P=h%v2|xtL&(C$1@8NBJ;bs<1?w}+~`=P$u2xZeHyoxnR;v$g<&exs=t2*81 z`dVU1x+el@UxJ^1875gk%<$&THh3EhW4Q0tzfz5E{J%juNzL zZRr=Cex(w?FLb$#SqqniR?%&!K$z>EilKOs7?qz13No-!aN5XTyqFcG*$E^TB57ju zzyta*qvrC`Vv^`e8WcA*nTGb8Egsp^8n6kx)tJu=Yt14>G+~;a?YT?zBU#!-6)$@; z+u4B*^MQnFRUoL+vfKT(>%1!Y4J46qZtr1tuc6`3(iR_h=%bPbW5zRx40%Z#pZ(2eX(Ugac68U zDBT=e1{Al)=7Q24GRB;YBc6oVBd4IH{9j`tUB^Lfbe*#9*Yf2lUPM&XQoK76Qq7wJ zW2__3dT#k|@4Oc|FSV=YXhkJ?r96elvCz0hY2pj*8&X3#e^!~dP-NEaF1vVo>_pf3 zA(JaLUq-Ni_I%a$Xw6s#?L!h=yy(~;z8n7pMo7j7{`yBTmi}o~RciGYmm>%{M5Vmh z$wzEt=`Fhbg=`saGNRyT{nHr@hBb0hDI&5Xpvc;MAWz-{lu7k&sVPq2=+d0|Ec8xe zaol01h|fTIAXy_=K>9ZFr`aEbbdyj*RUp9;BiU5am7QN|`Hc(19$U^6t}~1Ol=f|igQV^<*;yZCeD)xNRK_pl zv`BvKiM!IyMO?WlY@k6eqRhcn^#HX_V7eT26VtvC&b_rJaL|yaDaW?lDjLF4tPc9C zJWIL!23;&CvsjWwURY$mS~J9;Cz2^PBStt*Du*+kx%>C&c*bsYH**g)r1j$P=mJOM zUL437JRFJTS=#0|q`SfeVU}-y5H&YJ;AEUE!))m#4mbDZ*qPP#SgYj_8mPy~qerO9 z)N~`ZuPQk`)?9I3rnS~&b@e2E*a;8Qeo`inD1{@&Srz|Qb6gw1)KCFYJfPC}I`2vWeojXD(ANpS zQH9g2e;t9ex2OOWYYzIo557|Txbum`Hwlp3dM=t3B2GUlKJ)+UomnB`{F)y=8cX2)`}#g&GFD=Rgw2*GYr5KsDiiZSshCLiqzH+t=(P|Pt`BEBE6NvO6~wF( zOprG8QV?vmyHF3kRbXQxxd4h)s|FHF?*c$^)g7<&g+qem&5`P3;R>NSYbnshxvp2_}!F~Vj!4hWib9Y8sk0(+!p`{{#U$*DLO{1 zaNf^t_#d#ovp}RhN;pJTmVHWiGrp})$>gIZ97J~$p#INIO^Wd81#)wN-1tCK&)u~E z$LA7Yl>P`}k*R_~AW(l4--F6rG~f zw@av2ZWb3Nt@@yo?%u&EV)A3!U0R&9G?2Qc)-Cb0@k|X26r_6Ua|*mLkgi^Y@Fx!Z z%xI}zj}WJ3dHE-(y2~~&(U!HOMp=uRj0T7crWqV=L;reladJddmVP{lgLu5sfMOOa zZ458HrdgJI-(b7beSEXD}$ymj#- zo*~mZwsLSvsYF@qSQZ10lyS!WpdGKaYT%+$|4{@gFco*K6m&zt-v}>#(e_dKqa20m z3@Y1sVlo@DrL@0RmpfS?lvp9adG??a*&mj`^kft1D$xc_J17S39*K&Iviax|1>ACXdG!hX2GEq*K{ni?ZzPRu&r>+MfpOKqNjg*)L zuF5HL&p`nN?a2aC{y)`7T8bq#(#Z6iX{2?4bNz+<{e~Kej6Uhd{lPRc5j}N$?x2x6 zKT;K;A`5)kWhcdC_Vl2kHQGm|Zl!Z3^y;CneXAq?p^cITG8^W-85KuiGNY}?(Qly! zZP`qH;FN5}vO;`TAJUkVhYU+Qz>E$BdH|$J$(ma(Dapu5_o+B>5wq3T5v5>$Fp5V<^1CPb6Zy^M?q1NL+oqq%m$VRcb1FBnNiQqW3U71WW&J7T?dAAiCYg0yj?Ib z<^Crb7|6@3QkI+2u(cr$;9^B05xEOgo-GzSnNb%=gkZprEG&G>TE8-C==~Wc35pPN*8e?dU$Uo@hsB;-NCC2p+Bg};#q8lOfrilNPGgHGEn|^n!%9GL0S1@ zPGcs;pU$-mEMHX4Y8e=;94o;?kCp@gxUnMjb&It(q~YufL4;}o+Yye&ULN7I7jA6f&ki$7PY7eKSVW(C5}s7&8SYu{YhdEFmkaYBeAn;gc3^Cpp?{!kt(5;)LS00MgEpb zlh1YfWWp4AVj;WB|A-~YGO^T1hugk<%|D*|lq^X+mdc9dT&Xy`1&JvK;i4Qim}JhS ze(NbcQV@6i3EU?o{_kX?f%_lRZ%SqEBiH}jZozHTLfM5^L5E}**^DZZ^vxFN29|DN zgz$1-)F{~qW2ezo$S}-!fv|jGcWp__1*~k9S-=>wD1mL7G7TZ~h&knqAM zz(@VOQKir|w!KFLln3W&Hem|dH$yr94P=n>FJ zEAcw~p&`EL_$BXxbj#z#V|w9g>P3jzJeFAc8qBONw&ciKMh5&fl{JIb{Mltddr>YR z*X+6~HNC7NWdD(p>TT5=agAmL_G$rgZg@#F-NexRgoW~21f+^hIjRVV$xs!uy@~>6 z0u}GMyC>&Nxr!|l<&BU?7*wHUA3E9RNL&q> zR_5<=$bM@B>9BswRW>!8A|~;s*jM2WX+jYoZPedN3NWVPnKX@S+P0$7T8<3y10HgH zz$m-HXE2aZ1suXoFm}Q*E&=FYgB!S9kl*b;HxupnaR5xkrP7bxz*@-K#1GYd zsuYFFy(+IEj5NlwQDY@clo7QFAHPUX%FRw$UeObEh}*l0Gvd((a$(rbBIs0dU#A+I zLC~Uh^1-HC)@iDR)1GgC^?Ncfbi=&58La2RlfX-#?n$#50EP!y>;kR)6rVKf1}IjoSB5eeC1Nu?f! zdF?cpK4u@b2MP&I-Hd=K*;~t+B;GIHj5tOX(J$W6_J#BMGm(5NstV$VO$Obwu$vmd zEE^VU$ZUxk>Z^v!D;Queknm%r)9gv=KGEYp+eN$<5|*Rk?CU03Dva2Pa@m4 zoR?vm(Gy#4N9KHuNU)QI-*UD*UEsoCTUVtZj9m<5yfXBRPqNpRGAn@)1h(AaeBN|% z^-*C|6NpR6W|c8P3KWi5+A6}_2A=eW0}_4rOY$InGG;^Ae%r3t~)?wI^J#BDFTSxF#*|0i#4xdyCicoSZccf$z)@5nlx7xk)M%^ zkovwvu4*RJ-I#azqVr~n zR)@WeBgy;2DXwJDbBOX`GZ-Mrmd2+LruZN%;)c8l6KCYyB)`eFbV;{T0PPQ;{m~%= zivYwmC^Lw+t@tZ`R{{}3P?=w{Gb+vyN=GY_dAGsh8dq8=pvqu~`z-m~*=J6;k|FZO z+uhWnrO|l`H$KiI->V~eKWfaTbbiQz7FFL81W7`<&?^4&Uj@C4k(&004{`hsv}B*f zN98^fA(}&BQgY?DBQw6@*}}&uNE?$jh8wD!;u?!2DzU6NTFMs9&euhtkW**Gr1%1= z^u8-rsd<9df1TB!qWg6~A5w zJcZ*5&>GU7*hNFMLCD#Fnj3SWt=I?Q_a^1rl5$flb?~;si9UcBl-xms2cwS|565yB zr^i!hiAhif9Y_|8QvH0YbE((#!=?sqg_doZ2h%P8 zX_Ok=L`-XEih3=nvQV=N1u91NK5I`WSuKOrlhG5MsiBECsPAHFmR+>_HHB)ie0F+v zBg0nqew|cavZ+KTwpg^Hd_#75p{8W40m_ZYSPE%0!)z^OigDQ?GIWX<9@gG+qE zz0VmBw*ihi?^^h*d)Pnn{#0x=K?w|kVq{|xEBX;uC#G$sr3m&091HYNH`?+XYN!)o zsjES*PvicGwybXTgs&e(=p+SemDBsO?@IjW{%{6q0&oq?)J*`kNs&@t3>oG5R(oWA zw54SPSPRaANTFC}*mUPDmh-JbS9LBRLB%vnror+7E_Qo&-+%(GG!=aLaRf#X<**<| zgHwdwGKO*4RIeE>=v^G?YGE%TEGq8)%h7*I{&D5yaDTFVMq0v`aWM~37etLaXTJd} z-kT{7iNsP^QrVY6b_XZ>F771yts7iE`jbp`BJr|lXRp4Wnzb;ciiU|bmC?19-ELjh zyMw}4wo3$^;9HYT)$>+gVavqU{aaU4;K5Q(I!Q$`8Eb)N)}Gv&T-aqsCIf+3cAF%Y?46(QeJ`KH^rW$F&@Bas zdd9E(aB?YMvlDa!A!`UFD3cxradm0v`(laK8UF+-FULLN_w6a7{HtHbd<9v zSX`5Ui42lh6+ZOstZ6AwAaaC-!6jWJ`5=ZY3ledOq5)yu6<4SY3K@4X@r=XAo^Q+C zuu<=wI5I2l9fk@#K~he0GMMJ33%)YBEL@BHx4S!=GLG5LlotyTHK^VNs8cRC0U->&}t`Azw~vQ1LgBm}wvJ6pO>%NnC)LO!SVQj?>@%!!);3f7+Rn z3D|b{Y|az;5({vwLbTeay|qyIk0TL(@6OMBTwc~kG#gx#+8in#8cX7J&`m1}D2E3a z1GWm!YhdTSm1@as@IX;qWcbY#q{do`Ll2Ez4R|-(1Kg{G{%O9WQopuC!Hg~UMZ}Op z_HahoRX#@Oa&5J7%^L$74cdJCl8>ffODov5w+P4)J{yka%TT1-SnO$F1lhw2cFJ0j*eBZ`()` zewKbkBl8g3P<$wunZU*_AY0Oyh%QL9lOPy0D6%OL<`o`xyutqW{i>Rznz91V?v5WU zsk*wly6UT|&rZ7HMBF6la~5p2g*bALMgP3t7q>wkgn^sH!dC7!PQqjps2rT9JuxY~ zQ`&YLJfuaEgd)fVcvYM$Pn5BzGBGVfCl-s^tn5hQUg5}(%&%8i_7k*o_Rh=qeaDSr7a4TMu%lETg3 zwkXoev$IO+Q#Z-o@HELbr*3@4M?mvF?XYjHl~~Qk_NT#eB=CK)oZnl+(NN51VlWeL z1}jkCi0i@1TJ^*y%f6l8*#g|l!OXTsD={B~?~C|o&4xXaI0DOPDMp_c%h3wUOJPkH z6Kgc=32SyUxf@!uKg2a;%;vV3SX0Z!VfGw9XYZ`pc!}lFbTqSB*mShKxy3<)YinZJ zUr5^6vc(vm1F;w^ZR_T4GFXbm-EuKsjmQ(E!%C48RNF>=l8GpRLp%jjhB+~xb-TX= zK0NA+TkGRO&a4}`SS;ji_ZQHDSnZR+9=l=bDe-0tbjVm0G7Q$I+c({=ipxmEfh*HA zm3g_AZsf`0IaT6Ex6?@eBw-ghyqhk>Kg4-YuS^Fw(!QQBxgy<92D5$IboR$S3I3W| ztDC#|-D-b{CCta;$$T)ZB>(#g7v8@ajJ^CK$9J_kCH2$oVcG)U%9KB=g{3>dIJ49#!Ut$&+-Qmy1!nk;OVR zH(mS&foYNz@)2QnaP`rDv37RCdqfb!)saJSMIL4qSz?hCPAL5{b|qYO)xictAjj2W z%mH~nK5cJt*16sgcyjIJ>PiUgvVkqEBw<-7!SVvHj$l8?@G9R1CidpgX~KIqcQF5B?uN{X$|Fcu=*&@zyJQT^;PHm<i>Rern$_9b2 z5_sUcw4$v9Ozp2%s_2gv$l6&{+w6xKEv+D+aN`{sC>45%+JG0i>9CPGDN(-ue?iew z`Bg}?xOI+ffub^%Sub9*0%wf_A@oA+n1#l{&PFm8pEErYw*^rWl)v7H~PK5Mi8D(Y+u85jeQG6vHe@xgAX% z_dylnX{%ziONG1biStV_PBLUx&*Z?MFw#~2>|3cyg(_w2+BFlThzIHVC=NjGH&Fsh z)$O48o|5c=eQ|_Q1hp`wxkC>mNa8&{IzhARJ1&#a-l*>wQ(`9+`BMN*kI|Jv z9MoNY7K-aB3nXgQVv#aRTg5ObQMnaqnV9+zlkjct_v_iF!q5L+dN||i*7MbfX@m7Z z`sN;xVUqZ0bRAE+{-zeYLzUkGTKd=+fvwc^yX)uF$@42pBQQ85_Q;P(+!OsvRNuTz z+131y4sE#rWmlzzESyci=8YMh58 z5~Tav8=|?JP`%Gs(@efJ3uF?9&-=V4-Q)+bzV@pIr!@$Tt%*Ha%JGP2Kn$TYy~^v( ztwlr8(fM(^t8KH7YHo~+%zklP4^K@VJphch*BfvUc~^ZHJltmKnDYVk(* z)V`(BpJ+q;Ou1KYgi~2>i@)%J$6IYgqPt}#iOOR+ zBPdhI>>hRZMC*w-0arB&vs5DQ>I{2FdjdJBnFXQ}Q$UW2<|iShdnz3~l;*lvp>$=> zG$owTOT-x-FLY~w4PJ+-_MA-*G>rl4FPv{L`r`T-Lw#M;SP$YLV|_hzVmo{q_o#0&buz~|cW^-xSqySnjaphYT3e17;^tX+9nw{NTi$|FYrW*=t`9vASOJ{oiu`<3JV=zfSqfl zPvCa2F(d>D3YW^3EcBk*IgvT>MqLu2^A7ER-eIV~E7UMV%E5#3V$6Gm_~(vx&ouOF ze0h2Y<7`g92y8ApVoFgB<#xIo8giFdy(Ux_<#$!bCB-Rg3A}nTq|8v|mm7Lm<-#)> z*mp}5+QD>0uQzzL?w{8|OQBi21(L{%us<|%w@%hLEOsKLtJ%+lA}n`ks~=g?KQl4ZZO8ur;VdCh7iN{A({-;M=N{Mj%NrtG_-+PoUDf{UsQXShT_&}fB;b-{A z1Wo%1rHvjZSwwrN;$xh`D@P~!HhDTmLr!9L%wS-{DRk&Q#YOYz#qZLTnEnIW!#hB_ zy99Uvy;}Qk+eQ-pS^g^~Djdj;Bs(s8cW`1I6kD!|*pg0?+vbvhpvjfQMj{zLV&{t9 z-+tfhgW~EDH$iYh0F&IE*?E3DJDa1!JvyZGIQg80vw2Pp|A0=8PfqA6%)&+J#}Q40 zKab)?JPSpJne8TB=RupvuEGyV9>)s`Gs0XEWg?&=3Pegb#lnkdIKHM&CvxtaxF8>& zicC;G2SFB3^LsB93SL{LS+`IXybkLbv@m^B3(nowfbwNG<`%PncqI<&0@OxSagj9rXy$ z!_nXu=c0E(gFbcpRPT=QwN9_PV`to?U!BR-;C4coJ?i!+PH#+uOU!#iubuuylR5S< zr8lD9Z^KbN30>lEmxkTZ#5upc?v7}9I~oqgJ@y34Fc$0tVcTdL zr?iaWkU+qci;O29?d|;#M*gA*1ij4iAdK7dj`b;pP_l9=kBn3{<=4DU)^3__D1f-?ai>c+X#O)nE@25H*1pm z;{27OsUa~oZD&lN=%iX$mh{56CknmK_bEF^j(BytAosLKWox{>*S|Ws(Nb< z+3Kwp^W&!=%#sDLOX4Aal%OXb!rWq3+rlYSoL~cyPCZ|oy(}L)b@*B9Q&;*@4!en* zkl}a1l)|7%qCIPq$mhrZ{X2g?#_#mUpH7dD+sD@8ijlI*itXFh?5NdZmM>#vgU)-H zU^PLnk3TwK>6CanGMW<4|A0rN1U$siE+QFqAX7x@twN@p zv{y?7GA*Lx7khtxGk$OkR!~Z7DWilAjm~Fe!kUrHo^!x3gea^q$q?cqV7x-;^Rs+B zqo!h?3`jLu%!|8^u7+G6_ZxG?vTT?&0K{hO;7- zcHfBdj`kvD;eU{U#}E4tn1ci~(ziO$#^q5vJvv~#T%x+T_YlF0FcN@;*<7(8TEzD& zZe>(exH7eSzi2a&wVW9MhaD^C^HgAOSOnjFG2THN(y~D7;}^=v^pdWe*F%@#`lkDv zJ2`jzw>Nt5*|P(N_0kI*@-5Kq7hf`m$!@unr9Hktz2L1JdB16$wQ+4EWI-vxy9kjm zL_EPSf$?tXBpm?Xq^PB4=WCTTL2OhjeZOTuskKWd3x2l7_jgkdrc@}mo*&wC>$0a0 zoW&+xstQahPWeA7fMvf*f!tEyQFJvG#%7VV2Crr!9r8|K!|G~m3#2Af-(d382jNr9 z1|m*<8$d;#>1lW>r{TGZnMG24lP;_x=hvQi=986xuT7UERyu`6Nv_`Qx=C-n0=;<66&S+S^gmPZj|b*^|6Ggebk zknx!e=C;bQ@|;G88aY;(GVCJz$XS(~dglwL)R4?t9X{i-W@>jI^m{msfvB3IYFVCm zN>LmM%|t99%q~thT|U-*fe|L4MuR?og&QDemp~ZO999S=`MT)?AEq$aR0|=_rLEEj zcH$tC4jfFUmIG1g%SrhT;(QD7%HEQe@^D$LBIQT3IFD8HT2agx0Lrq{BES&luObR4 zY#%*w9&zs$A52WBlc>kttHV@$#Ho~@ahAf*I<1?o1W)45gqqIfyqc`K4A?hOnxXJT zwauIQLPU7C`xQ5T=DY{0e z8PUb#linQ``p`ll3)|)5A?Gt&vs?}50v>n6fEO_*vR2O-;Far9*2>P;Qr815PpiXL z)5j>56R+wUyRPjQDZ5uzQzQ>6?1RUJmkmTCeY0Bsob4A);`OAd@FsPV0kTCgNvhnw zTQH+NbcOQ$U%J<9j#&&N#zih|QCo_opL}k}fGRmDmzA#@8Z%>z%J2eK#kseT)`*HF z*0SlWQH##9;W}A$5a9-SPxormR0tC=QU-O_MpW+3#X_W?Wp7V+ydKF&jwm#Qbe5o@ z!L1_vQQ0TE2IxYgO;Gj^O(%_e0VpB4|F>3P>fln@XzT_<{c()uRn1OgeC7|FDv}jX zSj%gJ3?{iSg^%7pp77DT^aXR#Bmb}l;H1iT4r1jtWVPhOv-vApo-)-<;&alQCEMKT zIg^I5KkK~1m|_8*3Nx$@paI7!R6I4jRTfkN{HZY+yIiIs5a0=9`DGuFNX(BmFr zmZI^B$9#_4iRW$ZdDmoNUK;rM3uEk;73Z;!^!I1_6mQJaHrQ6R@i!Q`!7;`sWGj*+ zPILOm!1zQ~S+x~G6vHf)%|fLYgy(IO1*%%i=otnNT&uR8tNqVPb)_x0;AOjAZt-AO z`&t#sp0K*Efy#0Eb<%4`tlVzIhlp=?sP!JAmX#7RKW|8wQa)3+BsT+GuKkRAl79`x zF7D6K=GR*WK~|txRCb? z3b^-!HuwDHuT;vIPF;RrB5SrDMiP?^LhBGRr-2`=AK&^A>?f~TLhwYjhvVVhzms@&G6V!j1`5dbJ%0f;AxlvPavI zt1MVg8nBEh9mCibHh}WG;N%nKODjw&FfVH~uA-_Fsui`|b~*6*bZUZM!Xb}Tw^wWL zEni>+rYheX@Xy{CEY^C?tWn`J`eNW~j>= z>$j#;58acsTW+Rf$8bz-=dpfY$_=ZusPbVtV>g|vTS zevW^|DCZ?7a_ts@iIHN z{pQ=59bWg~8YZH6Et98M!d37QMmM7o%#$iflR)I)@*vJdDxMNvq2{0u3mFc`Y@R$9 zQiv3i3Q(8l6%V1#LtetNPQ4r~X8|uGrTZXi2vAg49Au0Jm5AiVD>-;UAj&YwpFj%S z!fjq=6?l0F7(Ps7BJv7Er1sAG&Ae9-zVwnDJhUnBD>}*mJb6nAcYm>z#qDsoOL`E9 zDo6*Sd>RD#P=&zEM`Yp74F{an%>AO-I^f!}SHBxmeF`fRG!rg02c?%V)*Qp>!xzJy zuhuT0wyl}2p*ygeq22@B8|Ji69(7dFZP343w(j7z4aU-182YpihB;ZRr-u0}jM0a= za$#XC4HtvCEBrLSGt8Nd+xk*BUFB@4+mks4(#FQZa39Fq%y40bzZzJY?HZHyLbJhI z+t$j_sS=cf!>I`T7^6s(kO?eE$Pvo4BIRMP_aTX}q7lrEdyARIg#EU1*u3`vWl7FY z#i*VKX&rL7jFBBI=aQv~KZq}TJ)YMY+r@t<$3cD7 zl6=1*K@kP4jYsVH3CR<07#2PA3I!+6JwL^EhZvv;u=OBsLejgRJJi8 z5%`HDD*}IQQDHlSvU+(OA%jjp;Iev?5FT1!O2=o$TVXTHHdZYY+w?Jae{-z6r)#TJ z1u@G+$j|E$jc#tCD&W&CgqyNF$~^P7n2iFbs*6ID65&B1L4-HoM;@OZ^z++;hJoK5 z^xzV81;NGf_3DtpMFX4aGphR(9*&!?#WYuSW$M^y5GLv^Tk0-KzSOAyptu!Svq}H7 z3XQ*0Vo(d)-Dg#D6|~$cBoL@w*%7!fsfaX3FzizNU)oQ|!GF3epwYP=3dzLWI{^{>7~q1 zpBZxG0L7p#m2}@2OYWr*deT#!q7S){^gvK!UwQ4iq`FMUAhhGE9bnY0ZO39$&D8*Y z`1x>t>{31HHAe?%Poir4J&a$mXSU>4lZF&1*T-`K-?Cmg=igZ2mEJ*IKa3C}{C@z9 zpNim_CE;0w$v!)9K(8|YpeWnawTk5`R% zCAubLKkoA8_(Y7TGj)?#Jy56|{{WQ6hrPGa2Y3O+TYGccIFkQc{uCH(IguSpe$33? zoG12`V=Eig*s@2KcQ%(vu_zLfI94GVpG`haYMJL!0dpmo3;$4(QvnWVnF_ytioXnEzNM?ZSZHd!7?9s4y(WiNy zBr_3Z0nKQuslTq+t|a zi#$OWx@CHs2|o@6rVpb$O5#i;Q|@cTd+XneWRm+)EPRZa<84}^K=}DS5nTM;KN9_aT#Wjc=pKo| z*~RIgf3hV8!{gJdlfm$B;tg;N&&T3)a5flYvhg`yhuy*O?Fildv;J_*$jE9oGXw}6{Q=tQbl{+O zBWLrD=I^clUr9=Q^>VS9$=P&^+!Qn_xbai5>8ID9H`c(~IV>ZecG|zkLR@A3wcHo$ z8UFoFe4=sPLqamo)9zvH-^wk~?ndHuC_lrK9=4&CB^26qHIFCySUanu&gbks_kWKu zt=mcH*0U|K-rf7LpsL-y0d4JWm+;Y37-jProGUwQYGki0mr-6q)@r~MDNNvjOs9Sz z4_+6Khi#~hUQb)CSLEQE%mrM~B%F#U+!C^P-4imu+4-M;qvjp_?SKE{{?1Nsr!=|Z zh()Lnf9Qsb?JoYioeQhtq8n0Ul#18saywrhitZg6?%*_D-+57Z_z`TXqSBNK#^sCA za(lcKtn&)9Ag|JE80gYqY(#W@Oz6*M;&l>lC)4TUQ;wG6g(#*}#=~1MNAIU~E6-M=G&80h@**+8B%; zR)Z033`P&D!H6~nqX!dF7f|r;_u%1+*fUv7J<4jlJn`sxCgV;4MIG$)ifM`up>3_mQGrmHIk0WHBK8~@F z_v09u{f}cTRO4}sEGZYGwzJwu7>;EPOvo6NlhH1}^%&Itl_IsuwgY*3@q<(=)z%Y8ZZ*{lHBgo;8@*j*2uScGWrMA%Zs z+@sica3IK!jQ-(qz9;@ev`5Rf*ca{b5>dN60I`u=C_G}P+|ht(gH#)udxzD(P<-ef zsudNvj1cj}3uP7nW_>}FTJ0`*HjJaeo(A6_DjY1dMX@LhFtt_yZ=@gA0jaeDIGuzZ z+-V(FcT~V>P=Yo~h9GZ{Lxr>ZiK$;$(zJ zXSu#)l`*4iFOO7#6N*Ac4|BmZg&wl?ID|Y=4Kb{H2t#z$(4_VPX{)P+2G(eyg)1we zfip^I;c7Z)Kph>l(2kZ_hMEyhC-KIPl2tu7BXma{x~i{c08c@q6hL_(c*gyhcm;9j zX&#b0&Y?6{9+U?Zs#hqb0WW%1E2ZT~RVNJ+rr#>29l#wVl6gASKBG|0(qIP$ltU{Y zi#g8TxH;(5>LN1sg6XviItV^^HSy*z{u6%xqeIrMixAHZ33WJ5+oYw+HJBlNfu*u@Ba>j~ur|u>_c%0=2uvas-Mp zPp8&|fx_5%%&zBrI%T&*6|D|!?hcSk6Yb)41A6Xx^-2XVigN^b=pfs)*~(;j2fLDd!t?^F;){VERpT!v;BVp9^hr&i0bSNSL{w(g;6{s1aI zg1wXovez{o2#UdknqIt6i-Gi2n~?}S-&2QZxwSaHtC{}%Q>gKHc!=Mc5rt8J-tPKh zUy#sbybtjbos84GFkX5YE%%YVjOl-N=NJnibLLMwr0P<)DlLq(+Q`UVENVH;_P?dq z*xXA_hGg{hDHdzC*-tcA11>hP%Z2PsS;^X;g{YV)@sm4)d`31eHcboY)y8geNo@TY zLcve3jiK^8+ilsVt>xOZQt$D3D^5P;G1DyyCuOy1NE9n6XE6{gu~z?}_C3+sU4;K4 zJ2w&_J7;oCgSBuiSAsB|%A)Cwbdg)x3)p_LGt&-NU{s-d$c=D}l;`tKhXeLbZxy#EwJY(s+PS#X+<8Ujl$(t zbtJ75Mr@Kz+QjG_)O7`lAo7zg*P4yLHV%AmhJ2QrFqN<;x(NeLVYqm1@)kwsX2o03 zN^K`J4~n$P=EuKY2!iDT8$b(_r;uDuxn@b=&pfCFIcoa*Q~d~Cg`+M#s5$%^nhHbz zm)IrL73);7*HVP0!YYfvCf0vgm^Jcmv0`*^_`)y>+*GyZM}Lxe^h%t2EQX}=jt{e7 zBT-%t2BsUn9)Ofvuzn&`mJWSTG^gVT{4{pk;G#~^HdUD57p_~Ckf~1RvD@yr?jJCnZdt6r-aX6~6FyrBl2CGn!IiD*xfEA? z3Z%#b((3C=BLe9_6?jB{a}xa=@iJo1#V^aS%2a8QC@Y!OqE%Wc^sy?+ z4mjhA{u|X&p-T{Wub$|p*&HWpsLpJfC)Py`$Mp@O4x4(hsUIMVCNzuzeY9Kx=fH=m zs2+WwctEe%C?r9L=+_GcytXSQIGJ_|OXI2u1x6}?tztQGKD@%Q8Jd`TsSocc8IEpHv zVfn+qADxoHT_<2;vdEbmty_5;%bztp0AF-oFr9X6NPX14i0JqTJEX_3YK*h6IIw}JeuN+c{KPDrh+)ax`bgM9;B&V97 zN|I_-1@LO61d#r%asXUJtEg6RBZE)H-5u8B&j>1^-ZW?vQ<`o}8liy0BO5d${p`=! zQecpqI$rb z&m^6L;xY{Oe<&!@aeBVwV{w{la<8_PNOs#V&CQLM-2Kwr+jwcKYi8L~f0mI)p$bk@ zYGxBRC%1G`Di(fy;jr0N3r80ns6Bn**cKzv<#J)1h*%!~YulhV3$|1U)d(OHQ-BBDAaBz$J~O3i6tpwS4kg2)zze66Y|0bFpQf9G#x&Jc26#4u*jv!0&17e-0*FqKSDvVJ5wgB z?p5^w0*iR^E)TE|XAsH-QK$o`c1uLIiiaHW^`prjoRD1?xKU|r7?p!jg0Fff#mUaISnt)#twW)JgSb#<$Je=*g@|0`D#zA9+-I{S9EkY0!bNTzlL zqTmDPp&KYA(ROUNkkvz4S8T_u^6^!MVn_BoJpg%#D|XMuq#)nXWdvRW_8m!jze+QP z=V$#hQb0#DR6a_k!1Wx?3r&(pG2-kT_q^$zg9;XO$<{kQLt7!`N{9yjdKOySER^P1 z=>p6ww6{6`4Xk?H$4NjlSE{a767QyXYv!b0Y z+Z%jzqP%U{k8_Sxx;;gTs@Fg})2~7z`=mWp1#SK`v}1kLTt!Q1{By&cNtuOq?by=c z3Tu+4;8l;Koy&DM*cJJT3-AOvu<}BybVg9iT2|<6Q5E27D^|+4<0+1F3JW|DLX{E{*TvD8z$&gZH^ z-Eb0|K&`aL$`z0Ux^=;Ozo(caZY@0rb+NB>aesqdDs?kg&W&-ps^?0{6=NX>7vKqI zX|gU1gXuq4BveB|b%l_qO0vEhL!Y?4=S$^9^e_`4kdb-nkr8PS7mnyA7;fU=GZ%{v zudkfTHzj9mbko86A^O-eue`5wbfab9)!xT|@vcIE3S@ka?5I9Kai*GwH}5i@XUv#N zv`u+qE`w-FAJL%Hv6vL+tSE59#1X*K2$zKZIe*OCNJ<~5lxtH6&Oxcq-7c2Aa`6Jm z(758g0|Bl*$k6UCI9leo@*WKxHg496BsC;8o7RT6h7();=~eeog)}cn7N}sVdk#*o z-aVtELAbh;mPZ`Zm{NHiW!TPlsvkk|?6nW!Xe50QMQYxRrTPIBE;^HQaxl?2D=VFI zt;82D)E8Cs8B#MYl?xfISH`}YzEGo!(uc4qERf8U6|_o%Bcwlw`ZvyR^v-o6wfo1TsMOw%2w%jxmX^fLYsgo9p)e z_WQgi$(GDFlbfBnOlPnqy{Gs6Nl$X0AC$#`I1lF!QE+#kh^n_Qj+#eD;%yKIlfVmS zV(5GKvv3mL1%8Z?jheVjMhyac8+@84VK@;%EHKue#r{YvW+OimSBr@|6W4=F@%f0y zz6%$^L(?MmMRE^-I2pP<(;kT4 zYm9p*e(rQHYJ{|Aw* zm~7a?Yq#F%zV4&Debw#`8QE34fBqH|wSMYcc82c=+w0CyyvA=!T(|ne&iTz{t1qr^ z`q#Zdn>0Z*417|8Z_8*LMq(O5AtN86oWwNvdAa-~n0b@M$QQ5TWE6yr`!lO4g5q** z5ApNlVeZFv^I{eN0kviDm3vr_GYdQ?iZQ%WF2{+R1fGbKXyGM7^*D1ka;M^sMycmh z@l`a%x0mJe^8*pgKfkCa-kj)tGV;g4%olGvKVLij!N7ssUiVvXoX+(xFP!1|wbSnM z&xODk=cmrF+T1S=HAtZj3qp0S9ZaR?Iw}r@sWjC0`x&2$Q2{=0E|^dH$@qM+ZEgc9 zC`vy`%u6gYzMC%D)#SrP04`o81B%Xt2K(1tVTH(BW3|(USox zo$7F_`DiHq{bksCqmAJZHk4X@2se(l+kKB>4q3j`k`mJ)>}s>Wm~fd%9Kw=P3dWIp zw~~O&>(Y5s7FHQme!O89hcG8K;c*d1KYo;>TTlkKn}w7@*$%M9(M>3W(ah10>jfPB z*fCtTu%la08K0|kVg%0=%I0&6qnl6$pP8c{*NZs%v17SI>U>)qJqMP0-xf#Dz=+qP zj&4DvQ*Cqf3~H03AJ+>x`mtj=tdVxMdAbc~D9Uj4!vgYZKhuh+(>^mW-I;deOnl?V-Td9 znwce8YuIKc^w5o57=wyoV*pw*Y;vXJOkLGQFiVbKILZF9S7{f$Fxk~!r8@`v;?*nh z{nnf(qf;v7Rr4B>w1W~6u+Ez8kwvMoTy85ZhGSW>un0B=ZBmt){kI}x?<*!>viIWB zHC$~y5yqg+9A&yKNvZk@WP>glRaW)^C?r@J$?X8OzR7!YDik%_); zT8xSHRUcwLl>D)(PdWKf%k-7V-WZ3fGeNT16~7*)Fk4yXqMG3yc>h4Ov-IcO_V!?f z!1g24{}x!P#W;7oz}#p}ze4Keh#q|vdH8APDw?wmx}tPpFl-wEf{4xTNypl+-DS_? zDB-J?)382O=6$1&P?05bu*(a^a+hP?w$WaGsuCvOIZ3%nt3FQqn88X~n`>U`)0!KUYrf%-E2E`TmcxFA`B|!=f%% zCijg*ZfYM7%|w#D;-Ph&9l-e&b+3Y5?*xW9_ezPaWWrDnM3@U*`AMr+ zIA3;zzh`^2*E(jWQ*amSkGTP#>_myO)qxNur_4~j<3D8lw>Cp!WsX=cmt?JDKO8~I zZCbK)JU(C{A^MR0YYb!w60fSO*9N?gIw7k9LQWQB2o;l-<)hN;I#RbI@eSCM=FILU zHqpo{lc7>G*$$r9oi`Y&liH&1P4;29WwB+!2?lsjel5vKEY&oQkMnW`XM@PsMLU3U z+?a&gLlwJ46*k=ru78wt*b{W|a8FE>Pri*cQesj*=7Jd_N^Ss(p8? zLf%Jw>UAB*-bX&w>R2f?9oV`%8bN-n zPV&+3jY_d+wxW!XBgSF+G+!p7%7{Mdrih8+tVxYViq;eo3!~vMB5{Zv2 zoT13Y>MPQ2WMou+F(?&&yLI-9!l!GsMc@|J&Rs6bK@5QNOn-F=Y}jJfxHRYGOOM#}5Wnr1_6 zkh^5Xwl*q zjwnsENq*q5DLxKWfs!5eCOs^N^*4ta{a^mVA*6V%hy|)v9E`aetaP_ZO_m>@UX}vm zsd~)us4uM&+7o%J6a;0zObN75Bt<1cP=xmKj2wNe1=d*5s#XxnKIHwp;*?-D+j!?W zN!vaWuxJAYF>UHIo&_wI#PS`AF$w|q= z%Ab?dbRxInvlS|UuAQ(R7fY8Z>h?gJ+1vR=gUwr62g97xA~)NZwNTfbtvR1mlwMD9 zwX^zWd9;sJRjpOuV!$ayE6{5m&&!I+fyeGZ*ypsuM07A=qV~DsP!F9LskX=D`%$b^ z1|0G=!c3#FFmrjF`~sZ|xeG#7EZ(ISHFP}XLgrAf#b zlK@{^JTJ%Zgs~o#!24zNj#<8>$28;{0Nmg_?7bfe;=>p|`$>dt${t-Y_G3=oSEP(yY<+ z#z=T}!0zoYZ=Es7`5^*ujiSN5!a9lWF3T5c_$EqZ9 zf_p){2PkN{B}!V7>0ifrVe>7%?AdWpNBeHW`!0Y*x+p())25lPt$mo`ha9qle=6)J zRQ6BEVULGWqUW;9!l?<1jfL7l;andRpqkNBz}G1bWQ%v7EM`dx)R@ohN{rC8h0hploDJNMM+y#7GT46NBh1ZzExdD*x5bmvKr3HcWZeK~%SlryE;6 zHTio5O7znjKV2H*>_R%GDcC{8HYu%p=&U;*;u5k9p(tFsbDULPYe3_7p>`VepTN03 z=iQexY$>m(?O}STIbsorbeSFonM@94`r%ypi!-SCzX2-rTOUPEP}<@y1cB(Zh{-}` zr!rkHf=RHHL&QqS-L!U+p|cZ*L0q_`mw`q6H`~Z&3yFz~7JX`rlL2X2^lUQ`+{f&< zc2Gi?H1qf@&|n#4qserHo5FDKJCW_)^+QC9U_TBdS^>UBvq0X3Ph+WmGH$l&)lqVj}G%w7oOszv&7Rq4>QGVfQH`!@>98)kVOqF3|-b?6>e{f6y+1 z>B(_BLZ&$Ji3xLJ)G17!1$N zL47Efx|Z85KbtPlUzeyG7TW*72)yA`r|(Zsa%g}`lt4|HLsnaXtpG8tcZpBnU^H;X`Eg5>Fcc1lF)yTl4QH$9=XaTsm04HS^izr*1l=%h! z<^!{t2bfjMyw@q7@~sV7PU`x!CPapJt1;xgiLm?noa0EvRIXw1&+ZV7j@_NDgD99+ zZ0xuxN3RAGxqRA5aObK}UxjcpRZ};z(y{u?^zPIWnI!z9PG>Vjkw-yrWn?mAcH{oO z5vOQcDEYyCFN2f_dl5(%xp)1$$P>(oq)FS6SUXB!@u|t-KDDgbpIGMV1_9n+O;*XL z-;Et;6{H0(2kE?b8dM|+Li4w&r16+)XKfajOoyOCTe_T^T`>y*HN_ZgS0dQtm}8~l zPxyJZ6A$}?CzK2QqiqLr%C)Ip=|MezuAvwZ{uu_Gb*y6Tty!vd80B-3o?nG;I2@Y*|!sbb3X=frmksK3ml9l~4q> z1hT$!qNG)bN>t>;MRLA@jimC$PhpH;=eXoO3GI`zD{=8E9F1f25UCdOo6QJ*jkpWL ze{N#kC!^Amy5`Uz{c`7?DDM?$t5Q@yVqfQX9+=$j7H;~%mZmsLEX`S>-(j^Z4{MKEZs0SMGj2DUR!Y~RGX~JR zG5^$y_%Ws;UHyvl%#3*C_+0jNZpv4_3XJh50<-Nq^VCcd+HyHoEmF*VqkFZ`pJ@*R zas~2IT9@Brhxa1YnH}onqs-vbEmJG?q7M_$989Ulp%t_$!`6`2WS1X~Pcv#c+-fNr z>@(KAgVzwLx-8(?xZrOA(LxWKvPh#-`4Js&fSwH#LO*4sy&tv>UuQTZM3BspV7hwM zCt2j>Wtq-vlL!yCk2sTTHzr@|IxcQoPI$N-!sLp9xh^8d?=MS&QHp{aOQ^uR8_%Cf zoG}*Cy0HK%?T}bhRkCNyR7mBbietzn8b{sbD>eA{j7qY6>M!5 z;5_f^!jbB712x4_wKhzE?}S?8?ytIt_E;n0M?wU+U4tO*Is=;b{#Y_z`dvgD-_>1g z_OiU%c0n398;GD&-`bvh8h0cBTEYbXja=pRHxD&K5kf))A#{&jWA$AoO6) zQ3HCu>wOZ)Pny9NC>GMaz&6ScY~tgW4=$rFWW{y-rE?2|GNo(2^}5g`!VD?+>%xOUKQz z>*ez`S>}E73XL1{j5Ws82Zk9iP*~;RFHE@+tYuQ(nrmRG;$M**h-+JrPL&Xqk9RdV zW#g1`xnW7J9_e?Irpijwizi@1I8o#8c+QKU2ND)xtTLohJ-=Vh%I^r0%21@sx_2X6 zgQrevg^W=qP`r$5XlPrD!S+r%w{!JkztoiBS zs9JriFS9a(X(fbaZql}~F;)%c%^aQ|&tlFiF706xtq3l0#>dcKSYc|&gl@&{3f{Yh z?jo`|I&9d-GE_=-ZH6m&hkn`g1GP0Z_g6CE+9sv~m8Q7xr|Lgv@4(2kaOD29twH_N z!$BH~B_E@teY$k(G`4ZrCrU|$E@&H5=blB%Bnj;aexG z?>12neq0usxWW57+5_1d^`EG-lAKM3=>HLQ9xTZ|$8Pev91s(mN2;@nitGdSG+U^E z44xgN!_GG&AVxsRp?gN_~{1iKU;)D$_gq$C9{4t?< zAe0UHlR&~*6M2`%IhsC0g@rn(KosN5v3oMp5h2Qb3gH~QFp3NG<^SH zZM{uoYdBnM(rX=O0I9#(8h|_N_EzE0c3D9lUu0ODY5=)H-**HgT};CYG|mj&_PsXV zQ~_$dYL~G_nh(KOE+7vZLe5x4jSf#h&)wY(0X<@FC}9s>sn0Y&@jZg z8E`tgikL!k27-O2*D`#}WLx3PhfFPPx%vr-%fbQ?A*?Wnq{Uw2%f==WBn1&3+0{Hr zOef?^Vsxs=m`8rGLltaAAvCTcCiUGV&QmreIbj4Akkq+q$-$ zKG;|1N$x?4L{hNy+R0Y=C^7h$WzoCi4BHX+yIt2n*HPyg(xF z3luS`0lOoEzThp`8aSqOb7lXj@t&0Jw{Vghg#n>iCa-o@Gl!BkYIoeDdx$Cj2aD~wlc$a2DfTo@=VXh zM5NlOVE}iXt-5NP#^KuAn{1h!@g2iUfU1+F5J>6_5kqSv09)@Rgi0+xvj+Rw?Y%b7 zN)5l2R%PCp3_DhRwlQOq6+my+Q@bcS-?+obK?UM{VVwJ_nzzDVF;CD! zrvFnRe+PTD$Wx2}xq=ZvpZfx3E6a}7P32IXAA8SSPXl57kkSeZ18e73yVK#sFH9Z6 zdtOZqwnI+_vRHM#`#ymVMaQwtc3#29ZMprE>ypvWtyl%aWk+1Q$VPc(Pn=m7mS3H9 zF{tD+7$O^R=ZH}rY0znBCBx3HLc0;#IH|)!yd_8%18ykXT$Zha$CfiKF9w>r<6hKz z5W!nE&+o!s7#~w_;J@XRZ;8WyX~f*mwa*vhpXSnz-0%o9{eiWWJGL{}LyN<0_B&9p z-59l~`e6HUQ$cytzU#X^^HlT%(g4<&+i?Wy3N)o|;jku(`Vr|P1g9X@+ZW@?YpH~2 z5`n&29O(zll~zes6wlvZ?mH;nziPSr)qQj?K@-W8U6#I<1&1^n<6*PqaamyVrt2bd z9-aV6K(@c&_`niz)DmPWnX!9(eJq+e;?@~jVn#^1bI&S0 z4QiQ_LUH;(=JlEZ`SN`l0N+)O*#$~RHyI^>toJb)IhC$Yv1nI~L0V5#SP}F{0 zHIpmX!2N8Td7Ed>p?#dU?BCARNih&z( zV?wXy%t<|eo%ck`sr`fL2ABCYAne$Qt^J=vXVH`$-J=oI2t9;ZKy^_r(O5sNAHM;OU<0ocSP*?5^*8WJF2LA56l1 z;YfRl`%Fb8ToxS}46N>ZI{bmH<9cd{^#$!B)Cft=%?`Bn&iq}5vphF6X0G+jc2-Kb z4I$2U`8kh7H$*itoqbLlWg?I@@fANLv;x?@6UcH+sWj$CV0P)gSh#)W&C>~`%D%PyH}%VNe0w2rF9|*nPrsu301uxiE2i~$2Y_SZnZbG#N2oId z8zLI=bSzf>!jzaO2rn=fEAP&FZfy!UmuK`jA><+UrA{EI{NWz~a@EhAnq~jPEWw@ZS$5r*L;mx$s!1xnE zt&y#-3y{jRa46%JmCi0xa}TgERZmm94( z-OzQA5fxq_`S_db!|1>M4KDVuK5KR0O`Y0L`yec8!(tQ~bF@d=4`tVE&k#nyZX=O| zL7F8@t;o%ty9{PL^tOY5Vil$`kf@_fRuy~|<)49xmDeaFzi{QdtKw;c9HH3z%SG*4 z&72OVgY_q(1JRk!8PMZ@$s~PFr9?F7n-vD0m|Z5i1m5+Swq+*6m3E#~Bkw7YZBk0H zg9)D(cK4f@hCBR}zqq-bfj}G;D@pSw=b4h!MN27-6JG+#@L&gaGUDlW3Rwk=WC6`& zFRHwldb_yS4~Kpl$=Fh6i!c;a_IPe-_4&cdrCt#)3CPc%yQP0U5c=tYBp)+=;of`T z;oy8VnG3afE@qUzUVKS*tou(9%@&Ipat6COVgRitg8M@ErNQ$QcC7q;QpOIy+A1pO z5;V0t%O1&9Uvd`B*!ZNoz=f%_lLX%u^jVM-4sz29oY#6_z|d9&=B4OtO@i>00!N>l zt3)>R-bSk`$$}9&Y3QVtU`Ij_ef23OLdEhgLIHj{5|vc{03MO>Iz@(5G?B$2IUmGZ@I9Qh6AW|S%8x#kNLqj zAmZTy+f^3D>(b!#)fRCK17m%8S&5nXA$O?i#j z8fTgtPCj5()ve)0Pg8Ef2%H%M@*-Sf>&&IstE6~}n2zhvf7jm8!X3+b|E5LTaU1Ki z{#1&-vFAs)28xO;)pk?z*+SKlH0Np3!R;-R$`}`Q3opTW+$l3O$mZN?Tr3z0TZR94 z?Ja_fW#WJuwoK$$kX5p9)m7=h) zHV$BDNw0U2N)?})*r_r|M*qTbvhda^?C~v0FT$ zaoXJu;QXj!Wlii{X%6(Z)SFWPALIv$oC?rt6SS-1eT}r{tb?Y~& zt?eMJkQaqZyX^Pixm`f}aOpLups?oJv?*DQPD8zD2&0IqEdPRhN%*_jB12mpyiHcX zhhbH|_Y5m~H97;ARdC>d4HO5%TWvaT7X9eqym?YnL|z9Y@F*;g z_EBw%nq3GwSTeeTS925@fyj5azuf*5 z-=d0)_h(LtMb(uRx;Zj($UI&VwLrP<6 zq@}rP6wqpfJ{qG`Dt{*TmVAmQop9xEQepjccVikXIQ2z@zYL@VwW~Md(C!}qZ?ccC z8!pwGP!jD?GHXz}5=^f1z@nTmUj<`B=p&oqO(9{qANEvre%Oevbu@3hPSD*cXgduF zGlxDqi+DL{^u?%Hv=X+-C~lA~7I&IJHQm@1;|cj1%`WqN0ujz*S(Rsl)t%GRR_xX= z+cN)QWTDtmU^b8}Pod}N>(TjAlBl<_dLGimr)I>rBJ90fL)Xp?xV&f>Akx2UiTp$B z`IaBPucr0E@P6E8nvQ(aK^IPAxScv zVyXXZVjP_FEjGMeX5He_9rbzq(;2SA@RdNL z2O$Hy{ATx8yJQ~iFd#C=L=TxPkFQ|xli#2HwZr-i14gG~-UvZl!UFs;2vuvXa+{w8 zah#48=vQi_V_JDYsKYEX6{YEN_S4&+1_v%=8~6kt*52P2JdygP;2;%}E}N9>UqYbNFJ#!(KBj$u2o@ng8%$k+oRYL`*2Lk1YbI*Y z5eSMx0sLmP@l+$)*OZ^}UCalCi{nkpwdFU29%AY^SznuKXzAB>tw4Xc?xxQt-O(R7 zXCO4Jycg};=4{iv0>@k#fmB%Q6Vu9l!z`7`hl|af(y-b{zPv~T~oG7V88H@vDhWNo^PdOE?xBiHqO>LMqQn{y=ky3?}YyWI8 zUnuS!CnNQ5WA-D?tS6%)_3bHOf0xABfD{@~=_V4x zOUG&S62WHr$q|RfqK~GKlR~u{rJ5M-Es#DEKxLl=?hp0Yq294R0>(2U*;I>`md!8Rn|>1lDRoa55*IzUgP#Ft8QpwwGiT{QV~ZF8PB!X0xpMTsG+i>QAW*I}y*^ zpROS#8?VKQyra#B_YUpb3(%3(Dehso{7*D%&g){hKV3UkcI9CSj~r0g$KF*v%48Jl z4I-!xZ8lyvqJRXM7L&I-L*Kwp!P=dK3=uz9lBb*H#1g?6|3k}A9>(HIiG<=UA$~a*x6U~D)eOR^ZytVc{d zf7X@RxVbK|9p!Y4uSX9#9@fL{t!KD+E3kJHbq_sC^&Sf^uS*83rGnf^(NImXysy9b zYLw2#R?T5vUoq=glns%bUS6b)4~@L> z9!JY97KL#&qYiCa_PbP8+Hw>ZSq>g_V7?Wa{d)9dSJv#73$#C z?};f+x$A2(Z7#Bwk%jg`H~xflO{yNsd#OsD4(hei?k)Xl=9mnAfkk%zYO22lb_MEE zwXj(iM*X1v2*;v17jGu+_*7hJLJJpK{(bNNy9BBph(CcS?5B|Zi|w4%-ImAYWGo@c z!7SUq&Z85{3GbLC#%GS2$}ESN*a57m^2MB z(uAXS8{{|dwnA!wB-9ax3GqnoppV%(FLJ5!jfoZzC)Sx;Td;rr^N6C4tkT1QKjI|o;Y`;WKHKE(#KOT8#_U&K zU!ZybSa_5WA4CnD2Z8+R8Q)6`Zh|Hu45yFQnjlGlUyH0aVWG)WWSOy0AV)_OK-X3tm0V#*0 zjhl>3ob&md?>|jhQ#B4R22ANoRtG#;wa_C$Cu-qg{7ctOF-RK20HI{MTlAIFUm8C7B2&@5rN?saiA`t)mR zD7;N4av`730c+xxA4P)jWp*~*>8rz@JXz~ZzNSqY#?R-Vv7>N% zTm>s)d}y9;Ur-uZRGG5s+feyz%o&?e&5&QZW$*9Q@rhMsRu5~b5=l))evp-)$Ry5r z-5scx5E_hDR1wP5@I#R>SbW@z4=(XaW!>s@NpwZU*>-HM=xV(cea7-{?raw9QM=`p zgi_D`6yhB_I~y+^q)&oZA<_{0Kd3!|Io!C>tu6$P))+C*vl*BU_q2+V(u3ywAXQe? z&n8%bcw4IfLh*1*JlxVhs1Pu!!xONL@zTe^V$w4*nE>-pjmFJC9;n=&n20@uzt1Za z8Q7iPr?0*J=2QirV!iwRk4_nFPzqOIbL7N{fk?>X#_g;_LnZSa2-ahp9rkr~1%Y}r zgXQAF@~wtvI0)$qA5Pq(>6B z86}Fy8L7M1pTK-&FOf3!^Ngjar%8>RwE|p&BuUzi{knk~9_LpP9_RgTy8M?9p?b4M zms7=j-k!neJI#-6=TJTy8h`ZP$oH7h@}mN9C+*_0qZsWO&lUd8VI*glp<(14N40u- zJ^VpIMug(+Kk@`Lf41GV&u|;~?aIT|gM|0~!Bv9OEvd8pD5Cq}YSA15`5>x*e(sr| ze1J@AMhjv>0s_%(99^N;gRvFM01Qn%J`FRQD;K^9Ya=5_Q5^k5W^cziPh3`+IjP$ZdOb)bTU56 z)y-9?)``D$JqvMVxMSTcDV=(*R*eOXG3QFB!W_QwTPj3yt1L; z;dct|aciOS<14_Kns+&pD|gTr8LP1P*Tcrn^uH+CFKy>l#S(gv`e6%aI^CmM4SZpZ zi=>Vl7KrBgYDolqvQ)D8JFJR}t}x4O1^jW~5Zk9#jXwfO)q97xS_XFjN!NynwnOCJ z8&nQgyxKd2iH;5bI>Z*-O|W(N4gc6dD8=CXxF{?QeIC_&%om~1Zm=^PVk^G`jmhP? zEz)*GBwPRogYjg7C{LU{hrp`MePDVo?kzL|s4Hi>C`9grrbsQK1SKbur+4x<|cR zx6(alV$D;gN}x`FtLX_7w)*QqSa6C;Jhy&TcKc&MEQX}Cw_hen*#K}unRC5EHc`^Xn?Nv=tI?1Abm) zTROK}v^W;I9mENvrmqp)%yxRrwU^MXd>TNC<%$#tlg}o6DMoD=Gw={s#f8jaYp}Rb`$iSnXj1l+&Lz13G>x7Vs43HF z(E+qM9jfbO;Jhz9G~V7mvUoBAgxzaM5iY+s-fZ_2-0a)DfdqLkOI z_gLY*w0(x~-NZDP#r{I0THN>59jJ%WV8qvF`Ov~i{O>R zRGp|o#=aGxwVs4k3*)}pDlS)tQ_ob#NeA*kBdORjXGEaA7ihqpZ!Jx%U-nLmzLz6w zgJwEt8QzuE<%pr4d&r4M3fsslcE2qojG30>X;=m%4kQByt#r*F2J`RdAgGW zOuXryg#489rw{ZG#*gMuKLcir0uck1Ps6nDK6RWvz$9xIhWyNoLPKIb%iL3=v@?vS zl%DwAivi_dWWTtTt!KL@W;Y$c)E$G(`ZVG)iA96WKF@(fM@UI#+ zPA$!kvH_*M43o#4bV*IPo!%(>tUrHExrW_7U{{O+5^Sa&|6a?^rw-i>sTrM{-Up+t z8?C>FSE0--t+*q!*_d)+*t+cL2{8~s3gF#_A?xpU5%Ij%o=+Y-@;kLPmP70*>$h}o zCVuHP^NBThPQ@k}OPv@&PMy_TI`ngQ(hX|!ML7ilV%&W#a1=g}wJr(GqjmOnT1io^ zJFr_o4`&Xk-y2GVP>e*#i$XA>{We?cW!B&4!ZG+OW7-aHK6GSTkvlK{USyQW-M+bA*UsP8esUDsLWsAq3?VDp?7rn?oGJ3Je5p^H} zcGpz6S13kTFBQ=c=vvXr*MN;FEumUGS2!9Y6y7>kSR-*=4a=c;em5aBw;KgM`@afZ zuzD*!(Y#=M7H*5DM~abHbp(sp035M+qE+G;uM(^tV#&n}_ofbew&uAD^a2SsJ1X96%M>w; z-Q8agPFi+sYot9K<7qD&j;)nrnXG5z&W=N;3%J4y?9yY=qD{mwOI+kq18#H0HuUX# zN2Uv8A_%1n!tH^rQulWPlgEfBkM%JipkRfyUOkB$RZilERn-p(P?)es=gn?JVuO$) zN6c8m;yEehE%i7j4>`cb0&PEtDf5}fD6+;kg}d*zv**?cLlJ-28vEJIhl3&`)2Zs- z*(f7NpoN5}9|zc_$Ls|#cW|PUh1i1;^X?*Tx|#eg_)L51=5~b2ff)F-$x?VqeC0NO zGA-fmKmFNd7W1oswCl?C=tClgkK6L8GnzC16XUr0SgXWk%`lo)^e;gh9=M=O;01vb zE%-*X$6BHERiTI5+DTUt+xG04$HIlCBbVmk!%fpuc(jZ3x*>Yw1Vv z{DrH^Fj}hiJgWPA;$gDiZYoxglAg5|-3_&xYkCb?m7E!kX$JwdBIZBEs~L&iY?%3ACO7 zSP_@g2XYE>I!3?%-JH=r0LG1fPc3#4W> zvTMTn$*2pwKj#amU%&f0=+Ou#Lcu;20f(wxxJ!AWUq6lHe)8hp+hWhK%Q)H>Ymj12 z^(V_oSbL#Z75EmwcsjfLDa3$!PRA#%;nznxEhqP%9#bFHEjO^;DHp0P+d75vHF_Ak z64d60`cJD3%@&Qxhd*C<7CHPJL`KKyJ^ay>axCP^M%Xg`_!3?8020F!Se>ckfIeB16(>fIOwY})Pv)=9) z(DONlgTKmdP?&>v$R!5~E*R^(8vE%m&)!>N^CJWS$oCHl-LR3Hx?@|kwd-3W)BP6A z#v^CW#pHEGRounZ7GD}A&Q`PV@NXF(8}6htKS3+C=*=5y?19n=YUl)iI=nxg=pDdQ zX2>B@IEyILTMcckp+tUDb{7wCT6pD-AN=c_CZo?su)1XuGhj6u-o$GRAD_wXgkEZrTi&V~7URlJD&$YZB4x>^ zrBPQU)Q=16)Sc2^Y3v^Qc4 z!e%eU!kEfP6V#+XOQRuL+S#D2^=BK3fT>;@%=2!zzjAJLSKDAk)HFUc zv(RL;&+`vg=8>MXS#z*xfnu_E)v}{t2hD6f_7V%_9>#=Nms{QN z;JLr5N%%-xD)?_GLU4W!yu+6O%|D{??PJp@0@R6=YHfFE>u)nB8fj7UwTEiB0ZuAl zBMUnnwbw!Z8?7JSK?BSg5MUGc=$NZV6AUhe{QTkEJ_1pBs8vd7B8q~>lnOycbV$ZU z&Qby*)kPNiz$=RT#CrX)nc~fjKXKtSCKcR6&NkkIN1BLf$lnnUz}OI4q26{erhPGk zGWqnhwZPPDMo^E#82Y#1cR>^IbfC6G9dCR|87~gi0R@x}72&ep8Z3Q>rvaVUt5d*% z8Z6<|s^7q&4+@_%D6MQ%-6eTd>z}ye43v@Izj8Ag*tIX0PIh4%@JiX>Cb3&wM^_)wSI=gfykuuw$a z)4H--!OX$|s)2KHY-RgHe6)GKj!Ppm(-Nk5?3K5Meyh!?zl2>BcqYXQ#5g-RcIWlO zxQJ;g3Fg}PEuEJxa@qxZmb-0X*~YNXI_9>l8RH)X4KmWo->_hY?8{PRo81Q$NqVj@ zBo;OH@gz)w*tNP}B#Lr&^cir-ge>vuWI3`*$rE2>Y-=S`ISO?8788*i#`k}k{MvyE z&q2k!--mjYXv%$s32|dp^)<@>t$Sb7n%bH~oLpq*iB&0tL`n)3Y(7K3YM;jz>Dq6E z>lw#PPAG01*YAJ2pV%qcD*9x2Q*N!ea+Azu4JiR*N8i936~IZqlveM&bkc6gKwY(| zzR;>v@uTdv@rN!#jr_$07pS(f9yJz}6>`NI`Agwt*k4bO>1r0h5{DQr)!eeb!j`HG zyWOCF*xXWTjac$n;cqCqVld?EmAj+>FF|&49{ae43^v^sa^aorW%}xY4y5WH`)1{W zIkj}Y4Fma5?09zmA3Kx!Zy*~`KhWwUD8&h*rBBWYvqL{VIrC&+L^N5!XptnwvUGK_ zkqZO-WF!)qIznm?JyV_K5ZO)|Q^LLH7GD?snVn2JY9=BczUu*9k{~BnJ z&z-PK-@)^Tk|>y48N7!_pM!1k(^RQg5kjzo5D&c7$K2=TcwCDuQZf&@ls|s5LzT!O z#=EfCerz5LVRf!GpC&C%^a0>%FXANrRA6mnRuJyzoq4w;H@mAUF5&nt~ z`Ekh_@dj4xHJV-#!=J2Wvr80%b3N-chTcEEHor7a%5CFi5LzZh)Uak_@O5lru@zeV z2-5IJsyfV+2z1y81)Kd+0$sg8IjtL;b9a4Tnox0N^N)?Nhs@v}k)fJ9d zf9)1lz%rMrHP{+8%n4;GNep$}XdB;oTssA@aymHRu{XhwouB%4IT~U~h6{x9x?hq<{*El9yz@TE}KS84n zGU_)yU9XIcU01nC_Z;Uy=Qh~@y4F$vv1q?Pi~N1Kw|U)0d&Cbci9DSOdHnr;pJ^`T z8>X9Y58zek)xKXW`Crn3S zRbVsYI%@hnp&&C8j>W&&SR;2bh+`^5C;#fzV-)c}xRAkp9zh(dA*_tUCAW;f{S0sO z!P_0l^ulzz$UD+$v*H?9TX%SW4Hda<8WOYZ3EH66B8*UB|BcRn4(1A%H}=^K6E$OP zr!jcC_hOG_r!#n|<| zC4bjB?I7sEOD6hx%)T1+z@?^(y|-{OI2JW7A->XKpsxaE?v@E2AB~YefDPxw(MjJ~ zxpF&09yiTW0{riCRUv@WTWq_~nuhQweA|7xwi)wwSiPZ|pUrfTnL_%B^VQFv%yA>m zyW$Hv{Hp+}W&1xj_$pTaiE)2geuc*oDQy=-Uua+1ORXp9*hc#I^|M>is#MWaKT@Jo ztIqA)pV;)Qf+4Nn2sI&t8E3m4Ch2ilE#*N47~aL!AA|?&R?JwrbkG}PM5N{nZp-_i zkjd2>G7B0?fFwZB=&>5NU}X~{)WX0^>_vjdjsQvN#fxae%%?%QXoYo2+h5Binjk;_ zfUPIq-|9;AKYA0xtaXLr;zubrYoG3o0O5NA+M^C*5)~-p9PfC<#aFY98QRX90>A3- zg6!SH``x=}GxTyeaAJnxI3dHxYff@fe=t%q2PV9Uf_k}<+Bb>YrsE#{)0NxloXVgS zuCF=Qguj4I&_?PsyX{h3u1jB*I_}6sg=dmLCboOHi!DxvJyjNZa%7AAvzD zv+$61R_nyYvt$MWr)1;?4BW^>T#p4@xig~m)PyUSiNC3*uQV#av&+n9{SVqy$S{iCc^eDyU73Fn^zW`j)gT={C`DIj92DuH z1MR#STYc5=l0Jc|JiibUFr&Qw9Q&nW8(8E;a`k}dVDACOzC4O_=ys1QqIB8terb)72Yl}eB*>7AYUL*ly zv8nA~S8I!wP&cY;WWrmLyOC9M}f9ud5@aj#2a}f*tA_}kA6J6sZ zpb0ylg}Q8tKim)8264E9<>@2BH@LWQYLQ95epB31Rz*&}UKmJOYwnb9yk-n1nNXYD za)N@OK#tk*ZW9hJizr5TLu~I+k)la%;BF&`U}OcFwZ1t8L=f9IjHRlN&AGZ)FdK~AK$wJpK*Dd0)ef9 z*}tSSSIArwNw~(+{704}12l7|Tn7|j%Wo{l6QHg8y)uTrRx)=wl}YD@b>zNKw`34V zTz!kxnoTGUfFvX!?4t#5auodO&CsA8mWruc!PTqzYr9no_cqHF+y|d!# zTqx^$QTdMGYv7K3#fyeYu1evGlF_m=?0G+anrmXq}N2)72 zz`RKhciMz1IFX*%V{rA@#{6Vr1NgW6|5Y(Hv#@ovv9YA1H8FFfv(Yy8n7BMvKzA+G8^hK7#Xv&(3%;#{?F>5 z|1QkT%>UUku(7cG*X@6HSs2;q0SwGcjI3<*tPCtn0D4Ad21YgjKK=h49pL2PsArFl z4{$azGST~AeD8nv`Ts-9m!piq_XhZ%mq6b@zJdM&>>Kz$puR!>Pr!VG{r2-8aQ_4F z-w?kc{R833$*_R{U6x>!2O2z4gVX#KM21OeIxls`d^U$gW?nZa`5*teR(Slw^S|)=hxa$%Z+_nbzXkmx_#a{4!v7KZ zkEn0a|4q!d*l+RwNcR^sV{7Y57O%KidA$`K|j~&$r%hegEkHF9yC1ejENa@@@3L82dK) zkEw6dK-+=i*?&_6ob&vDO(TQ!%p>Rh1Qvxc4dg0+!>mG5SSl$dl#1qT1+G>%sb!(s zcNbHf3A|Ig3FIc71>q`OZ0Wc)9!6^lAlsU{d7|qs2U~XFQrn0m(csk=qRV>Fe0Xc~WUbHprIm2^pic;eCj)I4Pw< zI|luic*GD39&$p9wzWfu*92p8!1BKNeW<6C4vLMq6coHb1;|3eoUwDsodTMU1S;k2 z=jSGym|R*;L&eq5mvOoECS1&dCb?1iZ=8xc=`G85HKh}+FL(q$X+6pPJYmdY^LX77 zS;QqvafG*qr5>M{Ut9+665Mp&tP8)=z>&7>2|=j?Eq%VQj@hm2R#;<2D$o^HHOlt) zSF6>MbPM=8*2Ozu+cB_QrBjCano_DO`*0si*erqzr7#luKFF-TXacvQVBvB#2r6>8 z3o)}ReiS^mFItyW9gi)bB0&;$x?-2%gbnSW@~0FL)`Fxi7ASS#A2AJM|4zj55MO?MO3G!a_Wos72|p3D1~Lts`Kl{vA$i;+Uu zY9i^O@a03C!H94>^X%t1Nt0vZ!hz{oH|RG~WSxP05wWdChmec^>G;*rU+dcvT1Gg0 zP!}yoH%Q*AMu4fqvChYy&O1xWZ-=ZPbWOghpTlAHcnrhSqvrWcoU~6}R7%M;Y!0Lb zX*ht}Z$zGNgMwW6ca3t=N5bZ|fEjtmqbB_@$OyUR^NuP~-@H(RwVlIH6M~t7_NJb7 zW1G4r==c?Q|Nd{PltvotG0e8V(+%Da%TqSa9eznEE=mvmR|Bc$i7X|ZITxKMFmP}6*ZZJr7V)Pcv8IWw zlGczIP7Mv7jKd*S;1#6nF^=@yDd?yeW3&nP;e@bfw?qlZph2iJGXjiwl1M=SBA&ff zeXW~tDmIKB$6sv;mi$R_^iG8pF=f7sX7p3rv#v)e`m+;WPFeCm6ZHp+Ac~9RPSzgj z+1q>h;l%_`VKaT+dM?tl#1n5B>d&g3biBkt2MdzSpWDtYEwi*TVO`buM{SJIyBCX| z_h(2VmS`6;%_Ow-E=P>m9^;yq&tlwP$_ym3Kus1^CNVo4^qYc92(CC?&r zM&)iC_9KF|Q7XdsunoVa3fu(LZM%0%TjlO`1S4D=2+e!4TJ;Ww7AiPMkb#tS^?#$Y zoKqCyRNyKo80dse!NAxURgp7JK-8)MA`HeBG%I2)FsVXJu_B#|uN^|0FW_6A3;!An z>r3346*>~gt(&fK-B2azrrgZ8npg>Gg`6hGKn6kfaMGa?f$ zmz6#Vgc+lwwn8XcvimS)Q)PU))#}9j6rW#{2yRlh+I!9v&zF$keg&O-|IqLn!a>Th zR+KYT(Ar{WNnPQ(rt@nICs-J>aeoxheXmKaN&VoW% zn=Jof5bxy$uw$KXV3TANhGr5I)V7gHsUt0Aa{A9?aNwj9yM}!c)2f6N_yxb5Y7Zq^o6_&`=Kq4O*A@DY0JN zK#gv2gQD2GumfDSZr>H@l5$JZnO33IQ-&&)h?Z)P`P5WJlU72}0R)zcTwtu+h^ty- zg$n2ZpFshey}gthgDLUIsL>_P#Etvo9}R}8qi4@i?g$Sg(Eyo<;DPR9Ci+BzS+L0c zo~IVzXs=vW^gaa!>K9|66Sp6(e!(VySlb9}m-vg_CGRj;v-{DDC!|P(*cON`1XvIt z3aRUx`6+3fI9~yfL=d?@yd1gbPnIlMD^wo8sDBK!BpSL=xME8(qvst<)5$dSl#Il5 zCiSk&#SGN`m{lkBc~LvT914Z|lXUfQop}@~6v??83}#i$3+A$`lS0{ofrJ{lgT!~| zZ>zTYpw`ZNm)2INJoqWA&%zWtk#7ilnN}alli}{48{2q|7Wzvt4T7^^y`wXNHzS1A z$!Vq$#Gu@b20(T_Clh*9mHA7`u#cZ_azQUiTHHwhbs%Q>FtZ2CCuR$RQ)ezWiP#Cu zbLr+wI{#?FB-kv4eoY+;9Z~uiW+k|K z5=I&%nI0`zV&k{-8UXzrwlWjUgb$?PsjY-wAcYrk!6dXXu?kw6Rl|?zKnwyT9)de_ zuxn^y%L=9A5AdZOm_r*o6;KUO{Pj}E{44Vj&6FJ>M}K9U(;R_t1C0 z{wL&L*mw-0H_ase{MBt1A1snq7%1I6g0r3H`YrO}nS7ahdh9zvdaK5_&!fpg7%f5V z;z9`>zIk(wCgr;wN-s2Rply^X=3r-;YKGjo8=`BS&g{p;lWkV|=yh2ri8W)m0%@=4 z1syh2^4-pX;vYNI{2py6zt_q+xyGkLA-XU78J?eVwtYA=ZQkdCL0(k31NyPs!2_3) z?n30&VwPy6)vv)Z+z0M|cd0RpOKY3IN{9YVs3=ZfqZmAKd$xDDe%2o%-ydWc*>BY| zejmbqggKRK0-9)eVjkGZ2*#0vWEx88GZN++FjrDRd$-igNO&(rq#t$yA5F~=q!mo? zT7=gB+8;iXry1EEmwayEo5s|+aS|zMdw_c6OdHKk?b%aKU1DOH5iC`3jrE=;$QqLc z?_6RsnU_y_c6bhcQ&Dz79~z56vPmL_{G(+j4l8JQsini4Z!|VTYONO;Xw&=|7bdVP z+4f*zcr;!YP11OCkc3-m@Z0#)Eh=z8(rx@?Injk8XK*dch;_i$eTeEd7i=;#D@{V) z&}-%diq4^?$k6%ld87CLkIPIs>TfelC*YSC}IQdrHWzB96 zv=OQ0vr;;qtuXoMJI~iu3CwF*3i&=xo=rvkP_rTK>RUEL><>`I$a)cm=A_&>nARoL zvII8=Bh%-99wQJT%e-ZF7>La>v0-f2x|j|10obN`*f(b_K;U)awE}jUBXs@$&IS4x zAExTtpdRR+w3Hn{3-W!fE2oWDVT?#Fw-WI+du$&SgbC^%mQr;qeB!rh3L0hz1BslF z4gi%f)x`E^gtlx7Y6Cfks8*kGXv5U>HNTjANV-;BvCq3Ib9}qM7h#A{@Hi7 zIn6P_8zgp?8@vy6c_2xd5TK2^^WXq)QMGW+X;FuytesPHAYHgdJ2oaxCZ5=~ZDW#& zZQD*JwrzW2+qP}nIp3-C7fw~zzUk_#?u&Qtex9|YL>T?JQMa5twJ}I!UXOV=9Md=b zydA;9rYj=3k;Xw6svY7@CtonUQO#H+84B zZ=Fefi2R zUWYL(S&FctfTOp2s(Gx(;765h_h6+nkK1Uj)1uCs`^zZdHBvE~6Jc4MhmtuR-YBy= z)CCOHgotyikCp6^?J3edz$6BdWtTR8!9Z+VP?i$*TvyTF3BM@Q|BSbT#^H9G_Y^E$ zqR+Tz@kz_)#Ej=o_AR5UIZMY^Y5gge=DZl(jiTBx)#aNu}OoAdPiiSa`S?IX^i_HfZb)CPl4 zO4^;Pe}aTsRj5v4y2dl7F=eLiMUKy!%s>KL_%%NfivdZ?-+g_uE?Dd1rI_)@bBM61 z$5y^+q^EBlq-9=jn;?O0)9>W}!ZNw?B@Br{!TXsMfSOc$JdqpZW<$jyHgfH!iV7o| z4h+nYx}k2FC_}~(qPfkBFg@+;=APLaVvIy7h_BxI=L)oSh$Qrp_57@55;ZSTQD+%C zY8hLX?PkUaQSS?tK>RDZr|6~W$`9&1vx|@>tbzl6u z?~p^;U$IM%HGFqw(&!|Q0xh-s0sLj-Kky3Fg+UsKD$#l6A9&IVZu;wNN%Y$-2IOMI z5{1^~!njHHU8}*+jS*KQ&yHF>E(<|+blka@2=aZ1T~E}qggqHuK^ovP;x7bK91HuL zUKafiYh0`r>DfItQ$HZ?S^2MK9=PYv>rBa=A=RMKS}QKst)%|#5x6g>qJEx>3DVP0 zLNkmHO0Zqg9Plldo1QE}kpYEb9!sOwnfb+qx~$FT=V zLLQy1n@5K9?lPTm&GRCG)APzg#=pc+>EM6)^*HdkmLn!9nAX1e+m`R>B4Xp--sPj} z-&HIdhgN%Ec*i2tg(N2|;vA>`kw1WlbOVJ-VvB8XQQn*UD;M<2Q*hg!kGl_^;$=pOCdW)CpI9A^p&qg@`YX zmoU>K^*+U@n;%i!kmSWM>5;*$9ZzCdT4tDrTdNRqP{xN+@xeE z=Vr>MB-)xVlb#e;!fmF^3J=^=;{q)OxWLXG7_i_8;+G)=AVbgq$bH~I{W>@hzz70l z!vZt?KY*SAP~dkg7@&s$5I(~J0(~&R!vz3j;(+=I$^$*ThJarS7eH761H>wT071uo z-#m^`Vhm6~95@(Ycm?#F(*P~FAV91Y1n`dz48Zvb^l49vEQ&;Li;REZnqfCj$btAcFeUoqzz8 z&_HZH2GH~D{dJ`V2=Ji;94!cd5f~I;BnIMV>J0#Oq`=M2vwcSa2v9%?01`L=%>@W> z(&?2`zyR3sAptsAAV7~lAfP}E^qBGj5{QTInMHs=YU8#w5d^@d*}c8|>f?(K+}wOu z6CA&PG6At;uH7S{AONc^phq8d-6jMGlG`Fc0Q!2vU`TMmfc%l9|lAF{`@ye6zv;oTTsq(9vLk*?%wA-D?^O+Y->b zeBW^Ien&BUZvWi&o^}KPDwcKY+H(Zi+!Bhae)v`Az-`@^H*d3#>)LLpLVFQ}hB^PI}`~#i%nXzSZ@e`D` zuq8!-0yJOA*ztW3R&#ve9K=aaH&hBkSoE)Y#!kQe1ur&A9RBUAccswyP`pTJC9$XY zRAmbeq9rZXD8`c zj#N5RG?@(d-bDJzJWS80n6Vy~-W5;a`_t0&$MPA0%MiaB4@H$;e&geFV_2;W>8AVY z~ZuL@C-M z@du(^(oy`s|hCT;b3OTP>sQP5(0PVf zTGbqiOj6^(><1;JtWT@)aw^9tG?bR!$Dl9Kju@~U#Bh?4LdC@G8<)~>lC}Ns^{|RT~Ff& z7AnJF$f7Gee!Yw_SkIf&G_h@;rfsnb;p(VLGtWROe6<+5+o@jgxmgBv3@p+Z>7x5%*a5|?Z!KbZ zPW-S>#DJv>@`;A&C|a+4K=C~XO~YZ`jsZXc*-(A&j@Q9F| z8qusj|7h>6;-Q*mw6v7t@gr~~QZS^0)X5}O@^jsL`Ni(adxd7{+!b+94w;B{XAU8! zV5)mG@_YIRw>X7e7a${91&a9Pe=FuiqtBgoYz*zGm|O5UY`1N)9u{5 ze2KWf)R!zbDemuvlP5lDX4L;6yy!DDOYK0HPcylx`)Q$2G{3L2fB$TA{xBJQEg+qq zH(AW!g_?Fg?bVvM`8dTb+=Tom4_E@?t>&bU6!OMQ9=?)pJF#CeafkdP_3l^6dh^|q z8ikf_$->qrEbAFqb_#UN&Z7#v_IVQ^NA|PM5O*gVY2IS7?+~8Sm*x5e@+ME zgPC-bNc%Oa^oB*(we&2!YZ5$-DCCK?ak+}T`q%OJ6@3P-v!j{KqEf*gHipw-f9IUP zq8D8Vs*hG5I}m$tj2gk&XM7u(-k`WkIgQV-z&{J6PUdyv=Te^m9Oxoj;mYT4Pe%Fg zq`87sTbA$exk?Px*)8?{y)10v+k{99UyxbhE?IdH#FaBlZLU*3At-axToB%K34BaN zE2|HlM>>a5<{Qj=>#pb^UecP6JK?uD^P!DXQ9ShZL1 z#ljLxmrG0S+x+W$wvP?_xBK_I=7`B5LzP(NZL?uMT1~`4$o9pSK>tq#+-L+9;A6V( zsh>HgJH`}xt2s&0QPFWxiC)cnz2kTPLf&*d0JowUY&-?^&R?^q z6f|;$Xt6vZE>4?#yRq&EQ?2u)1(D=MAP>F>N29C%?KDHl%NV-AMpmlgte^OYGR5?` zZ+Up(u&RxB&7MNNt4=uG9#)}yi`_6wR3qJ2>0e{T0Fk{J`GDiswXd1pp+deq>^ zJwZ97)V#s#*JELDq=BZmG|K!|&S?66=;U6z7eF)NM%uo8_ai4n@A7}^fp^U#s|*|P zCGOt)r2Og`q0bYa4hVjk34z>h@3=A&zJ{?UV&9SaSz9!mnfT}N;TZ1}x&>P}`!n`_ zm+K7ki@{S!%ziBh0nv@F_tK8=0h#V5xi$8kWzRz3hlN;DXNiEWy zA_gGeTCy%$ zMxWk_=w*iui5#H`E9FBk5Ukd5a*O??5DroP4`Vfi)8gF@wT(&;_Wn=n`5tGC<3;fk zu|B}3qKX?+(UsO`>196XoyPUC_#?1ebjKwQBo1Kg$`DO#)GTh7l5dIwhh?_@S&xCq z$AKIrNU1I!#UbqcTdS~cIf&uk(^V?K$pG2uh*ty?pT=S3@SoT-p_W3m-62DR-xfAm zQ&oeHavnz0?!XS8buEydx(S2cSxp$iwW*j8_nU{~AA+wnUIql~d)UYI^pRd3<5|2V zfeEQXvhOtL}e9yiZ>s`}LDr802W z-0JC)(l4;rS_<3+=7&$*=v}x7%DgyyKIiLdL%HvJCM;S9X)RW7l?)-p9LrB<>c5sv zD);DbIEPH)8}zD%Q5#~=B9meZ?x%YX@#MqHDCABnOxi~2{_YK1byLX^3TB0zeq1#2 zueb~4W%G|m9;iqNtsA2}#IZ>9yfbhxy=fbp6X*Tjqo(pfXie3HNw+CA|x#Zo$V;C=N}O3QT)g3 zzIhR4cV*CG^yix*34P(CO|+Js^yYLAsT{j{1&KNXRkAfz@w8z9+b(YYD%}xfDnhW! zRatxTA};~1T_AfgIgfZdTJPF~09T^?hcs{z%>Ry;vtWv*$~{F>MU?9P%i-h+@<&L5 z^QKO2bHh_+c8-MG2-x!JJmA`s`1$k)GNVT%qZGvw$)- zx!S>@Pd5!qno1&WGR#Tyb)no{UXZEbQ#5`M)NsKvQlEy1sR2Q8nltat7v-At=ECvc zJ>GqWQpN@n4^wnkWJXx9^_|LH~< z#P5jX9Oy>HN=`O7{7fNwZACJ@sjt+iK)ZsGj+?bwnwN;uV#Z5%(41*;$Oy{5J8V)r z-k-vJe8jpf`>>{Yw#*5?nW!~cq?OWF!}{}y*+#rtKhs83nDXyiNgC;q5kz8nSe;Gq zfRXt_9W14(!r5k4HCiS)tz5R!<#rv!U{z0B>&=4Qx%osme4MO=vD!N#t+Ua0&krWt zX5!u$&VYY#BCtw_nj-LOjBw+Q_P_L6)3*;wvYIEXE3DMbaDq%vghut>esgv8bjS2r zB$Dg;!}w0P$WUjGid2G~5tjZ=Gl^(VWSfT1uny*`*h+RTo{FP7f3T;bbcU0|Sj3IA zj{Fsq7y!e8=~|XQ%-;5h8n;>tv4*9q3!k-tUfz#2mxRYzx-h#4C6>%!D)S$VIf z3~F}P<~chtnbh~E=L5g|^6Tz(q|msR9G3ZR^1sw=;$ltHXUo`{IGn#%{~fG%H=bry zDeQJVCW=({R=>mGuR0UTZwoc-t~qA+@$Nv=knhFMNDrrg{x_|BA#y~o6ZhsUXAzoz z{nJp-qO{I)!K05~X5{EL;a*B(<+rZiw#Qd}oSimGsOA1@;O|;A9K9G4`P(V!O+i|! za?dC!t_N0;cI~aWmO2vtXmM9X<%1nu z@8)Pl5?gVp_9KqvH4H<_T;bwVJmLo$oT=aIilV+I$S91v=Yis{b(PCfiLM{&*lIJ{ z=D9O{^$w47d1HEA>oGQil^>3v#8GwsaeOxJ^Wk^L6~OKGDjV+e9(Ie^6h0B>x&%BJ z?e>!l7P?vQNkK0pW?eNj2j>RF7EGq8CDNz5nb=bJ>^dl9TYu-k?ySkczv4$hiS1l6 zObL^?2KqY;-E-qf49#+^W!{Vjtew&fL8Dku5lcX?<)n#?R3aKjhvKGcZe=Gg-PPv zmBVce1x`7T;Ob|`l<33)+}zmF{g6-85-~NX*l?P}9$Kv0!qHWE1(eJm!R_vU*m#F< zuNzQ&u4`BS-1k*8gVs#Ft8^R#K@kZ4KZcJS^gqCyoR3UCtqph?vItM%3@ zU$tAea;2aOuVFk=zVD-cb9LsiOe&;OBU{D!FE-eQf1UR?Mc%HWOsM{~OsL#`)1E?0 zR+8vc`%i4RU=bVHDGo!aTxS$(HgG65Mlk6(Exyga_?(iQRe{duZ3G_Fx1?^jgGHA; zE1mbB1$@%l{U%v>i=OwN;$0~kp-W+2JQb?6nU8c0H~5W3qi;oY+Z6df9t>1>Iqikd z)Su(5cqQHRJ$|(jJ^dxeObK@#d60#iwXQ9`g;ShR3h_OzLR1=8ednXh$9;-Oce^`K z%hNPL|3RtyseGra;={q)w3<3K`?j$C)wO`4H&akqdt&6Nb}Sk)Sw)gbwZG+?4kawo zbsc!_=OzB`%Kl8O-R@{}GnfJ=-mJ(K)rt&BD&Qv%CMA51Zdis|Lp&|P{&y%ba3&m5 zkc40OxNyKl@#Y}A#u_bFSM2F&;<(j4uH##drWsf|d)J$%ffAf}<3&zd8>6#1;gCsxoZQ6P9VY!gzp=Z4gsSaT z2wb0`OpJETpF6XsYo4-K|| z$A}vEEp=7$kzuf{89njFJ|;H9d8ez)x^#r*a9;sG{}nF(E$*xjvD3R4c~Qm{+(9gW z;+?QUmG2hk35h`h&u4S}=^^x&$$ z`Wc!W-axqD?asjhXEg55+OSW_i*gH<#^r5eK*N_%9#S3BoPQ+0cef>b+Vz zc)w@~d1%cly9ME^R6fOWeerhD1wQ#iX?N~5G}Xk}9#v$Ag0Ufi*dn~@(H!1wbaRluY6s-xjI_NY5_(|cQQfuy z@?P|+$NM)0;_}I^^_89N`#YIQJ>1}s?OeU>^Yr0X)!|i2;afRHY(FtX|-FQU>>YpYQd~M0T)ylu~FkN@Qf>@a+ zi#so&3cYrtL}txt)Hn|hwUxRGZ`8hwFKWtYGtT-c@mez-ggWbPJ8#^i$Sv;Y1>JcT z6Js)(k$wbZytl~b3eGa@PCA^WRYkqn^v|T~ znW=eAvK$PN2CX1OYbH0QGS&MJc^s6xvw;6myDzGju495HI7cm>KB$#Rec%>pndcB- zv}!S8d;if*{TR@w(EF666BZLPr82Z{nf@Dm-{?@Q7u2CPrT5}On<#HkA4z~uxEy(F zygYY(QnRQd1S2eOmcT{i2(zOnnYrm{#i~7YntPx7FbW-6YF2@Br=fW^n*^=-+TWiT8&aloF7`}lZ){Ae*dkv zzEABfqN@ylXFYGGDbcQ#eCUG}uxu|4a}ci#UoDRUF9E3)c6%|pur=_hP?b4L_M6V~ z0*NlDwgM~3mY_+fMXNkQRhB_49HCb2Vz^$3p^Am2jc`%T2t~PIquoIz($QLOW zomYWxQ!Ey0@_$5uD8o;ym+j=Q>A=H>ovz_5dK0{AfRe?*X&GkotB~AWB#bqWkCP9G zCnj+(@KnLj9P8hnqwCvU4k6vRndvS|E2_8a_B;P8O_eP?CU6bX)(~9u>B%m#a!@Pg z_`A=`es_YHyNyCG(TlD-B##VC9yIr^a`+n*8`5JPwbE93?L;2&QQ%^|iP%viXO7+x z?EA|-8RUSEOtDtVGb6=G*c!~iHamY83GN?+WXu~5ovSGOMh_Lh7v&>G5gqNh7lI>J z1zsO$BY^tjfibnmG}*5dsy|)pq5V`XnZbdL6Q3>$?1Xr9BoR-M{_SrDeoX6g7{On7 z{T0{oT{qHFQew)DA;l$qL7^Xb+Dka{OIg1`u{oXiA#79~xBh@9rs$L@&F^@#KZ7*3{T&(qYtz0|&9Ih`hl=g`^6GPc?4~%@|yy6F8-nCukgh8ib{7?1C z1r0051DqWzk69Si5%fA!&OHw?z8Z57O|`x8eRotL0v#S_kz?S{;! z`DXAsOJ8eAm`UxA!|ell9}d5+j>EO`to*03*vWp?&TgX3nt`N&=OnbDYTjcTuR^FN zk3%S%)2v%9b>+cdOdjWxi1bY)KUJ(p<& zOnCNLH0nMrcoKU=l6;cfK!a^g$G!ReG_V}ii&Rh+9p8YL<*GP!aEH(@j-dL8(n0xZ z3Eg|e5}lIk=G-FNf`r2Q_VH)#CWz_E8`~SVn3Orvy3)N<`yxgSOP?%VJg$kHP}Z{n z6xc4S6>{6gFu^|0Oh3Fw+S0}%*1fTKxA=%IMuR>BeCYB}GuSQR83WfaaRvl<&vLjF}Rh)q|tU z*=f}7iLg&*{^uhkaasN9g#6$HpHUZv2%MTTL<^=t+5rfRZC>}AyJPjz*a7Yr=qkV+ zPII&lZHKJ{7C~7Rr<0^xrhAk=m0fAQ1C=hD$He|1HF@#p`vtq4Y z%o_|z6{eE?XIX+I-M_WO6cLM}G__93r4w#xk$q&U!2gUHxrc?u5@Ps9kXIXZ8LYKxAf}mv4#SR*t_L?+3psI~))2vU+w*xA9KFw%?Yvf8#r~z% zi=z#sko=oG(5mTZ>}jVZ{XPb}@BTX-m=&0|-=6T+t7v!T8TFRI8ATsMY_$LzO#3WZ zj0WTjxqT9^e4h*7o0l9e> zWL^9#{4=MN4NdDoX~rQh_y6H2+y3XX6SgH#`nH0BnS#v4A(KZvX8wG=AS_z zt+|^Xx|r@w$8OY4E|H{T^QtCe)Stl%`p+Hqqo$aA6$ht@tjPRy!rH%OpKGvPHNuo| z-gM(g-ov}h&h`be`P`Y2Sfp$fT}oZUSvjx@tFBr)OcC0@0z}RtsXW$VB~k%mp&7C) zo@m+EbbS{Z44{n^e$jmO33Gjhal)GZcnK-+{Lj5EbTITJ+Q}H;B@fPIokx*pJu20{ zcujS~XzUALZ7R7bLDyJVeOz{6-kC5t$NI0a0<4k=Q|#Sd1zoA2 z=Bv#t%CF0`;rdq1r6y#d*FrzbMnQ}2lEsk?JpW z8{hl)1hNTeaq9Kz0x2wbY&Wm^iGzfpw%aL|t&Y0MPFU%XKXnUAc0z0lYI11vJQy`k z&O}g!$Wl%yr%)f&S4OZ!?x$#|3!<+Gqv5n=dq-`(is?pY=%#6BU=}^kv@8CZc7}w; z_rt$;_0PqYZIU+Hccpd2f4>jT4a>d9YBeQG5?=Q# zGKRlktjD^%tj;zw!11ZlMct>p^s%ROY1S*+z0v@=! z_8z!Ssu-0qN7f&Z`F|#M@NRSWpwONR?aAO|Niv?f2d*Y(oM4c%;$one^7r^x#pr*# zLD>lD+o|s(dlL~l&5&mx8e-!-jU|S^ZaOfGCx^jMelGQeP^4yomy?i?j>5k}7@w?X z=IIq1&{6dtA5lAdD|6#Ns(o~P~^IuQBK$miN1;N+y`Rr z-V*EvfrDssohiNwqqr-K*6)V=$LEYNVWXw&X3mVFSv6B&^Z{>6eju*w;pcR}%QFzd zibS~EL!Q^)XcUAbqent9Wl&Wf|L^5cu)j3j3vlR7Sf{&QSfpz#8PN^kgjgJyyZ? z?PIvV;Ki##>b_o`Jb-GEp~Ak8^2e@%>0Q%%u&POB=h26uQvf$To;w@gBPLxV3y4!S zr~KNYbt9T)g(xL^^PIQo!YT?h<(k+H@`?KIfqdFKolWJG3SI{_uI@u(yF~B1Hl*7^ zYO`%-nt}*5oS}O)mvtCq!9wkh_lI~{+!Epi36uRugDkFhdU{$MS{EWW7wv$d2hE_W zOHI=pa20mS5JT<^jvRrr3(ZPYf%~7o#!vWDqxt)MtVCh^`kMbdG79ensp=WYa%s`V za2S0TcC?@pFggs^JroqYF(uA?YjYQc^ z#auN~+0p&TJITH*ATbRk2}4=l@MV6nGV2`4@e))Wi_eLbB&7&UqL(BcHL>T=+XynZ z5crVWA~mi?%O1a<_oLq#RBC%)E?e4A9r#l~Wpf;!N0#`6hr z5SOr@^oC1lj%U8Q>ml*$Xs~*Hi8=5mqtbv>E zp+F7Zi)1wQQx&5@eu%&Wq9RTdUpcYdqG7Fa_5M9YVA9%Y1Z4>dd{VAqBH6qC^UzF^ zgV}$Kd?(d*Ky>@v7t$!BP?jx7K9#SZz*Or=>~gf;d%g04|1HLSsEHvtdemgYzOm=G zIG*G-x^--(_+1#9jXSS7rHbN~#^5`N!}`;OSSIg0?$dUswFpqrlu0bk zkVi2y_#zTPTy1>@vb%^7+o|!Ov>8D0vt4pV;zMJHun)JE2dhN>?`92+Yp*ic{s0v; z^a2I+0_96*{pa*nL9d1rSkz!}Dq&AMH`NVruZqsGi2H`*HjUOYUK4CXT;=y~NwaES)raMW9{z zHCuc1)uSp|)AA@SyXoX!vT-l_00x<9t5l9BZSZvMEZK)8*qSzqTtTYVP6t1UYwLI* z?{oQFI50dFO^GH%5LJ)2&nEv#VT8JYR;=sB>>$dRYaF;yIirSh=&~U_g$D7bm6+jBNM08Z*rAY{g-LGFgPhaM@H zMB(^WssXuH_X@H6t6ul#@Hit$sF+PGGU^!Naa{O3UVuX`S}5e4yxOVu*B-AYg|Gqyuw_3R; z$4?~8z`Hu2-+2sUve}c0=DVG_HhI{TbXaS+Udp`p1CGks%wxUe!Q`5$@TF^7j+;zg zo?iFe9T4E2LSr-&GqI3ixmQ#ED^+f(YYcjvYkee0$ZjFh+syoVoRH@#hqt5(dQyyH zFEa0{b9=U?t>ER&W=^yFB_pAMSaR?*j2fBzIl5r6g|G?bKm)VT%68F*1a6%rut2B^ z{ek%4dM3~suvxIjam1uM*4|0*UxIP;jXH^L9)7f6cQ7a93CSitGgd3viIuu<_2c2^ z+9+2IhapM#E`n0>j7P*Duhr<_(JY8$_g;UR6Np%UMkbu9hflTzRQ`}#nkVt+z^tO%LQu_ZZ#Vfh z?-f205g(+o_B$G`d;VP!VDEpY{*HV!mxmDkRZc~riH4yNNlLg|n?uQK;kv!Xk5^Sb z$0?16 z6w<$n6{j$s@Re`QR|aQoWPx-Q;P*qs?DrPzNm7;;-^uXB=|m|kJ#D$=d#_|bln$w_>1SoIT)(Iaf{9u`*P;L8qIvqMq9V1 z@6Yf^`flgdElV`h9sENWU-q4yV6hero0FpJ(EZy;#(?1;g|*8&!9)7%L%zN4j+O*L z_RIuJ<5t&~Ua;48y&>=QZw3C%I;PVEOKnrsG|3U#F4y=3dmfKpz~#8C@9S23_@WboMEAX#;S$x)c| z7^$kh3_5#dBV(h~?MC(dPE6Vem-RDD+1QYazEo^4v!y=#$Xw`TM`fND`ra_YXCc+g zWMVu^dwfqXOCX0)W=(E`z}wsH51lq7)YlUc{S&v>>=N>1q+7MOVNvV*O_#||mV*ob zpT{It3vnlD9)Z#i!-Ca;vn?~j0r|NT)&S9Bpd@YpHZG~$-H=BT@g<=GHaO0%7&@9% z{`Y5};6%0F5jpcDneXWYYbTeACY5@|s*yrN+A)_jsx$TQ zFs;5;JyW3mJ-kx-?yO;i3N*Ppjbv_-&hA52I^rGhQ^FoFCSx5=~Sx zekKu9R$JnD9ycJ)J+lV8LlJK#swMAH>}Cnkuzi2-2Uy+A&G0D|QS z3Sv73v5cx?>H6AO8za>(gfyUkdqZJ}>dTeF=-B-c&NQO398Dy2u|GcnpL3R_Cblwh z%!^2iUt{cg33tvQ@Or-4U!@g=XaWZowCI>uJ2kqTfW@*}D~Yt6)T@ZvGqBIS zyRU;SyFD%nR-x+y*C!5wRt4>zMX_==5;L@fnlBCsSKD?y>AomLg|toS2or%Kof=i| z`Xm?6s?HHPiKVVS4t93&9_;f%gYkuPQ70>Po@q>LUnJ4aVQ14}&FF`zHMx9p{?z8T zGF(DbVe~qayj}*EETHr*0upTUYH@loQ){q_a*2c=JdSkY)-!+1ptCe4sHJk=RG=lX zTn3pY?$-7mK(3_1TVzip!*#m+ysB0((Vx89&qgF0@nENV(2zPB4+1qw{5h8B9a%Ay1G^Ldnpa@`;2a<)KNQbI&wvwBHe!+68~Rg$}MOi0^1LoC(WT4 z%((Y+)uAM~+EOO#_SxPbiOn|Xn7P~%xpmnLd`oRJa=4oyds4~p)j6@_$irNCrhrhF z-LEy~Qr?x4EGhyT;@-s!S4Z@YXH`2Mp=bMy9Z?6oKj8YqRAxpycd z9!VYbczfs%v@%X`_(v<$A3=|wRr?av2y|M$Pg}G3Q3f7~r{ubH-fe=TzCb8bF8?CF z8`_1VGq{!(w{TsNGl6*GJ3B@SoHEx`yh7BEb!x||dgIr{BEr};;pB`$EM>L|8H2Ls zR5Pd@$Hn6on{--eh%sfuWUyW;oNu&s6KHu9le|jDM5uh4B{L}jg@O%V+2Z1Y0FpK< z+p`e|D1J2TQ^bKC@A#^4X~ELH;=}t8s@GLk{mSDsgt$1XMmsN+%u|{->0(l|1QItL zOU1}m{GMyx9n#=poP{j9EJPC=eGohD2xO%TxsH#v5T=|6LGgN=yo?9aD?tHIl>n=T z4x&=N>puY14?4f0pITrzjJ=ahklrucCkXp9s1Tub&=6WbvTewHL@;H%DlE!X)V*QP z8WEyz=^R!%G~}pZq|Pd2bMb!PJ!sMt`x0cbd*9d0nrQA<;IRoA{kBBrxs`lRj6dv$ z2D|jc;!GxlEyWJ$+i1{(=sX;$xOK_<{g0YAd9vKVlC+kP$VYRGRxu@N{+F=lZUh5t zc{8O-cD@OvRc9L!84 zvaTbW!H)VM0i8zJENo>)*Fo;;emF7X2Rftp1nNZpDpxC{3|=_xn*9`W$RKH|TP2Pq z%_VhpC=;7|r~>T8cHQ2TYfiCl)#*7;*V-&A){tn7Y#Nc}wg1b|I>7}vpf;?2VsS0U`ZzJkr)>l7pr6cHYC|QH^nvG!26R&@Wse* zO`y7{qct^0q;)f`X-W@5&P+`}-Yy|%qJj$NxOu}RT2l*x>Xc9#RTB`@Y))dC-x(B; zS5VYkRa02h973d3&{!B;mD^ld6hf+1(il*bSJ+%rTpUPRNM+n53RCi5>s?mdvwp6C zcwULy4?P^~h_i*i)${4y%raFPIa8@!xi-_)O*co&RYNC1%RN!G8B0FBps=X8%%&)o z9Vr8HbJXeC{>h-8$!tmA;LeF%2??HE`%>RvcaKp?VsBXd>D=Dv3EZu%9(qAI@qnm7 z$vM0cKt;)sF^hv33KR#=-soOI5k5JF$+VH@cP8WthHz~;_#1W`<|Q8*VunYj-@6wld>+ZyqL4JFcrvp~gi#mskZE_?q{XCl*Or4R>AraIJn=*b2|DwX z>%3K7f@@wZzc&=^8{7tg(kqq|NR&o6 z1Lpf%kgP!^9Sw+wZ=U1*{dp%e6qH8Ahy6q*OXatx4C^Ib3oH2x7AaNsF$J@JO^$g~ zJ-{Iq+SFIzt7>S%6%1<&+m=cqMvv6wiulIaKuhUIu${+_NJOe%;ce}-^{^nhcrJkK z^swk0hCFw}8U?SSTFY{i%#uiv$;zhf4dS-Zk2dyw?VZ%Oe`-uvtArU0XLXv)V;rMk zeb1iR9P(q)lGqQ@DfQgq=KI`3dwPV}+^&>Y-iMffls>m826b zbAlH10UNTKO4>hG(`(n}EYoqwx@}8`zO_k*MPUL9mzk>k@v+g)WPZ9qCPR)jUQ*Me z6i~r$91%b1mAP8wx>Jttho{I5JCTjKi8>`Vkuo6gpIf1sGfup~{8GKsc!jV>$57da zpTEI#yK@FOqT0q&2 zC_BMZ_8sXnp4WjcWQL6?*%K&s5S~mbXUV?z)&w5i5HQ zt_2w4jf6yJ88KveD(h6I`+)qn%3$9;cJd>w*$}sBY~x4vaN>0K@`PPR z3x@$t$OL%w2-{_&cvFL^u_^kn-Sd8=NiYLB{YftjYW04@p}yjLI**{L^8+QK3LBlQ zEGTHm%&mx~dI42r2^*C3>Pl*6bs=p7r}R4-wVi{hilujiP-(1?tmUpT^^dNJ*iOf+ zG^|wSMk@b)Q%oafQvf0z=CXIdf2-T_{VoZ8HNA(>VrRTKX)wsYj(!=>d^dvdy{lQ) z1Vn&*H7NHwsQ;Jt5k4nH8!G>qp!@FNb;_JY%SfzE!;}M z&zWMNYcu8D>yeiyg6~nXnMYuD)8ITSnC=WVq(OFh<<^O@TYC2`-!fzW%a8RmoTj7^gS+fKei;K zORO8#Uc+-gMVa0cQ;N%&o_kZ7_0}DP?meh*TB5tQ?|PfGv*8pF^-$yq-UQ7bn}@6~ zb#%eHvYKXPkp01ES^eb`nV`7UXnwubM?VYz>Zn)-dRcEIHE)Tq(MlAxSinp(=F z?Zy6nvc2Alh4_4B1auS=t>@bq^)Ui&U`PkDrBDVQ+NlUn4}-s-v= zmZrIDehLyj9)xQq0GUA0gH)Mi5#7CW(sR{a!Jt}gUIdEBEdXq<_IhC`Kf|Zw#w1Gr{kh3pev4EqAN`7h0s~Xd}TlpcPp;wS-KY z8j694k;%_a2`XGi1-4Zw1z{A4HYLN)$j~Jv?=C6K0aZrIidFn;c0Ob>^AOR59J5r6 zZ9F;zctC3om$REEyhKRZ*v)y348y>Nj#+eg>FP7|KTjz;;R!m~(|*1%0RcefdfMCp z{##AP@3uz4tY$i75IZ5p31@S2oIL;pz}pY@RQPY_Olm>OG~AMZy3zuea3Y^5=ApRFI^6YcUikG_1l!GIaF{o zhY1`ih2gc!gY%s#YVHU(|D0v{eZHMxkG*`B z?)uF=oiu9!UWhx#m=ZK)lp0ubLY&rucXh9Qh%ojIsc`5%g9kiElpIKsHA<47lN5!T zI?JM{!%fCenK@=CC$BbQ-hz!exnSNn!6E}ocm@SnLG@UG&0g#aa?bteRkaAbycb6z zbBbWUh(?3D$R=s5rwX6>Ex?8xa(ST~%81U^4@AB(a6+>L;-jiqd(Wd5y28^nXTgDW zXI%~Wm^8`g3|85MoKT)X)15DeYD}T>VC@8(q#9+pa2{)RUd&i%6BSWCm_kDd@@F4Y zaZ{|3C4+-`O*4_Wo>3X2qeaf)>XTU2*odzfhPCw9~0l&qBijH;sd} zDtBhXK&XwgdTAC8xpT%KCzd)E2|3%`!bN=y7kAa5YDng_d#CP|Fwwca&V*8HLs*ufFNk*DXS5=^c13i!$o1aX0}9K=UVVDM074*QyAe)ZVOq zT`n`_ZlR6j7 zU0=~wEuy`tqUj^*IziGbXyED^L+1&;uop7oN6{BMyzj4v#3@qY`vzvO8wG(+u|ci? z7EKB?Qdw2CUq7P`v+8`$6sWSZ!9#f7hM-o!;w9BM`y&boz@Eyn)IpY>mYxX8k1tbS zYKlBD1xTJszBUrnC;ItXmj46$aXb?A+&)(I1LUs4OIHGjzuL z!tqOg*`mL)b!HQ+h=Sk8SP!gJKS;#7Vs1~5DzWr(t`^*aEoC8v^lo5@_1VT0@Y81x zBd6Iaybe4Yt<_tQHaMiH`gNq+0G`u*xF2r}34n^)|9R-f_8E}Pkoq(2s`wd57CM~5 zsmkZqX_{TcCbN`CkxSDZOx6x8i?XI=|4#_~!w#@~Kt1%WnGfa=%*24~oTe=l9Y_*P8Yh;7iTQ${p^% zl_me~b}M{T&4$3q;6N$XKO!u!nYqJF4D}g0@??^S#{2srX`G^G5;Oz=VWm$`6Gu^& z4;B5hI5xthG$C|C0vC+^=o|#~U~+P_e?#PSwI?HHzmMaf+3GN(9Kn1~?iH7q9u-kP zcyf+*v=4E04*w7d9roxD9|b8`L!6|Z2_jOQt)7Y6!;pL^Vs}ZY)ci`@&>rsC*bKf0Z9Ud=- zq&aJxl#ro=ke8i>l$Vg1o~T)zuac|@VRA`9a(0HAMuC!sl0ue7K~hpYlJ-5GQR03F z$Mpkng&6>bheoac8Xic=tbUI*Ir*Na1HauG_`P*sruh+H8(t;cvi=huq%1AhV3E#k zsFBN}@6%0KfBZhy!34#V*)$WRBAi)I z?nxMg)e+ud1l1GBZ^rECP}TmCQji`DKmhZJsExk?|E(D6_k?j|slQ7wD?|hkg6y(h zIRG;&tx4My1VDEX?B~B868+?wl&Sf~&!s7cwrAbosZ~hq9I~2?ipHdse?o6CxuRa@ zEwi#6%V!UIGrq)a1yiDNU;sKf{L>HMf2()zp1nouAZi%I`gqJ?Iy>_`y)yk@2jtcS z${47TMDI9hyLze)bzsvwUIAg^bNZkU0$^)~;&%rKnf4C%xyvr0kdfC^bvyE9T4}rc z{R#EoryC7fo1%ddr1ONmK>#q-fo7Nf%c0CoOHF+rOFTp`X3xV!Qr0C=85xc1y3dvs z`z_rMYe{AdNfK03N{<((?l~Qu_n)Chj#XK=Ab=%Y#MsYpnAq;JX`=!yX|>e@c+X|* zR-wh;$I^APbJ|20ok7}BOkviDS9NuYbV@Qhp{7C9Pn7kfUdGt?Uz0Ar!PX29$K>tP ziOp>f8ck4(`=p*?6t*^pM@A=LPSOaGiwe?C*Ce$&je@(rdrl@Q>DJS=6hR~z3EHSR zscD&&gTr9|37?NL5fpzaCM9PSrh!2y{d!KdeR^ze^58yBsqILMhaV;rGw&oa>*RIv z`vy`Ib28J@Ssx05)(_f%&l8c6&;)S&#qBAOgO&0TW*`8IsuI?BU|6|TP({z3E4F1d z=M&3l$PmQc?(W%H6K$DxKiHY0fDoi_3{t_F+3E~t^@AZI8mYYAI7`#vKO zm3izV>$U?vbVnu3>wIl>3)8>5#}b0^mGjA z&zTNK$7X=DQ&erg4MNRS$QgZO<@76x!~Ti?nr&f=aAgpj+DD-aEU$!jeK##bUP8KJ zC16=FU z0Fg%N04PH&1N?jx>oY4F;7bto9EpUI42-1CVjQ4^(&^Uyl&W#_0I5Q22>X{9w^#Vb zl|iPY(m1viNJ7$(Lm>EK{MBTy99X{%FaQ;!t%V^f5tD8mB>i=2Py)p`OS68|w{wD2 zW&My3f}8*eclVa(B`W?=52h^+^4tzJfTTvKenbT#76=%Xm0yyMP)$h&l8tmwN#?hY zR3Ww+NSg86lWSmwcnbNaWxB%fnG*i)Iw66%?RgB}e0oULH`~h?@Bp+cqS$Sae z9pnJZAUViH_{26(>3*SE6Y-p@s4(I1RM`;7fd-_yKxD;4S%wMw3p7qhxE&m-ZBY51 zw^%Vut&*!#KssPH`dCSRR+WBIR-R&J(_39TSW$IgVl7>ImL)WzY>N`mZ=l2U8QDZ} zGMQeo6!?R72|L8#PIg+xG7i*4P7Mcb)T)rS9LeU*+Mmu8}Ae>B#nl;4#6np`h;m zsOMl~8XjNzOGcCplz`zNlP6BfpsDgoL^XWcjg-$8B1*=NmpHgZ=8GtK#lRhSQj*1Y z7{pZOhAnL;+q@JK^_Hy<*g$5se!Cy2(Xg?2MFAkThJ)r2HNFkJ2N4z+kW%LEerZM) zH^E;B`1=i2*Q+}Gpho_utFkpx3}#SepcKR?Gl+JRuGAkjMLb173zsMB!V6{$(!n3( z07QP9t(}85q;Pj1<@N|QPnR}5mPc`he!3S#V+DU-)PxIO%OoLGockHk&q-~lSl z+7U5v&za$|q0j1}ZHSPh)zOZ@xsN7$oEog&l&OU_$T499l(zekr-gnPJ=58(Ax%So zO+L532MbX8TPFP#@~o*!X}c20JE!p0YlODf;%%c*L#c=FPg23PD#76gc2ZPeU|>cBAo~Av!$`PZ zOTb$ozD!TNJ1MRW2m=F4LqEyw`6Xanj<26&sK_6LY|kk1RP^-ARPor~={UW_2t_`i z0CPK#L5)An{Y!q%9bb)~MFncKyb|c6o>DPAdyIxGoN{xPW-4S@XOyN4o_!5sWq%() z&5TA=&Uc(9><)}LiiE!tNCWM{(-;t0xF0MKXm(?0fqs{M8C@n1vXZJEJ5YOQK3hMy zl4_fA8nu{ccZ3;c1NILM)D^?CC>m$7d;9od)SW+26;qVRvwKK$20tRkxOKcb!o^yL3pHS$C3Ic<9A(nDt=NT!Vun(RSJ# z726vxHhg5(SL4VaZKQ!(Sd&)5`sMlx0$lrO?lhEvh7&<@u{{AbdR}+%4}jUd(SYJV zcuZk2$OTe)%pe;ESz4T^7$T_k0TWXlF!ja#S=wNR>MPXWGlNzmAVuA6&%<>U3hCOz z)l-qC5N?E<#Tot%uZ;X%+cV}cZcl!Eo?mQJ4{J<=q^8j0g_vzp{YoHNGg%s-85pDv z9MI))O5+f5)iv?RiXiMzoB%a!s%ZZ|@!{PrlhH&<>-qgSn zjhuvvi{qeBq9nBl@gN#5GDE76vB)o?fO!UJlorDvsORuaf8;v}1#Yx@fUtB{=~O6nuH1vG9B*y*`w4&3z~VIu`UHAoObIV9H!6}5tbftB9{A<5HS z(ImjzE!8AQR%jC$R>VjTDmja-6QnrZDo*TYZcCc$NhC2Xbc$c^Q`treOEoqTXltyK zS_NXl;1^TNfi{_vNExI9182ZZoH0rqCIVxUSOuFDRA%vIik0bLett1Ks&X{JhIs=p z5L(A3pBV%P`(_GZWD35c(8Ld2g$1(mOiQE0yw1Z+%V!7C4VNARLi_oV%C(TG0}x={py-A`99ryiRWEfH~ETn?Z zI?1H+G%sXYT8USgm{iGyaq6w+(vQ%jJcLrE$~=m&m2VngdP2>rr%X+|QlkJmxlGG2 zqo6jLu}P+Y}cPbduk~zS8!}uyz-hPq;rO>V^aKaR= z98rxnc>wfCF6sp$rH;mjz`?*aBzZTgrWOcbO&uEe-{Mqy3W|9t(|HYBr>6>m_qH2< zu{5n_;kg%g+een+LZ+aD=Ph;00}1-W%HvdT_4GE+mF}XKKtN?AV(~9>*@cH+ilZw@ z-l7(U{Ea+hm&q5t?%5^^ds0dU7^hBV+*^pwoz@B5o-ESIHUrfs=Jnf}MCWY7*o>U- z2dYL+-0y&_3oE0d3*mIRQFPr5@wS?ocL(_MB59gNYX;~F=phI@62fCS&G~1ie|FEj z`p&%eUN|-Fys|bflmOxIwkp+ra^DA&9QrdB;yD^dHRLe4UWsVHgo~;#14k18`#v#{ zQ(!bXK$OoNZiO4Xac41ratCAV!rX3#Z&AzZ7dni>`u!;#9=v1LmSr%eYsQd;y#ljO+^Dj!%VX%Rcu z=}6W8JRg081M@@&*BN655nEYTyI*&3UZhvsl(>ZdJ#_Qs^bif-Fy8)~@sjVynoia9 z#XQ-SrdNC>zgQ4E(Xk>G9wMm((%^(M38C;}h4(LA-B?Az@e#E`A(ku|vzbAHvLr&7 z!+x)XMs{|{T4pR|bgr+3KP;R=SLoz<)_9UdX^y>#} z^@16d#6Nz=I)>}{?Si2p5`qQ~pnwe%p)@sFV3xYz8DbDIGE^A}c9Ip)^M-LKj&7XG!Dd@kjR|Qpn$Ah~nht zS0qqcf)eHqMItPKbsh54e{B)d^sC=30@epuGDJ9@zumL9PCmDM zhTKdcK@sjAonze`TqE5epJ3+!qbQ_jPZM&h2Z`ni06>#)(@n_98`K;Bvq6$OL^R9g z0bj;Nj!sUl{KI&sQ_6nMhviJ5VM$z`801K!ci@n3r(gi*u0sHf>T^s~GgGTIJKsqKi! z;OeyVy%SC(d4W0{9TJvM!b_%%7r4^VP+9bomJCA0r}g8uXldxehaHsGVRvj_O4~ya z0MDn2bx*(}IL|OY6q& zLS)>H;xf8(Gz=MOL1vF&XgX{F(kd{h<^OhOXk=(*R-{ZB+>Q*;GhY-a67MaasoU~o zR^OXgVH+xE^j}@v(c~1E$L8W%!0AiVx?DRyG zrA2}t=vLjcvvgNfdkAww6bv4O(C#OYgFDFAnyySF=qM*Qtfw?5r}NU&3iJPNQ^7kr z-{nIDJJKEaJHn9RA0y@B%#HB9(Xo?r3r{1^na+VCGY3XO*896BLANKrq9F7yBaqOK zSefe^AA%rfcV|hVN+cu%M1ZO%L<0#6rHzIOyB-UQ@Esdw z8L>o5<~f7xuCXToA=5xLiiGaQAzETkzzn+26|imS=BDk40K$-IHDxvmre{HG z?4%o1u8`@;pJZm|kAf|k41%rY!zCXDIY19+$1ASRAanFNMFt871qL1A`fUF>(h>3j zb{3d~2_7b|Lp?=P@|W=H5*;)_CCfvQ^|yj?gmn-$UtUhj!68x{Ow?9PZh9*o_tyA3 zdBGI@!f1J5N;-;)j6zLxd`N0?QISGTe1xV#jbyG;L{*H6e28*JNp9x|5D>I*>XBe2 z7QQ^zE7eI#%cPXCWmDSr-kuJR0Im*2Hs6qoD$|c5+iQ~!+B~u>nQi7=6U{t7WA`GO^t4-`6^6yR`j~ z7aANWMfyjANDB0*0zS^c}rvA_r&w+GYw3CP9Z>V$YN^R+|C^Cm(amJvo>VQ%uZC9A+4sWIxF- z8p@!KQ2Ns?nKKOcqURS{TujgvT%ciKITbVOa(h^J<&D{AxTe}gNliygNjW`ZqK;H` zRg&;&GnR<#)|BS%qmGiL?gJtr;o!&w95!Kc3%aHL$(oGQ?At-6_9y(U5Q~JAG^3+J z1V;4z2gVH)2uLbrI(l{Y>1)G~!J475hzKamR#5jT$FxVb`F%a>z3FBdK6z<}BoQ?w zoqqdIbgI4IRZSU3t5kc-Yf`y>8_qGf02Aav3;(9+7tP-eXb7Y#E0u*@6Z}m$ZzZZs#bc=vi$xKlAs0ZFe%M0SuIo1RiKtn7e1k zD9c$P3!;EqX*HoWo6B2C=@llBkXgvbFR}qfC_q;rDo`|=tl!L%S+RFHxGF-Cf*^hX z1&Q4sk3{KqyD!P@uiWmF-yLV|T$!@RjBvs{-u~J3>U+t0X}$lwnYLvHcG2oFPddFo zv7o$3+p-jS=$Mj))t>#t0;eg4zmrruxeRwOpJ}feU_|l5k5`z%2F}5Iu~e0vTll7& zUc@PK`ha;7Mx|&)N6R~>GJ;>}HjSWW>4#ELzshQ1H$d|;72wIWBUc-pZ;p;caQ@-X zW^O+soO@fW;WF&1!0l)+VhQ@Q})O*n5 zDZ-PKV~1nYk?QF^y&u&YRY^6cK|nl}{N#>m@UcrfE)dY%2ap9 zB1H*7M$Q{1<6#L;P(!$5SZ^WwK4L92V!%IGX)A9x#UVBiMB+B&tL@kvw$RbhYQya) zO%Mo0iOjq>c6x$N4&l^j8{@>mhi_a$FDzrP9U<^faEI(k{~VnSRi_BM8yg-Boj(q! zKbU6lTl0CWPm6)4dhuoO;6n;~w`Xr}QR16SR&9CJgMC6N(fH$!$9AXzTwtR!T_b-$3POF&Cmt z3cxAi8C}^q_MZMz6VA;aPa!7XE=)phk^qqyzGy;LpWc`Y9c*~JHjS__df`Bd-Bh<) z7Ky=E&Afm8hp3jX2oU4frLTA$lcc$fG1A3|@A@Jfu2Ni^@cpSNKT&zdw5V}gPKB^5 zKJyfDLqYM9`U%Du?b3+qx#1BD&Z=Notg>%6a8~OC<7giT&Nad-*8jD>zBbn|5HCSH zzPG`;yRpDZuuIIB``_ucgnYY0OWXu_bex>Y5>0s1z)?Xf;2qz`6!M!2Lu0T7v>l8v zxT8H%DpE2@3MKJ7s*8F^QaVaPR)Ri+Mv6jmI+8-E?BFPPAboq|y#LScf&g23<7s6} zs8yK7$#*-IqzyjL>yDOaz%wvauw)$X{!a=CasI}eg~dn(>B2fLj#W%C6KMkpVjCAt zEr1r7tFR?qWDe;YX$0rJ1n1kt#=S>L$Ey8p0ap_RD=(fg<*@z9a(D7H3#bomGy=Ft zSYRq2IshS2boBq;i}|lkVvcr6%CsHLOX!dET1#G(A=-!Op}1wDT1_j{a4AdBz`oO; zR{I0HP_f~d^_h1PJl;%t2LJ$9OG51{+Yw3kY#)^wTWl2+Rcb;5`h1C{WqX_oNf|@Lv2vNE{8lU(vzrh3x#$k3Yf(vJegH$45x9FG>v;A0n?PLney|8| z0cC6T`T(cXSTjR%L$uV}oX0Ppy^Ouc)ytKV+J^MfVZ~ey&Gt%@ptRIpc*$`47 zY$Sp3Hh`|@$8|FSBQ*%!8&POD0f1vO+w9>W(x9n+(>rhX4nDlK2sm0>-tEo6 zljONA3f2uM{{-FI^AX)xr5hIy!JZTvX&B!ImYN8zY6+0By1yYcOB`F#mh&-II#+P5 zDJ$FH0vD(L>|O|b@0n@c=<(9Gb>sVEUAMNy*w*>ZYP~bTZC&22mb;{gKZ&C{eoi(|gHh46FxvmXT_%uIAh zKJSjC?P#LknZ{ti(zP-rZj$tbJWqxCy=oo6*_HpIW|oIC6tpdE%Qio-zdMuKVZ4-^y(y;4N1 zIUIB!S;BI4S-ULqXt_gAvU6_C%@XBOk_Q5)VAmj`*K(FnZPn$=oh5^+9<#*?nPX=5 zF6R(GJnI)cM8k))5HF)bSW~6OvDTvWFx9*-}kKa!?_9mYk)ivrL%2Noc$E7-+9+&=>IgGj==`KsUzWfNVDHudsbmB$C2BmAvE zeNK(7xpVrQrGtJc^Ko>=W?6C+e@}s5wvK2Y2a0A-cU^Z2BkgNkCY`6Yeb#es42RtV zwcrQ)A3=p1{O6Hczx-HJr7#ET#c2_v%&O#jHFY~#TOyeW&wl5WH*3%#jgNM%rNuqE z@I^XIWq%-yXN@`xyyite9p1$)WM*j$P~@qNa{s=lfp6zZ=lfG4zoqW$V^zW1LBtP} z#4aWTi4;IAMJSrNfDT+!+N&~bX8n_222$4X5&Qp2-)c%S3L;FBjPGl*>h7{r?-uj^ z9|`;2VP$RtJkqv~3`vH((r`2osbCjSjxKR8&`&B1XM?o(I5!tKhXwkgY(2CfU=V;2ivAtL0(wswK^g(IqMcom;X$g;D^hWB|F=g}@4>K&Da9}b3SBf$ z*NpF}`0oB7v;=dhDrm$(H=q=8t`6{P^{e#d4f26iYqB%b5;IEk>q788^2-(G7teqI zda9#({WKMfjs96U04xM8nH&OBCr#>o#q= z3@O+^yi^3N$WQUfmbw|Y+pDV|BqF?q+I6A`30;r5d((XDHmU`Xf6Sk7-XBGvT*?5= z%FN8{FUfuPxxc5Sr!<2U;ir63@r_G?f~Yr# zw`IWZ+(n!53t2fhnq@JHp^e3f=>N>bVy?#`kJRGN62{m=m1%TK_rvK3Jk{p?R!A2( zUeK=CF8KqqaJKyXqdvjxX}Y2*S-VL6x%9Ld^mbT*!B zORC0dQgFAVs6*bK=Se@{%I=ptu}A9&M%+(%U{NZ z4&0Z`ZRWIJzE`bkLxfs&|s zSLyRCXQN)zlmE4)jpgU~#~4+gQ!(OEu+r%HxNHpKF@)iI*<_SIaTc$^kZ`2Dp&7KA z`4&J5y=-h;7it4YJIUV>EXUT+*HmBjS}21LDFg_BXp_x&*ZpoabG2q~wmFY2`^CLG zkX(boU@rqN`MJm+JEZ*j?nMf-AFiW_$H|AfUlM`c1qR*vuE722@u zCt^>v7(u0g4(3Wq%qBgV;gPd6C^u)fW{;a_o0CzZN+X?IXx;0Ff{4doLTfzWs>lLP z+6>|R*~Zp3r#KJr@y~w{=II83Aq9-YjBM=g&n*(!!`GV|gvr3F9Q$o_+*KS}W~xU= zXHsRM+ywa5%5XR6cD<~skgu_cT#u3|^HzMAudw%lBfQR4Trff_IQ>an4f;7eV%G|v zQdkJu^j4arG$|%CrGxl^TLMqsauapceR(pFajWXhCzUI;w(G2mlLWr;pe&_lpy*IF z{rbD?ZffcVXLE{<)@UGeg4B~*OPPj?%lEwODM`j&Q(!Ce0HZDYHacTuZu zi*6dI{SnZV>BjE#hTmY>Gvkj)v76Hf8FiJCNDx&K8Zq`>$IK9G<0JzjOiVn#WO0y= zGJWedm@o!^_PDe$s>2#LR}nJlCv6~MPfqd0C~_m*L$6JFHiUCx4$ z%+?%Xix6RpFmtOel2XuU$vV1g;;6`>`E5sYT&l;sHa|+57%9*1+4_@ru303JuDfiz z9buOMj37fmmb{V?gLE_Z77A(=%mtSa)>!I|Ohm$nU{2~C&pg~Y1zfud>xLkwtMf2T zQmIN5sOB@~R%C?|cMiPJ;wl!VobyRf6sfEgs#v`q!E11Pp38HHq(KyN(rh5jwanT7 z{`J!Wd9_oF&%w5{pxgj0#P7|b$NBQqE(OhuDt?d9RjnBdcLY^Lh(cC-^yzxSKxJ%7Sne=&Q=d8HW3>0=*7X(3-5RG3-BkAVBbp27&d@MWpO-*e-=XP~f$>P(vJg z>Sp%DDVABC{M=;$oSd0wVJCrTb`4OfkKhF6fP!4}Q z*H(GF%BeT8dtOCwUM632x2Lhm{M>?q*x<&&)P`0W%^=Hwciga+c$PfANmOUbr3^Xb ziYJx&L(2N@JM+Ib>II$e^- z(mT#glczM=x)Br9hs4J~J!?gSl1U%gk|}PVoGzn|#oG@uq?Yp+u4{^4R_|1Wb6%;h z=_H=srmD4(TIC5x+GuK2A?0=oPlsv(b8tx8LbiVBCkj;P@*fXjb>}}*5#Dyp%hI>S zdU2T?^Bi2GCVd;WPLe(W2ol9*iut=+Yhyn1*%^O&>Krz5bT?#$qe>2G`OO1=(z5Ap zZo~B=(+2{md_dlE13R5+Cn&mShbU{wAq%3!BFx*O{(z7#2wg%tY!#?@EkqH|*WMf# z=>S1y%rbFn?JC%*X;LB~EFLAtU-5X5*z)+e&it{ve)yg+t4|8>W=HBx@ z<35`{`^ehb6WvO_$h>@=o?dU_Sy1{7DRf?Q*KE>E))?~)OKvgQr6=XS{ujE>xmbctV4vpO|>MN@WyNocX&#Z$&!iA|7tfog}rA zm=a|zb#=)sPlr8Yk`i&kxkIP1I0!W~PLRUNTU8izjMpW%fs_yHqLa+kXUi+#G!~sCm?v#D zKz&>oyG4;G%`;%VO&VEw^AMn1TvWd$mmu3G*8?!ztB?n&3g{e#f zWFx&4o#-A^D#UpZG~so$XOU}WHvdHamx?e8$Cth zv2wO*Ra}FgUsjol^v6W6z+IUp2}VoVsqupQK$sfNXTLruuWTg6#kYxfVBsyAXNBiz zKP$dUaZdIcSZ=YRcg$HTekL`B4DD*cFIFq4rTcl5vGhRSq=G3olf1GH5%liW)1POX z`g1%J`5v#zoV)kkM|;+Fv3>Lr}}4 z5v-5a161K~V5WE|w+am;bW=1?m#9FY<8#UiQX4|WOr!;%h9Sg4qYi6d1Shq*2W*z+KQCXpw5Njb$g(oA@N;@%;ogv0W zG+BJ`(y!%M$bB!Au)cCBZ3y6c;Ppo2Xxo8=oOxr2GM1c>M-&9yEkQ{MpaT?#GkYOm zH**w7A#s>vnn;Pj3ygAnkL30r`2j~WI#@VEh?XD*PdmK0xw7_fW`tMQmov$uoIO;ppE?Yy7IY8EN!JE%;B_0`gS7*VqK zGh`@1TB{z1s|g#5X;n9|F50soeh}HwCM)&miGSUd`D(G)qzwxqE&x$gZL!vIxpA__kC*krDhp@8Y_oUoyW9`3j8&INbD?UCOx z_!VqTz~zTC5c3kmSVmJ^(HWQNfplD0&UEWAz9HPvPA|1t?Ir&az!dx`MzFqnc31z- zK*K<^#O~S%<-e@U^8K@Di$}rEnLN>sS4=j(!n;eqtTr$XQHxRyR)|G``FD9@ctk~8 zQ8`n)Fg`mANiR7s8!Im>5k)UvJvqHfer5zRg=S)IE`nZyMp6#6aUhu$-ON-sLP){V z!BWCoQ`WGPRjr0~y&fkXtX)E+B1C^F9!5%1A__dop0=DT68caHNvfYqGQbrBdnD*e zB5qDj3Rn{@<_>&(=$@u9fj}Z2PMK02V_2wKVupG~L>=hCM#4mpY8)wkQy>1z9#ji7 z2nrZC+`lQV%4q&LrJ8Abo(+378EHt>nf5XahYU=fkZ05z>A3pB~7%=ax`5Gn|8%hDyfi=-~qfS>H9$g z;@tscw*`cF0O1D$fWb}IVlSIP@vrV@XW5zGeYo}L{II{&Cs3ujc6H4c`UzFr$6hsU z4I%qf&6T=r7|ly+oh#tLKXW?fh9C&46 zFbe$K3JD|)#0LxXueLUuJ$M{@n>q5CvYbQ#mHCAdT!u6?w!4>j@FM1{MjOB~mwQ$} z*bGC!CLb&CqnB#gHXHroLJmQ4!}uFY@LKE$Ho4lU(bqVIo-o{j$=^LOj?WTQ4!}^E zVP;x20pL;O%!h_0g=W9ED{u5_c0Idcp%JvgjRdp@Q`>C($0I}gWes1~K3KkT@{&6- z)N0YeIQF%mXojg31|>O%l!H0U7PBxu;+S@(ph7oLTo}8SoEaPEZu6r*shKfJZ^rvW zI94~Msj8HDc%u=a5FMf@uqmU%Uu!oAk~MPx7UtciyYg|Cj5~*MH!U(s!3)VHX24>E zGEfK?fxK25oEsNRk7)h?@C9|>KMM^;~BqrJieBmsSb{K`AKfG7g zC!-&94a2`FJ7j-RX-90(%c?Xgfy%5s6B}l8TpQEaw{dU=d=UXb0xVndcr9AEDbq|a z9=Y%+Oz6qhb!xuj{GXY}5k^61NxuKJVCntOVy3shoB01+%mhN~ma+R#TGSSnx@ww%8B@C zVa;_|RKJEbi7BNeXe5R!V7joQ4s4^v(v=eR64R0M{z;g?%~Q*?f_3AMM2=EiIuc|P zidL1Kk(!WJnqM14!-vxRtqt%+k+J{peZut2ij*nG=YH~B+zi}V@gaX|C;i@A%461( z^nboo!y!BN^LqW-GLO#V)_yk4#xM3}uLvGs4~3MsZyLxw`&#|oZi@}!bK{e`7H@Gf z_SzjV6xIVUwunXOPbIz&4J3$2AuS!#g}8HK?ab%%jzZikDmyil^|~ntqX&=gSl4?j zpG8@67!u3zFQxIZUZ5e`L0cO)^jY^|;2TLm;M3niV2;xo!I>*eEGcRwHfA55mBldr zV*Z`d!qY(+cj^!|8v79E&sp|eRWAIKnC%pqA~4Bu*hHL)ZnES34my~g+R=g%+Jh!& zvPAa5;O4tWky3~OI2SD~?Z{`yT@2(bO`_n&v^f__4>)mGfAKBJD&T=uzTUxw z%Q*m$?^3gar)h%EQCfb7u&aKS$Uu-$X7tkcJ%66&qkHMMbjeEfPz0;mF^7|@ezxKe zjdlP>K)Am(1CXgQft_E^4_a~^vCMn6->}ZO4gj;t=o!Vts>IilvARo`m#qQJK6JzF zeA?}|gvolsa}MjVEwfV`HrL8)NHHH24`oP5M~E|^2ntVjdw9cdw-3q~+t(*^56*ar z!!rTJr_>KyGBQsM*tWa$86$V zkG#7TLYWkJrxFWhRxvmc=Rj5s6$%*wv^6{!ci2FrLVH1XNSyOT;3}IL5ud#UI+tdR zd7&Fd(vMaSt(m-$+ZcdC)%&VLz>49)lL0pFsKr70`Jn%z%?lnqrk|k{=JaXd>>3pU z097=qjH<4O;rK=~Q25cttIyjgL3)Cp>+Yh=4j<^8B8NCNNE=Mk9S^<@cctI%Gs_ zhDK42npP;ir_Hnayh z!Njbp@`(IpQ&A2J%VVqj$K6%Fg6NeUv=)!a;EzG0_01vEBpxwjER-eb4ym#70J3D5 z#n%z+DU4JST~QzxdyFn{yL!%E}on>7M127K|J1yGx_FZ42wy>Izk{~i*P7N znR75F0mt_CyqcAZNVea2^!0}ufyJGv#R##NC=bO;RMfimD*rqHJ`>=b1I@Y418n4{ z%b#K0JaoH8q~xalCL6)0cR_iw_R<2UWY+ZDC7&H86B6s~ZrZ_iLoPU~)Pp1KTCf1Z zI!`y{7pv-=GVnY0E3AYUQS~{MCl=11um@#Z5}^{H#HCS2fjW$0;L}8{BT{xh1S?co zoVD-RpLBn74`%ws1-oSHQorGD181F?!M37U6hegcYmV#odUOlS^LFxbjwtWJ=wTox*JMeN5f1JjgII^h!4Pk)JZk zSx62rXZSk+X$m##a3M`c+w{eYYe}1n5gI+^RiDsP+~*3>Gr5`h<##$uX@-8PH;wDu`Q>|BnB)iUw8mm^mD|BQ(mSb56s&+X6YS-y zv0W~sJw#A@YcMJIAyl1WBw`@elJ|UKoSoY-OFtnTpbS8G!6*}lNQQm1IygiWcR}l4 z@Gidd<8TcyTf?rCt!LrY{G~=uCP*5^!NQB%mf$GevhJm;Ro>_^mmud zgdia-NY8RP+^~conYyyAH5v>aTR|r^LZ@1bUjjPkinHjts^^m=_a7rt;NCtj7`O`0ufJ z9i|qUJ;OoZ;;MeLS9?iTOJoXG|N^XyhfQr{U&h7|y6z!K%TisVi$E6jp{(d6^{CCiIsh!u!sPyaaF&%_l`=&@u>K|W%cF5##!_RoIQRrmXw9)3 z=AVGQeNFe5^0d+)|NRB2-jvkQHXouhE?@u%1^lMUe|^1)X&KtZ@8SNT@j*=CJ`7(% zj5QaBk>}G`%y1L`$5kXVMk>uJnscwtczan^%-LP1T!~r6-WxDLLo!)=U(bJr`~Pu| z*CfKw`R^dVTLQ-c?h?X&e_JOriYBk8pUpI_S|;(5@~emW5*5 zF~!h+VgU^@BD8)X5b1$8qF*2|qB`wcYmI4+fPAvFL}2$Q?81&XdtQ+NXYY!j+R_B6 z?ZH#hGemd70Ofr9jA=wboU2yY4raUP@p(pZ(0BH8AJ7u$qytg#;v8SnNAAA$ZE09L zcP7VSuoYymdRG@Q?RI&t9JpQ}MV}du1+2{gV?hRAJwBE>LVe&hc*>f@*){!_tK)bX zcLT0mf1ttTJ=cG7wz39(VovG|YIV6;A{B-Zts+#%1r@Lko)E5|1=ZT*Wa__c?nEhd zy@2Twi`Lx=tnszsDxdzkZ%}LVGW((3I$M)lG%#CZ&=nM^S$AD~t&OyqaovyU+onH{ z#pU{5xP>*iZ^&^TNArMTgU#4_DuW>f${Ya*iP6avE$&|TL5%L(4uOF~3lhh0x0H0E zZ4wD%pYkgM`w>$q#-c`Pq;zzmGQMHpJ0EM_r$=S+{(!wMy~)eE{qcZow0hq zO9^c@2F2s_4_S)Tt8cYXxd;tTmT(3{i!3iFtDMYDLq+DUzfq6MgC%s2pzSLVPr0e_277YAkpOdZw0Z?XG`Z-a7%!O zzp$cY^kXD|)p=}sLAK=T|HOOzd=>Yzkmd!#<(9V&1Tm!2bRgwTm5LmJCe8Oy_w`N% zjPTeS2p|!Xrc@Ir!Cs+V%VYW)6(R2ozu5I4gx{VUSU(96e3y1Nsb+3TNS7~Bx?{wU z^Y`NjHAR)zp+vesOuIB^VG8-0J)X2i)o~%T4emyd4>cgS%m;3HDkpc6Q$UyH@7=cJ zLbCm(Q@gbvk4gAv<$>yev$5@}lNi1G!O)lQHR((2A-`LuU?~29m4FWtKhQ$loOHoZ? z8X8g0V*aw~v?T(vP>Xdu@uG$U5hY}V2duON z%6eu*bMEOOTB#}{Nrx_-yLGo_ra2i6-|Z3hYs^XeFJ*!j$cek1{G7Wipy|QzKcMMF zvR}Y}mr(7_B5;=>1;6qRdndaS)e^0R(2IcpKxM^Q9~ZgIilG`iMG8B$4+P1OZgm|C zc64DLn<_MB5EwTWCk##eCM|eO9L>8=vY*)Jdzw4gXdb`nqrvc!rHn?@?`f=1B&*^~ z7oZcz`~L7pd{&TH_Pu8%LIivPO9YpFypSgJYIrjTDN2^UAb30A*3KH>m7))v2;+sy za7xWjF`%%~(i>!8CwWoS#5A-R2>z@Yq>K{Xm+CSH$LgAa`vbIV4sNq)3SQ$g6gw;! zr$sl4eXDpC@D`QcLxCh}(~a=C;_{?nQOT_lXdCX|u|jUn=^(jBB!TF{tF{KBMu-Rn z;sWj&eV8(q48zm0ih8-`1S+AWCcVn4SX$r#Qpu{B-KkBy5cD%P->46_eYr-jllWb2 ziomI={re2|m%VQ4d~k`;)R_2H{L)~&4PC`c8s|+A_Y5rK72j#}y46ay@oUr~aFN%* zOY7X2o|7`oc*D`G-Km!>NIBI;*Vm-zeN@dz;9uGTdCTO-?gTiCdqS@0(&;9o7tRK2 zt2i|18ffpk5u|(1)t^aru*V=S)BPnz#?#ps_D zqM>Vuk!sjdDV)#VkA#C=3bwdEkEPcDGcY9OT^;|OLNt!}PYRI}m7#p3?tMZ3KrAc; zlMV8BYw<>BhlI$~mf%q;mQ;-0(fz%_-2@+5TrP&IJ;z|}=%&m4n6?h4}D4(72l{4rhCN_alPuJJtDXtfDO3F#BT^! z?GqL|n-TdQ zkq_-{#`NiPjJLHl3R+l<((T}N`uhrC_vTRbgz90kTgDb?438hx4k^<{hiYwQ$B2>F zJXe-jJ#qXhSKG{Ne+6t@pv^>cz4R2`-_-Bn!`Xvf3k_ATw+uWPjaRQ~GuV|#G^MTH z3Ysq#UUU4)M`N^8C9f7ej|@Q-nt?i#TVcZLg;H3SuJXPIydkoho!yrS?$i5_#0{@= zkZ@FWSa1JTLt6Et6jIF9 zZIS)S%UHdre%A+^C@L3=UBe^Il-tfS-ju}KbnBgVG49O}88MMbV<2Xj^HYb-!lD7DYtu4G1TO;9v(y(E?(t36f~E%m>i| zpZeu~pZjU5>i10iAKeBIvX}t?9+sTqVCz4;i%&v-$Og2`tk( z|H$o)b{gP0V-To2RT4jPIUn}y@%D~K08QTqGznx*10%!VUtQd3w+U^^pBWB{Y?3LL zdd77c#LTQCM%>GlZN6oaPbpo#h_#Jrjyb@u1K&|0ct%WQlH0o(r(kV?pED~#-!pK~iI*Lvt z?uzb=NL%Y1;3K|mOdN62bG(<6;m41)Rw^UZi``z-*#Be_JzSqidg@7ODelzP-mH~s zqt)?JRFdR)g|}*kKr^K_8$tY&Nu($^UGxO}1}Q^>LR%)oZI1yd16mR+Sh)9v3Ku$e z58-Hc5c)BUOdfU|Y766g{Y#ND8FYeASzb4*ZmJ9ffKjVf++&s|Ih;2E6WmIT6j=ey zWajb#bVk-yUm;)EAp78SF5C1(U=sx-!z)O^hTSZebxfq2dr#&Z32XQ;Zd!15)GGEF zrCqiG`@#>+l(Qz--_AB#rK6lfg2XXx6OFB^QjjA_{p^80;5o+kEa|O)`PCfm=J(wg z{x*p8t}AQEK8Q}qBCzV$m=kI03o&N_%d?T9$yZX6*V09=YV~&I>?El0n3~)s9u9S@ za_*hRE*lYq73*6u6KRCS^#HVWWX5`cqmI$|C*>g6FX2OWTvN(A^8jx8T&ZwHKCfAg#n9B|3>!XTk+ZFad%*SZJ zl27tW*eC)^$kit}0|s^J(szA?aJiA4NF~sBaA^#-;xcRlYgSTlE{9sr&M=t~8f}85 zwCJ-%LDW_d+VT}7XVF6huVib)#PdF24lfD|aG<9p93I?e{|MwR*t2SN4z2gJ8?=E@ z1*W{V49BjIunvG7dBX#5ID!0nyDUka(-i_<7DBrx-}O#*r}kc-dpe>PCZQIl6VDnF>DO^Jbc@AFXP4fLT*oja+rlp zxSyj*jn#beJ6Wr8v2xS|qo%!p;ztd-#}bco=kQTfc$GQ`7@8$jl#0ANr8qg2sZZnBTldn8$OGRl4-(sPfMQigju&+jYFE#&K(Xr@515We7<;bK&e#??V3D|O2TURkDLOQgM zLExYaU~5Cu`P2O$xN5Uh4h1QLk7gjc?`d*+0Y4D(I3PkY@^ zUWQcN^S++h1)7+qv@una^TMU#Qqu0z_w*B6z_%?V*Gs>k9YC3s+NGm?t~+pOTB4DA zC_*wDSs_XG;e9o3cR8Wwur-!%V`iH{a&Iev$=`kyUQ>3o zZBwXn5i>PjloPyfcdjp!lB5~2AA5p>#Wm|Do(B^L0*NMGvp@h*$nEBMkLt5_Z(WMN zQ0GhRK_!uIM+pAHB$oNzFj}HjB5}lHcNI>rNBB zZg9O69%S93%Sk=f+`Hnt+2}^tC6?e;dwEWa%}!F=La;bx8^tS70;!#eY3?*XrS7L6 zh_2w<`f`%eB0-P);Et&2T%^K3%-fZue@0!wLH^X5vBk`Yo8T@s?gfs7cz{~G*2_@y zY+J*;)D%%rd&tvBZiG0;_Gxb(2eGVq3=o_60%a5_w7H>dCU?(vQJj+m62u7GfxBL( z41^PuSuYTp*RB@kvhFlL{~SOGOssQpgQ?IlaYI8BE;d_7kH9OmvYW4YF&A^vSvqBy z{`j1}&3ZfadE|a_oyBdobtwnTZx-?N3DfuAl+g(*RZS&49AqPxO)sTX6SSe`(2FjC zSv@%ojKmb_G%}TMmh2)7qM~GCF-AReqE57usFB<0*f-3m{yDFhu8%}LTym9JtcvyE zU>~^QE-(mDhmA;B90UXRS!fi@^Yb^^NU2Q#Hv^=+9mJ0zR_lECV359BdB(h0w%k3? zQYLUT%9#j=TdY~;Up0!a6W6xPzZ~I^!jRZM4u$!+Shf$KH&oEE(hjjq-)<1J4+Bi( ziM@|sJXQnMKF=8z0%x(blJ5r4$t1X4CzhNWRNv66z58LUOX&K% zNvMk^aP;pG?gaQpt) z6R#x)<#9$O$Qw4w!XpK^2*f3nEq?_HS92;mD~%!r9nNj5O7=G7gb*&m{<_{4XP4Iz zRhtjHDRg4X>haxhoxSzQ{bHW=i0Y%~!4pQ(#FYdPT5PQ2^1%j7o=o8~XO#fcA@(Hk zDO8du*amo#2E@G%QPexC$`DG5k`8DTD-b};qB$Z>RL?kF&?wX_pTsVbaVESoN{paG zr0n#ZQ%#y551#g>szl{?c1wmf(BY~3EY65W6S?qHPh;&97F-_5uO?_;zn8`%Hq+nq z$7Px;+3cXvUuOEvKHu;FbnEh)WBn)Gw7y+p9v35%7n=0U4-Bl>g`&xO^t8(s|HxiY z(2ZkCO*$pDEw*a8DZ&wV{}?)urQf>r{KTbaADeSmO8f0?!UwD3X=ac6J8TgI zw2GW(x>^(}6_urOYw4A3*48631OnN@c9~7lh^2B!h)vP8$DQ1sNFTGC=fp%d^+Qy` zfM-a^wlhUy<>7FWmI5-8G$``?%@mQ>nYp-Z_7BC|9c?pl zm6NNdp$=8uz0IxFI(<47+q!E`I$7v#scfFDt+uupTByBV@`h1CXR;1;F5Bh}{7XxH zeE1A|>Q<&s6j^gpA$U99L(^Y3s&6 z4=vVz@YN>x8}jdWT~`KIWZukv;C$_YI?P!q9CmC0mYUbeR&yPag?sLgG((FwH5i4$ zMn-yqM42K|`F`&Dpo^>@dSK-?c}l2g@;Ou#ncQ}LD5$LKQc?f>rSr2ueXfMHHT~1{ zHQtoCAJ)17{laZiWzI@qH1sH>7Is(2o{bljlw>>Y=uMnhKFJUgktNKwrrH+cgxhU0 z4EcDzx)SV5I@8&Cr82Ou{p$_@@0@WSqr$ z7t)zP2z*yUucyt(4lDMssDc}GIHLmb{?-J&{vNwFyuia0^(B7F8plvVnR!@?5;4@+ zDX&3&Sw+T5I{^y2)`xH$eST^?Ymg^l#Cgv&Ehm*3fyK<^1*Y;)m=lGTTx+{gB3LW5 z#s@NJ_n>FIrT0TidW}eI&=4?q17kKlO!$qcI{B z^QXdG3TJHwk&40en`EwB?#iXLrVrTex=+8C1StDHUfKsGP5eVnEm-T{qW!+&Jym#$ z19ULCXUS{uGKKf&1-WAHSYU4y4h1SnuzPhTA=BHq%V-|5`OZC#w?}fM0Ec_lNtv7| zX?zjmzBt*IUt{Buj^*4BYk}GYM1?=Nk;hRD&`z?FgnnTYrebY`xnUe~ZCE$}Jg@D) zYV4w}QA>5)oQKNYL@D=ibx^LR-NB?@4OHxjNZkFf4nY};VV<<5u%nyY4x)IWhU5d< z9jh~m;8l1q8k+~?V?Zq$=XtW05XQ%TqU_#X7%nD)fZA~ETu)7z8l5EIAs~0A_0@8L zKz#{a_kYaQi?;?zf<8E@LB!#Gozpv!DL48}7QUL&(Z0F7Y4hnzMWLHi15B+T! z4Tfu4$ll=M*_RVFmo0}9r-SZ?xaaA_525dT%=G@c#-m~eCuOgopmn&7fJZ3v7u6Vy zhe%K*f6&WT0>I0W|96i#7ykE-m7Xasp+{o@JF4KlI$4d^!>2c8opvw_%BN&xm!!OHluES0sT^1$2`hr+KO4g zt@^n=O_F~gtKdB$)`!zT0|S|j^5i0LIpt_yul32*)#)dRJT#kJECP6*b^y#{?t#5z_czc zkf9(-47(HYM)kpVBWqxd+?hV?%YNfHJKA@;mD#O;dE5lvV-;v}VE~9nX$po81^mKH{I3c;vg>dq)TYo0r9Uy3JLq0A~$N2<(^B=4N8W~Hfxi?DejK#puCuZ3BY`{#1= zuhpVROV*(|lV41`^~$i)TzZ0|L$N>6lPd;OEHv^te_>Z&+EyC$)>L@vD(p6h=egj6ycw-eX8e5AzHJeWr5ne**Xb(nW{4bS;9pXU||; zIBkwUH2tCe-C)9h2Q=zf`|uR$kE3*8ACP@yqC=$tArFK^4LRl!@%4V0i@AdYVdqMn zJSASlS2}lL0UHM1We-5>^)|y;#tc8{30fRVGLUkS>7>*~D-Yviy5ZzyiA5*0S~dSP z>LS#|)JMa+l^b*cG>DaI6>VS=0}Jk1)nPjDR1W=u6!gcuPGGDc#mb-k2gq8kyB_Np zfXteWnYE_Uowavx9IV+vplJ-?Mx4xCGcEcRq*tnhTY(So`|Of5G|RAtFY!4AiTN%h zAb4KJ8Lb=~{7CU-=k?FW&THw*PM2{6L^&dulS<~mg?&YjJ)BAZwY8yvE?F(xp?vrm zzT`||9NK})({kp@!S`54)^-Jeg0Pw1#RM^icH#E8yVfN;wTQxKf(L|S__ZG%!Es^p z7dmd-j$KeWzExgJH^27!t%?`$Ddw+#aX~RDfw^zhx%^K1;Z5^$+&dWlbZl@5g~_Vt z)`@#Utk88uVIQ$4({2lwB70f7g){gxbLYvBC}9-L#uS~*W?;x&U%x6Q7;X&CiHdFH3GiMOExD?`>3}fsh9)ryjdnNcqVgC-Ied&js};w zg(BS_1HkR}&1H@NUi7cedPx<6?oH4I4NuwY!9_Gt7dNqXu?o{cOd{-A;iVYp@(z1Z zMLnTY#!=OUa*`IM0L(3{?49lGtm)~@ES%}>3@uHJoSo?H4UDY*^Mlra zo!O9)!NiD@fz8Cwh{M3Z*oc{dgMp2i!_e56!-$=c!+_n8iH(KM!q^?)|9CKbKUi2; z{&{9(XJ!4L&;R_9m5G@JfRTlnnVpS+iH(UJfPsmHnUM{EfZ_jo!T(=AT%4Q@90>>j zTun^O4E{g-yZ>*$|Nqm+m$RJF_Y=_HzXE;({s#IN*f;RMpuWNUe*pUp?*9Y$Z;0QJ zzoC3X{f71p{Ts&rfcd{*{e|}p{~O^qqHo0CNd6-IM)r;38|7bA->Cnh`9}MV{;z*7 zEyll?zp?(s_Ko8k*I(Srut3oFZKU}#y8Esw7zM7)A^?NP5&>0|H1HoF#5~*e=+$N=HD#8S^Z`Gm+d$E zza0K@{O0tR%U`a4{nH0{#m8AA#szqJ3=@xOF`>;2aEt^eD=UxWX{(6`}lqkoP4HU8JsU(?@a0QZ9@bGOrk zTnhrZW>J9qmQV`d{_Q?qK((4?^{mv#o)XIQ!H*jE!MtP(z&yn(ZCwwhqv$O`3W3BLd`0p`RI7u2o)2r3LjdChO& zRNzL89H0rNl@Qefr>_*LbQ@gadK6*0ccDO*BFJKUL~S7;c}8{N-617u5$H_WbTM=W zSh2Ah{%KCYe^kxbeBD2zgU@{Dd|;pLC9Z2BvT3-O>@>bo^s@xVsy3-`;rNgs1Gm>k zHb5091iyq4<8|db&U2Cdx0}>c^lK1e>2YoeaAfi?kO?}VD2d!rjGOI^(zj7Pgo_M( zSOxNtKFYpPY#8QoT0Eb_@bzhUzmlXJ)0C7`o}Ew7LZLL0AAXTHiJPiwOiYGT@r+sm zYCsqd;SHKl6xyMp6mM_-+wJwJqYW*Kwb(j21GK?eDCzDS*>?8-t#lNv%CSNyM#uH# z2dJCxD+DZl)$t1b=4Cquok_}-D--kVA6_CbTNy2eN557z?-Xm!Mu2}sPeGBC7v!djn!h5kp)+HuCG66PK&mI6- zZZ_d;VgN!=a+@+FZ&W0bYXwqbKrbSZX;S6^4Qv{Rw(-GFy-F zAfLV;r#D%;yO@bbLJFno{n5B=F|e_1-+n5`*HwhC4`KM6oNStSek`6dMtZHr-}n#T z-1do-#U&FOi)s;6+d%}qV|x!l=NJKsd zMpQ|P93A#;=9`V^yUN`*7}5rUmN6WN_Gy+*uCSq{&k)l8BIzbieS$F*+X%jIRPhI) zh+k~eA(f}1x8$K02LkG^{rVVo&ms9VCeb#tSJ4@fz^$XjmvcI$4!(tOKgX3_{0TBH z!4zx8dpafR-78fFJZu#1%7O?ZNu<}XWHE2)3ROvBHfuLG0&GJinIcvcgoN*C(^&5z znvMfwz`3m}!*F@Q&n-_8Y^M2S6+(HP+RfJYZ+9Y=qxq~k$iz<`cCsSPhTC^-Yg?d` zi|DB(IO|}7KD=J>{&k5gW{rL=*Gfv)=yt}0<29*$^D4pnrOHSuPXTHs%0Ewn{c@9;`SSOmm`l>Z9>c0BEuWy30;;Q>XJayw9Z1F(&lEC>=DU|w zt*BV;vvn9NF5__IY#5`Q45h3z{J@xzA^c9M^j&Buqvh@5Xn6WH!-ha)-QN8e_BpMy!Ll-^*^sBw~jYOozPzW+kIxW`dBhe+cEpXaT}-CujA3Ckq$g` zz^-rE;?F`N6d`mzqngU2Sy#_=u$k8@VTX*%{euaBoTHa4Xp{wX;z_6X>uz*jr7xrN z#ue_Jj-x_#QL7@4aE!lZiadlg?RyW)+ZBH4{fKgNBC_nuX*W0-S+3$FMFCXRHx$NT zy`n6}t-@1MGSZ8ffq}6z40^@5ZAx6?#DO=P#5S9Z~u1dc8O}$)!!H&=yUbqt|T7 zLMbWU-yn-0f3$o?aFO$Dl@*MYboMw{)7N?K=mVM~3702qLo9=ak%MqbHAASf!-BT^ zLvg9>JfDU1KkCx!(*N{%KvXvHBKg=laQ=CqIW;eZ<_z`@PhlsyKzJ2$#w5rjl8S@4 zwW;#?f3WvYVU{+*x+przwr$%sx@_CFZKJ!oY}>YNb=kJ7%i8tNIoCRC&-2f7uFkpI z-%}Sgo-sydWJF|+H!?EgJzEhf;av$Elm_Q(rsoMb)0CF~8G7xB?U_u$9f&n8 z;BA`UL)x zQc#^MLlv$v_Q;W-A*^UaZ@yi_aL|4xSOun{N#JwK>oHEuehIeYcram7$Vz1OmHtB8 zseWmD6MtgqpWqhO9E#~e9u5VeqfmjXOJJ9}fRHAcSjbJ^Ee+A8xH{qZ$~MwAu&_rr z&@P;!Lf#HaQ#ow#N^I-cp$H_M2am~VR7(wxrV9z`K9uWa`F|_U9C?V((H*cNS5j_6 zKHDm`dd5_x9(iO(@QcVw#W6R(taDAW36G&NF#5XIOt}Ik*nd#iet$pZ)_6)P=HCvz z{q)Uc$Lv#PqJ1#~I`xG12n;g^#5qLcy2oGcE%`;lS^gcpd_svq`nRiT@qZ;kb4%Z3 zs=+-Lc0aNSX03fp5P`6;ApvUZ@2;K)dXs$kJwhP>+wbiK&ekvHTvBXW}o4{SA)kpAWcm?Ig zHQr!EaEqit@D!|fbVdtggtNQ4&NhM=mwVCyC~oHEBaW*wxn)iIgajuS43p%fT!qmG zek~tm_Tc#c+J@lKpU+Jqbp`WTy8V*N?DZnpf7N5_lKmR|!F(tX75v*G+czW!KKuSi zd+?0xmjOP9L{Vm6-aGe`22tm@&0hJI_wYjly@L5#fd`gT1ts^wXX7vGDR8RMUSGN9 zLR}ImO7q9o!qH9ZLaCd4T|@7|!U7s3k#$F)&S-Ghf$BTgDUd7qVtV^OPQHvvK0s)_ zi60}3QzkfP#RG3y)QAVA&L<9$zZ1KqM8=?yiuZ^)aTwLfaM=n2n>v&`VvVpYOYjY) zO|{7~y<2c3$M61V1B`Y#%FMA7K2XA@wi9}RlwYJok}$?3E9mJ~O+KbWu!vCjiSDhy zZeU1lD&CcB_%u__Vjq5O3urm(Dcg|H=ypQj6YL=+6u4ibjO%eopKpDaB5$}QhPpI6u1WXdQ|Hi`9q9m0m zn7MDrxf^P@YIgTLnkcAlwe!k4=#vDWFv zc|tnbW^065mxY#CGlnmm_KI21VNavf?G_^Su}drD-G(N*R?fpaJ{1AcebvwO{FJlf z&y#8YJ|711qQMtD@K>};lT}Ji&+1h!LNuYGIDL(3@YM6!$@%8lXo&J)kZI(g)zIwy z-->S!rSzGK^A1?4s$;y{=wu|kmm)L%8-?1)&bZ8TgWxo_{;lhelC}q^N1n9N?9`rp zwbUgRwpo!Mg5!>wq+9>_bvylpaaw>1NnC*ypN*9I!yqq7iB((tVJkw0_%-5&(K&7ZL zGq%!_?kL4%)Y417PVO5pq)`w7nK$>+RmSP19bWsH+%~r!>N+8R7mwhomxATpp&l}= zQdUaGvn{qDW9P-X29Z@QTcO~`>9fU;K=f>g`}&rxaHm6bNs3;ip?O(PE|zr}%`B0f zT6fE#J^;s559ijLH3*`9yl(JrbF@Lw#(YRn@lmRgJ^G=+X-nB5jELaZx?0+J71oH% zaw~~ov-i$%L8OSmQ7KKg@+V=Nj)+NyIM9!CUOl_`B8A+aN&3+Ehyx!NK4hxr>SxQ8 zE@;>KC-8meThm+<0-=)UxnT!DSBEmx3Bh{kyARHY)>R7^Jl1t68YEN$__I+>cQ<9B z;?y%2VVTpM#++N5Kn&WIcDb(F`+NwOjum}nBR7}}3Y~c7x?Jj0fcTPsV+_8QIu$o` z8J6RKf{HkOFX%-zpM1O}H`wZ(OIds2L^06FA zP15|(NAyCtq`-H2av2g&s+>yJnJo09jliApk0PcjiqT`2w? z)Pkz8{uLch|54TrsNUPxI+yU>hcUQ`EJ_|+bKf0WU;9yTGRWfJ=nnslGyF>=RsDuT z7J5V(`9@4Jd zi-K$k)gq&i!QaJq%4y3VCe(?+e}F5n@4C6RQH!x!qD>y(v?n?%*0_GZ;W6k&2M<|Gm_Nv({$cWQ^}JWHMq<9!mPU8UBNV=axuARemZAR!YB;A#x7Wv!~k`9K7>X zR527)2?-`x<5a0jG?(TDX=MU!n3l+7aTV@JKqA&aII!b&Vu~@#A_n`m<>I@_o1T!; z-qebXQXB7NJ3rgE?nm;FV0JA;cQU``XLTVKTWvvyEM)yP#n4U@!KsLEy1{C-r)5jB z6idV1o#Y)C1dqswO2XDRF!r?i$gd|`kkkX=&WR8Hq@_r5f>{j(%z?C4^gPk?WQ8V# zz_}SWJsNHGXc>&tlUmN0uh=5xoJ`oc4pfvm;3#8|=i$4X20(Zf=vaSCg#0H|%lZBzFT=4*79k+qcz} zYAfVOT9!BRu01cY;Yr0PE+Yc4%*9GJ>nvpIH3B9Aq{jHvEd@I~iaI8J+?E8$n%@5a z;UEwJx(_?jLIL(eIa&+x!Zvn4oNu7@(Uu+pZL>(AA$}TaC0q|o^ZjItJXkfwkZtkD z^*K;Q;@x#9Qo`ht5s*cBy}jEJCedABA9OAA29)ri)E?j?SS1LxG^aR_Y_v_(k1fv>^LLZ1L>iOBEST1>l)Bo{9 zKw^QcsU!vlSk*|bMKZG~T>i}+h+`GOS}1=a*&902r^0RWf@ z0RZ5y0D!m`0O*|p0647te(wMP4EfJ~BP;-Tz!v}j`2hfk=>q`LHUI#*697QU0suzC z2LKUH0{}`*0Ki~B0Lb$I0C@cFziJ2o_|XOUMpXcS+9LokqyYe!>;i!PQUHK`JA001qk z008^9oPUx5K<>N%AY}jmh?@!kMC}Lw%n|{B5Ouy~`~U!Wm;pe-Qvd++Gyqty3;-lH z1^{9X0RXXvezyYy0LK58QvwzMBwzI1&Ika=ZScDD3ILMP z{T{y(00_YJ$%~=6adia z0{~2KziqA#0N5vd>$C0Kra=IJ94i3eRRaJ-B7J|}<6B4203e+2u`r$jfRqZq^)dS` z&-u4qKL9`;-!@MC?*Hoy0G#nHAO80^)n5R>FjwC)eYd0at#I~lU2**VZu{Hrytd!= z{cbDh8UUR9ZAVsW0MIS;e{QSSkO6@BF~4=$0sv;41ONrb0DyOmzjadq0OElH05UBA zK6vv zzkSsd07UmKWA9G@(5VRkDEZqb=G{to5HI5FI-{xvAi+7iRz@&O>P-%ot)HEp!zhgP zTTHBG7lx9>>Ho*Xc6MWSQ)W&x zb`w?;Lnc!*b~gHdKK(!R@&7UZ%f|8jKjT07UuJd=Ms_APmVffU%p5HLPyYA+ACH2N z$UiyCfAYW6sk9!MNxyXM1_%*Dwtb@w|fAXv4_CqjQdq|GF*|makFU zZg=aNg{|TuMQQ{eZAMjOH}mOAOLgc~CN4~A2{DwNVBK_ES3nWJ%22wDI}jxymU6Po z3iL?X6`C}v$}|^SPDYJGOEnY4s}BNk9%kB1H{;HBajvWZv(Twx=0KtdH^$e=#Y3zq zYE7-r9me?o9XAuxc6(6EWvjE}I7ECT1rK$FZI;7iE9M3}EcQ}@w|3oFhB`tsAp|E% ziHIyz$QRBJ8h$EODW)2H|B|r%DH_{ep1rxF$PmO7{rUI#TvGpGEZJlZq2L~5)hBy} zZyo5pHaPlFJcdL2Jbs-A?fn-%OT`g;w$0?-@Y82)>PDH)Uk4%T0oQQJxQVFm2Zm+p4s%!tD5?8fu79WD6$xS;W z04Ver8W$|gmxk{zg$-xwu)bJt1jJbhX`sxN zq-0GohE3U5Q;9vtTBK;9m#6~fb$&Z)V}YgP(sYI%-g{%R;VA3;qo+_QGl=eSafp5$ zD8w21I++6o)Pq>5lX$eIp8m;u^#hR%cduI2B84#VEXr7{cH~nnlkbl~BX<5KQwT|A z@-E5M0TLJ#=q#Oe(_56dd6k|TSHjCn@&szl?Uq^LW67kq0$dFNL|#2(m5q4uZ#*U( zS#7s&K`U5!;Yo-u@$c`M9tMPrmGHi|DVJ*^+2${yyR>t(&@Ji?-$20-c?0T+r60E) zJY*^9K3s9_*Akta)(tq8mq(`WZ&~|4jF=;A^brz1;XiP~-KeR?9a~r(%bGgJ+_3m$ z)ApOg7JeFGl#(ytn0JG7kaiQwk3?f?rAQ-x`F(vQtmx zPzI&BwJ*+NBT7}r+FnZ0gqv{&O>!7IgpI#VYp(~n1(Y+(vDLE0o)K*~Hw8wS-w<(^ z!gPQ|(rB0T*37xPoeC^<1!-LsUEHnw$%a%RHgnZ6C_9X>R;4fd15Z%t^?~6%OIGNoI#)wPmoDFuLW0UKTqkDO zpz9Wjx1H7Kb<$r9V{8n^v_#8Pra2>b$~^oChXV>Ym%o$?@B^3H-iF@1TNAYK5O@|j z#`*fI7B(Gyo-fbUw%?h%tb)MEF)!yisC?)73w->VfYy6GG zi=%LX3V{Est%In{=kNAR!27l{YA$Q8Tk0jN@0u5DSUQZ@65s&at8lFO|F47i64j%T z^3t-jRCH2{(q^N+@5VouiS6yz^=VT+-(#!!sA+h&5tR+WgKPTEQy!Oqu<1?}^&7O= zw&m81n+X6UCqyyb72qD3i`bU->%(^q4>ZMIwM1m~bUaiFE3){gl0QSw7)iNgcd$Wa zs|#a2OL=`d7rs8GuI{v)sQyHvu!3PLJI`EvKXqUE;0(Fv)z^IOI$*Pm=?*LWydlbG z%F)=>AkIdWxXVr{iO&*k%Rz<)S4_>yUS04y%fM$K^T;C<dAm2MRRx#AIQfQ?WcuD$ZL zst3y9&Hgs`ohfZd%!T+7!}(&526|rb@iBVBH}C*wJ@b(49o8^|_4_)`aZ(pHj8P2hb3fbSJ#|9wP|Oj@7=|TAEGeZZTMcuA3Oo2@D0=- zcDM^YVdY2sC+aJ~Oz{U+ehDLH797Nf9t`;Y)lDY{W>2^~r7>^XfCD4;q~fYikibYs z@a-7t+=rq+?{UBQhvgG0n(G!^Snvx4`K1YCILiBaV8gTv|4B9ik1{7uPPVL>FFMmO zJ4qp;tVS#T3O#&;Bx7RoOvICQ)0e_Xt#Cr`wO>F1>P6MoIAgTlp&|ayVpx*w<5uL- zZlhJ>cpO{XPzl|c+!!8dZA3muzJ5eDfmsl%-dJfS3PkftS2!{&YZX*hM(KBeg0%%G zuI*W1btpXC4%nNGP=rYhd=mgU#tf-M^G#`8O5ty-+WHqTC{wg;X( z`Fz!ja4+fx!c?mkX(biqOyXu^6bshDYHd9akqR8`9qrRtQGj!ASjjFI6GKI)F6a=# zTw3EsQ{#qfdOQ)BKe{oIHN}LSBpMw$J1%F}G!bpcWNJU1*GwC~Z}0Hi@qzeW%MCtn zpv=M^weBG+7`NNHbCC_!;^)jh&H2uAS8vNdgj$5}7MYNVkmI}AB*?4fyQ>Tp8p)ur z({>6_l&l)rTLKxYnhXm*LaXG4g;GQ-96<5`Dpu-TR4h+3oj&;r(j4KqKfU zVV`z#3C=Q-QA(f4@tULkIc8V5Y!qG5UW~!=Y*pvhK&9TV_bfs^iin3OELkQKsJoU- z1uHF5SF#7yp8ot7v}#6ED#~kkR~M38j>3}=lMk&Y7j0%uBbv1WEyHcn1R{E1i>gvK zAGW`zUy$pq8(#G66^g2oXU(O%6J0o)QA;n;&6JR|RZ(b!Q(5R2q6z7@`g6V8(!ZTt z*SGlI7f0f|F7zdOxxH%fi}NXLxPc%5H|0bzy<{& z`^>P=7UZD&gKH0`C2t72NJ&ih-3qnfj<%nPSBhc2R#mZJR5IH_(um()bHXiLr(M!V zBpV9j!pC4OtNTw_@GZfZq4+%gQZ#!r6Zud+DYr1#i%|AEA-Vr3y54Wgw1zO&&6uIP zTVz-so-xlKb2){A6Vt|XviYALXh(i|Op21eM|H^YgW^U5G_;2k{Av0dXfPIR*ZP}g$!Qg!<8dc{beT&{e!v}_a6_I)# zM-wdc@WQM&|Bjcn#=)6zV)N3SwJn60{3XKsIGYk8VnH)5wIOVF*Pl4-h(rHdFZI-` z=_lhp7W_BiF{Lsw{O9f-{uX4ucI=d_aA1MeuN!MS)gx&l4s`bo)>Z~~D6B%GHl=Z6 zzm)L_!iw<@;-YzE6;;hWnH5GUT(Qahc#Xf(M#&SWHm2pbXA) z;=++zyO)hR6v{0%Ey!76eO53irN?0LV zh-0(3S%?;aH>esnUJXJlcWIdLmZgd(BGVVrhU|sJdBB)9Fr&*=v6@*o* zNOA7OBo*k4a0;ns(dxZiua(^uc?mS}>**|uOi<0q9}I$^Nn zwycl$g|47L>~~2_36C-k=?l)WAz&cc3XWl9C?5=YXg%lRx+ccFe8)rK6-yg`?jWmm?mBn62;+|T@O zs47%b52CNv?l&o?K>0TI7<7@Y4;|!&M$dXd9AoX7wV2-`sZr<1Jt){ni^4FY4%+CuF*L5zS)Sboh;oEv+7+GM}WA9Rh!K=Uo)?)cCC_*U;F%Ug3*&L*v) zl+a4K373l(RVfXRa5a;YtY6bgVHdcR^KKOT2}0sNk4gH%n>fva?~8I~B)06=lW$e= z%V^ZaTVo?3ylrtFNV^Gm)by$I>`G% z7$w2YR*KO#YW|c6bE5pb&(bZHBQ>S9d|pA(apTU|TKd5ArMBQ@e=0y|GdB@@G#eN} zbi}#{m)Q#g${Ek^bS4|e;A(RvEDM8T%D5Kp(?cZ_71O7ru1m(FXLVBw&sR+UtF@{@ zPGmx{`}>!@Qi|(@6P)I_TxB;}N*(5`i7+#;#sjjwTfP!LRm23|+hmWtp_cO7&)ODA z85035;k$UyIj)3b?2GZ#OEO?LSCetLkbY&k@pTe25gTOh>!usXu{BH#HKq-O+qY$l z6YTLmTk-b}`~5Xv+&WY6`aJw=vw~h+23ncptMy6Zg~Y+TV}4C3P}*R$ixH7RrInZ^ z_ybyP@5OfKs$$406Lx*C`+|25kNd74B=vfsi*aE?mP}6?xep&F28v7 zoSD0Kzd?PLmbU#mC%WI(J9NIUWryyFQarnDErQ)1tN1>QjrsbOf#4{zDa>M3;RR_! z>R0!%LOoejVR|E`3GS&6FR!{^`1EZC$z7O^*$c_9rHr7?JAIUv>-Gb3WJTN;O{wI` z?Ly7WDiU(R`lsX#bRh&oj=5i*qxGqxK>@VVU@)WXaF`VPwiiVv&8=iS>f?Sh&4b}T zwEHCLfC5JQ_qO(9Ji2pk38j_`M|aRV&3KUpr9pttf=eUnRpMw9uVc>1w@Aj+LNSU4 zL1aE7=4B=K&uhc5#**iZQD_)5>&CCoc{GBWPEfsbzbsog z@r5rB+&a`JM#qNVPv9u9KC`yt(e>q`$Ubq*Xyi1{^RQ+jzx%IgNX}X;=;MPAGyE|5#_BP^4I0z#-;Lc^!-D&4Tsr1Rg zhlqaDrw4X2uL#vv3sZ}jbuOH(op}wXon1K-Q= z@x3&ikHe4NJz0Lq3Qk@wgY&k+?+{p=TD(Uw@7E^;lnB)nU*sPxhxY0%ix7WB9_m;h zPOhVmsN2+Qm{#ix zoE$zNl?rdAi_YS3%BipJlk#Q6xAU*!xTm)5tBO^yB9iQ$G1a>G>;1=vIo?J$DsQ-sF|cD0URdANxkwkSz7S~7yM zQ!vX<9zT&!&eMli|2--*065fv4r!$of1*tI7H$2>9xr}@+Zn+ql8T0`&+-2cL`y7&^{+-~r5F{L`!BHLX&I)Y6_I@P*q z>KCSIrgFBi-4YeKA%&WKeUN~XBLNye_q=NTAm90e4jmoBV;jK3yzY7s$Rf$qKS5Om zlCse&HVY%=VWYH*c=)wp2|p@gBQ>*B0f8I1p0uRmIlK(?FTh}~u(W^wmIRj)&U79} zT<~`k>yKRnG%#vGckW@R$&k}vs64yz4Iq;cKPRH~9cp`{$)O&I1BX^rUb{2KWjE1oEM~3FfkSE2o$_XrBP8M4pIolBE8(&9MrI}iPlh8+%2x8;1WH< zug}8@^D23GfjV@Ir66=Py8QNdOKuIt$3R2iEzbRBnREz_Of)4SElP6KP#{D*2roVm z3UvcCT~FBReyq5x{KETfylLCnsvx~66_gGsaO7I11*M?6-VRUmVo8jOr^QE^be66` znCX8!GZy6gbtVD4aij-}Bi&l=ZedR3E21V+m+n)muj530yqPD)L*T{d-4M_EgAD%e z@3p}BUxYSgevN5=rd1Pdofx!F~--0 z_;DRW94ezNM1emi_nzv5T2ytvm^DhAcZ#vIiq4M<)6ofJ=r;(G14KPcA7>Aw|r2PFsvHq2UfZjmJ^Y zv^uP=Wl0>#cxpW9R*KD%B-Y&AGb}Hcw1JLq2`HTHSfH~flXp+bTG7#}t>u<892$!GzEw4ke&D@OAD<&Al0cg*EHeHtx^zFm?-{VO8(up^@%Wzq`igo^#JRFFs z;easUJNX#rhZ$xv%(UaH#`;rsEILB@vX~9`*v(tzAb(%Y}mHQ?ophu%AcS}ze)8I{avZ*p{yXk;e|EjsHUEjb@ zQv&D5LGEgvORG8ME1gGy2XJ-8h8KWNoxAVl!!zssk5w!Ljjkad-$ug2b$1VmIqskj7PrP^@xv)7XD z$V>U7b**I2#+9N4vMtV>l${fhqXVpZT5V)mBM>CBoa+9TYK?B6XK9VE&n}>oVUPi- ze%8vh`4)&0;v-*APjWOgY){J3GgvtQ@%`?U>eeWpg-oCI{BznH zK!blPIJi@9fE6u4%c)$t%5IPvX3LCoQ$mVH3|tLx)vVNj)Wl_mDxkeHPL&D2*_dlb zAPxq!Fb@&x<_99*|4m@PdKMxy8Qljf1Qw$-b1LfnB_jAlB;OW+7SWchx>x`85SN7%)jS{_IvSqrCu3mMp9fUBLqV}j5PXt2~(VFXMKc0qi>d)&9cij=t z_iWC6fy(aH@H#kMoU=`;tEJs$o~B~(&W4RXk0W3!9^Lh(NvfD@g=?TIx(<89{7C9z zkfXQnN+w=>*CBpERE~XaAgqZmiW{TTH{WUIX2FV{cwv|yA zFA$f7uBNc$H$e;cWEl777MO(UeXXw5+VftMBbj041ZHtFLG2Z^@)s2y{zi(=x1YZO@?dm3I~4&^t^#ev+Bab+W8`M-B>{Z2hB8|GfyEEl?U5@-YtfpP)R?_|;O!`xv>Uny}1b1+I+ zeW6Bk8-!cbtQxP#^geAKc1w)uqQv8!iV&$({(aRuIv-feaD)j20@kN4d&o_5S2Gd1S z=WlWQqUw8SL0LQ2X>a*ACo~7tk+m|er+0f_&TdDT|FB(2$!q1^Nk+V@}ck%@_TAqot`>*;``44XctW#G;foJHZ%-gKnOL-6uaqC08q7ZSf3ZtU zGM8OMhR1kvQcj?{74BX~qM4+h4vxG?~@dhd>rr##S*OSWY70 zBI{8?a0so|JuFbT;boW^Kg% zS#y7r{!=)>{QhZf3v+p5(wO0 zdc0Q?*~L(kOs(D=rv#9yi{PEPJ(;`a1`#v}@VxnT$m@sHLyj_n#0@rE2iFknPq)3& z)Gs=5$F1zS00dsVS^NaW3nSujk|t$9&l{0)Q}W!ATCs0s8?#LTu$JktpBqk8HxFh)bV7y+Er(=g zDY1EYX&3;fnG9hK;WOKY^fVKIjv5~=H{b+KX-mnB&_^D!D0JJfnHt}jsfud3j3=tB$YJ!5lq2n`?LJFhEyGW4&e#{;_s$N|ET3<%Mn?Ll6?q(n=8V_9kqwpcxN^f z=FSt5Xm?K)Dx|0BJ2?(0D|a+w<3oBlx>0|#^WZe5Fe-8q%xJdsQ+y`vCy8y-XNk#) z8A1~Vb2`+nw}PDMs)~NG9rGKz>-2@+D}968Yusw|-?-H`r_j~FcYywAo6!LTw%5!L zld$*SCwB;kt{2snWL!Ud$n6jE{b`hf?n%?8|CYq=kPC!ez-eYs#1#A3w;p32W^C!LuQ9%Sk1|3+bxJ}FN&)Z8faA9q2v)ry6A5AFU27mcTtGQOX(26o zudpmnRL5g>fNvsxY@bNlfuth_S6{+%l;@MCWSWk??xDE55BYoPz;pfnh`JWyVY^g+ zTf-4!4t!P%-#Vzy%*83eQZH_=3vd?{tCuscZSVQkMmo;TlG9Z&3`E@el`QT==739t z4}yceEO?kO>+hk)J|B*TDXw_i+Tn)Zrtq+}?22ma|XtLuD0{?x2&yAxDcRiEw~s5xA7;vnvEYY3bNrELisYLWzm?(*eMPO z(-E2Bt;3+8Aj6oEqh8AOz9NVH62U?JFpwKac`DXFG)0QGV^2n=%N6+^mW5sxwneLp z4=BPH;yjoS(fXxSH3jiENu^SvR50R8x*TBiplS>s3yb=p;KIh0*4m#b;Cryd#T3O*mi%Wg>@fS}@xYa|j`oiDAg z8HSVCms5Cyq=oWl70_tnd=DL4|32T(6|XZ8`pja7nJc>10!{q8 z(-+6vdcK{i{y1mXi6-Wq7Dk#ngB4c78)H-KSR+>))#*#X0o`!y4amsy<;@`sgbO6PvnH?<5jM~q& zuj+h*s1hX2sfm2XCReL!1gioh~90gU!WJ zB70ICkN`;ub3)jxXm;{hZ`M?sfJHPtYj3i0w=O6*WE37*3%;dTQ_X``T@g%Gx$JB4 zS40lQ3(p3FC4Z;5%sT%7uqvW}-je}Sc2)uJ#ydiL`1Q0x*ZCrWeXj$*+p*jX(+pJr z+^w?YMhHs|qnD~BSWPXvugdHI#;gf zZtCNPiMO;6^h**y8I-o&myKRNMIOhOvEf8~)uZKq0Hbn{e~Cr@*#0UhTWOw&dl0M2 z+2q3ueyN-~qo+=@p+;;S)_hT(bF;e)B4D%Gcj9lr(b*hW+N~6= z(mg1?iAo@)Z5yi|fy$20O65<7yl^3=D3+UMP(SJ}(4(<| zW37OQ2K~(#&^mjT|5<3&{trT<|A>4(;{OsOIbfgn5*nvRS5r*XVXS1|ws)NC%JF*7S3^h&>X&*i`4?v*mtNZ-((yd-Rk14w}jLq()}i zm&r4m2JFGJY5YFYHpES9j_o28y>5B8m>QJl}+zZdwhx+kp) z=P`~g;2c?XEX_Mxx7T4P1Pbftt=-1I3_YT~5N`S$z0rx*N{ze?{Bb=WF^BLugB7>y zywN%BS_DqHuC5(|F|TIByICB3T#gVNPucOFmPG3KYIU~*;B0EV!+&yf$Zg*eKwd80 z?xKIW8!X)Vl<=Io^J2<&&N-hCuuME)3f@i} zrafJH_i9it_zMB$Z!=}x(J@E7wH2G4&?}M5^EOWf<4W%i>Reu*$_J(yKO>={s&(`` ztbd~67L?__$sl?}AwBl##=dF3zecdf1U6;!*N1@tf*rRWqoY9UfH%htfp~MMR$3hQ zj*0TjZA4Ea$Yv>rzn#Y7GK~|46+RGj?t$@id}Vix3DPH7%rfCTbD;B3e3{r{#jFXw z6eq&rMVaDI1al$_DsHeT?U9g4WQvd(fZTcMm6W#r1|;&M!|@L5lA_~XqZM$ zebl^N|NcPYF2YqCm?BR5CSoi#3+U_W@|qE9V@=sWqgNhi6V-qlRPvLY+PUL-HZ@A( zy~;uHanGz6+Gi*>Di!`v?lacXn`Ot8pCPxY8^CJZ@sQ?qc|kI>Uarjhm3LZI7j7zL z(lQnlj)8tM<=w#%d|%<-tB;*1#(Ah;{*HgigXhW$c^fE~X-5kqQk5Pk`t~n3>`VER zLo4FlsB#PXlq^&TaW-|)ch@;MiHjQ8*vW+HYXyMMx)u%3CR!`wvzmrks+@^`AMW}z z9W_|~vawenPtxG&J=4ZwC#~VJ$`Rb4NfCt7IaEZYUAXvjyk}IlV1@pHPw6TG69;tk z7|zF5-j9c7)3TopvLxx}=13LageV?W&gJ4&x6(z7`Dq1|rHw#!Bj#@Q0$_o%WI z<#chqOWHzk8ad%zt7vcaG4wXv!)ApqHnGss)tiMX{@W4+K9R?$ZOA;I7w*Yyfq_7( zDgo}usvrCXNnEbsyxXx4CfKGB!^x_ykM{b55)IO*St!nqukL@?~7~|M36^8Mr zbKg!d3K5VnMvRB*UC+E7?zX_wOBZPNl+J_5(t!HHQc)_WX;SJD5(gFTCH4&enj}Or z2dGlhBonGe)p2Z%CR3e20`A%@w>9%Q;UEPXtWsb&C6lus8;lVNqO4RkP71(Og_;e& z5!I=7o)c;4siBC^TN~OkJRtVOhB|{V`5xpdekCDR@X+!5Ko^~LjG5?rWkRMU8qXc< z7pA+2|CMbDULy^e)t>*sQVZ~Z3w%nVtpxL+Po;;QM4SWK$RL9HaU)TBSw)r0&8RC? ziP%YYmc1L;8vR?YQNakzfbS&`jTjH0`2t^uPC|IKp~(>O26n|X@Ic9FB1Q>cfUnn1 z5ZM76*Q}N--BFu_Hff7%vV{^pYo66iikkdv8)OfjIJx{2E1(D7hoSNBa3h_`#U?uu z3Y-lnzQnjgQqjU*q@m6&tUPNlCG-?ye)e&QqW(hE#b~SWPxT9Z*0qX48)fidVF5a- zb#d3#qkSU>(bI5B>X!*D*4096zDdnAd8DmWEUs1%9R5vwOg{fh{?;vHR(-miNAqN? zFcsMh%9DH(T36h6X8y)brJR!AL44?Cx>II9Jd|#@_fDBqFgj334=+&r*57bEZMQA; zybqox84=H^C5qwMs@b0199eiQ?u@6@ZvKXxzhxP}svW0xZ{j%HX%6hqJy?n_cjzxZ zY;{HUL>4PklvB;kjN24$o0PR+b1=qa_;|(oh~=e6H?XqQ46aaiiyAV+G>F^!DN6d7 zMX|*@NGcjRS^3!cNm==58o}4gNLktm`N&ymTEVx=C|Vgw`S@vRIa)!fQRP||aVgwe zRkgJyD&H$H|7itSqyE4;fe4`R$b1`a4tEWPS8jC5=a&$!U-;jkfOm@qaK{ z@v>{uA5L~2WX>n5fMx8(Cr)-Ecfs<|SMSB=&mSO%{&U{{`5-ED3?fxU4EiowYL7*^ zvdyY0uwCgtJLFHMAgu)czZd?UnVg`FoROWJ{3C7VV8YFQ|8%h5_eVvIt;>OS_3h&K zyfwgZ1O=oc{`-5I>g!JHoUp#lJ;1IdRTpb=>Auoylbn&b)@RYw6P7%(;RO+xT}v>I__hit*6RnO>SRh8 z!;j&j?HQ!=aw0*DxCW1+IDtzBNViTFh{68+3z+gIMhc7}N-b~dYK1X}>eJnWgn~Z{ zk&f3(0j1y~+r6{TCfz-qQ@nCnhcjBXhnTCp949G?@S-R*e2QU;`JwyfJTec|BWvwq ztaGZ)h%Iam*))x5ZtXCKg|koY!+x=4VFV(jot0;MVvOmkctzvG8m2BQyr3xBBKT#b z^@^E7#|Un=JzJA*0L$=}Kx6CyhY`VqyE@AO9u_-%fdn5;XS~wnph<8dq8$k5a$X-E z#*HDqUE71KwOpGQ-Gj%-lWeOa_lgHI8EN`+m|HAnVL0$D<-K+vMIkekI%A&nlV$3bz< zRqB0cR_(;Q_#|@;;}idOh+Ud4M{^1+nn&0mz>dZ8M~!@h7sz41Me7`7!=_repcz;i z9&QS>Ty-n(18<#?FOwjQ0ZtiVy0rbVxK!1Lzp2|Nk7AtjTeoj(kXOR4Qhytl)Po6& zfOMJdA^3nBW66-GZsf7MNfMS{R)b*6lys_7DTH)6 z-gI;qX?1J%k)G{rdX=FudB$?na94#myYP3RgoM*oUDl;Z+7~>x{>tG_)WgGWwiM+6 z_pzUcfy@(6aIIqgupx5ZpPsuHw&=xK=Xia)_P!!_MAR?71!yzQ(D+6F8G|K z1%00tYadm9M%VY$gt18=r;qiHYjZ5{FjDw7n&KdDS{kB$Tj46UnmK<}@}}3G`x~sk zZ?JswL)C%AKW0`-?Q9+Ibs)1Sk6@+cHfba5*VMQ_F}m&rmNKDv4x{8~a-?l5rk4$f&adrF>vspU~?#3~f7${58l&(i)O3ir3&ZS3lP)J}|UZ zworTj=2fReiGx}Hw7h8)DonP6wdeK~Biow=Cg5Ka%E}#8KSgm)7!4Qa65lrC)qJV+ zAyQz?(#KXH?Ga08=)V=4Y|6f!Gx?Zf>tLoebGy*vW6)Ld5K`1s6^9Q!j>5WC8$5mZ zG1Cv(h42RyQ7a3oElDPzjE!zRV-4Ogk;92OrH60@c)J3gUlo0I{+t#?wuwo#DN(3O zj{$qbZGaAKDW0QHWWvVzd1JMXG zyuFLDfK0mt(mkdv*2b)^OVS>wH%x7{6?nknnt)AyLR>lc|8xbh7X547_hcc{V;~&n zFT&_W#$JPYmxASLdnBwxp`X!yW=WPUlbqI}2C-FaZ;-`MD6QYJbc}5kaO~oW~C#5tv8*Svi z$_sK&mERe}=W-hW*(J4HPnDKaH`xSucRSO!^BNr=Yu6r2_b2#?e=^O~wam$>c|(}~ z9eNqdsfrXevtF>ARQna;laug-Vgs5tEXHEwSO8^_Z0T@f8cXnk$M*`BPA$zUfw5O0 zP?RIWh}rmP*mxClAW6I$Vm-Jcu5dp`ey$rL&}ID<-38C_+`_669!PtC3I7FWB*8HF zshN^^lrnYn6wPv3kj+dmo#vL|PO$34T*{Xcr(2{4(?QBWmy#sO{AIJ4^;^X?ex}9gk2- zO43C$j8e%iPZ&6?wb*>Avp;aqDpy>oK%)<8<4%r&1LUy~k3T^Ftsv4jkQ&?^ZOBWF zWc%lWsGl>_A60Qk=Q}R+$T28dPlxPQTnq|CN`R1)pPpl+u%@3`RFImYm7$N6k!1d~ ziP_Q<;C>rRIQM_$=kpIH7l6TwT@_DpWSVkRJi~M>UT|OPhSV;J0d*L#mz5CzlfSN{ zWsuf6R-Yt3P#k8Oea35a^62x7BIYxH%au#oP07X5B*>6v=%)H72uhnj!d-)F#-v5h z$NMSU&YKpR1(S11Rjsy`4&Hq7ahiF}xk@TQTOSQT?Ma8Sj}gM`k*TXNAvMT|3WkKy zaF0-*DrTMK7k3oR$S6n@Yp>1(uSv9*7hPT#2tldx|8 z!09As9tV=3=1mY0HIdnMKnvTK;qq!%^b2)&Tedv^6a$`sgp}emY8!Rh^;YQ~_4#U9 z1#*1c{KEdoJw++L)Ky##>~)X^{ZaB9QVkg3i-N*n9Wr8lDIrXbMWl$9?=f(Le~0?F z@^s(GKk=T=*SQs)Dxi6Y!45NljAA&}C)R#A=*#2?p&PkK7IL_^i zp(AJr|A)|Vn=O5>yU{`%1fqJem$5R~dn@gu`>D5g+SgH<#ZOQ!=U+w6@co4>nA6Of z<~+*eFM5 zu#oSC7iIlGSEf2+F>Ra47TuU=%F*-?-+b{hIf-+h;H713UM*gMx8##D_ z>VTYlgrc|*RSak7OlC>73IgE&$}CWd@n2KBbMoLhu@O4V_ZlAS^O^rksOur~T_9yG z)n9ytJ)>8(u!zwoMRxLwt$|bSspN9X>gp=M65cXj0$M2ni#umL?b^C^x5Y>G=UOOU zHHSV{HQbL<35Id=xHm#pE-j)*mn*wq-Pl#LVoCoN8PU?wN$Cmm+V?usG*5~*Eu?IZ z<(?m%HLP;`bAps(WAf&+SCZpe$hOTB^-N)#qRQ9%f_i9kgqAunYFsopR0aT&N@#(44J;y8hZ>VpLxv77 ztw63fLEYa24VwQBjExJPkwXhJFPXdBIHIE#Sb`P=C)aqz8k4!| zDcSh=$?8ZIiMV=lmGU?ns8xxYN-29JegM%zBiAZ1mMT=uDvrul3hs>@P@M+Ys!&pY z4_!i5X0Az^o-PVv6-J4TOIz5ip{@{^1cl=Gh_K9USa3s)N(feocugwem>fe&>gJr% z0!VeJq);`WYV%z-JqHP0*eOHR#MZM-kQc0KZy~dB%v+3%ox_69*eD!);DA+^kG?j| z;PZ&89f7c&BjxOg85jVS?PYrd^gpp-v#6U582%jl!3A%7b&%Ny4B+bpf5`tgn@P_} zo1GZnT-)(<+Nag^p$;;UX0{XWS)*hLm$gyNo36Fm`DlAejuME$gJsBk4tc;rPfB^vWnDyZoT|bS5}CwtYap3By~dBG z*W5U}B8_h|9AEGEGaNs!KV&@(N{Ybzzn%U;XQzWt^4{`IOoo7zo-X*QXk} z!3dnf>d=#DOr%Z6(c7d!352rxjANn&2gWM5W2v$GEbdE~06);A!Yqpgb8e80RJo%R zW)*!BDSm&O|e_Xi4x$h->-l;_9vJD zcZ1oWj7uFb*>4mr2cHuaX5+!5DVNY=(P<^9Fy&Lyq`xh_!gWSx(Pd0?iAdRsa)R?W zop{wQU0}=ZT*fUEY07R?8cG>biY_bsbN%1%B+f5PZrtSRQVBUzQ7$i0q=lE+09TXc zzj_d^NQCKzgd#t&(;g+o$Z{h~cbDm@6by)=A61=+p+qW+(bcDD%Pu-pl*!_jV<=5t z_67wofVDe!t6OPV;$vWvRU}Vs8OpS9R?a=b8@CS`#{QISMmEN^wsg}Nu*F+4Xc&Nd zE*!vY=A=#YcAJ+v6s&~jKp0H6bJW-_sv3}@LK`zOZAeT|qb^dhvG5L0QVMb_(!kAz z8r9E1i)85->Vg&>n+77S5}g~t^OH6~#TyxRbOEJv%WkN@`Z3UA`9#z z12nGii2_`j-ts~8le4n|>Cup0%9&%}jc2%$Y7YG!@^jiDW`adoVM(MJGbhOxGGsza zVRgob9aCbt2nxe-pWoPK6P)IV^@Y3Je|#2F%7n(6$JH%{2YK24O*g{mVJTebY^pJmK>zZ7v`ol-2cLVsPxSKR z+MfPpE;=U%3+UOOq;gj%X%8AK5Gg5XW6kJpmu9=IkeTF2kU#uuR;LI)WDgFUk$2|S zkFFdPy;tQ@cnV>>E&bFt`XT*H?XLH-eH79!X%`yBN98>xafItQM6!?ajN z{S0N_^o8=K9fmIpk8tngZ58Pt{S9$5JhXjNBKr;XMekB{`Iu+zA(wW#$F+I$ zWa@TL#9So&`0$5x4pM^6@32tb6?(_N_*+;sd)v?y?kB4EKs7!zchO_~np&C;`4AQU z8V?D-jPs~|UFd#Rz#)vbFnj(e7^l#j&vX8BEbIsK5S+}>QT#CK!k$t<2Ip$Hv=*dpXwaOAKfR-nK5SN&&MRbAM{6Qd=G!PP zx}7cy>OO31qO#H-=6fZyciyc1O`SbF-MtTD;k_#o#W%UV*|A20A`GRhjb@P%#9 z-5+q8O;0^eE>8aEfZQ9vn1VDD7@WrKmX0)_cWt{z%OFjCkM0aW0e0r7{x?AX#tQPS zq2Ak6;{h8pbTGnH-tZSl0CNpk=6|O?{bwjM-)QuEEOC(CSY3Bx2^r_aCFHbjE57U2 z9M|+BHc~8@Qlw~RRGv@Hoin<+Z)aiqP8Au~pg=|3Bsh=o|3)G59m!m69yJifq>;51 zQkvJ}S6mz+ACV4^scRDV5@$SUlrYu*XSl`R-<;;@l(=y;wzlC(s|99xo6uE=%HHC5 z&*TikMHVS`T1M9HmY{y4nRnB3%f(DB(|oj?B!nz0Nf$jMJt@1myB88L=KEeEh8jT4 ztn7ly+}96nP|Kyh!+^s>5z@mYy%A-3Ct^A_^+qbYLQ$izV<$YqZ}cV}nHgg(>GmQVEYZM-GFOJl5G?F9hSLTi zkdgJ&r9qg`l4)dN(9O-zWNpx8o{^GVWza)pkz_?fI+@T~21!Jf(3y-$!wDSBZ}$9S z*u9VdZy3zzfAg-HG5K$cK$hol46WGp`O@zfv8?d7)XYu3j@w3vnSu}aU*bJ)*lut>CstCXYeuhJy$&i?oxZ;`EW|Q9+Es(t)Vi>X^~q zdq%LP7#4?ngBVK#W@;*?%;!{_lT#z$_y|qMf0alp8EVSFL?!ita<6ynKjSPMG43?N zBZp`V!G*<$j_;{u#79J5_}@q*XJo&p$$yeannP)z$A5`Vc?XZqY1I@!;0+?9!Twe` zG9?dIElE5=KOtkGmA&-3t|97a{Fwc?Xnm#?(cVN@cA%ayc+SiIYeA!bW4_6vF5qHe zJ*c)g=#fvuFv>s;lurA_Wph+TfRKHDJM(J$GWNc~fB2wXM?GbrF>u57c~TH=x^~SS z#pgkvRi)+dz|cM)wZ|IgZLbDq;^&1;QHa9o{(42wrUVb}y=9=9-dEcyTyN17wwUCv z{n|8LZ<)=haNYt3sND07xK;Z%Mj4Mx-^BkUmMm+Mutpo&D{9sP-w-R!B@_#_j8Pmd zDpYnL5$epr#0aoAaK*rz?{Ix@xK%OvZ!9MkVoO%7u#gg?l z{xmeOPG7E7$`A72hq&68ok z96)muGVO0uc};s7TOIukq=q@9hA~vT<-#(lq5)F2oRFY8h$D(B3F*q=-%>Pmk30_{ z+0f!roOnd*)y3dq!UcecLhdjbrGuO?q8)Rrpkl~J68@78$X|Kxb1X+*l4^5QJQOj) z_HXc8h~(~IklUWdHQO4kfsi0^E~=X|&#-nJb!p7gyP}0Q=yNZXN#V z334rXkg6b}Ym#&?H@Su)C^{FUW`2Tj2<;GGVgM~rAXzI}YSr*ajh0_Pwm%0Kw}0ua ztY9n~P}2>Ka8Qs&e@wIj;`d)@?OOxP*5ZEeg*I_#2sn5setkJCUA*=96>0SJ{w&X2 z*6=9am^;67ije6X7Z%-{m-hv`B5mO6>i*J|n6tfS?Fqjr9HE&S=##-{d%&EWDxC~h7 zEyYY;1U*kxc>1nr#!E*zv40_Yj#1;RQ6=w${WZX^X{UvSKP<|n% z7BT5g#%~81Eo;w564E65MVz>3=m9b=#p*W*Y9@Qdp0b%~Q4EE4&E5lIC_7!d(F4mWNqdj>Z?q2I0#(+kIf~Gr{IfpU87qY_sxeXtVU`%ixXY9q44WYxA)-ep zkaysRFa_%p^m78Cyi8Zmz!*__cntG+hFPS_m>npfy1+c#3Zb)sMM*{TgoQo7wYAd- z0;x>Hl8)f)U}9fDC!}>I4*>SUym7%}5Tl>l1`h>cX~0CR>8Jk*wWGfy?Vydp=Y#ls z+*)KFdPh$%8Md~_v0JV*&s769PaPw~1nss~Os*Ytxr5{ojfQk>^nT7UTi}$f_Z)4E zy_l)?PE8qFLL7>joozTk@vCg=Gv>b)!T(;*MobP4;33lwjV_qI!j*`xib%r9N(^G7^;Q8I#> z;#7v{-*9GnDqks52AK-FXqU-TiW^#r4DA-|<*-alid#@Kb_~K4l_F!JTt<&%fQw5^ zO$WES8d5iF(2P&h)GT*Q2>NppdND9z9dv;sM=iA<(q#}&E|(aLF||{B#oRf=37lnx z%et?S(%(nYPtHowNY9CSrE~24>?~osOq$V24qZhZtiF|F-3m09)4NO!m*YRyY%}x* zR&+?3b*V6{$@I<@z!S(-w|X;^GIWca9~s!{u5GOu90Nt`kn-M zQWxvY%-^Os0L3ro_xlQqq;zf z$Ctv42Z6c(t19$xX*uwFEtOJg<_Il$1l8I!?L_FH?l5f$0>?7s;?530-JDij-fxsP z{05vPnpB`2SQGu!%LE8Tv==-GczShUj$w;o0Yf$is+_tOCrD>tHq#)aoO*+460MMU zYlsDQ74Cx;`hxLM9GxrCqjhvI`X&Ilf;wn_x*U8t=@%_iEE^>KEwtosM4TYop|C=t z-?GtIMx7y*feFU7)}7j-oi)a_95SKd=A8-V5n-nX;WqsVGj)zm#2YCy)a);OI0#W0 zU-d)%bWw)t;SJiqSI$=!5#d{hvnQbqHJu3)3mph)FmgIWL;%yd9?11IH}p_jy$!V;X`?6nxu$foKh=9O4`98AS!P{P!y?d=#mhvR_cJ~oVCbJLa7i+E|(pA|cGz-RtBg`k4 z0x1x-Pix?mPLjs?Xgun9FNs!kKg7OK$0o_(=6sc|;Ih5G;)iEMr*9vg;) z_@xVDrVG8H(#8#3ga@(lPRgLhKF`8VDr5%J4;CK)!T9@=$+sS*Nf9YPbSn#^=Kmbu z!W?UtU&Rx-Xs_px;wsHI3XOR4KywB)Z;t{ByGo!A8})lFFbd5Z6jmi*8)sI1m=!iF zF2^sAPblZcJn~U@?L}-*89=R2V;M$V&ov7)JEURLSD~R>tWpFUU!Y^0QdA#KTO-$3 z){n(Ep28NFDD&$GqawBKT#OJ!ew=j?gdd=n#jtS6Uj8fW+|-!N(2l05Red6i)6`qE zjX}qt;Z(QmCj6k&(9DoNhtYKDU`{H8XD05VE$ZrS7%~H<%fV_q^x&fyuU?+bQ64pg z^YCbpnq|HN4HrxYULAq@JVA)9HxYtm#S-YVYI5;Y!C{;eHQ&A=Xv_?~6iJ;fu@7ut zKKcnVsfN~<(9zH?G;u4ssu~!utN{b^Z{U=Hl5$qs?0FN-m;Cl>pS5EtdM0NW(&S0} zF^6$5pE)>i)og6>vO}N<4`q9;((mhHTe4#uhhIz7H9M!s~N~J=HW*=PLxX>mdgBEj%YBu)|vYvbBr#>PT zJ1;e@gzeLvxDTbg*@f(Z?@-8O@6fZLi*+o?xTg_NipT4fTbNF6mEFdq1P+qRf3)D8U) zO4PmfklcxpwxGb$4i4&1k(5?Q0(a*t2TsgpM^j5GBe-ION{Y$8WtGQHrG=KY$j=+n zqUmDX0fPegEZZth?JsZ5gM=_isW!~WKyhDgyYAZ`+5HUR)RLNiAcv$JmC~6~NY=JDBPmBoTWgJasy)-lqMGhg2IX)bu-B0cfkiJb7_BRMdc5&-< zqr2Ht4Zn+dsN40LUdyJhM}%XOG<(WgKA}umiFRQRl7t>W6BOj4s^!f-g^w+OL>i+z z@WZWA{Z)8&U5hF72fwabG@-8*%9CT`HjixuL(pnp?jOfu+#1R4(hi<)4g5QT%4+6? zXHtF)my`|7>~u;-r#am{6OYjJ@kDk@x|%~Nc#;hK1ANiLYmt(iX|{|ar{-#WR(83( zbm*3v?EOJ~H46)*MfKoBHhDUByZ5pNYwLw4_Y25U&Sd)u{@+-`z9F5_^N>R@EKEXB z{{alJQ3jmm0hT6efPoWX1zc)f+b>rX4AD_VK@8$VhS|}{JOEgR08|O1q?04H1r=&? zF}f->>CpjY;ZYK*X)!v@0fy`}hO!yZm|Qk#v3Vh4a;kEAxk6%UO12f)5(sE}m|Ciq zVSI)_1Q^qr$v+`F#c}bVc_DdmAv%=>S`oVNDz{E%ra}0>Zv|zIB_YoNo(hGA{&nG) zWLT0mn}zd5ULmi$zdRSHJaiS{^f*)(XtVl{s8$W(g>!gy%Afm_75|mqh>XPk#M9iK2qoMU7!(vLpG?O~V@JHmL5EykSZSwN+zx3|5N(~D|Cu48 zm_b9?t|WcWRHR{G;p%4W(IBFt5a7~QZ&LYxOA-k|Spa4si>9RV7h@bQbrV{k@8z4( zj#6pB7XE2OgF$xzR)sEVs zr(lTgwNcrG->`ovZwx>J9*>l29zgz$mFn9+XkL|Eg27<^0e;O!OvmAlf16N+Gtq>} zdFmx(^=4=p(^7)X@4?Y^*#R=DuxO?KW*J&pI@v{OGe-A)LyYt%MauYFt4Era9NDF} z1~$05@+pI7R}XY~MV677Uri7UYO?dZH%a^Nz5s(b67ySvf1?NU$js1NRO=$j4plU~ z6Gp!sLkVf4SZ=s5m87Q{U$vRg8lTKbP07#wujCzqlgmvmWQY^}Zh#XkIl%#PHtx(2 z{|h|_1&`W1;xj5@?*bwz!;rOwfyo{yN@izr~?g&Rwi>9chnqm;A5-_OU<+dsbIl08eJnD<1_Ktj# zlqV+zT@ygaOemr)xuODspe;yLSQOlqiuw=Guyqy0j52iDoKt&+csvsxWl9q|T|rX= z0tre=#-_m>pN`zR)?>cSt_=5%NmOpDY09C`iYj`;j#WY;*_3|5D7R(e1t4PXt3;L5 zTirtsX?e*hB4q*iQw6jC>*S)Q|DIecTkR7Qu6I{qp(#@H>U?W>ugdNe(f_f>nw$Zb z3K}#qQxZ+k?#gjHr@uN*pbD@mAU?Rq_&3hlZ_iro_oz*B9N^3f#*(d64L zGQn&6Rz=f|T+8AaNP9tP&0dI02Wibt89A%A!BI1=E8mllsLXER8Tj9*q`!TgtX0Ng zz#APNj5788w^$O)up(ooPoS7j1Ccd33t&|M>a-f=f1M+GKUjD^7+e4jTfHv^@k%}+C+T<41!|BJ^OHX?1xf(M*JY-$T-Jg zZoxnrO{DTir&QJ;{FAd8h)d77)q(Qqnm7pG( zu`2S`C_<l()#(oNy#l0;^x_bA{AlEkQ6B!O;@g_$*nm$9NmW_$WL9gmkekY)Dfg0%W(uuo;-Y-j6G9-8J ztdYl`828o=d$0tjV(;lMpQEE87c%G`lJ21uVgyD(3dLdE41zisSs(}@p^?eV3C%Xl zXp-nS)yUq+WRyl~SND6RW<^5PQ7|xXxd4TeIz`jlLrGzCsJW?-8OIY!G0r>p-Z0Wo;x8g^>+^U?{D;1F-Xf$U@dc%U*#)WgJRci`l{ zPvg!kO~8iVb7k@eM6x%38ZQBqs84I=#yS;&>3GGucP;oQv@&e~!RXI6b-*bO2JGgX2r*Utl0{#s>e#x6=)R2AgyB&;_CerC3*lXI8jM-5E;}_`&-V0 zs*nM=#Jpn4+eh9~&$Qs(1Mn4NbM3<=<;Mw;NDvCf0xG}&7H>y*J@?++9r8&&> zD&>$F{nRabS470M{ltKozRvw5YM7-gWKEDyhx}IN;qjDzwTRvxnF$b=woQtgv}Bcu zx)HEUkksWB{?RzZ9HIL&q;_Jo&x*Sw6#i4iuM;Grd5meehZFY_@frJn$~`R4)b+(l z(v5DfvTd!-u@P>O@Mr(8%PU0uTLXW12=VE;xDq8B@Fzi{gBKy%zQ+{$N{y-6-vrhQ zP88DC8YLYil^~58@2tEReV3rTpMatavj>A5jqJQHjauHunRiF_^1^ldADI_H_SE{L z@}@BBaLdE*c`8L0a+1>-BUy)UXr^ezG}`$e2Wv=jS6?hGhswz2R`77GV+)zd>PV4V zxM`~a+Td=YR`gL>WG`fqT(^>3FJr5>o<(g-4%d0y4U}wr_$E|?4u=b!iIc2gzH~8& z5Mtp$$@~}qBI1~s|DLD%&qZQ}?vJ!tE4sJvhs<(QPP7sFyV;(ERlIstGxK0EYjEF= z^GCD8u6@{#!Pu3lH&T4QbOuKNz|D$C=fZBpz$4RFb;=G$6;+Lf$dDmd@=szMdRBWL zK83Nn6q$+xZkd#<5zF7?aQ2+&)l4p?M!`#kDZs^gSsgh23)pxskTf= zX;603AOu?=x08dKslcHs#Lm@dblgCok*N)i2v8ZYWdF&{m)pD0C9ao`(4^pjDEK6= zEMU;z12-DNB)W3-BvXj8y(o!hhy zB}0C^42gO0)W~XV7z=;0xoi9Je9dKeQuR!$AN1VoqlE=Jr(*rI-QKGmCpIVKY;JmU zFo#G`;IYhGF{JtkzINazzOqg=DI9=1%s19Fxeh8e6{j#uh` zwet;jv=e7S*Rpqad%7OquBK%(`)z$tZIR+Wnud7?3H#z@TBpr9Ti8VOx$)VH3K?!L zKA@0uL)x-G*6TuR*k|Qdp7d*+?2sZymFBHt1>oW)a9TCZOBDuIn7r@6;-+iVfAE4? zj87fplvm=T+x54tybP*uO$!c!DbfVD+kS&f(EI_S%5^lV!d?M3>Co}UjS%?TKDyDuh z67~!(hOZn^sfL_=21Shgo)`HE57t_dN-^mjA#{jaF!6IKYnYDO!ujSO!-_8R`7+r9 z7LE>=P=9=zCwwHMyOdCG<9s+X<@%B4g4A%e?M7cSf#rF+{y|Y(lPGLPNKyuI#|9Cz zjM0_U5@eBtNf5_TafyOJbgsTRD4Q}4iFc3ppxj{6h)(_r1S7e4SK~GP+-8;0ewWAq zYcSs<6C0ka9v7M5zbgEk9X~UyI19&INT1gC>F)aqrjNGVw(_GKs$9oiCN_LmvaXB< zJ%Y3m`g`xeMC$@(k(5)f=JC;*^ z-MjKfIZkB0BaUVaJN7;2#60ZX{F+P8(CnkkQ6J`cJ*`4$u-EAP z;q!l7hwBV4aTny3v2$WfFyfPer-e)gKZSO3{q+R%pvrjMPe*`zb&9)}XAn|8xXc7x zNjtc`4N<7lH#-{iUw8b7xH!nVDFwLL`1x9By9w(knbZyMaOvT=5II;F$eQ}oE0)q> zim{8GoCs5-y6O~tB7yx}Z^eedZmA;4BB2*`GKfco(IC(~?75>ZGAal; zq#RRZ;C*q@k#J&X65~xZQ|{Ln7b2u$d`3Do;)uUH?z6Wi`B!Y!@}NE}9&q38#h_hF zfXqwG%^l7u{C0T0!_p(#e#(d=e(AXSKS4rgZk+2?U#3aoiU2=giHZJ@wpw^y^Z^IF z6`~DUh#L>_MuL1cPR>R-%t9Cw31Wtish?OYKT(FN38sl+9iU4zJ7s#|bp;=)b6yow z1rO$Q$~KBVVCRk(9z|+@n?FpJH6$989A|2L(apQKZe2@{3Qo%3O#)`d+g?50_0qi@8?We?_&>>oW$lXW$anNZ9NtrHG*AFtzJI+flKh6#+nr~ zh2Fx=`v&Ap&bdZQv&Idk2HZ|;4yNw?1)bd8>}9RiHu(7({ATU^7k=v-6L^4wI9p6B ztlGrX6f|?Sr|mQ{v5K=Gv$K+aXsaxETf61QyuIX(P`9{OGBhQ z)+pNC-f&vt3bGgmF7K7fF5a6h~IHDC$*66*V0&h?}W@ZgkfPVQxThs0M zT++~+CkN{B_?u6Q(d!}h;Py#H3yB)9 zbyM#9C~vD#)s_3Tu7mCG^kIT#z@-#DyXGAnqTGt3x z$#M;l#wZyX)q`FI)=04*WRN7&zSSSaO(u1FhXvIrRi$ALVgqWW&#Q=5I3u=e$0gMj z9b{U=%iDxX#nbQ3BUtECym7<@pSj_W>QTUh_C*k-sB+9_Gomwd7U+v34K=x6wjwh- z<%Zw=oB!&HAT0K*7oZqOh(4l*X=r%2WX}b2=Z5EZ!4J=y*qcYOpfq zqf(fkpc*!y|LbQ)KuqZSq^IOFe{|9O9b*E$m0m#bt;XS&6%U7Iu_(qXfnu$r`op$VW1Lm=P;Ugc&c(h zAny#WRI?oUL(yrBf_@%R@m$zK>a1$U_?^LAq4V4@# zCZAtRZYCzKaMvd2>5Ti*$H=^Bv{h)ix&2N`9uj07v;^1FcQIQsuVd1Nwg>4;1P1dq z&75?pvrZb+3?MM4I>S)V$aOQV1UWup3#BnP5x_maFwSi9Vt~ZDNnLk#@srxtkua}M zPdjO$cZR@{ChI#>>t4Y#r$+CQf38g;rqz^7AwyO~YQ{QvAFx0!kCOI@F*Ec2mBU5e zPxq@?Wyb73>vC;j(ttB*tRP}GNLWS28K2;fRpLRsg;}2Ps*B*l&W#Kely7WTv6yh? zoUYo(5hKPCW8qPoC!?g*mUHsZ!c~<=_uq)&JlBYQZoHQ=HCCD3whN$WU$#sjTXEfR z-^VEe452_m6+M%afOfKU=L>1)&4d&YRaxl|jYYwVVU6n_Ox@i$2VS~~>V=}DYVb0T zQ>#hlspT?dmt};JwD&#H;VI=Oo$$+y6{s%ft6D$rBWUt?ohWdMr9kF$(XJxTG|f1? z{ynoqS?W|vTW)5;Mu;UMNc~|6O5K2dg_^GsrUz8O>*Dh$xYHV~HM%(b69nH;pAyt% zNNCbTEjmZ#uVfJA^8pu^jGfumm~)ZO57-6jdKPdr*s=z%>hry+5ut~LpXq9^t>{D4 zQ9cj_sgt!tK`J;@a6I7}X1+5h2k38!%`1ymTUE|&ddVCs2{Jj8YI}K)nDr&^OBVL# ziCDb(9LWhZ97FNZBnS9lHw-qJ{y#Df96x$o#=cz3?3so2@S)oH=5i(8(P9maPk+K4 zZO?=Jq;XVKxvcQvzf{LKSjTY+I zRWr3MLAk)@?C&85aCTvth8qW_-7-Y2M8-hJ;`JBZ$@+Yr06_%3jTEGud_NI@MBNj4 ztgi5Ume*+D@VbcPI#0ahX-#35JzIx{T;;*V(t%MOP9sl4a9XvIe3Ux4iq~MyrV8ET zjw6%)AY*&;nPvfVYkym5=UN;0ZhyBO?>mnSYiAp09?vMS@7PD8F|>7-D8x~=$K!s- z*2c>mO2Q+^?Os8u2(4uG?P=VOjo+V+)a%(5U0jN^(54tlvR(gU?~ZEaBCf%B^Uk@N zt5k@qBX470)=toG?FXX1dS#))mJz)iMKAwy?BL*JYtMvLJN)*#|^$ZkCvdUXS#? z_=aoE^dW_=X2=xnF8)49-$u!>Xxvw>XoAN#tHZc${`#F9x#{GI`;zjn^&55mjCb;L zDyf%`nOb#}cIoeZ9dvc-&{BKFhdp({8F=IkVLN|}Lq%!~h4;Jgnv=6+#FtHrlGKeK z-FVDSIgW18<9>DPhY6nm!gvYULV?ca>e$a*4yH3N-MxCw&bo{UG^qh?|5=bvI(EIa z4ft*ph9H3IJJdA~i1U%oZzYe+P!(-?6d}}~h_iNRB9IDsVSkYKngz?A^HC*ob=F43 z+CWj5GECi@JMuQG8k9+i3Wq5O7CrAIw|(y75x+uvdbf8vetDU>Y3Ew3guA&t@@)GY z^Bhkezh|s(i?1i1rk_7gPOdcY&Mj$|r+Q=Ylu-_l*Wsr04tx12YU`#h-&Me9`I$P} zfk2DdcDELpDM!t?9AWOTXt7{oqA3?-3$Y%|mUA!CC|GT#29k{SJN|UnzqB8@Oc=Sm zu5sunV1Sk^ka2--9qVzMq#_PGZ4|})LW#cbp1!;ymnDCW+j}(#{5sh{lkwrMkK-3p z*h4ASH0=s8*OMV0*?#;rDZ%NgQ@nI@yj3_H5FdZEL~R^fnEqO(zbKP+8VA4aL7H4n zLWR1Vy!6LBN0%dQoC;~orc82^wd_a}9UAyWMra?Y1ZtkK|BkX09(wwyH}EtJ(+3Mr zmg+aT@uLH&_ZQTiNibU2FCj{6A2m_15kA-Kri*)oIx>Fj({^$<-*xZ6qn{Y0A-pL| zff}QtI892#DPDmqO_xb%e)%TP?nN12XJ^qZT2Z{M!S=KzH#BoA!AnkNk22B$v1S<5T7jRvEhffAZ>_jXz=m%^1y=IT)k$7z7Re8C1dB&t_uNCw&p$5%8q8&$( zhThe>W=Rq9QCQ3kgsTIpZEK2mPGlAlARq8%LZg)Hv0Cwiqo!ebP}t>3N3GuNuJn~i zMoQT$)$k0@zO2)g7!HV^K|0b+e;fbFOpX)U0mjmFIsW@jbzv(dA+bTS35Q_WI4wFu z_gVH;jC;6U$9jz&vuVLvc9u{dIV_3@y0B5I?v{qVS!Sed_yC6D zj{~%2OKwE&3;c9OrU1U-=d8)>ks&Pz8g#_l-P4EL+)}I6{bzD)%C9pb`rCc}Uv&Lb zurRRNB@Axcwr$(CZM@sIZQHhO+qP}nnsdItd#Y!q=OU@fO)ip37HZ{5Byu;ya!ZlK z64<7&gpOrG9q9!C<3G$X3*yCgX&f-2?>laA3WC5?aPHnOADvm((Jr*>z@k+*mj(^X zb;LY_M-!$1%>@(_LKV;olqsncOT}@pgd#$BE^N%r>UKS=5-AESf$D0k3_)#^MzB6w z4^YL!ftli=+$uDX&`q&GJ)#1|j^8OONF4}OGtm}+8io)H%{r`oRWS2B)J_FeV5&RE zo=$3C@Jp$uLZH~}mmI-9F`zYYux^i3tvdM8qq0JAA=W~i3QtC)m3CqxJ0pyXXtMa= zrRU{X$bB!Au)cC>9SGoh;Ppo2Xxo8=ocVtcWh^-%PbdhuTY^%OKnExeXZAwCZssVE zLJ}~?G?9{l7Z~OE9?9*(`2j~Wx>z_vh?XFRP}!WxGh)}!eyF%gA{J)9(Jh1SfF+R{Aa)rpxYBP-?|CN}Q41w~kD zGO?NrZ-$RP!1p&zbSGiA+r%{WK7%|+`-nbO3mKaMR|z>=^7mU<+roE283V632)276 z_%u}uF4Qc`QWC2W1C}3QH6AnS_I9wjiRzlOoe%R^&7viJ2bHO?zS??^Bg*!EMhqoL zYt`d$HDNJgJpH1~yW^7Q&?*$y-O!9M%XjflLkc+b9Vn4XTM z*IIPx6@`1YC5^4gbziR-hN$`zQSh1xz33gbg+HaG$n27u*GRM}EiP*RVAK zSKrP+%u5hs8BK9TXI!QSGI3!!)2+k!MsPSE?=Jna`oK6uElM?5Ar=MZ|FS2BM^tr`R5Eo6 zv7`2+9gFRLJXGTVWg!bqrj8wY0J4Hp%0ajr2Dy~0$ee$M}n>;^2qfd-R46qthJ~snXQ*dHHGm#%BuxaV#*yMT4dDOmLA61Hpn!41 z{hQ*djOUM2s+qRu3Dp0`snA6CWBtE674+kD3(}?uB*yLCTrH${<0fltY} zunm+m2H|eEbo6SIoBVF#hf783YTA{N455Gk!SIA}$BLD#?%6&nGqy_t2xtZT4Hknj z!m7&_6e&6Ds!}6ynPi25M5@o=#YBWsCOT$0S}sOSyAmmtR7gnh0A7^z{h$Hy?f`Pz z0zy21@B;zB;HGP_SIwaK*AKI^?95+2-1>BW*nb)msM1}#dgcrLglg?$?^?D-kbP?A z%3U^$<|Vbx6>#7RAw!v!V$-I%zq|oNOQx-8jGHcrXxXkyg~5Uy*&1LZwS}JDOcq0;+WtQW<^fX?Y%W<~}^-Ylc4ymz8kfm4(45@N+99 zkTekAEYQzwZ8m%GIQBMkr){ofzu1=wKZC z+E6sZ)QW>roI@(X9A=AI7~gSBJ5x}h8z?S}T}#f4jdOST(ZAHpn54Jk{UIEyn=({Y zDm=W=h){?QQ54ve(c$m48wAN(IRFduZqr@)I7|OJhjBM8GD^V<$t7pNVuUhK2p568 zRvVlf7fg?6egOD_y6#^`%a+v_`L`Q2v#}zjAr}%8?F0UBmPk8{L(m_;D(jQc54wio zKU5sD|EP2#Ht6M48-4(b%_fa0dJl0YL&RTk?1$0f* z4Qmlo%1F{k4p+c*VMiU6;$-ZNJ76fR z2ViUwi_lLcz7Gu~h-e`#9n*z`b7Jkx@9U0Y+&d~eHI((bDF~wnkMCI5S1g}JS#lT> z%ki`F_*gH{5bdC?jT`!``!MjW6d>^Frx2Lqv}SPT3KL6;dWntMw`XNBjK8>lr;NyS zP{zFmM2+S?#QAHMeOHwW|0HHRMW!fBavU}hr;?l8c)x=#rl(G{prp>A37Q;{eK5HB z?op&PVgSxXOG`WQ8S*&wi9I0PZH6z=jfbrLG9INFzJA5U?yQ{Sc_lS5d-|~w zZupn0#n}GzrEs4Um%IL5hX0Xm-P0@=qkR5Ss3$hm3!fCUz0RHX4^wv=m|4yNfI^qL z9Xw4Fe2((+7ld8)t7Ha(tO}!-f$#b2G#}ktzoko7s)rI-)s8uweD$jphgh_$8Gvk+ z3GDoOe$bNZh-KcZ{f2eMO#qlxM$afFRwcf+tkr$Oyj%@n_MsbY=gV%tB}~=}o^x1_ zZJC|Yu(@_#LyGyJL?}Z-IzpTwMNoLM+v5j*yM0i`*uDXodvL~E9G(d%KBYm}qRH#b zKcyGw5AR}}5#4YV4ky%hWP0t^GP!dZYtSQ7M4Umh@_`}W)+}gH==s*Uz={Nax$M1v z=E%)eg8)*9&|)S;(!pRpyh_&LMW30UsU43 z%&LYb5*)~Cp+X@;fVM^l;|?2$RA_JL4vBM~2wY_|BNDTBK<6^7F>iFkNCwd=p*54Y z@*4wCsQQ0(2v{*Zc(TC%I%;u{E*}lvba=s|#|$!*!<>FCoL!?r0HBISRWLPNbU;hL zH=XM1jIOE0b@1`#{Y0kE5)n{mOJ2Vc(FCT+)M;eyt^B@qK!=Qp&Cn>yQPT=#mb~fy zS)xIe-<;vIDG>9$vBwk3;X(^*OB@sEnzUXqzip15Z-!g!aRI(vQ``M>n#=bwakrpZ zYQw_Mm%zJ6#DK1+hg;wjFz%2bx#g`rN=Oj+b|XtG7KOP~(1G?KCzzO3QyEdXYAVWM zVR>p*_`bi+R}{OpgVyFT85ABgUf&!tP2v$p#zI+=>5v{P4omJPt?*SlNxE> zyt|y~VBwLX0Hy|6C=VT-3S*j7K84F1jy_O4p;-`#q7Lo_d8U7CeX$m## za3M`c+w{eYYe}1n5gI+^)tJy%+UE+7CRe3Rc9L3HI{U+%A{Z86v2?Gn|zF z7OGA$7Bv)a$$LHdmz~=&OFtnJpaMX6!6+MtNQQm1IygiWcR}l4@FlS$e7FXft!dZE z*0b<#{#K(e8zh6`VBy7WOK_BKS@%(LTYcnfm&>5#AWZy&{^hcn5F~^J=~*t18fjMc0Nh+@SW0}J!vgR8aEfUu{}Rmx6$l~!Vh6= z#)C|CJA0;%>}z7uKFmExR0Ij(ddD*e?r!|SJ1`DO)GC9dCB4xHRsU@ZPxmY(x`%jP-%h=QLILkzeeTGo?x@AHGxL-2bnw3 z)%=e2|L@UDYxaM!Sn&VE;`}M-gWDmn;xi5iLJ|6%l+nHlOv)+q4F zva)e=)H5w&NI(^`vvbt{A>a|Cm!s?EMHMzp3*7I^V>!EbZcd;Qq1kQC#sM3|~^5H5Z4G=l7qu(I&p| zbtE%JD$OdIbFc1rds$Y@*?p&ciCMPmY!d>;Z*c#1UuDD>C5hO9@m*h9I>)cuHo5=w1Y%oNu2o zjR=Ty)e76eY!^K~&o~bH-hS>IS`wXfAPQcB<4@+u-M79i4QuD#*wHaV6$ndYn$1+E#54;9XMT=Lh^{a3TYjEF)<2;V$ z5yJ+XvGr6ILmHGh0uU0TlPOxlz3!VB-M1YA1BVtQj^TbO=|smQ62?B|IRpC%Q#r<> zL?_mW{*+IoLF=9Iy(ynyf0p;e(4O4N$sR_(05UF&69ApDdcR8gTN06sv$zlbKP3*gg9_B2S|2$VsP$*`>V z&&gJ!gm2~VDp;(@U;GK7qxLC`%q6iN9Ip=~n%v-{AQt*;>HHdQ3DD>nD@xWNMiN+q z$EFu#OTPXm-sAFJ!p}m67YLVI!8#Dch)T2Fk&yfge_*Mks#dv0L;BtY;>#@(cvxg{Z8p+xzf5kubJk0aC+RY8{$ z=>jqB%AAEMwZ+l~v#_F1=fYd^^0 zTy{Qc$al*T7kesxi;v%BOSg)ZXWM!?=XfAfbyGA$G{ggSW~V=jxBO&o6Nw9R41F5- z(iX|)wv6YW0g01%y!4uUylt()UG!7rDyMr~Zt{D4&a!D}=gK|PA=YypG)bTq>v-ZtO$Q=M$OsQu8A+7&%!uaP(?hgU zHAa#SJvw*mZmmpnG8(?SBkcE>llEs7f)>b$`wu4_ z^d1T%F`I6L-xZe^O^Zry%|P35|Be-Mb4~}TJt9d&7hd%>5OqRCC=eHL&*;OHv1AyY zj#bpFH78I>ZFQMdR;AJc50FY$t?W)6;)S5g*nHzY-1g-f{Z8U9^(g|Us`mfvV1L>B zrtUYFI8BX-U&XT~<6Y<~UeY*kf`n&a8Lz}nqt~5wvW;J(Hi3(RCSF?S#`K)DX~qYR zR_#u`R6)wA4!VIBMembZMgsrR7RW~?KXxa;S=Z}z0Z;2rx*Z(Imghm6S2C#s6e2I65epzMkZ!)A1gy`z}3hD0p=n|ti->}@kxX2)X zVk9L~J+n&Tzs{U~Vn&u0%75#m=qqW)SN_+YTR^=&z{kVK*suPdSWh`H5?o*uH#pZ- zKMK%_Ky+9XfQcbd%c_pf2&rhv1Su2&b-Xpre~AKZE>D)UNh4(%1-g)_BSD%sZz3NF z@BdC05vZq{o~B@6j{u)2FC7K+Hi#hwep2$+k+9a0V2PWLh+&Ut1>u(e?*tJjysKcc z#{Ux`LJ|xE{lDWpCDpvN>A7zoA+0;Bo6`?s+4opnnV$^b)r#?dBSb?t5F^#FrP4UR zz26B3yA*73KToAM05dQoVT6P1xdq~1e8|3EA(1(OZ(e@=@xIy)pp zrj8_!aHC4nEDXW)Ff(CQ|i#ba+ypC{Eq17OjQz5**Q%71%+y#TV^txOdqwV-G7C z1E!w5-&M3r|Jj23dzC|p{(wC|4xkDbGEPl@*z9on@&UWCCwF%ikWw6XP(^{ffqRVe z+x-HD&WdDVEXgOvvwTql-@pYU#*gCMeBGr1OlMCQwXr=gzQU*hM@a4hduh2f*YKL) z5Qa{igVx!)0`t*jw!y=Fqt<50;$sBSwQP z#?~X*bRa@1AlR_sxfDIop<2f``&wI1%TRt}zkQaW0W&k4`i$s*5c$yFX3T&-=ij!D zWtB*IQ5F!)^T@KAb(+jnGi_ddt9z@p$#B4uf5ZWK-JeouK(*;SI-gJ{qH) z8hN$Yd1MHx&{0b9RFO=f4OqKTo;4P8W?Cid5aG(CS6mEE(gQTOH!+QI34QZ8d z$-$u4Kcj=`#tl*=wYet8WBG>vpteCnV3L+-DsiZ5Jy zSDzS7s2%j09zcSE2Xw{>i=fl`w3ZiRbCtqIJ!I5A%;w(*Ca`Sl{1dk~+G&92jA5YO zR7w2E)qL2i$Hx~Q0W^Id&?JyK4U8;*e|2%E-6pgte`Yu+vPq_V>KWH*5Hqu`IB_pm zw)vJxKBY|gBGxvhIpzSrE`SHHy1dFo4REA7&hCk529PL z2(0!u=0uwMM$B2j@@lMP@|Tq4wRF*|R=r(0I|(W>rY^sUheO?}l6$YY%SHrY#rjdq zL>ggnGXQNJnXw+=sB1j_OF0PkEON+>Yf4#X9>7hXD;=)HN7md7F|eodY0tFalbh>i zIjKhv$CUAXzEj#p&tRL4-BVbfg4EXD zi)}@YUAG+YHugh^CvN*(A!%2rd;98OEqXaA|U!UL% z7}TXl-}N2BKiya|@lV!##!QCmT1%U6(` zMGq0YlC2pN&-;iuyeJ~Tfu5FdcyO039LQa;XVvN)TJLE$Xal1LOnGA&j$I#N9RNG> zfd}4j0{QoGRgyZVCj`7Kg!Vwb>z(XQ?Y%ztazrgcLM=ketEPb0uHA|zdCvl=I!DH9 zD|YQtE@u8PPO=3K`g1esmWa|Z{15VV_^#_g){FIx+@1vGFbkV-KSzritNG+JS-Wzv za?}K)roDhdxCY&0iO0Ef_$Vs8N&^H8&5|lgRl%K7f+2S@tCF^Ipv&`6NsfBKCq1#d zgtSoAqJKsviRpNr&@Gbc0MtpN@r0?L+3@RQ=4rG>vxcb_)`#Kx$_FbQ+&xt}fwh4a zO6bB9G}>rw;Tmvk0STEf4VxRTI(&6dx4*8BgPFZb4t)AJc!JXWF`7P|p7~`~y*Byo zUT~4%`cV*4*RoEpnZ%>XSAn&qqBMnXu~0)a@y-AxiIPnuo{BicmOQ+K?UhE*G%fA} zvRY@B?n>r1Z3Og{M3sCg!@Zp6^O|!D`KBhCDNuZQ)X1?#rs3oeLLbjFOo^p z_oq)~0$=u}MrSWLnEpv(`o;m=Z6r?-lP&eulHo6s$X+Kls@hV=6xf*~6!Y{OFZ`PO z3~MZ$k8WMutriCv$GR`Q(P_OLnUu(HSxP7YTOMocIwnO(m-Zc5dDhFqzTZ?Sl?s2$R}*NyZtr0Slp^~^5N#5CoN zshXTOE>)M3cAvhNOKbt(wvb#egMxMd6;f)Kj`q3kz@cf$M(&{qscdA$B)P}0)wtc| zgr39JSiX&!Z3d~mtpp}}(?XAwG}kY=22CgB7wzSnoeRQZUR8ZXKT-j93N zw@E3|jM(oz!NKC1bra8ni35Q|6R%kyfGFg4bG#>wS-X!erDxQ6wSB$Xo^@T1Yk<}` zp*Df2;db|g>8xS$=BaD?P3|WzvVWvzpnaRg+ib}n@w0WOiC(w3UW$)$ZqenW9&7Gh z@!f26BkYn(aI3vMr^RL`scj)xoN|p46)1t!&crnLTEEf{(~m^g@NIoLNokRw$9-@| z)O0S=;os)%$}*Qx*Km-R+B3G88F3Tb#s7MNBOxB47H{-3)IHnQFt4;k71bZ}G?N=4 z&ar*ko5w*cYn}qcC;mVgMGI|iDVxdNvt5+tq<{o5!gk?%s{fudECkMC zX(!(gpp!{*yG|@QH>knA_CM;6ejC$|tdlWSt4`jT0m25Ggx7=hTws$AhQ6sVY(V zo!ye54Rv|yev32W(L^u&G}2i6L8^SBt9ywGH3gfXyU7m6ky(9^D3{3CloK{t*mwdj=9x7e!XrwB*f z{bT4rmOl09`H4%%phhS%TPgznv`g=X5Bdr z@KErmeg6FY*S8;zuGwfr)K}Vbv+PeZ(`|2K<5Pq5%)sR4^G5hE(XEE8TBUYuu#uLb zcbe-GwlhWI<>7ErmIAU;G$;!E%@mP0nYp-Z_K(He9c?plm6NNdp$=8uz0IxFx_!D8 z+j?tGx>@LLscfFDt+uup+Nix=3Pw>uXL1g8F5Bh}{7XxHeE1A|8dj!G6j^i9Z6qG)kIO8+pCFbOe-N%G~yIIho-)7Jl89$Ksm^VKH!8}aXV-Bbow zWZuqxs}UU%$2aVrvIA0$D0!O!&*0>U$||m&RGeJ zh8~5~!tM&$v+;tGl5D3PeMk^1BpE>>vV_^zRNG>laJx)tm0^gO;>uEEx!-_pD zrsxJ8&ZtPdzcoQ`u*a?gFYq`;eTAR0#xayoW**j}Obj)4%4=9(R*|vNPJqI${Vftl zpP$;!8steBao#gc%SmNMU@lfPc%X`o*kpDgeZxUo6fPq~Tr`V`a zc$$i7P~1X{m=Uungv-D_Fxr?IebG)9DC{!*Ar;jF_TS}~Y@o6MEV zUAeT@^bOlx_v`nT0A=6DOZ%v-g@4GY4Qu@=*6%CPQ-!BAKnIh1mb?ZpTljEZkSqR$ z1@=MVP@tLwyH{rtGQEwvjOHPi@7&{fcO*{=aJXlkl*x&b#uqW}i<52nH#Q#WSkC>p z7N}D|R4B}iJdSFJc9NAO^o&iIinS5uhH=QXVc`Jqy0-tWxr@3+E!}Z@9x8turP9aM zLAjcC50iR5P_ZW}c`s}of-)4tJZVc|M>n}0MDa!q$p^GMR%a5ytN3UI!VAoK<-TItL*}T`WCwG|CFmAZ!P9LYUFP1 z^kN=PlOG;-Q+4U=1_#;WZgQDEfaLl=IA}t1b#V<@h>U)e4!05T2xb1F8iVl=3994=y=)}_yd3%e`$n7# z|6kQSJyTplkH!La)WCanvl?%PPjAaQ?O+yEPRYowNSS3Q&QmG#o?jPQI^}k!>B)C} z(QgrlOPPWSgc(k)Mlzg;G7wL-_uS2KQGES&@O4cb#C$!xl>q0rk)KSj{czZhG8-;H z&rkD;UjpD>qN(&_3F;srf#$hB8WF01li29PhCGk0Jm2)zAM^ zxl<6t!5hrboJ}jRMr|7fy(3zdfjyD(^3otN0@J#*K$e0iG3;K{8`THfjjVw+a%cLm zFZ+Yz>}cQVPIk8f=4lgnk5!<_g#jQQr70LX6!2G5;*cmag>k4Sng5hP1CSXnx0v@? z`AKrWLry?Iy&PzESuFy-)iH`b6oOIF)SXe@P%~5!?Z`~!hJ6TlsHZ|0Yo0r9Uz#Ub zvCJw`SGvrPB=4N8W~Hfxi?DejK%Q(SuZ3BQ`*OMYd9^6gl67d#4*BW!G!-FXwq9 zNBO`$Ap6Kfmr4^t0SJj2a?B&*@9QcTa|a2+&XqcON}`Cbbne0eHVnMW9)Q;CV}`Me z8Gh0ev^bPxAmt*{Nx6+y0mjF4!^z7Mi%w{@YW`)^MW~CZkA`0ZBJTK#nRvr$1r1+}y=JKiYM&_#1 zWgG!fo(Sfok~wf;U&&(+XVQOdZD^oNPTO`UAAW`}Ig=QNcHru?oVjxFE7p;_k>un>zcwoVo$c+7A{5Zs&ory z@MY%SlOa*kIGBwoI+@MTh`YXifxsA8mD3IK-QMkueQEKmssXSBGgI5;I-_&``LjCt zMMOXPVxsoSBDW&wij#T=IG~7*Rb0DYC1x*g$j!X}$im-53s1zOg4wv223iaHrs)O& zU-d1U6Q_ODTZvTMfp^|46Bs;`xu@>hcW+0NOTt2l?#B>tyM1$+BY+qE@3&q`m7seQ zbV1Wo?q+ZiP0Ynjyj{G)bP$sWdsbvA2D-e%UJUu6mo^5!v-Q1z8;t7|RH-t16f;7e z4IN2@wI%|01PFsBBQEdTkQBmEN_D+TaxN$%&64@GPi*C_TqwI0O2Lie=I!*ar>~eNbjmoYhEPt@qBKb0 zhhc#C?J1a+M@MnA03D^md8Tni=LzZatS#=4HYXa3oE!d=PsG#%h}~f+3yye;^|R)r zS0x|wGd-21wrJ*M4;%Z~<&Jw{<`L6@s$pOD{VUg*e!)j3GR0W=?-dRfs!F&ON?SWaO-ZSWYq?>Twd4YDov2K%h3R~eDzc*yi{_ka_PPXo%VvJh?xP*qcx6zJ@PB!Gj3=Xp3L7U`KMh;gj6 z4VdcQDB|M4Jl7}Wp2l2o6+f33U%i@t`2^81B#SYxf!58Qa~DXb$uz+r+)0^mZnl4& zh99R+*EhWmFLC)5n$?KZ1Kf!Kum^t%X6Z<^?sY3ahwqa15W=6_KMBN1zGgjS&j)P zN|xiBsBzZuHO_*5miT#$AkXQiS=PLN^(Ct!iBpWFl`UG;Q{b9W1|Y0{4qHYe-yT;6 zmOYcZXv-f=ug#>7G1Uz0*pqh4zp{0YQ8i(|mJ(S!EJ*nYzBQnXr@Wk2g#_r;;fUEf zWxd)NPmJ0Ekt!b8Ye8k`zJNJ?#gD|e+XZz#2a|}}ITpuq*l`tigtszQ);#wT2W%Yr zN$3=S5Npo^bML#HruRFz1Hcg<_FfFh;%h;_5^7trC6Wb?T6jhnJ_2FfLg+&`yK)Q< z5Qm0*hj#@u2_^lzCt1 zr)9^{H%Vdv)dN24eTj6boR3Q4Ty7+Z;3jdf7s4Xya*q(aN6c^0bLW_KT|ukbidf#S zy2j-7v^XLJ^K*Pn5ecrG<0Br`-3HKKvpL4*`s1hznSv?(`U=@?99>Ljh>Lq05+0^< zX5#eW&Y)K~0i@YE6=wDxoQWxscH_w{%8=KLU4Y3AejD*yMHbvSyTYU*upU`?qixgg zovqHyNWY;o(|b!W<9qlyqn?I-1>*it)8_EivbBAdDbI1QFp(GQpje!#_7GRVAitMt9$D#ckZ=g|Kh9s0oip2y_qmkPzUb*~DzA-5Kz&zlo8BhFQ($lD2T%f;%+tb ze;Ogn%BmKuBFNN?-of{p&-V$*F%H>r4>Z_E9(e7uy}Qk42q|KB|+ zDK~I}&ctBIk>z|z6Ja{y*7I&v*u>+HL`-ySC4x(WMBktvV9H%saym3;0et#NfN-@w z{a(3n2fM;QGVRcWL<1S%o%vTyd41bqzgD!r4>4~G+TRDU?@_JqqL}wOB|>UcWiuq2 z+S%(ediFzp?WjL*;@)PoKX+nZW7^*ZvF~s$b`jMw`MNJ-!V~zI^PHsn*P6fyX0$1x zfn(s);-^{(m&)$~W~K6jX0`^ip%Dtl{!y|(oa=H5-U^JKqr&H0)S|a;iXQZl^Bx^( zc`9?nih9vvBeaA_EfFeH#ESC&V_*>^$_CO*^j3=ucmr=J0FIc3KmPzGZ$BJ{zKQ+C zlOUo0W()J)3#R1*DkkMrF7P|m=&wNg1Bd|XFCUL69S}l(Tqq@-mcN0WDhrMS0$Q0- z^b^TQUHl^}SBN{%#@28;#AY=4!zPfMZUw368b=BJ2x)RjO_7pYN+a~A&5DZ3pe+l^ zDr%TCuR>QKBMW-9zr-SX?pIY>2!ytxaw>ge&VpQUv*-Qf#1zsfZBM}V5JTYxvYab`qK zeh9m$&$>5@^~5{jn~-m4C;m8V)=&XzRturkZ6!5%gTG=zwDeCoR}L!_dLd-OJ&#E5 z;gksi?$UOOsHKpcGbSdYHPeec;fWJSJ{vhlp=u7;S!|1PKM&IGUkwo>{3<-GDFG6{Z~LM^R8j z=!2f@pUlu*NXbJ|A9KGp3cI8*PTX7x(ub%ZTfjXBn|vz`*0|NCW7QVUWB_eMydPIm z31L(gDyGsGy&(z7tKZ6lD`;~LpnG=whn`AOxRP`pBNSU6O-iEN27(PM&Fxo-^@n?GFSrpvTMCJ z$o-zPE;nZ(vVE?6Zu?qrbKbB9y!m|Sx8#glTHt?QokJ9m{W(N;fVSn#7gVBwD2Kow zrynE&>)@7NXrxJW3S;%QZ!i3m-vT%J_yx$YCo+Y!9%=z!%1r zim&<0rO5**bzJV9bL9?J7kut*y=Pz|E;1dULfOv9ryhV+IOrs3>yynY$G&Aw3DXXu zXZ;DVTIagq^dOfJ2DY+$>e)ZK5|_mnueGOvHwwYcC0UF+41hW+Q0{?mdVRi2K6W@TecqeHeg)($ol5TS* z!(+v|V)Y%sV9%bZNeQ@$HZx;1?Ls17L);)K8*ywoYGMA?;@7mBA)1X&w{cfW#Gcp` zd0UuZENytvZmlfR9VB7yG7lXKV{{MA?^e1_VF-Rb-eKguavg4Oa(KT1vg=CUD6y6T z!hn~7Tq?8*wkRhfZh48e5bHBR+o!^}0nJ+WpuUo=)H`^k-}>axd)-6iX??=TOpYb{ zV8HU{GNnudTFi?*PKc1+)`yn*Y!r30)^H;qIvsxLoS-qhunl6tpUoD|!s6r5%G==F z){L(^#$?^l*;OZb`gP9Y4#3Lc_*f&tplu}KHUX|+Awxs)kS7Dkewd?eNlhSv=d=}=b0^!Qdx)N4R=*U_)# zG(ic+vd|gkhDKenWe9yMOW#oPjyUQ4*@5sKA(zgaOle(Pi5*1pmv}q}k-zi(x)9Vc zVDgm&M#-SjkBj|KQ74Ipk~2~HOB`PDDrX)!L_zjcs$k+ZAgCfeX)o8x&Yv;VWYUDH zQ$_(ih7szo1+4Y>ZS%vi zbD;zEMV`+0S#!FtB>dpZs(@@XgaEl`=cs$hABiFSWqC(hP?ZmH5{9WY038%N`!O>)vGs?LO>qH~9{G2w@Xm?__+;c)9wxY6U2t-=9;yoE#-0sOq`p3 zR@h+r-x*syFI;2kV!#&g23vXscB!`8%1=kYx zk_{VUObQ@8X`YDlI|mILE9e@u-lWr8H|*=*&?_1%?ufdi;VDuHaV@$Dj&nGW?%Qgv z#%8Z;4tkI6qIw6B@#v#L_)-`uxAhnZ7MrX~pV8wb>20Mr0F(uSGUr%|=kJCf4^<$~ z;ajHIr4&(!HD{>(-~eqyna$GeYwYix)mH*ftY`-#Pqgns<&Z8FXuTcqLN&ObwpW9? z9M_rA7yv7!YJIj=R4LH9xwEz!NTA$ z;jA1tR#pqznyZ7~EHJNFC!u(mO+}d5=HLD4xa<$?KaHTpM~r+GqS5X*Fz5zQ)-uWh z?Ul(Gk1jbfB54BMjKuXx)-0q^Ar6q_n9;8_aNoMqw{@aT7dDfc{+-oVCo}Cnp+Uqq zk)nW{OPGcJ2D*ZhTWTAOoK!5>gZHV(sb0P^i1B@Zhw(G#51vMV`>EN-TdPF77Znr6CW z^k$)XI-SL9=5F2K#UN)^aSE!$^`^%*ZzdJp8DB=QBI&!{ukyx;@P>Yfb+?0Ydct~bdu7s8|;WWbk zN8s1^;Dq3T2vVCko6cmAb*0Pj-Dt;J%OHUvrei%fy~=J%UV_xA#bC^g%&{!$tn&L(6LeFVFHQta?S) zs<}ViP-^a-T6U@xQifJ6OjL4>O{Ph3o`PioO=xw1%eyUkm|lXnR3Ug;6uNd<3@AQ$ zeTP&&8(VPc2?C)jAPDiU8&RUskgE`;>&;cAzi+xrY*EYqjsoJm_^fg98GD=e zkxm;uEJtdW?-P80z9w4-(4|xYC$N-eC$-cZ$=iia%^{?7;-aU~`LSqCK!pGuJ!;(H zbaS52)O1r;5J;un>%DHpT>I^pDd9Rr0un=fr?ucPjT>h~dw^*Xh0@!+Ks9rK>GGgy z|J4Yf@wzU$$Q^eUtTyr9X>4!AfC*i>DpO%zh3ie9;Jm3QTHzpU4L?2)u&<(qt z*pG`P4o|5Ev)e}TiWF>2P-QO3;|4*JPQOM6**gfs8^{nss+oX-E-m~G! zO>i@#rpNQVQI)D>*%mG`m*<8Decn{~+KP ztEe^^KbGo32*tAiMDa3VBXTrf7Jcrh5n4Fus(j_) zY0vFy`7yUEi`!xI6!`jvuBvX_1<(PnX`(Uu78L{Yor@;|@hzHMD&^8liLqmL4Q0FU z>4}$@Jvc-5QCswxwsBfDb=+4yL8+#xT3v>gGXK}eE$V%@UJ1_JxQE{4&%Sxw*>qj&Z24Mv?+!3WBnJ|Yt0D_XP^Kxd$g&|G`?2ppC4?WD669! z$%0`cU_^RA;>P~x<0XcKB}q)~Mwyl%_xAjJG@aD6WXutwSpS9R34eu=DF>aLTi9QN z?twiA>0Mvm^cp04zrO&%+GUeIY@5c~_0oHNNU-jY4tS}=Ur2ZDlNQRbV`q(j8U@Ki zrSm3S4-Q`7BSNTW97LfpqJI+~c*7xh?)eKm3>c{(Gh_qOdI#is=h=Y%jtD|cm$bRF zxkvbpvy}_a*1F+iwpmEF{$N$={a$_K{`PrIam>B6n8<-b{KsnOZ$zX5ycCCs#;(+aJ%%U0Vas=NlhCMnR7{Rwfdp(_bP_?iSgN;10 zslrTSYyBU2uYE1ivr69i5}?_&K-)fGhk9CRaZz+4!fM#da@G_w$~2luOHuO=SxpdP z3jq31N#=yiXwqzK%IqVUF=r;DjL2lh^g1cg zNweuRQi9_olUl?$;Z7-AXOd$jm2_b|Y+Xqu+M_BpFCQ0o(9{q(nD7DZM?R>qP4mIT zp9#0HsHynv*$cR|*Wf}>J6E}_eNEMbEE!b?DQq3nPK2%+xln~l-qZuI=vB$MQUwB~ zCi(dqWHQ%46xV=9j)4L>#wsKoR0+zMGp?S5nPI*3yd_oDkS-BbaRWp5Nj*`R{`i3t zCr|v4FlRP-t;CwTOOXVAhOwhr`M(Yh6rvFflG-%UcKR?>&Tk>Oys3i#9K6YcD5UB` zh+K0^)?Ad-k>n^Uhm%4n>yC0HeY(ow^#2S`3#F<%&WSQAXN3BTx}u>yf);YxF;eb* zVQZK7=`HV{u)Gz5;H~bXkZMm6ogCG(B9uJxNns_&|I_aO)3Btl5`&XjNGd2TBob8? z+s$#H$1vyO3LI03tU5PXmzow=f7KBholqPO?Sab>cd9q9S#U-s49}P0@bR?A+L9W4hDA~_T8*ShEi_ksm~d9R!)mu!kbEG(E}rh&69XGvFAwhc2FO- z$*k5w&1Nnmy0Y5mjeNbR%_Bp#uMvDuJ}lfjAbv!R-2E2wgIgIyrT?PvytBK?~T zc=t;77R^{fnI{(t(C6L`Pn)(2*zRc`thYn8e{Qnv;?dih+}t<2ZHLUc__`CYeV7P| zhosE2jw_;y1VWP1_of?o_Jg8cO_4c7@$*c;;8Z64)wsf$fUB8&5o~Xg zk7k;KqMKx1+N94(y>&y9BeBF&zRh%wJpOG@S?ziUV%AJso<$OFD_hUq&T`=MTJL!U z>GuKi4<>~C%ERvE@yp{JkxoB?lm#O3fX97|1WGp7(iJ!ltq6TAoW*bIYedG0T;|U# z%RWc*+0XHLzTtbl*&)fEm}UNaReLSa-7#ft-3PA_b8z-X@3TJl=2-VWU@AGXjuE%p zp|9^8%9Y_#xZqOwbpVT=`>QtUd`sPoES@3H81Hu^UTi!~xb{Wx4oai(vdTYsgg5wm zVEOGW0DCMDWW_OeXG~wp$JVNG%^wkn&6XWS61QgQM53Do!h}Fs?SshJFy>*llNu5k zbM~ytxbg!3`SVG$Xd!hbXmC`u-0Rq%aZuZ0eUmz~_@venjEqD=J}Ra!*KBj(PI-SW z$~c)Oc2r=iH8F065y~!3`+D93^Qi^2SOsCf`^6D%-nj~5ltncZyB*2pB;&-x8#DfW zaG;r$PIfL&f+;yDan*m1zOpTw@Vgn*Y#4yFW(@k-AC6xAvwe?2=4VXdo>+W7I?FEE zD{qRsnCqDIu1>UXX~5sd)E5{IA&NLe7lUA)V}f!5IF|Xf*+o*vtN5?dg7_ z1M2-Ii&HH)y`ddn8jZlIZ7SVrSr%$YAf_aJo78LVnq9Ya=G!HQi-#yloQlqIsBofsprZBt*XNJER4`HLT} zKVaDA?w%c^s{3E#)ramsK${qD7p#B=-E0qH&pJm!2Ug}BiiqJTZ_HpU--?vca@EVV5hU?t!{EID|8M)3{6Z8_&fMJx~r3E<-roJ52R;PRb~vcA3mc!az%7JY6YE44!H$TZ~~$AK05Xyu716 z2H;zC--}QYSGhI*iG3%yq&y$Noq%#o?X(36p5=x|`!IqofH7+KgXW$FO>39e={#98 z+Tu*Yl$3wMIFM-~D|u)G>kgW_R1f7;7Io;4+)0$ zv?|yndUvMjXEZvrd48Ae<=1I$w8g&g%`mm8N=XtD(MhTX(-*C81JT!UHV0Jn`?^2NqLz;rZ{!vn==tBDQ{r{&D!-+^L6FyDi|r&RmD*EMN$!? zxoe#6U~CLoxQfU%dE)3;@-Y}mJzSS_a$Hr<%E|XX9usAPpNE)>N7>4piv5uVCUv{X z{6rHIGEJ&`|5%UOwiZ7itE}~w&QzP4sl98btwyCvSl$y#>|fJ1{S7g4?b<%AV^`R| z?dr(CrQO=keOKO6=~Z8OxK>3-oc*$;Wo$CHt=?X1^adjfnj^a}>ffKN-<}zJBhso@ z9eA&{n4a`@BYj)$sHJ8lDJS2m-66tn$RRy&aR_mU3XiGqC;{>N$6M-?c3~;^4MN-n z)v(dd0zKVq1U;=BZRFgRUz3P!(l$5N8faR3}Ao&7+uDjqrlg(&)$#0FL{c(Sw zm~|9FAp{-;qfECdK^2IwlTb*uX*Y~B&5~dqxOe*stkdoN4kaN$b~_0$oCBDdE0@o>0nCEds@P3=fVtjfFNX!29xDR`@JumWqpk=VGrG{V?WvjnJ_-r--G$= ziQ;+=I}4&m|2Z&w59SIjqJ;Te`=P|jioJJnU&q&rP1x?bg)I}>aIy3D4GHbc`waSh z#$I#X$Qva6y&aTwJc2QEt@u2b!)yuq2XrDXz;-PE`(~W}c?@zr|9Y zugpXj;NI0_ReUhlFk4A$vP^knVFg?h%tnHiQC+`j7ff1i7m*f)4D0BXGjoaOdQDO$ zydQKKz^vICu&m3>CjWL{oLQ04M+(~WU&miK(o6uS#(q5tgJ<|=!XVKx$}@87p7_t6 z!xq?>zJoFOfrILCu>SaHJ4DMo3} zE!vva#Y9_WVZ^sg0Gt&&Q#gt{+`sLxwE=$<-A_75$nkUs^@qS3?n0t6h;_ppXg-Vt z>uMUcdyREJ;G));fH|cjbWpQ@D8a&tQiJ1v)P2}_j2;Su&$r$jLVii3=^yuk3y&|N zH6(L>s9(eXUBtC+)gEY6V`(p@%bjoB=4d|zMfVtE57?1DCl0LXm{MctL6MD5Cf%g6 z{#EPXj>6g6-ymdpL%G4`LbA z7cEqvwR>BHU0aHI52Y|Z6QKpJ^9%)YP$z7n_-*iA=*rMbVSc)oy1_RQw}px~m=ZH# z7w8!OO5F8T=Byc?bk4QfFs@Gb;pm?xADtIrt&y%$d$+1Y7o7vE#l>T!|Bjc1qr;Tv z9S*3UKZ3ni-(kO{b@Up8Z?rt=YE)x@BLwCTa@D&uYN1ruJv>ODB?x0Ib3$_}PXwli z?(TTm1C}cGrj}=w!RIC;YkN8-CvNb`Cg+l`y`^C6AfA8|u1-+>=93@zKQ^+A;Tv9_iYkWBE(vqg*#WWF#dgH-DYlfF` zp7y&Xzx9|wiX)siX{D_A0_VqwiInkSM~7}$9H0sT&&kc>)&{)?-Ye%gIuJ7Y#>sRe5@fN9gjq+ zDP)?Psc_YJe1%$z?ks_D0UkOg2TamPmFpxX67t>De>(CLn40*5_%OnH zeCyX>(y;-$RkS<{j9M$6rzyS=>jp8Mb$z9{%ZevMM zSteC_JJGf|G|g`DtkAa$3cZMWm?K1rpi`S_LVOC8p;IE+?!l^`YZ0LN92?tc}eN} zR|A3=h8cxmzhUKE!ua)_vm{}Zy%KD#DoTG5LcgG!5-GvsB9aPJsF(@5qOc5Plb-4p zb%Ngj>$-NoeZ<30RXP%iBf{UEsa9Qj!9~<6-`njk=S5$rrPJa+uDdotK{tsfMUgj5 z*keRnBT&leYc<7Tyjva8;!<@Oe?}35A@#X*bl#`7oNV^QDmLC?Re09 zMsBv3UAWyUDM5{w54|?9#Sz^iyJeKt!f$CelnoU~=ojyus@$`J->e))tGz~vJ7o93 z-4@7E@n@1}%8$*diVETGn8tj02qftMI02FDuy4n+XPYNwANJV;Zc7S8P2I`VIOhCJ zcwSFC*7b9IB#jPH7C-9n@uLqM@9yxTdtM#%GKH3iLbdgl{?>zk4CH3Pdv4$Hb5S1J zs_cc5My@Z0|HWHC2qy7+D~e#1`yd|9_3=ko6kkVZe*baQ{2ZK||FH(q;dlI;ufN+E zFS^rdQL;Xlei*3G#Q-$CmnJxfmO68j#JWsq^PD2A(A(b|JZqkLh@{yue6@8A;QldF z+<$`V^5!HS-6|#i2AB;(_Gie1op8TBKBq9mO1kDZa!WQy_9Jktl*)GRq zyCmh3b3LVDeScP>4YV(S&mwa0RGnB7g~mJr-5~|n;8Ch4o(j;~VPE}%&n+G0+`uP_ zyJzdp^g#_WAb{DQ6Qu7}`sDorNttb3}dTTv+W8d>G?r5vASoI`JTkh9H6)~*XhD~61xpbNNX zU^6RXX!m-n@PVq>Dmy6C=#@*x@YGk@7ZNBAdKaW={rd2ZAKj24qag=P zb;@@@Q$%VPNHS@LGj{}r{zpO?6h4}4$ee1F-d!?5HO3SnIVh$f^Jo$t^9>q9(bdw7 zYEu87J)WM!)U74v53|lOvk<%j{jC&J#btff)`QB&=0`{&ZLOGAvLnhu=*pg1s%+K8(-^Ue{x^sR?f~bb zY~caroBfIDO{MJu<;Qcx{0`WM-CD*{&wdHRhaC2c(%m!oH*)qqWtpSz_>w1Ef${%V zM-&pXGBN*4A59t9zrJ?0%GQ0Y+ErP}FcghAo}3{1>Wsnd7aV7Z?$<6QPWAu#>rF8 z&;n#?b31G%?_7OjvB%#};B-3OD z8Cg0=8cCWuNSZn_&Tq$ALcYQ2Wc$8cMLx~;dHeY0jA871p%h6`OjCs%@x=^d*6EZ#1%kWaO& z)l==ZT$i9$e(rI%5{4*{fIQ8-Va)X(js{@g%XZx@dm10ue86pMuZ1YQSXN0D3647! z&8$|ZTqkhm3I414Ab?(pTg7SuT>*A1xitah)}4Sm+-aSUe}M4qB!1ht&KEIXldi`` zc`j}3imOf9WS)(c`?A8ftO#DmfW995sBD)M4@S^uiDQ@$SXZVOpd$S>W2zg8wg zdG#ge>tbQ#Ip5{Fz8&vcHJNJ?rN zteFEagd~sXl8jmP@jmHGZ9uCE6MYs{+n3s)-Puez+Vm5ocj(pzV86I*!>@gHkZQK! z4W5-4o~D2Q&h*FA1ZP95u3|2D^sa|Q;WYvSAdgHQ93=9-IEXr{iOjfRco#Z>T#(^p zT%B-A?TqGWK2HqJmA~Tv#ct|hoS77!!=T1&2)UlABR%)n0bOp}ChLvnb3Ntuti>lH z7tOg#nsMgBQb)_Lu<;<}+>j~z>rp4emLO!lLZ9zB6Yk`4{aXx> zP9Hy2jF?&N$9_fY4mcaoF;|2lvl{2vT5U|m9$+Qf!3!?6r?sK$Wfz-73I-c~)OrHi z?A(V!v&mRPC?nkV!hMx%?XO?9gfoo-p_L?49E zw2Hr~byI4a#255s?kFb|mwPf_2$L9}i2>#3*EY_~^8K?|qD#t5sa3&FTlt9%=b2+_ zdVQM+F7}i3IT*n?x|;3iJ;#j3oWlUnI$%m2@G`J_>7rDJY&sBGhyPDQy9tB$IR< z4oxuG#VCp(V|rn{kCbrYwt6%AAH$G7z7hY#_&?N7$l)pyz0!c3^pcWnd|BjGB|*{$ zA*k3QnikME+%uu-2eCB)3m!s1Sjp#zP|Zxb^K35kbwpPF9TCf!$<}@QU4{Y5Bvn$Y zO!mQ@T<*DTng?<~*`{EzDo~i;7chEl$Q&>Swy-O=*rFKAi~zY>7A^H=Tk1$v>^%J0 zjB;4#mjm01qeZ~V<;sx~EB%NU+Wp9&b%k@x&&VfDs+ z?vmEgXucb%<-LmXwMENkdc#ich@97?J$A$9oa>DxEC;U>DzoGkOY$cIsHPC?c09KN z(H8nU9k+W_uFu@!_S4H;bZ379JD9LI(jK>+E8<0H@*R6`7rTASI~JVI+px8oP_O5L z6$EyUXSqxlF`J<7gZFUP?mjc}yXS&X{P~L?L|9;(yN6ur@A+@jl?A@uTNW-KGP~o> z-G}8aW|xOWQ$I=Y<~WHi&z+mg=MFKBw*^02{;p<&!Pjrs;~OEfCf|FaYo>~}$Ag)> z1s`rcSX0uul|QkqcIBBF!~*cI41&}2zNqvG*{X}vU;w6U=-9l^mM3VWm)r3ABQW>u z8Z8^AED5AvoWDp;eNNJ`NLucVuXt;vkoob_Xn)Y-^)y*Uka$^9AX)u8-}51zOn7D8K;ZPE*# zo|qyWlDIDs`a$DtS42NeGz%_r2RQ*YsYeQuDw1d>Ce4|jV2xP0+qv{>*-j!rn3~6M z6gLJ!d9x99{-|(#5DT=?30g`ee}LFVQMqpt5(B>IC=OZ2#90io<*xg_q-UptF~|qQ z*+*`vHPQ(EZoz|>yskoxUQSNR96q>3o^<@OjT?vf?D`0XI~cQe^h{wKr)ysYYpMMv zlPvYk@Yrw*gb{+TNZ_Kcf8`vROXT=0Z-d#LAjLK#_N_(s`Hs0o_Y=Fj zeMcneb%WvGx#;mFhwryOHr6S_4BI$C0UqBSys3hrS;mT~q!!ZGUcQOwzDwhLtLbAZ zw`*c|^`C?1yV|qrZL$fvA zlz3NKUS8{usOW6qr;99=&qb)DA`xBsFS?w%Y1q4veMgiJnf;^3FtW)t?&y=^&2ya{5O5k{=u&Z+A z#%dv0S_{uxQ20`;*lrMuM<1gvL|_6mmv=^Q7L5s-jH-%ylK~gq5UU<`Q2=p%;mVE} zQ4`l@zk(#w%yg1#Uxfr?ly%W#8$AkGMeb*_Z6kwDSwME#+RCUPc{D&Sg2JU4o;sE-1$6%RM*NArXTc{X6-wjo4IL zxHFE*lyuy1&6*Arg)uLiDH&T+AaSaPds+KOZ6}hIPa+S=wocF{fX1R3UvMhjB!ggO zN6BRp1S@fvu$EkFS4`sBEmsQaK{-uOJzG_ef(Cu(Dd(IlyC20+u)+#l`{5@^Z(uf2 zGOxos>o+`B!Kb?%^`s$xf`ne2O)nw`4!=r3G0XCL4z-EpW^fKYiz}G|#P${BF=O(> z*}+DD&~X7@w9eiU-mxGIwOhh;#QYQvg$M|FQe5hnXxBH;u2;~mU(l}E2~D$%@NJZ@ z^K2r0nq(XFTPa^B*hYRio+CH!-AN2^AtT70Lf!R|7ta-tkD1Ao>>WT->KM$OR)3XXXF&Ur0w2(I}vM1uTWTxAdfWW z)7n`xfv7K{q2Me03`j}i#cFuR8*Jy3vET-NrAV3Qv_ zF?fQhPUd>|@I5QVFVK@h?!6%2>#U51dWeO;hu#6{moYW%0 zM6madGG>3tpW&m3@tqYqRr;Wff`T~0{02AjXq+~%U#&uUmBjm_mtqGF>mL!kHADfY zzI_?6#Mkgt>-}e(b!^Vnu>O+d!MEx>xqV?LR3{p(H!T4_^Ct%umJiNX+Zfzkoas<< zj=g7FL^2t_#me5ZOEqz{MFItBd@yo=b(zG5d~QT9kVl!2Kd-t{J24{>TirvV(zOY zN%Q^JW{K3qg5t^e0^(flzH4%nFIOlNAh^Oeao!W;()~WvdSOBeekts4_^pXmsz)r9 z=XF^=xfhUUBY7G5Rzj|f5Im3mfblf(#euqYTv1tfsh5za7FNl#Gp*gZA$ZFevI=i3 zUu@xv@C|a}@&aXv*|;>63zf~;6xCF@XB$k=5cLXLH%T?u z72|Dj*QP<=dqq8q{mm`w_Lqh`55N0>d3H%%9d>@IePo1!n2hON(db=ya26XT~41`?qSa)8YcFjAY zF}6lskcOePA;_YPzD#txe^KP^QGxW<3CO8xAC(8_`ql^ght^LIb#7N7{^(F9v@tU$sb^9x4JVv<(uxCuue`9imo%30NUhqp+N&xs354!b6ai^NI>>J z##0(u7R>kev8@kLHlYvXYH_`Nl=m@xZyVkSqCq+@7=AqzbF=0tB(x&->KQU!|KsDY8}iJ&EK^&JEf`YF**8<@bFES z-h(*bTGUCeG4FqXF#D<*?ZWQaHc9{URv@%)s*Xd-u9Hf-Q6{rgtcM^XN#jU*^dhWu z!pH#0%7B?6qtfEf2VAScm6kpIt$WUEno))xw>>ze0?*QgL#th4Z@`-^Z%B@{QlVm@ z-^6pdlmVO++gWaOf5Upwko%>maTFyVOQ3E!W;%Z*qk6zDN<#(lWC-J^hnG@}(I(ATR z*5G)wJl5c1lm%~y_N2>x4sd50mV=Zr82fo=2py|>OqWOy+ECz@NX&?aIp6nKu@Mg# zR&Cc;Hi(vnkr;y0eYp%L>j42j=#6Eafd)Abq#OPTQv0Spp{p40WX6mVKF+_ivfXYN|37{F=x`doVvjDEA*=Urv*6k~Y0gCtm0t0(|Yk(7R-u&?vYI zpX)D;9(YC&$3*7lWL=%2G4k6Z-9+3}tsapnGs!b53UadckP3}T zmH=C*RPqQwIGcJKbYYD_C?CrXSc-LcOxy-n3Umi zMRg~z`2(CL4?Gsd6O4&oesqMQFjQ$p8tg_bAnBS&wTcf}6>I4!buuIQXt#ih^U|29 zE&Cuv2bs`SK*v5%o5pS~Ahcx8nWG8jqYfe@+P|8vk@wS6nRBSd z1%2o!#wsoy2ijmNby(|0&QlL6$@T>Wn#e2e0X27dsU-Xcslrcz~BqS9=CNkPgv>p4nUi#%KIa5mDG}YdKWH4*+q)rHK+x? z@ydJuSbNyDV_sVzycO;-B0tKW*V5NACGqS!JmGV9D41PSKmf0oN_sVpDB!hS?p)6r zky*A}UKs4l-f-(|?sFa1!=Dz+r!pX&Vn(#-reMF4sOj7)r)6_N->Q4@Y_JGq{P(p& z@R13mwS|XRpnw+o@ajjRfk3|>x=8uhJF;5h$hR%n?g1PFXHdJ#QAiip#|K4(I3TU4 zpuGzU#bxBPARxKOig9S1-0Sq!^=U1RH@M|55bke11%9hf)^3R~zcAhG{@C}$Uly{3 zx~RZ#p#=Le`aQOZNDVe$7Q{By+p#^p=)dpR_#VfLKi}{9yww*xvy@&6hdQd^2yw{P z8pb76YHX(7tr5|ZIc*04Ht|8H2s*-?A4ics z5vwZ^YH?cx`?{M86U=^q;f?(+J<9X9rh6*z!WP1~Slj)7PikC7hO~Zed-Sl|^KdYfP1Ohn2#EV)}6wckmyg#p- z`MR@aVrAu}S5jV7TDB}Urb9)hon*oE8(k zG}r>-qU#P>!Bxsg4x>#G=oQ`o?lh0(qlrZ!WdnA}DQ6h6fuNK875#u{9s^tE3Q4CI zh$A^cX#U|uJz)Ha^);C%7^R1@90qAhDBFdEjAw&J^JBDu9@Y1A2Lu;qdtCV!$5$_r z%$8@QOHKv5v&pWPqrF1mOOVCnvOkK_jd8xj%yaQIwlp=r5e!SgQd?{8(&9yL$p46KE zxtT}yygyg*{r!qcDhsgu{6_RtKWe#dq7X>V9(v5)g%vR3{|07FK$fBP;yN6XnVrT) zlLY4-Od-+*xyuDI`-Wg}%Xc$-@=^)MY3JIBNfePron!tvTvIht{ctkzlbF4tVaCz+ zX*=Q3%Uv|Z+Rh|+W2Zj_4`1G|;)HG`suN?t%ssb=CWWB78-sp_@X9$6*fmTe9WD?v zoju$(WTwr=o!>CDz_W*dNUR zb&~&}_98okg~Il_00jfXV0kH$Zts?{L1)_P>@#! zhYEBoU4Vd6A}ndZx*n%1)v9Zb?vhaB)XnL&*_ZvkWoh;qki*SeRdsns@N$1mU(Gh{ zZdnY#Wk;Ozoj!#G$F7A0{R9DHJOqPpBNMJqYX=h{IL#t0U%wg9{P5XeKWs@rAp*z) zxM-#`{0Gp@7X<$- z0kS^>&V1=OB9al9TGk-CUF-(6C(ywUjPNe-TBx%Qq=Xgg{Gus|g?V{(EcwWj=*^=) zbl-(|SrXrJ=i|Og%+Mm!DbVM8g4SI z(mP|vY>@S0b#*$}9yGcZV73Bv%~v-eVqs-p8t?RyH9PHuI(_5!|1;S5+&FPJ7&uL+4}6DF#w023UbFle7XA;ggViBNs3!i5Na~{9XQ^sNuT)QI z;Di;DSt_4#SUPnPp++12KB0ic+&p&#o-i^FN{dfSk=*%A+5W~7zD?wMAp{KajQUuk=+Sd z)Q!NQ0vtwE3xj|{FkLU2u}8cWR)6#M2eEY-LK9DJfn(}x<0Cj%nNS$Vd3Y0f_#%q8-^{tvy&tg ziB$y~78z#>rDwzgi`A^bPj&2zezoCo{?+}kYMr|rC+NhgAX2@cfSkevx~!9Ns8N#= zd7sPSpLMxL75pVm>#e+0IIThp??g6bDhBRxY|ozsKy7S1pks8C{*%FvS97HzJ~e5r zfSNy(fZYWpdIB0odJPQMTC*5I^7?50BXTOQQqxVE%V;k}(aYt-ROOT0;C||Po+@v~ z3!SAhslbuDIvW*c?v-Eq5W+c~7jG_mc;vK%d8xd$m=N!>lpl#w!Qnd|jSVtbb<{(# zeSylW3(*OZ2*|^G6eajuIIig8Z{#)&x|?CjXe_6hZpYEcMOPzJ0O|5wzxhxMlGBvH z7a+Xex7B+khf)oHsh?1eH7eRi$e>Hhg|oB44-^aBP|b0lM&Cp%E~q*hd`Y47)zAN0 zgoGg%YgpWu!{OZ5sg}KMv47`X&IX#ianEmEhHuEN7|Umw`ej+)N*~h}>S6LPdPhy% z37S&lk%6?dxZx9bhIL0WcXoEHHWPlumt*+&$STB7o7MHZ(f6XiDzlTdVa3+ln!vhS z{X3i*$TJ+a#2W<1;qM0YAR}1c)CKqe9VN&!Wjy>5d%Xmqj(NHWYN+qP}nwr$(CZQEL9 zyXx)zoqO*&@4okAwl@CE)&_cyjOdw>X*~Xn>&v-opYfE{>YTMf)}gn%FJ_2o*lD}A zuT?n)MMTvZ(jpoTbDCNk){;sIVIk-o@}vq=Tw4!F0#E2@tKE!xcgIQ<56O~@rLD%b zn#}ZzC$Oc@_kc*&tHq>&?xj9CrJ%IukI~e@6tzR*yT+GnBgD+oGbl;a|HsI89|U(7 zNrLXvw_HqKXL?@E)q3<9Z|FJ8{+shg&C%+p`3dNB^f%7qodx(_>+E1d9ZP-B1E1F; z$-R*O7XUc_Gq7*qAN4n*s$;jsitH2XJ0kM1_$MQW-AZj(E|O+#_!v%nvay;RJfqN> z5V1l*S<~p;Z?EKvUG)l9BnMzA>fK?s<8@mq$}*4B9+F3ex+R?sy4%36z-jlQUp|=- zNm?SDT}wQrqGO+gP|IvTtJuUs$UzUigb|(uKXodROnxHR3SC8m+5q$8ZoZ$xA8eoWQ5S&Cx-lC^XjV&%M-;@*;(eM~q zDr#3$(7Kk|{gFDFqIUDzWs#;-GPNZ+w=LazP59V_ng}xyesBW6(*+pLo*RbLFTQsz zYyy3o0lSN!7I&xxEAbB6R)RTuTiE}+A4hB$%7Br78|O=Q^qZ;boM0HL|I-Q6oxm21 zUsNg2{hJB@DA#X^>?qDY2J=V)gclDfOv{ zK!l9;21_?{vIOuiyV$kTd0qLckcIOI^mH(VO|RG`$6+j`Mr6k@ z6Ggl_bt>|X<7CUIGG)XVbnX7351Rbl(ny!;DY!I{BL6iHROW9?%9=xw*P!m8#k9K*EVbQpp|7=DQIM1Eu64RK z0VHwHH7^5wuO?f4gbrTwt%1gppbc-AU&)&Djo9d9SU4R;S`PaaMi zhJIDr$wK(8&Z+Yq-Tp|%s$kiKSUyVkPclAADn>0LCMjX0;{5QaN$pQW9-@KfAeCJ` zI`U3XfCEHE;A0oV{@*otG7L zGSSiCl{@cPqEv84S&!!WUSHk)x~@+vS&_tjYVQ?X)z^FgHf|<4R3Py-)mHTceP2AU||7(n`!#@?*0Q!BdS{eLX&T+-$+Inv@1SWO;}H{ z4FH)cWL!W}0Xd?LQ<1Phaigi#&*y9bZGue))JG%tFyY)c7h7&l>j84D@k9K> zjH(dZ`M}+XJvf`T!vHWw&{Uueb;!1TX}pvEfN&TvV%LEmsiq{LHsC{}dINkTyD^0{ z)4^E1y3D?>xjWw^G*I^>GH{OwAj#SX9iPcQSb($;t{uM=F+oO20uUc8;7pjd69!eh zm5|jk);k>jZS$PbodT%`{tYMD+edbKRbS2O#QTQE!4rNwB|LD3?H>VeQxFAPam1UL zroff2&2M_mP5-^9ldm48)-n3L0rNjO3y^kP_8giVR8YL^H#1+WpvStgrnN?O`o1yV zcn3L5SX#vkqNrXFFSk)8J%SI2*%yX~>qb!78!N}ISJS(LB!AOqbkfd}+nLC|HV?Ps`b+~A?k8Z(Hi%KrFcVtDS)VFET9#dq(6V@Xe zfSCBpI)+CKmpY*-%o!1JUyaM-NT64a)@FCsolKh$I z;uVOE=H%WK41oiXDeKy;^2@A`LNt=$D{7oGK{2C|IyT9Jvt_-VJ%N9lwSd1Ko`eSP z-UbUFQ^|12EZK&{{ct=x*RK1n5NHxActw{g@aX9h2_A2J6fB9na`j)Ok=u^8E(W!x z(`wlo_O_6!zTYCVpIP7lR08i?o*buy7ikD1zW9tKeZ2x?L9;1IS5aBQ7U8YGk!8P~ zo%XDZq$MIVS9fO5(Dzl}v0P!v{yJ?p_y>QW6%#L5{1Uzpt$MXk$$zmx#S5hev{Xx- zT%l$^h4ob^)-Ro%`r&z~cZyn{r-Ppw-9EBU&?^f+F0IkkpH?iAKSAdZu2}$FIBFhd241~2S)JK=taW%abLF{t3YH`u%Sjiu)-rrgIyz`B~?e!*5ch8Cq zZcThSGEamFN_4L0p^DK@9Wb&NoFvT$daq_1lX#z=W}xFnSO5Auni($K!sT~d3fK@M z0Z4t;i1p362KvA-&UCw=QqkRol!vk;XT~fH&RAZ|^9C;cy_AvNpx0680x>ALs#wR2 zs-Mk_EAbiCDW>4AjG_F;=atn(jmA@~5eC zR_mF&lKPIY<^73duc8JPra`q#7ula1P|0$BAaM(6>~IIAt}8Uqjg&jH{12LO+C~0= zumJs^N!~AC1Ln1zfn-I81*dmTVm}1(?bt6n(pOtA_KC-i*gzU`BdgY@k*DJ%Z|a2; z>^;IJkFZo4J=+tY+at+WM;lak90**e9TLSJq?ab$oC?PVm`bO$>eRpMeetF~hIz&e z0kPK_WvC-A=`c<*mE)!bz!cgCNd;Yf#%sOu)12P;2*EQCTv{y(xxR5zY~A|s<%(h* z+;LO4y{eEKJ2OdTe@8vq?rKYo?5y<;q;_s@oc%r64=^%wfuHo{6g|k)K?F~4v6MV# zIK;eufoO7k;X9uGLCqF5n}1Lf{@+TstT0$teXfi!ABhEk+L~!WoUQm|R}n4nNa3w* zV+H(*=8gH^UM|U06Ajx&Aecbq?zFHuoZHx|5f7+Y1L{Swi8U;koO-CCsRQ^@?fdjF zLcq9?Ea73pnGC@x0XS1m%=oS3-yBNYWGASt&$a6(3(y2kK@ zaz?ei z3}^Nm!WMBfi_uDM-FY5w+QRK_>^eJ~0cvs;b(m?zDR5*hu6 zIL&cG98nw2mlnMk`SPtdUoP5X;YcpUGw~sB)rf!LpOB@%KmsZI5)k=FS!9G@PRn-O zvIeqbRtLX(gZ{S8{&_pO97{fUXcW7Ik@Jz=lpRI--kM+Ak^Nnxy-*~0rpQSZ82_pX zPydA<=Ga_I8z!9R24Myh8no^+aM+}HvkB@8CKmK9H-SEj9I3)xsb7S*1%fyW(B^a2 z5@$^TZ~EKJM+)FZsoq58UcgIwjT^7@o5`<8^SLHbZ?cmX20J3x1dPDAT&dgP0jK*9 z99HERbF-XF4d{w zC1pNF!;EXeSR5M5li7644SXVBKR>3ij(YfrY$q zo0mFTla|E$2vR4+fS2>DLr6z>lG>|-!ZO?^f}9?8%)d9fkY>yp1EtYv>BUjCW&-4e z`-z?0Y}Ibsv!|o}47>7-jV_qboys{5w0k41z~LKm#NK)m%{}Z~9Pa$)8!G-3wMUz+ zj(a3VXGohmQg<5E+ zA*02j!?05`$lVb#ib%PhH$s)zZ9KLWVMzAkk``ePaAZYV@&&~Fji^Rvdm)*=i&xbs z{Gty(a&#V|y&we^nVpmhy}@Ir>(f2SWLYX{6>7K|kX#%~P`-Xazz!1uRN(d7v{|qb zSG8@VOAlqOY`>2GSR1p^t}mijmsaY6c&(?xOmNGIufT2#KkaBQ9n1ro^{Nitj?eKy z;Rc^}Y=K5!8EEqyS{BgwFk2B-&^WhS`4}quTCra(mAb9=Nmk+?il<;1e{Px1UOiRn zQZ^D>29Li63}9q@>SW_6qM9pShyER)2vxDk*@MtIk)>$AJ{@G+tTyPxnSn|{Mk4Zy zJ=T)+&bjkTFPG?Y?>I@ri%eiT(6>Eb@&2V8y+x*ToXTviaf*X(cB z9>meE^Qf4X{wgK2yGYfwI(Xdcs4#^i!o{>QWO`ObxdB5!{BGzg>nWduFe~%CE?mCN|+et`^ zdPL10iW$!((W_x`4y1*q3lnNTiX7vHr)Z~EFC#>ynnkvR^`u`o@SnbUyUjo){8J0y zqEV?1?t#e&vBdqNq)ttC_YX0{6M+S^J&6p^Eeb$P_!&xr{=$c6JidTz=0}LkkVby9 z06*tF&WutH2#>BtV7t!~;I_;w+b@!Nk=}HXxqC*Tu=8EjG*d%EGno(KFUQ9P@4y7P z2w@QJBG71edqGTn)OsBnZvf~+oBitHX&wC!-@INxblbW!ZEjBEdDHK5d-Ot+-@=&D z-qIZWLVe~PwR`vpaw>oIa(MzN)w` zWO9q0(%8%0;UsS@U7cppSDNbR5E3h5dl>*tK(fDf1d^yzH z-roL^Xz$7b&GrZoM@;ba9gTy;0s$%ScB~Vi-I#=WB<3PaoMvliPEPg69~f41mlni- zk5r!ii}qIK!rD(K$7cqemd2x5=W*(g=;}y(Fji33mGc9qlV~FN*NBnk+utJsJmd9v z3U#eDB6U_O8= z`u!^PEGG#`#BbI=@eR!!W2nQ>VY%p!GG<^4-NANRRhcc+#00URNY0B8q`xT zUjmy~|LBi3kVK1(KH2YJ7rk4|WWJd{$nd5dh%QxvJz#YoLwU+3>o-o1U2&Y!qT-A+ zP3iCMeRs@L_tojCa(cW%!zGL6&OoM$`l!*1Y>9BfD9Bo61>ry?<2$G(pd+)m;0cU# z(+vs3Q2^= z2+s0lQaC*jX_HXoM97HxTZ|M3D(v*y@vNAtW*1s7SKsD=Ty!-}IaY-V(MjF_= zo4@@-H!;(_^>+G(Y{8pLC+c=N4QJ{__k9oq<1CMb+$y^JWA~>b0g&r&)J5CeTTg{U z@26GOlPHVw*Dm3MFzc;;n4gukofPN5Cq0!_SScFT&FiOO<^`7Pj;dreT{0dn;Xf`S z%4N~bZ83Ffo+Uy5=)=%Ri`l`X{R0CMdE8!A7*e>bM!u@F&`DrAg(|tcD2LPPotp(a zLqg^^f6RYr=qTYX)9BW$iN+$(duD zMHNFKw=L7K*`Pb%WH^JWg@vv(p0lSkt-xr z4jKXZX_Q%wobLsqhlFL_A$199X5cGWtQY|FVTaGq4!DX+`bv(Y_V1r)HT2t_#j%;! zu&&Ja7naM+)83{%n(nNNbu2BmH@Wnc3YNqS)hdK3XXx+G6p4HECJ;k}w`25{%u5iQ zFBn`&M7x$`AouK=e*kt<{2zez9SK*Gg9nu0*hv$P5FX&Dejv5atlFG(oB{G`=~=zu zw7JRr^<}aG9$lB9<>c+ZnVn{8dTbrquz-;*pgRQnmz2WvLF_!*qJ?VT`+pJwg}rBq zgZxWMXJw&8JvRs%2!2tm2!Qq>Qn-#a`y#Vf2ytskjOb)>gXPpAe z=)yf-H_UPLvU5yC-MkCF@`;W+kHpMG;ZHh=51_9>sY}^rb?j^bYt0@nz`XQf^f?1| zLH_oD=B^&-*cs4i+M96=UDN=N^W4f{Z)x^F{dwmd^zvdf{|8;ESFx-4%$%$Ojycwk zHpW~3(A1NCFI@NMegWRX8!@`*8^_szrEn;1%Wl3Lo5mVjS<7Gpv$mdo6Hxx`X%cIF zOqjQ|2D80u18dsdZuo2~+Ql|)d)#m~NEj2h9#~IcGaw-j1_Ew0KA+@Ac+{wQfr|UW z*I+DHD&O()&DR!cW1FI79p2Qg9F(T4_@U4>e`g*+zZkKd65`}6TfuZED5Q3QLH z=(iJyeN{J0mp|KICuKW8h?Y7C;?+hU91j93U0g`xJV!uAaGWkgkBa0TP`k~Yy%p8^ z-P6;q7;fp>JJ#kH;8TN?2XfiF!t-)DzFvUpc4f?x$Wmz|rF^u!BA^DrBhnRd(M8J% z6>R~#j!<41X zttULctA*0xHBV_X>tUw~QcJ%pp^sDdpPiu`toLctMF>%j`MyP%-cUv)UwR4569QtAI5H)pEhA;rHylLpeUQk=^FbbBwj9zjE8;Z<2lEk?kZ?` zZLXD$;WF1iM^l>s@>rCFFGJ>nGV`39xGQ(e9bRWjhHgxD++lc6ev;iuN!96lNaS88 zo$2Z;!#0K~d~mDqg_x$%k*2)amapdZ7AtK^j~H?{JJZD(>ctdUurn<1n-au5r*|pOFJ>J_q`a2%ukR2RWpP<& zEhs(fu8KX@ft{|t8`N#arfNJ*0`$TU5~WL%D4>`OUT{m^3?~af|F9v2ERn`iRzMkJYF@Vx0wFf{R|M(W($wMbr|{DxvoGm2->>FG8Npk*;*Tn?py~< z5-+oJ&&^DcU_d;L_ZK$`#ox%J%5KLRad1B=VA2}#Lp%0&ycm4)qP8Vpc?dJQZD2>J zEP*@K!M05jIQ?Vdy6c2TYy?W9PpVE` z7Tr)Sd*F^n_~S2yN{+G9!b~^N2N&(VIAiS}fNE2G%O?VuLsu&p$ z>y~iL1W_zN;NzXV1Z(ZXlEkVdOOcarGdml9}^wz^;vVQ+b0r zo0P@#&o6Rue8hoT(qMP}xU9OSHm+*S^C*Te^)5Ee99hv9*xX_bWgN$oR2-0u3HCW> z67`HRXbB<+!VM6Q(R2D;;*-1~*^1T4wt(Vi1KaTpU?(6uwB95RPnJ!f5g?er{mL}b zi?RVXiV+~vl<@BfH)$olfNL4VvXS8vU?}eD2?uPxQiiLbPwbIKN8+uKOruzEk+qY; zk=tmuB9ZF{{QxZDQH&d60-+aeQb|3|IZv%Q&VF5xZc;*35BMo#YpkP#%yM5f#8;nC z!X(B(=rSy|NTfC){Ma~9u?X<~3I9vE@G&K-=v3((1eUsKDtoSY;+ad661feXW~eVE z?SlEVJ53(N*hOY+>PWmf&~H;-55GZA zKjUKCQzL3{?+FRM;oMSAkkKf6`9XHH&G=&(Q9|W zJ)d5^&l_sfBY@HR<((ddu*re&yn(MJZ&)l7m6~?jg7|Jrml`-pP2w`7bxwxo#+c5F z>{S+WsPV~FNkAW};s71JCe%f5sJ6#|o<$ye=x5cyDtUdEi<|U>e)cud@)rPEBgmyi zW>j@5fHt&AiXF}QlX$MbTlHS^Yq1rm=$4&ca(pBK9Zqn3+$l~w@76E3^GdZeb!D5_ zrQJC&g3B{Kh3oOy55_v$p&B4>Ii?eEjghMH!|QLE#F{ex!&BG3B8PVN0k{r|{i#>t0a+*z zv`2Box@PIIt_s@Frd{M(w)RDLfz}cZCp)Xf{w%#h;zQN=Q{Sx9_&a76iDJD*x~Wp{ zm09wZz%io%;1M;|HDP7~_LY*^<`BuHQiuyCjawuPFiL`K%c9^GjJUrM;9?B3QE0veN`g+MjR4Y6|B@D})r=Fj-Cvx*{ zP;3wUB74qusF#4)i#64GP%*}bIkeA(sdGl1)ILso=&$bThL5;{MOr-Aoa`xYViZAr z%&-~NrT;qxcQ}0b*1Xtl9O_t6&Tq%MW#hRDQ%BhI{i(U9CYj-%l8jo0Izo0mcpR3*zV$Xce6`8Ax%6o@!rw#?!oV( zq)5p^W$Z0YjM{s*^t#vW_kRDwBmP%W(h2G?N^vP*RS#a1#K9$H^zswSxq}8}-B`AG zdUCXsF(}}A)-fjSaaA(%OX9NCyxv}%i$MfQ!bHK+P|{n{5@TK(il*cCeb8a@Z=6!b z65%PfaYrKwO4cOwpVurJJhl+ldUNUaW*$`*ekr~wQ9L0N0`l~qdSi3ijVCE-)}Jgp zjHA-On^&Na>&m9|=GfuN$&qc{*ZK@oKZTh_1>*IWV9qHOA|ey-6!=cxT(7lC?!8Ol zp9@=6EPA?7U1#Ba|Cz*m{uESU%No`sI5hHmJUpHIWfl?-2w;QJtlPT;=$>7os-<)& zj_ez%=dfDSz>lErir1=K9SJ|SEZ9#RZFH?zk66qh(aj1Zl)7pZ?8yWdD`a<>6Qo0xFJdI@FpiI#HTgx6dw^cJ^NhWQi zcF%aB`{EBxMYtzUfq{+{X?hXWr7DAR|7!!oN8$4dZ?v<#GrPQWF>Zf}p`|IXEz6}R za|1vLj7S^vO7H^84XnyeqQ20|xlR$mi6WNyY7T$bB6a(qALwYLfkn>*KZ8Cu z!zhsw3I>uTDFN3;Fh-RAL_I$4fbvHJyse5~Nx&r;ZongPJ_D++gF+!ez#s3h)1^-v z&0x^o6_YGtM3Di~3w;95X`(pSb24yydBYJ|>n`gK;{nznOEL7qt&*u)!3HsnJ zLA-^IVR$;Tt}9T7;dJ3+0>A4)rsji^c$z`*obiOh+@T!7dd&$788-o;EYESFyQHYA z$7>%5ofdM8JOk%A}wc?HSp}f*52lu~?4kcpOO@F66JMl1F>%pZ$!{u^e-m;9ea}QY(PJ8-b z5rNmI@lxUJGSrc?ynGbk`C7wvX1+fSXMm!wjn4MS{p{V+ z@E|5H>!uw$Q$(pX^I3}-YHiBzEPwKDCe0sCivWCZ_Vh z+u+xtZ0Qh)`9)FN9O^h(!==;}DlR>s5OR^OiV1scToO5LOWk4|(r>o2M{Fr9T6c}IrzoW~zLtt)8`kuFP`@qiB!F(>@7q-NzAkM~9D3-lc>u@zs_b$sjj z<%>IR?CISWm0O9djSppB-=`jwBaV&dDj~sdB^y@YoRB0a(7OYgIfzGj6SK3(uET-9F`=!@`GZs_vNN*{PTXgW``xzNM>CV|=Sp+TQRtHu)Mi#FI)KvksEcjbq4 zs-7I?|HiKMa2?FXt!U1Wo##)i#7?otB2KoJ$j!ZRbcJYGZKvCa3fNJktN4Yw zj9_tZ8JjQ7F{=pKOu$3V_9<($a?kcrk#foshvyB`TR_okq*YZsR%Xpoh6N8bH`F!# zGsP)mfKF`*I?kQwSn{y96as!v!v%HTuZTYHv2A74pOXBw*ryHZ) zgH5h7iG7Ckq@@C6ov7c!~*;()pzF>b~n%d$2#pozbq- znhF?%pbk;NPQH+m$@N@&DmOGS3 zt4($qe9_#EM1x!gd|Muh$Cve{>#GMR54UHcvP@%+^79ZeMOhEg$4m;Cp5mYBw)aVJ zhWV-Kg;6|aLqh$I!o8y{;OwZI>Ld4>D_;DS0 z#L!dtaxC^_bx!#?XTm7YJ^cU%?z|u&ok<3aSB2-F(p;RvjP~IpANsW5Q$!>TsK4^P zsteYW1EY4pKt#vO(bz=6_>jPP2rCRHqs88#8Y%)kWc z1Hl(vwYL!^^R)2OQt!}sFzUMa+DEeP2~c=uM78ITu&I~3PjgIA5JNpn87BOE*#&F} z5#n)ue2W(S9r>ha(OBGu^uKP*9Lrs()cC`Qy*5mP2TM||C@pUf#3`PsBDNJBb1Zp2 zZ_d@rnhXbT(L-0w?t`GTQ$V|M`52jltmVLu2oJ!A5%Jz(R5Dq*m67%VQHFhA70O8Q zCTjdhY=jhw3%u9FUyHlti#6jg`&83UJ(ljFE>6ia0;9bdy&|xfs0`w4;om=nI7r1h z4O~-&jNx{%ee~Gh`3K84e>U2Sg3vwIa{C@Y^uT`OFw-19+)-QoC|JSV-tdj&#NMCf zCp^k8N?!h;ae7?cihO`;sF8j~70}8cp&>pX(n+F{DdM27?9@&tsVD54?b`Zpb$+lM zvoP;`7ktX#wVr39-k9)3B7Zyv_G-jJCQ52tx{v1DwNi@h418-Vg=4j6mg6t=)&d_; zX`~`q>HskT!##V8%q7!r2!`||d2u`Nt#H}7 z2bzSo_AqfcaoRX!x*PF7r1ohUF@E{jPkJGVDjgJ~hOCRp>dxOdzY~&-&Y(7@J61$! zkz|>TUyOi*O=Jz07|wV&O&PV=Qd2H>I&%m}kvAhmCTqdIkz&iyAwL7NgkLH;=1>Y* zU(yAcluth@j2uRP?Esik5x@c2kugfDniS7Wt%YUz`0$vT9O$p~lDr}SP!OaFa8zVE zHwg}C{=?hhaO3j%w7QH{ttKsPIvGErzEGLdoSAf<^{i1PIN~2H;Kb#Ad**o(#%@Uf zPfbJQmf(Laiz<6gS)%a1wLg(KpCtF~i6KeOmV5>Qm09@0fMm~0GZ?TAO2Y?TLKUS+ zzdT-vf5C}8Dly`l_uBa0TScZJF-fjEbxI&G~8TSmp|9oND!VRjWhEA@r}UJLDQepk-=K^(CF>8|nAb z5BnRXE47!U=n)BmJ2WlyU0~CB(L~2JgQ#2AC)%l60pG3D%L5AJni{TzNa>x-ChGDQ z(@$-gH_>>ei)Skfl&1_-<62|S&(!0bMG?hOm!7JyKK=WO-0wr&d%>dMx8Z5GL2A(M z_DP95LhFcgXmFMIU9UnZ?vd1`6J9~`B+hlV!g&?H(7*Z$*X7`21E!1o-*#Ez?Gd>> ziNAnx=|$Vc3Gkf~4I7;U{D$--*kcf0&V18tgJ!#fFZ;`jEiI>AeFvc2^^1- zrE!7TLeCjuQ6ub7nrtD?#4H5~P^yVpiO=_RU72RQi!AA8%d!id>>gO7UV z>^<=q?(7F|o>|Pd+$R2E$U#?m?kRK>iU?cXgR4=hV3b9;42wW@h-`)Xwj4G8S|=Di zR$jsT9G%!E?emdpbP!|28rkUhVh(LAg{#?}hmh1q#vLF6Oe8KuSjsFdNxW{nI>L>J zLq5sG8;KB?CJGsMfb27!Ln*5;Y-#1m2i&q3F|u7wh}UaJ90~QDuFnw)nD$?ja#G$< zZa@*;nGp~(j;nKUx%y!Hc}fkH6&s4suCZ@e&^cbK&OrcY*K+!c3VNewnue#t+H>dFE@TbW9q3QU@7hYC+D~)BoUfVflB3ZOPRIfUm7xY=t1tNFEtA zA24c60&4vJSIgJA6hxs`3UPM6c_0@$TdpSq@Qo)&hBwov2o4F#6II!Z zRk6x`r%9#@B2U_ky~71yp(*zyJrpJh@bG3o$l^Jxc!58h0r=?A*>rt8H-IBIR=Q{p zWT_Kl=SAj{N4p5t>ac$tI}29#RQk?5Cv#Ol)Y`~eJywyG)s#)ByWGttR{AWq8AclH z&s!hZ((W{aovm08hP0j8QiP5Cu=up8HC-k>8U!^cDX~8KBt6NU#t9qly8$Y_dzuLM z$S_?kGbW-t@vAw3-+Bp2`o51wgN&gBqD@jIRAqxdPlrQ#L15*mWY6;Rh$BUzkLO@_ zzX-#jvf_or4X`HUu$OV7I!kpeG6my=H-z$7?P5E0egL1$xct7&TFSimI?+S!IxWp) z>ht95B!a~$T1rt1ZDYn$J5)0ep3q=#4Ii97BI%0HQ-eVg$uUdBsO}*JP5>ECd+_ai z=vtKINqK(D7igRgEC7(lJ}jA7muA2fY~ZyXf~q)zH4;y|ULX5JT3agQ2ol!@u@GA-G< zL}t}jBpih&PD^aSYpDIZ+G)Pr-R=si9*-FBgV(TS{ER~mIdm%SiYgFtt4*|&wMN-I z5K}>pQc3*dg*BI&pJu}6K~Z#DUfJ#kmfzCOS3CG9(# zs_!39%d;@PJ9$UW9T=&K9f>m&-I<=b8)x@3&9)=%n!m7>J(;KlRaE;f>;W&8Nx-qn z{0eF{tq_Z-f91~mIY>GH+*r@Kb-~4)FxT&D;A(kTqI*9luDFIgYmIcnlycZGpsj}{ zo(nvza&Gm_ebYOcy>7I(zNX4k5UP|SY;&O&9i9MX-JGx3ivWGISyg}t*u)j?W|&j9 zJ*^)|lP8qicF%&jDLPPI|EBaTc6}H~Jet$4lGL#GQJVFbElQms%E3HGIdD(cpm9>{ zgzU`*j%GdNSc|9P+Mw;1-1Q6Id-vKRYNjVQo!Mi{Q~N6$d3oEmL9Wt%O+b0v0e2r> z0Ku`B_8L-!522-rfEBj_cA9ra>rA9c8$bAGkFJCmr(^e$nVrkuY8=|f5XUtN-CSPL zG|~U)!V{}sR~^x7TNr{$g=N(qiCU+W*pe?g-{#s{VbxpV!;svBAg=?fx@vi$>kKSv z-J7%$vk{(3q0|9$!VWmIKzxcNgislx8no#?d`CNLh3P-{)XFhX=1u&Xe_)nm_jEbo z=M|n553RQG2sQwx+7X3t)cRAe<7U3sOXn?AiSWj)h!l^!+SiSd^p}vj=$h|L*Tr0n zbdk1HcGEFiXxo!*Emo?0X>;m3(LtSboJtvBc?34;Aus7Y7fUvP|9C=Bw{>}QY{7J8 z;&BQU;Phamq+$zhGAxn08*n{NosmNz_lf zp#QYZ+n@Z=KJy(*Vi822O^J-u_v6_!Zodk*QS=pj=OBt|X zMdtfST~kxrwPUlCqn*`#e(t$2q2gvFoOg@85ndcWI&?)VF4+IOMBGafWDno~A^=i@ zFVYOkCLp=Ux}9K+JjclIf+&mup%flg-W7&NjM=PX7@kNUaCgQGp;U~7pLCHP9K;%5 z&X)@#{)A&oPZY_7o&+&bua0_T^AsXH1ae`ID7ryvjY#^9fC_0lo^Jd~Ya`BxerN}< zgg+tf#|n#>KAUKf9cnw4O@nf{V>_t5CU40NPis#Fbu_Fq$Ccp3y}%)#`G*20xXoF( z2T8aX@e^NCMVDEde~Mmc#~8gcgmWtO3`2{p160hhp|IsmhDw#`?a0TnxDk!FC7#Yi zgyi;`UprC=WC!+r%L_{9kXkW~+Qyc`kJC@4=c|=v-GyWy^J^Ed*D&N*+2 zVW?7FsQ`9E6J4PWgwJhQH=lya(uBg^MhC=d%daBeph9UrTJ90O|^4@C5qLQk>oIuK= zt@C` z{q^h9fM!KcWW~c~ntPm{ot>sVYD&V*?hmeG3#3U!{5Sv@ExJdy)fh!YeL(icq*cnj z11-W}Y#~r*Tui=7{q9Q5ChKS9ro^%3VNH#-0Mg+x( zJ5j{+0o0+MHRFvm>Uu?IwAWw)mMt|@0$1TJzKnWk zkdANF+FZZFdIQnb&m2j8zcrOjMmfCMf>XB=H|m^7gN%cdy;eXYJ|VtNmD^?u6owFy zM?U0<5knjmNE8xMOTHqX*HtYPmEu7@@UM}gyS9jZAfC{;!rf=OI6H!Kz&a66bIH5q z{O2wgrBAtfN-nj73pYq0Z?YcU7Pf#%L+nRmmiectO!p+{uwi3<85Dk#*kRHzD1zHaVDYA)(*;5ihYWoBHI5pRI4%u>A|% zjG3}6x~0D8168fl)bW{2So;V{FtyKQ5Q)K|(xx^QVxjSMzvQv+NqTu%^=LNLlXJ)` zt|?3a)MN9QZ_=Y5hYY#=IRo1JAIn%eUlH&5I&L`SaurXXZsBBR zPs{+qNR|9rD{#j4G6=s;@+PhOATL_th$MXnKs!f}Fv-}MXXeEhb*%t2|G!yj!X(;j z9UGWSg|Lg57&Zn-byPl6BuEsAt)+s0t<5?JPMc?THZP~KXayzbcS&#aL(e)c_4?1> zWfHmZ-b9NBoM&PIw3}u#ra1$JkDyMte@h%Uxk=VMS_zO=0)h1UYozn6aEd$O=A6Qj zj4|%h0?(pMwgw1_YI8Gfwfsj#spg|yhgH(CESPl;!JA#L3;(RLh+=M&CBG4hGp&dZ zL$WHvr%5hUK6bodcHKN9p-}I}S9F>}I!04Rl|pq~{S9}zMiD3i6{#OQ;gVhKXdT0R zFNtF(a&cxi?FiI0FSw^`nFrC^XaAdU{jh?YWfjvxtGW{9e}=*M*Mn`uaOJBBw6%5V+nWXd8Yk z$B_T8xohqAfVpm8T?JRNPT9#fT}~>+TuNCjtw-HTf2Sy&ZbIqNr_BT|7P68k3*oOf zH|;2d$X;w+*pes%G){UH1i0T5yK$)>!OPB-mQOj2SjP^!8s5ZJ$C-3%QXM8bmQZ)* z@~hI^mgOczm=KHPH4jRIDnAC^(uhX$x=v7F z_P35USyvA)oc(hYoa3|N z;bC>oSE@=3p1Hkm0?@cMXuKI|RMW(WSt*4%@mZ-qjZ%G!ia#g!?!uTDlC^_?f~l@V zW@sW1NI!OdzJI;80HA3@Akg$;IyZ@o747WAf%U`lK{5Z&HT>#6x z7OQ^MgQQacwvCNUb^!8o4ZWXvw0xJhc_F-0mbRR_zr+X&`S`}(2+RMku*aq3*od15=4mM>=ino8al}e0 z5dI&Uo?Dr_mz;&clAVN45y)f4E!!`RvM}uex+Qh*Gid8BUI_-Cs>_{^B1Q zb^v=!uzxF2{@cr91UDohO+W+=~nMQ`b}r$)smzr>AFtE4dnj2e0`RE7H1Dw8I~Q_2W}sVNDCm zrNya$D7n!3TTV0V-;VQ7cq4q9zF}c0QrIGD>gkZm=PWBe4o&gi3OA)NDYi_;?uazE z!v$2-Gc*8|PiyaOF9+1`6k?H0Dra{*0+Od}qU%0Qclq!K_JQsMp*xuVdfKj=4~A=fN(1fmMG5alR9#Cqjn;_%^z z=~2OrB;>J_%18~V@C_jIK7uGG(m;C1oopU!3rKf%l!efQ!^U!(o@ALwlEZUqm^UKk!nd`Xge$(7rVl7~^#;mSa1rV`Z=yPGQ zpH$gIVO%i!SJK%4IiO11oj7AXck(uJ)@i}%!bhvLrsxucw`sR_62v!o% zNWF}=_{04E;SN=wFGwluwgRzX$l}vSp14#PAH$@6RnxLOs(fv#gI0r$@$c< z0WW+KIB=G9`WV1E9sB{OqkeCRDWM#oAcw&~y@vUNI@_J^vrhEqtIx~%EXj>Kag1G! zSo;`Sj8jsHNbFng8$L&wIRvV+zpMzcAFga)%a`4aZs$UUJso;$X4Dq`B)X`hKyHe% zc-s8-wCB-;t=vmCNlgI(XVt5Nd}y!>Kd&Na1o75X?9`z>b*iq-9@2bceS_D;0+7a# z(4@^|by+=3?e7_nBjIpgd=V&GSUDVpK|oXnF)4539)_QO{*uo77{Dq-=a!6xg2~QS zdXS_`ex-TMHFVCIYmLH7rHA5b7d}tO-1T8(*8K+cIAzbcLlxj0zoNGIX5(L!n3^^T zm#9V-sT8a~YfM-in29R7lh0L6(K!CI=X$}n5?kzlRj9Kptqm=@(HUcB?+7^uzg?Hs z{3I|;lv6GiVqEg?Tg{ADMAma-3R~L7W-;hcX?qhnmP!U_nyP9(yy{Ftsw1%2cl<_J~d1Nu3Ge2iLk8`&G!c^T*!${2Y)8qvG3<*O*V8c=jy zLheCDNFXajMBYU_(?g~8(*Qd{c5uXfP4xaaFJQ;o;%fyp0gBfiZ^OJUipf??)M!6g z!vha&6KUh4ai1zONYE-TDganeJ$QRTzw=k;!k|$+nA;Ptwl=CprH3=_e zLIJ!<>7DdM{%em_Ua;MyNA@Ara~LV6#K+`(S+z`31RtU#CWpBEKsJd0v?Gu;3X72W ze$^qPD1lMl1n$<~bDHIOxexJG3!;VgXr0=yq!EbYq;JQB)*l3sQXf{jvuKv}7*vaf zG{)pfpIn!3g!oL6m_^bDikDInFd|<}Kc%Niqz~y}3%Sle=DhtQHt(uI^`k%#aR;JVMQ_p#|f+4H#N*cltg^fwGN7ua~J+YHrQ zAk=}q4(G8$;l*EPw#re%WiveB?#Hed<^DA%7;zl<;B}*cGe8@+<|SDz2OGwfMI$ow z3(>kV;Nq2@h<-CaS8dq;+k{Xk1 zfC!$75DOdx5Q=7@tA4JSy;ZeDd!mi&h&CK&=+@WYTA%Tv&(de7BGhQ0(u=G?rB2EP z@w+}v#o>gQT<%bin?4Z>x0U6O9X9{H2YGTXvQP(fK@uQIeEK-dx+9yL+7e-u%cnAL zys7|1MJ#kl7h;=M+rs5$3#N_Y!YnP^JW<{?ui*`?^)0_kgIF*@U_rE$zwZ7d3CyXCCp8ui>aGz9Sg0hLao{)TWaf` zZ9>((lF`MHhNzUVB-fQyLBQ;^Ox;~j2@b8rY<6=-DJa+ibJz4p*Lwu4)LZ(MIWL$y zNKQNUe9`@~ijp1bnth92O%Yn^_+Vl$b2_mf?#PUD;!J~;IrAKxJ=f;I?sz=fSn}QG z`URHqUOVgP{%1SnsM^T=6-WM|?mMK$N-~7Rw0((kBM>N;B0?67(sg2yX~WT9Wn6MD z)!pg&dF3fXCa1%6de6W1@R;3VGV}CR4PZK-JZ3q04EaM;E$~>l5zMQ`eOiFL-(XK* zOnsJ3(QKVgKd%t9{qaSypg7u(l23yaDH0zMUP3>8$lt$?)9=L8){}-2O#W|&4Sp~Z zvk$R&M({!TQUo-oc|?_R(+fobe8T=agf(qQP{-8E*hAVNwRpcve<<*IG7pl=MiP*Z z#Avp@kkyHkcaH>TqGZZwEXEu*L5EzfLcJvJ?%wM_uFjVmP9&&14{nT|O`a++A}~%^ zWiDFDD*F`&o3&uBt;@Jl-2CU_Blp&m!E?;(n}bnTPtt#V;xhdothws6m1O#GW58Q~ zGxWK32Aa*d{02}A*@@u(yv)DQr?U;JmDzHwAt`GKP2D@z7qDEsFvy=x;;!%V6zFW> zY9IZ=Msp#}-N=IFKtz`%-H*4F8y%lAy3Wg_Pavlvf*~?kn^cd#bt}H-MA6R@{_&%X zQCf@<@uI3)eEYV?U_o6;R0f@dJ8`5KDahtd)(eMSp@1UfGn^}~AjdJs1rh~aELhj8 zXJ<&3ZIVCQ{!O3|c@@eTwJ%lYW{O~z6lw=oWQSUOcdB{NJ0X@pFg8`j1L;==b#jF$ z`zxR%A+IZE%$ac`Y`z2I^Q}s;$s|AO~eSpA2 z#sGE4Z=YbC%qZtCwx@>+Xv(dE*~1HnS;J2>8>?UVL?m8mn|w@m^&sF)yK9IN_qVhx zyoz`fI33Rt@supB=T5E^uWsLvHh0xt;46~YdvplmgT;U&UlKivH*8!joH>b+5TTb} zhXH$>Q0I^GkAU8Ji(?{VP6-fguj+1WV?yH(C@X4xaAEqaPq}=N+0F;>R!2n-S{&m~ zh&xCCLj~cH#zVO)Gox)90t+BbL5l<}92N%E6E=d(8#FZI=Q~qdmff}GyzM~!A6r3x;tb$n=8=!-R-EKsmu5_;(0eLBnYiWqB)I(>>bD*jZSciN81>H#614 z^Qus^t`P0IM7RDN>OTpCMk8r`iW&*$(da27%MtH+;xPH~E`!UAH<8UAyGp z^B%9gnV{?@PG?SsK5IK&7IP`Zw_P{7f?LsRW@asipD#1%;UQ3UQF|7t4ZNbqF>#kr zRnAHRE8OTjf!}Zxa6Q3Sn*MPZ?%6KNdU8wh$Z_E3og>0|;{1*jfi)NW#}a7L;M4U0 zz{1R-@mZxkTeer5wLLlb(%ugbMvn$(&wH%?f4y+hOS0{(aqfu@7kM@vYAd$Cw<*R-3b zS9tpMru9=bw5=!&;W7F~R)M4}xWR%yn7{3VT@2eb9&e2v=UKBD2r#1gPKHbdj$!#+ z=7ZX~RDH74Xo~~$u|YbA&45TGA`=!iaa){(f~4gu%@ypA8Lb}jr73@tczTMD0VGz% zAtR7BG{>_u1*Y?NW$_jEU7cJ-#YgJh^V#J=91R^i_Jn8y&;9~aif=jR&-++g)tgd% zh{@;@VGh#L8fy2%ElnJ;IJWzW!^KXDnP~ECu1s_!PKDIs@z-FICXRgNXrZ78#Nx6|OZYDnUkWb%Ob>_kc#OsPR`FJ`w@hmhdnTiAsc$&33gOvi*nEW{Qj|KKa^(R3PvczLI!60_j zY2UU;#iI#3*ZYv?UNz*VtmRjCej9x@qjucY$&3j^B0Qh-0pS?(6os+G%XizoQ}DHb z0+O9y!=Luw4mu#9zp^xP*^}ZF{dC1r`n)*yX(u+lhk<7EnZoiv$oP7e7D3kle@d-9 zaQSU2$#&(_LgyhO2v46|V9(^EyqEm*-e#iWqsikA{&t8H8IJmxW4e^OyE%t#5oc zFa1}*wmW2p|Izjx!7fV?1Z|$Wa8~rHNltZ+fCLm+Z{1W?$YkH&(idx3DskKT^<|RC z=ckC83|q~}ILo;2Ugzbk?kCWmJmxq_s`x`xE^yht5(xWG$PPf>Z`7wWrY8G0WUm%f z4UrCTet8v^LHLtWmcGL@zJ?{()_UlY@hkGRXFi zBB+B>X_6^^tRw!RX0Sci3%KYv)$1s>rvK$Y{qKscmd!brKBqj37|RLiPLq!F>C63+#ro_D{EF(F<92qn84MlQ`FMAISF4wpwOT8b+S^`m0EhGSl*1bK zpguSDlNhQ=08c=$zqCHl=&msmVaA}ep@3j$MKlTqo(g536T+~@_`Y39gJdTMk6(&P z#g{HURMyhpNagoQsAFr=5iJgaWVOiM$|37icZ#g|(!%CC4}f!&)J}>hB%uptC}z|j zyo^LIx_Jxeu*eaGoK8^-@KRsMFkeoON|m1~Y+{N=VbNz@fanxH1F}1bohVBj@MU(g zMB%a+r-M25YiAt!pH^UU{B1d6HH8ol99|Ypze>>hP4I`l82w2k+(piaj5wqLkwk@Y zZa`e$EIt6?e*(6GS9~a_#rOuQZ1PQE@y>IS_pt2Ei0@Bn2;U}KjbLpeIvIW5Kk>R~ z>ePGgE-8>UgLlrNB>j(e(75TS!%-b(4y3Ysf9ZOhy&}A<;rscRM=%H-FG2L_Cle2< z^iMXOg?)@o*iHR2y+JJX{Obpq?5azvpu4A~bZ2AK3>z~~; z+uy+}Mee>Qxrv_;w+F4@yT3W?@mM^@?O#PF7Vd-Dxd~-E4KSQ;Z6?O%z4Zh1+_;z_ zW7|-fci{gkq<3$w>|=|bj$dZ937>Nu>B7)g1CvZbA{R|8E)UHd6hHW7Y{#$GC${$2 zdx-mt4w>o>2B{GdFbo@JMM<+#Z@pW(Dm*mGc{E7y#_#C7Gud7DKu(M{O;dQEugk+ z0yp`*>a}JizV^+ar){TA6smcZwW94yNT#g+Vtv@v^JSei@eMmHB17tAhf`}g0jWl# zMoUq7k>rlWEbAI^|5WY=*YNRhOhk_p-u!lb8!ghuiCN6qf5zf{XqbO~MqB?}pV@Ll z(jng+tK$RHJ<{FPx)oZhy_D%AuQ@SO9_z)Gck;BkMBE!qZNMJ=dOx7*Trc?YU1A!) z=d)mCs=r`}wQ$e&Nt}@!;ztf?SWhp8ViT-V?up5#X(mJ|!H0adBa3u7uti_0h*>V4 zmi`K;gc8_k?~L1@jR~aN*9wm#==I02VQy*e%3#{d_A!Hl5 z(JG}NPKkwyr4o=A@Qu~YHRJ+rXLHXIqYfW#I7h$+|N=SmgB+rW$nLz3w}|;Gz*0+_0cAY41`uRBF13<+>YUn zMRe=p|D;ZPQBxZ0ycX5m;kJ zjR^)n_RgsSvrJ z=%9d}dU~KkTfqcbp^wB(e|T*l*g(Ee1K1(QA+7`apC|tk(f?;?w7DmDm`jVWzT{Ed zbziR3E4MDKiu)wIgn^`mt$??JWv4Eq&{i8`YR{rn+WOV1_;Zq>7E#KM7jo4ibm)cV z7D>p6CoUwHw=HFO_dAPY+P4`1H!Gv=Ul{)fQ1@)ES%x^9AXp@+dZX|oV_?z+Pk5r; zjlH$CJ-S_@+^GMZ`2eK8xkN|6+s8vjyhZz4r4OD4ZAsfHt{)YEQHkOwjcU%PlzGkw*gCfI18$d#rH{=Rq)BfLN z+HZ{C5HD$I;_$?0#_+Wy;*rw-asfUwCbzdoN+C)yCZRAsN+L%h1teZnkl=H~9Dj8i z=F3YcSU5%qO8EN9a*KO5;x|#KQOGwmD0oK*o*p}!&P?=9D;h$!LaspmfoxgT&X%Xq zUrEYvA>}h>&FW6kuxMnD>Xr^S>aOdHiWRIUia$a8ix>T+P*Dk<(V!m z2Y*2pm(aDKolp70k2bgimzwpJHKT{JanwP<32Co05@Axo326zRLUCo;t6v5P<6jZN z&Wk%9NmoHFJ~AI^-B-$jhGwQ+3a~{an3deDjKVw+V&*D;lG39h<5D|-1q@}=|2O5eKgwbyIr}`D ztyu1OxcJzg5k+^^0R(V`4sTlp`hTzd|7z7bFJ;=k{d>RdcApj{!k(-uC7VgcKEz{` zNszesZ#UJ$x9RTV?8Ri|9_Y}N3&o^g$hMpwzIOnlJ2|?uibFCUK>AH$^+S~;PWS8- zWf?gn0d!cE&6_~dU1&iJ$-pibjd$<}2xLX0L%>bMk^+c@2~#c_q_!>-H&m(Oi@5YC zwOf7ZyHn7*+%K>nAUIJ!|66OfDNU=OvJHU*23+M`BS)u2oGP|bRQ);;A^)U@}mEEiqOIZ1tFdij$ahws)_{{9S z+rbI$z$vA!fQ%!h5qqpLOigxHY8RbUa~z8PgR}`5-c-%?K)Y~PV+u5OP*iJz^Db7% z`dK|yV6cOpfziLd;`s`An0Xs2cH3!qDr z?TXKW`=_2T{jx+IQ8l$7|HS%9&P|UZ1#|B)N1RX^#uI1Zfuk(Xr}l%voba zBqC=-Euxcr?er5zTyxn@*N0==WERZ#GRQ8Ze#I!Z`H0@{wDVeLrk29cXmZDS!|||X z{tU@?gKyv-q^Ww+=_Die}&eA>7Keq6ts0$DNN$xVdCv6>eWJo}pii?10I8Pdw z&0H=UVgt-&Djd04vl_omQj#(tc4q?!ZLrCw$M^Mc3EoT&c-(^po-#cH4VvI{&;A^3 z4ga4&i~&yMPa#(M?}p^%U=u0GjA~+LsvBM>?-d55W`8G40@wOaLHXoymh{6QMMedG z>3>Sg(;O{zB~3BW0P2dc91H(@YmJXj(}vT@(nw0stV)@l@AlSyJVavh=@&^usF|{27|g!5WJFf)ZzB$+h=XfV}O>$l|;LxHrZ>?HmJl&%VaCQrZ%KX!@q| z^buJl9n??SnGwjJ958hNg*MCDnc<{Oi62!Dqkex9*LQo|tMkJ3)F2Ec&RW({Zop+) zio3YExVXS*?9m93VSh+<>-FJ*E3jqF?^&`PiojWqweh5l&fsw48S84*@TbYb%nnse z>X*IBGCB8vT?f?HI{h;pINp*DXO>{pZqL9O(q^;!(t;KcA)?TapH0NSKQrhSI@eDx zGuLMQiYW+JRiF7D1pvJUL~OTFaNPmu&ZMgr?q;wZ;D&A>vHfNfD^df zMO0lgC@n|9uXv#D`+nm61ik*bo(cWci-?_X)V1zF#czHE+z2k~DRlnx+Hf7q;2HkI z46W>2S1ssg|NN4qofqr{s@y>Q4P}||W=r5B=3&%#v$nIY$vcXEt z%E)OMx2vi^MJEFjDTo+c`aQzT7E2cJn0Zz}3Q<$=b#2wZQbTO0_Br3&{(Nq>W=t@v zJ$-v(1{&6;UC^RE25oGM3&^yzV;>r4Y(C4sJz+$b8%`sk9Bf~~r6$3lHzEbTC^MuZ z^GdUb3JK`eY)es~n|;@_+&;6}COR*U247o`63m?#AF$ScrUhIbv_T8@^_TAI_E;wth1sjtcH05c0vu*u^ojcY?6x!ifV8=YyQdcPxtwD{m8wuVGOx5+yBo}2m)PJ8 zs`5*+e94P#8FJD&9)SMZ7mW}|x7wDrjQXbLce4V)s6Tc>IGt!3pOqW=8@q!48m?^; z6wm2jhPFpxOgKmc?#Fvro=M#(zwEYy=Q;!HTglRCX@O+8L)BmDU*snhFbq|JTi`CE z<_p3yl)o*{-#SDXRzaW?XqPrtEmv{Z^6yWMBd~ku3jf4N2GEz`qaYwJ7#pPbiWyf& z2*V>GBTg?lgUXbUYYa{7n=JyPkygq?Be*1pxe?9p)N>VZR}^%-%5tL93cH(yIayZ^ zq}VlSD25sdn5Q|PHPJultZ&ry(lz-KoQb9L92oS*DHD48)P~_d2ayDPgADal!#Qu9t z!Gcdbo|zw`s|eR~PATv#%qZCnPh-6aaHT+EU(yhD?|;Hc*e?*hbMIIJV_b3D%Yw~J zPcTG!t4(5Y;yE4wpRgGGCTODEsM|!LA?Pn0X=P4lbRMU47&qq(gdp0NhpZ9sh6+F3 zGS7nV6*RS^L@8r{gko{M;<4cdcK3bw`G?yBNMc~)6=rd}B}^cS7xPHDD$n%~PtV?p z*HA&ML7=R9{rggxxEKSeGlr+Ej|8R%;oCxf%hGz-wT$o#T#w-;W@!@rD~S^r}H1QKZN_Pyu^x`!PH%12*Pj zGKD2bn}g7OhHVS%N_Iq654AO z-U%cMsf{T!J}nv;~v_0<;=#50nDkSWmOFom^f_ zoPwSE0sBoX{oqP;@5=&oMS|v8GV>AQMnAeNa;9$Lrp5zowB#EZNH}Z7^{50;!!4Vn zx>E9VBtl0vBL}q;Q`EEyKNa+ zdkI$e5+a}+qjQ)}Y-kZBArkZiBtvX@txVP;Gk+hnIe%QIC1~=-nq_tNvcL=px5w3j zu-kja>ctZ(Ugr(Q&O&+WIc%5kRXvTHa;>8^G>sc=I4mdKVIzV1R;<21_gacCw7y1x z?dXLKq7xHR3R4Lhr+&EXrW1?tO0|p5@Dj-!;3j0d@3^##OGX;7dYVtGDJ0idL7DW) zD&c`;a-egSVo182Hj*Jj2Y|@tTK(Hg3t~^rf&#o`oEzb#%Pf$|4jlVfH!N0#h>&kb zJF*`!IAV*)>9n_hIlR{Jt%gC@OS2Is3}L$gwdO73AJmLXuINaro9}%{4Jaxv#id$k z5Y;kH^{UB#j?c}DIfWQm2URfEnl-1{df7lm7Ee10w1%7HB}Hl#RsrFKE9@*yq!B(v zL7tmp#G3+PssN?NDvrRch2L&S>vp+LtLU(=?;GoGnldi7^MhPo$_wm*rCWoV-tk~e zw4Y=02~ck!o82)APNr0{Qv#8RUMx&i$N#c)ugv(nPojQ0I6!KkT3^)q>nnITB~DR- z(9!&nJZ>3ee9b22_hI-gg67_%=JR1`&yte)tn;jU{@H)i#(Nzr>xt~%Ri=90l)B;S zI%ZvXtenu!9JIz^oOmOwQe@J~qt6vpTX$+rD1*0KuQTq0HKL37*S|;YXsu>d0vnD+Qr!l;{Cv1>j;`}AK-|ZF@-KFa&tO;fS#Lv zLE~nKy_t;DPGdYuhE6N&=iq7H8IJ;@r#6xp$UIZja#WiZoW^L>itDh91F7|KQ8vOl zg~9idIYy%4qRlEbW(#PHs_tr5G<*k$JfyN|g$v4FZL}VHA+>CvxA*aWcU-*>nLgre zOxCMTt#ud9eF%`s9b}P%OwxWTUwy6iac}7PZKDhB6+h0Mg{VX7tSTqrDp05j3wb&j zm@_t7TO6iKl(YI^V32YsSHzS_Z@MI%1?8M+uL6`&-1wk}%&eSJm`CpYgT*}NL_?ln zAYEf4+=0Jo&z(C9Q-rT|;J*7XNpF`3pG7r^D%qGMu6g4N^ji}NXY0XU(tcxa`>ykM+)NI7^umR7|g-XVnfQ!x$ChUpj$aOtS`N9%?R zg%^sDY`JHHTAyIeK~bz5l$(q8ytMLd@yUN_0v}2u4@id9BkiU&oxr~N@-#bx?NtWJ zunXwhYGZT)a8LTDITzIucy#y&b{LEMgkuKiC9(L`>^Kg|gE(lTZ)#B-LW5kiMbk5b13{U!dPM10&=rsEEiFJ3OfJY&xGvg!ePf zQ)Ob!Tk05$^+c+Z^M$|NP^MRPq58N?iNg*zdH6H*HN>r={GJ#81Yv@LrigySwiM_i zV)pN1U&7qM&Y_`L@hc~OV#zj1!Rp>bj42Ag3YCfOXN0jB6>nBy3bxGxd>?<+$7=D9 zLtSPEEHV&E`?Z;Wa==MIPrFzMjwF5Lk8;)G{7Yp@#$0;i^{6Dc zigRNUmsh3Cn8Z6fRuG87{xtJujwC4Wh$Qb%F;p=@78`Y*a{MK1@Lg&XL5axLVo;7?AU=q z72yojlQ-=EIh;57>Y78TJUt3g7b5wJC49)0%IU>35zN=em)eEKk5!+%uSw7|`0bWr8Hs2zOohR7zCZ6#Y8dmyfP z*b74#uR9OT9|r2Fvp0ZAe{RCd?C)31>Y1(cH0~Kzjn#si#lv8e5@F1vLSD#bFUxTd z7tcM*G7<6E60mg4jzL)qixynnnh_=jFRe# z9X~7%y&7b6+ie{GHdsG=&^}eoHkW>}+<&;0h^dW!uI1sLB;D4(KK@#HJ{3^NlGM>< zAAT9{7BIiR(~P{cl(2iqzx;DCp_sjmzGy0TR7GMmmct|10awFwKPEt^_{BYzaHyZf zB=D;TNLDeC1gw1MNkG3AReR=WUMt?ADIw?dZ2UqsE|*#pBHXA_urP_3Kt(7Ti<@A1 z9NZhoY{Z-V4q`FNj-s0D%Vc62KeqE)g1$r%RmWiz5y^Ye*Ew$iv3HG=;~LuIx#_ZU zcv5m_T(~9j;y*6QFrjQ>x@88cL>dvZ{sV=Ho%q_j1LU4vqHbeX)Qv)?2&JIHf2x7dsyD(n3&s+{dXkU6=>+1W7i-c%>IPJSGuCSjy7KfMT&YY-Zrz43vrw5 zoUZ7JkS>?5@Tw6L{OH45n4Zb!m}_ZY_mMu(YR#!P{SRxr5z&k&9y4Aw-n{Um%rEv% z*1)s|2>5)iDH!QX0u$&qQ74nlQ8tsIzdqan*xC?pJCE_K&eZTI2cyl7CVHt)6luQ! z7hvOb2S&ef0C3yOZ7I)lf6UoBEM+6d%M*rlv5fQ-G%m;1GW0yMFUzr|uKr&rsmJ)P zJMFPCZbR>MxeEp61xC7g&amKNWWkJ7Z10T=Z|T(d1rkDI)7_5YvD^S3Mxx?JglP#; z6kPOVkqg$+b3T%&rQ-|3XTF6OUERi47@D{l6Wkto(k-S*eN5L3<3=8t#_KJU#^h=| zcY#F9NjMw%!jS<(o$S=0^Dz6hmw3uv=(c-8u~_m+0s7DW>}#q{ z>3~Xtmy~R@L#iNw#ljnMtfAQeh&`R8{DBkB+m#Ft=vD?bBzJNj3#ZBu3V;Wy#LB(e zB?t~5bf+j{ITT&JA87!(MvVd|DD7;rry1vL6^`{)JN4fUgqc}&2!c1X)J9m({0rV67-@RxDH|<)zwS3Q?5Q*cd7}cVIzr zq^p(SjJyuH$D5$N7{{J+y$5pbIKzGzkPRVqrxv1BZNq|AV-X=-|9Q%RqNs?TbhjVO zHMuYp?0`lzM7uStgL`>48-mDAJwEhUozObw%O8lavKi1%!$Pp!5uBI?Ny!qFtC(yRk9^6Dr?ug$0$&;Q)V|KR{8A`-X;9&g6&+sS6G>>#{2o z$A$q&ICjUq@GPvb`#|`Didi~<)sZ?`9%+%^mk7LV z5Ge)UIIo(|AN6HTvM?#%QVg0w=Q`JUyW^YAA@JP4Mgtvcwa$@N?5;Pego}`%WnUYz<_dH&97?6NIk^!!}rtL1rvg#)&y3R=s$|bvVpOU$ zw3&{rkn~AIHd37HcW2$a?moxus<1>rpZ_A|w}CFPx-z>**eAxwHzJqP>X->FvL4>jTR z2Xvv#9bUHw-8=hyLrk$1>@71-lv2*;1fuiw+^VG04lGi>=e~pW1e~rqeh#H>cU}Zq zqT2q&JlA<7gl6jwZhcaJ3%Jp{B;Cm@$ZTwUQWoLdhX0VAupL{btg3lPW=eg0@m=S7 z7j2iiNQ7ux`BkF)+1W#x$4Yy5aO1v$Zx2tM8_XPHrZdnBvDSiIWu9Y`Gk8*TnRdv! zmdCS4Xh>d7=9`+l5raqu9-=!U_CCFqu~y7*JmW)w(7|2ZcE+0rtt!0eJzD0$Zv1HZ ztXUcK4ZLot=Z?-;p8&D`O@AeJ&EKEVvnUvZMd>c9SF@qk5xt12X9x7!8C7kezWDAQ z^TmAj*Bl*!$ik}^`I;fHT`ThSiunx6hup)9{S&GFm@5<+KcL|IJfh92ED2Sb>a^J`7F?V~KH4nqX#q`WVo?Ag4&&B9&C8hv z>y~ReM!NTgOGM8`kIlv|605g&Oq@Glq6jor0jOjmqYcj!Y82if(T-owvJ%51@%{6Y z#{B3cZN^{7Ox()`hS+s5Np#OaJx?SH2`(WFNv%r!hTeyN&p6bK_wLZZ67@9=Qy<@i zPe4K2vXzKjKkNslNJbUj1(^fAsFF(BQAbwVkljGG6f7EDkI){Uc|gupF_P*qjiqf4 zY=RLV)jW-qR%{}lI?5pGF_%jUe__G40=+90;-zBxxj1fU0dRLF z7T?^9$JE8&x^EfVB`}tUl|$W(#PyrnWhF-*dk1hHIf=mPp12fXzTi^|frn?^Mvis6 z-sSJ!4Kdw{pyR^%zt20JJ&T<)==@a%L4MNscELBx!Gyh zGcydYv(R|AtX%sxDb6LJDf)U8gdEw#+sqK#36UAc7o|sBKLF24XsvCxU^OXz+TaiV48O|Hqw1h+$bN+T7RbPK^sIn zM0+8;`F}*9i2;x`#VhQg?e=Z|O^1|_y#m<>ZE;lM{zESOET7eE(eAs)U*|2O2()I6 zZcDF&4rSq<+WC6BX^!c#wU@D86M$H=)u$j1=1}?^em@{hzt}3w?(4ak4p=;yPt(qN zz>=DuVb&N9={kiQ)ZMJ40$O+&WCm(_-Wh76*e%rbqm6OqP|ozE0dodsvfF(cL+Mi1 z=;;QFA_lL>C5fqQZLM~j=$HtafzeQwb^)R9w$t%uJJ8J*iy;=@SA*3yYo~hjXPR`H z>J4XG@X_GS?0CqmdSeD_blq^d_(^<(!L#Qw=BL0KIex7p8!m`P^JQJD5EleMS^itN zYEP`bZc6%gIoxdW_1a<8oZu~(FP%CV+vyA=Se)XCHxRr0qBSd_C30Gw{Y7_9?P$p= z9c>(GvQ`$H80f0@NA0@b_G-T8iNsJ4ItPE$(5Ug@5DotU8zJuS=!HFj_NpefI5U6HOwe~|YyAY2z6SssK+2r#?rQTtTDH{yF= zKGRoN9%1hpttIgCx&sF0yhQ7EgCEv$v+!9XRFHHH#}fUw^joU3?x%L593aA6^t;n# z9jas&h(b|Ii=&?bLx+~wu_J(4L`3T6#rGZe=lSZRgF^I%RG4cg@OtrWl#2n0K)*a8 z8L)!2PDFNuI4!k;E&}&uW`UMeusTqd<-WjFxVi*Pj_rOckr<*fMa?* zu$V|E4rc8}pBf9|DcM`6aLW;yfECS4`^8T83_KC57LY{rh-O41_;MAQy2=bNf5q8S z6qUZp%#o-?X)}}&8I=Zjo&1ECN*FYr&FB0rEs^AbM_oh(_XVj`-0rI#r#eVUIBa7& z@yD*@KfSdU`IWM!+XARpNNx;)lOOmJ(CtL^kI)V0pc(h?n*FHiT94Ur1RMluRrQ&y*h^507 z>qHJ$`Iw=E-%<5FE2M}XiQNj>g|;w~Ey5UU0;KCD{j(`Tp*OA2P7eiqh+GstT`73( z0h2A&z6C(JdEBC{#wfsuOqXPfd?Ga4>B%a>DUiO8@dnXnzXP`S3LNIFbaZ{254&3~ z^X?Vt-;R@2bH)=8@0}i2hdva`Kip4PaM2%pS*$r-SI@$5kNs8Gj*7ws=lqz;+&^jl zAvm_vuS{ajifyyoUo+-cMXU-}8%!xCgjji3pzWI#6j4%a;=vP|GJ}|@EG^j>txB%I zO0vpD@eba2?bK!`&0R?op%}%A=Nn8JavWQ4D#Z$S%|v3|z%VXq?-p~zp|_50@+rg1 z1E%8i+0WEV5eL!IUu56Tp*~%Ct<-!zU~x>j91U{RliAphq%=;7@vI}|cZri>Ms4(z7#t`hb=)R5$v3MspTaUZxJxVK%jEOELIG45KjxKpLS$g35( z&D8p9!zg?Kh7V?}(pc5fjq~ad5l^OZR0eA8(oh#R8WZyavDRYOf=uI}R(j9z#-HmCBQ|}*lGbkCr!W%&XiruP| zQs}%Bv4}6n6LuLuEj0(k3gL5oFnNuX5@3W>27;LBh{cIv6}3eZI>uy;Vz<84TQV75 zG5!1X}k>73-OmByU003_1?D2Pq%{Of)I!EiIph5tROd7LhMZbFW3Rm${^RmWLW z$WZPMW{y6rZHrhJrF-{t23|$s&ydP3R!&wP-}-ZjkjIoF&ncWDLLHkBO3Lxs*)Z8z zDL{;)Znw;Fuu4eBIc@Kv+CXL2Hm90bLDi%__|z)nJ3HB`{mG>-#;^9!%^~rvwXq6E zh6I08@GTle!+G=Z@^6~2K|M*f^A3EW+kUyN2>H>*wj~;@{|`p^}w1lw{?o6zBH+P_L;_8(n;>!S?sYY;vsO zpFB#LXn81nBsZ%@Zo@fA~cTkaU zFl%-{rd+D5UypjdI9SQ0O{vfpP4{fA;x>7^Am&G7jnm&Gto38ot$J%iV+mS{$&9aD z7MwwFGo`)l{?!@igM0f9YuLj|{h&KpD0JH&viU)fBMNC<>M!>PW(28#X=c!v;ld|l zP%cm+nGnm`iS0tsB)af)CI<)ESu}(lY)a2m1b`6^ikAnl$&0mQH;TOB%^VZfA$!je zs)zi47`GK#27Y5ftO#XCG5J_#ReNzcbB8bi2O9}514%TGYe69AEHZH45^}*mYqZO-Yr|EDYUy-Cx`~}N%f8IM2|Yan z-CCF8B}pS8DoF_tNRsJM@;_~17a5%tj~)@7l#ZMfADvn8QZ*;JIdo{z0H~tSi0`qV z2MFHrSLJyw&aVy(zO7PEUoXA>dBC&`@-_noq@s~i66q-n3>4DO`g13W{()1?R3K6d z&~5z(u2x4F?gw&xC(JH3BOccdblTZu?+{DF7{SF+4ednr#EfeB%nUU{Yh=Abd3g}y zk+YOjO(P|~capGZ_|jox*;&YHS>TQMjMDss>~u6ZR*j^3DgjUSfygChN@wKc6r`xd zD3%6xFb$!aKwJVRg@IF{>{@C7MLC6{dJcEM5G5O{DthFfn>uhKyeGl7y?th@{|6<2 z+JD2WN{pr7g4L{s#TQ~a?q&Gj?@86ZKw*Ls>~doMTgzx^s`h@LCj=(7ckGYf+x` zAkYT;A*MVelt(0Eo`c}}luEekD0$-)2RY5~0<#eG=cS%tgD~zwL{CpMx6`61Yj+Yx z&p)$+rH&KCTG(=|O%DeM?{#ootAlS79&n}{^KId8{ zx{`x&Dc&YK%)>m5NZ>P^p+#Z>S^Z1R%hsYkp8=GcbEcl-Jcx>Xq%27yp3wlZDm~|H z{7xcf?Fwu32@a+y!pm}ThF z0-DE+Y%vOP#z^cllEmmBTa=`B=|`UPA7qXq)UscA0gY7KPTN2bea2rgf)^U434~rr zTgliCS>f20?Ql_5S;pSr70zzzU4v-VfA6euf`LeFUdWs?GiP?rkYUe&9#~@aP_dgr z!G87zMhBx2OqpaQ%LIp*W(60exM5Uc=AaL*$_Kh^%5GOmh!U6t%%xn?9BQ7^3TAbg zatI<9?nX`Sm8c;@sFoB|fdx`5)O}h}NV7~-Ipa5=1X4)TYAGS*IiP&b6cb#6STx+$ zzRUCh#I;HphZJj87%iSn0I53G18+WsQmfN zpTrkt=m35XLjRoDjt#yCrU$!bgy=4um=THka6#g!KaT;kL(_|i6M;X$yel{(p550S z9ZYdTa4v(;iI5I~%mSAc) zPYRmqEBS5g)W{x<5(Rg(lIZlf11&|KWFn_sOjp0eWPP1H;eW;(sR9qQVJfPgiAj~J zT6X(xk+0+`$y1dkyk2%w*ZB8?A7ewS4SO&Xd0kRGK72E7jbcgjP<#U7iF#O3JwRX) zCz<&+e1(I)u@gC=?L;kbh=50|HX3Q#w@A>&M;M2`wXS~GgwvLMuanJnqYq6Kn=Sbf z!?Th?PUjATZSX-;D6>OwQDDewhGU@>}{g7!~y>`1^$jmyfFQ$W;*SvR&8{jg!SN( z{h}y}SNXVroZdY?^wkP9Q}bpCEw?Gs7s5rgOv@xIDDLlZfUPglTfp<|YQ8K_?wKl* z_Co)oS7*m<5q3BBDE^o(jK60U-$JtG26zF@TYGQYMiT#9{uEmu;!3I{J1KBDf(n)e2$Q1-lQZ^BZR7on1ugQJ(`_1f=6z!zV;czWlOS`i(v-6(a)nR*2w8bFZ z+-33gO(B{=OFTJx@)B;^PyBeV1-UfT3+3iQ)ze@^o3;`dK9WAV{+?POe3fVhYny zw$6p0gaYKlxQNpv7wMAcYVof9JCR-$ew+v&Yc}|{EO8+G;wdp~{<$fN&C|m}#dI%7 z^I+9Wv+G`v95M-T{)AR6&PH=FpPVk<^k+kX&(qoD_2^`HA|_+eAB+9|9HaZlRVLKfy z#3}yv#k4vLKE&y_N4FQ-3uRXQN-HcIEIjtrq)-wDGHLez*zZ!!Y^?$H@=(%ZmuzZ1{RKA5F$; zRR+i$t^mgJ!Y|@LU{B)O1GnBXe5MDt82y_^6We6%V`}AJ+sOn71ntwyH+~R#S@fG| zUwb@)&kq3R8w;3ko|Ty3u#6kw)rZGHch$rvmv(esz3EE=Ommj;`Rp7 z2kDVyNh2EsxnkMehXYHwTp{Zqre7#A$pUHj)o~YeRtI_TSn2bSnhX^w7 z*s82KZIg;V;S8>8vv9@1fkUPIP17{upnyQD9!r(%a#w+rf_nf=$(I!OrPd|lBrd#Q zv+^izZF6g!yGSjR)R^@!t#N7Sw?0t9lWNf#n+J|J{n5f3OwY-&yo)(_G>9ZOqyS~k zasZ1S;tLqq?iKJ4F9bXAXbd{@MSnp7MO&GsP-kYu)8K1XW^99L^rusg_p=yX3{hq5 z1Rz9kFV6FAWJS!TS5*Mn@9rLr-V2n1kOCBH#cwS#Scl$C% z6B`mjh9H=%9U{{kU!I?noTM|726nlzD|#QJj1nJMvV+}YHCnqB3)fqxp%5eP{qERHOT|EKGu>mo8wgB) z1PzO>d#v{b2>r1F;cgR9?pN2WP3Fu{MX|`;0)Y}0p+OqM4b}R5#NTp3nuPOpIWJ0}zM@1}I!c_MOYfn)g ztr@*oqH~HuqY|A7y2J70Vt7FtqN+pI%2h%gj&H=E{6q{AQ&>?SA2)u+Hiez)Z2`Pu zaHUC;Q0nVPGQee=p<2&S=Y)>>bkwfJ^c`#Q%Fu-vkw^ zKlU0L2X;fQ3c6@xs~QAa(u@1dc$#Ovrx55km{bSGAgBbarp9 z7B$y|S~_^)*sHcAVpO0XO*4xH)gwZtYKlxLsds0m2(vaa7H7S+M4!;>kxH>UDuhX$ zvQj`BgaUt(@Oc31UNB$>2QbuOg0JlcomeiYEVzy`SU2|ojZ&rmbr)P0O;iKD zeCI7rsbqZsV03X=jxncXqmobUabidUM6VM@MqCa`S5C9RXgKvw`y+IW5Z70HV!d4z zu@oLM1mxidCNZ-qPzEBqX}8rU$0K9~D4jtTO64URt`4N)Osvvsx7GkY&1`TNtk6iu z?pT(yOSnVU70G=R02HO|H{a;afaY{00S2~HiBITYKc9O2^K;XomX$G!@(mh#oEuS6 zf@i*ewEb12+k#HvGC#SF-aiU|mC;`Dp@V%DFUV_SHa$IS$jC{&*lXw-qAbdmjKDgx zsXD`jX(91xLF@((ZKw_@H|}d^&Gc?}&_N#&+@Lj;YppVDRqHGurgebF zDzyjFD;oobntESI?eahYqSXfqCb#d*K;G5k2*xOnAUNNVImAxTs!2s|a3QlSHApD; znXK`3Zjg2Y&?$U3i9RW(&SBrRp-1@FIOUZAsL_a4c|_!7B(LdmXwo_Yi&5XrW)pSfP+UVP<848mBq<%3hQ-T=pLJ{v=p|mF&%EOEd$Qd*Dh39K!peW zr^5@G4Nl5XLQ_OxBN2Zmi5X++5&(|*=@@h77!(S{UH=hJY3&Yd4J0wCGZ~oB{Lrv$ zTvqfk?5jrllr`%mUdbPa ze8T=Rf@4Lv?cjS2uG}dm;C`egFsZR^hPWQwL^x!l!}(>3g7p^b`Rd|vPrSK__<)Iu zeoDwP%tRrb=s)R+0k6DOK!iat&u51ejO$3Rqo_b`2Xypl69sg#oF;_v=bpGkP}lM< zU(@JOD#ZAjpbmB01YcQtD;Ua>s)uxr3RrK{ywar)k~{ZdJWo1uQYw`$Tp80zaV=S$ zkY)IW-c0UnZ%l^f6bK(OOPBBZBfQmDwr?kbhX1*g1EGzh; zNb4K~B=&qn@u})nD?L7bA%yCzh4Z{iyn*nx0POGfmNd6>fwV=gM) zWAjb|pHBxwoFt(}gy-5Nf?_vhHQlyN!z*Pi6dX;Mj2jwMg#4c2chKkqwt5 zBFofz6T`xtT`C%s`wclqH1(UMkfW}qq+)PbNF7W4fdHT^xxot^=|w(sh_rnIWQ&RK(}c6krIo z9&$X*6rFN4*g*+QC&%`B?|x_)8x}MT$rjccenB>i{1t7&LUaUu=L?eZktmKk#uMD} z(l(aVv!xqgmcp8Nvy;jA{GC=L=AYvP#I?ieaE7A>_86?)fNct^0Dk2D6d z8bZPKUa(5@2+%ZX{a`e~S7b(o;XM$L_<#K8(U0gK55)rcBThc1A8`MH08~J$zh?l* zWRz3ujPt z?+%L0!~Fm zMAF4rma}RAsSiKFz4++l>+*79TMa2^cNK?qNWC78PbRbPq~?mFV`!PndOQwrDC*(5 z?dgtkrY`mcZe+p5;Vg$vD!92q z0LDe2)F*PAni9`(K14B+XN?WYZ!d(~QP{g7X(sF$FcD7{d&V2-=$(vC*%VBk?u#%& zA-IkIWp`DEwA~f75Mf3YYR(ogh(N(|P%uroNFVc(xmDh5m@5c^q+170>X3)Tpt67I z$Xy-k5*Mo7Kl=3OlRk3d+ua&Mgj$DA#X3SKRS-%RlzC*MG@MT^XM-U<@sQzH>j7<% zQX-D+nL}x7JA2xHl+(ZarhaC`224IW=^!XW&fVkCOZ+vu3qOe6=)GpkV3b&bau z4%-Z+0zthu%j$p4@nAAO9liRa{7U&dR?WO~nW^Mkt2N_k3dp@Xa?GBx3k4+@iajh= z%4Qd%hd*u1LUeTwfMLdFqZsEUqec1X$Srsn+{V{$0(T?VH!VQ>RpWy40RbN)?|7u! z2}$3j%7w&IXO<*#a*H1T;1n>@XZ9NE$wiZG7amV_451=u96|gJFQe5Z(|&&hDWNdw z{YVJ8UWt=!M6se#W2si)COX)mR!4lNcd3L!-i@uwW2y)J>p(kL9kW*5hFLrG{mfD# z{x5OrTAJb29sGW7bvpc0EW@s0PaN({EzvAhOf72$Cb9~8{$s1kmK8qEnMyOIt&--+ zPKl^41&CP3}}_(wYai=Qv~cxQ3>{12S}UrJf}X{Df)=yk88(3BNH!Me%f} zs4x|gQ?r32y(P34hFodQsR7ty+X2-=1n3~X|p3#0C~jMr1C4f$9F|z z3Ps4#>Rn@$_*bh)7CrpY6t2`8+9=i7COPiyaV#g}ufM{q4D4WEe}1U-1TySX8Izj_ zIN-@-rEQc1#?ZAV4XWQGAmj)%69jv26N$NM`^XxQrfvF1b&x}<(W`b#3Jv z4pXdF*;JNvs!WOkx~WcyL*S!o2Qug)!X_zwH|AL)%Gnffwj(|G=&w5BaYs-sGMHRk z^v5TtbUD2fAIfLcTQzOm7xN(s8q%;tM}xNIRKV_8$1#b4%uHkj`{2)SX817%^w*&a20xnArk(5J& z3V%RS8;dpK8Y1_{Wqnk^B%vc4k5S;_S0v_HBnLodL%m8TG8MMI?EMFfqCsG|y#aUu zwN~45n@A9SUVTNE@?xhP-E3!b*=!X?$eJ<&0?3KWwKaudkSHTi7?7RX%D-3u?OlnMI3b4k!L8j0U3-Od}b^k)I~u3V)fTak_|vL}c#_ z^gQShZ5lnU^E8bil7Lu|ND)Ah1R{f35qk+(jt-kqiM>k;@Nub-0`esiWE$pAUM9fv z{WJ@rWC3}KAqi6rUdwweYxR+*&o}cu~Eim&DG2AJ0z%eK8H^tTfpDo+GWn*m&rU8lpUB$uG zE?g-NbI#x!bEoFq1w`A5;WEtubAq@#xM9Zlj1)D5Xf|lyEn9OiYy+EFI@88yzzkKN zkC|}|SEyl_F6eB=T-?kx@u%^Q850}B+DtRtQf#K#>J&Fpu9(i;J5rl47bf^$0ZXx6 zrp|T625W9xrlV0MC34D8!0}!1;~ka$9AZ#iyKi z-r!=Ch}Jq15Q8~CG|`oHhdiyi{7$}8`MHG+(kbt=s8qquwlv(1-e&Id<;>OhV;w^a=j&V)>h%oi`gRMVKSYXo7}htXm$-^%of z!gM%!H#}`DA$8T9%@kvdwq3*E`PeU8`^v|Pt8jD|&PRt%*$!H;4Za^Vx}`xBRqs?? zE4jl#o2%%0!#~-Pc9J+DsAdO3r#l&{w{EI8c!Ig%!sRYdElxEIT`Lx!J1`s!n(b9f z=jyA`ZwhlcK}de)z$H;TA}Lnzcjvb%AFZkfwZ~b#R+(R|{Q6uIGCvY)?yqAmb1yIC zPJtP?iQ_6Re1X9k^xpzYa87wK5Kz#)skWj-uI{)yLEx|i;-f5lUq~4iar_g+v+#=? z=jJho&E`lNRqFWsBCFTXm~o3e@D(}dbw(R6jsnQUk3vYA?CEMnLp4cr2vZ!>r!6wa zk)fc%#fu7SFY{Icr*p%j_970~74-&*mnBj6{6`wW+pTv**)X;58mErN;r0dImo%-k z0;fHMIDhsnQ7ns>g>~6Xqxt#;elIB)fG01?VG?Dl@@`|$E-mEikvGQPzMx4-vm3db9IZ!(VX_`HVIHqPQa6F!m zcn-k>&+!HPnObSQ1z=EQS+UMxArg^!^ddx07m>tueAk%eA@?=>ID1XPkA;`*v(*-R z<;lm_=oH&$+buSB{%hp=_B5&6?bO5AJ32nCw6-L7H))Js!~#Dx$Ps#@aEVq6p2;=Y zTDy%;jl&y}Nko?^;z(GQ`8Q!?a%xkKgQCV<9Ag46_wIKSZ9C=us^K4w;mzEr5R(>S z9R)lS^z~CC)LP@Ec9Bm!cqnl=4VOLa_-DK#bfJr6l?G85c@O9bjgemvMj{T-s^);f z)BXF8e|_%!hk@e9YX)X=Gq}Ilo_1?sovFVH_)>WE<%gHPeyk2P+(LJaN{B zmDGrZaacmds7`)}Ju68_oxD<&?INIpeY+}@#Z;sA<8#YFTl zDA{e!EeM*VEFvMMvGEBRY$+Xc_rQOta8m#K|(biNXvkJ8c@~L5H`UMITprk}N682y4SQ3jLEZe06+ysG08gN#-v*NqW=q z<3l+DoFDOy*_l11>0~hbuIE^U@8{0s((YS*nvAJ8rv2U&qxH?^m2`p%x6O)h4H z)lP3bv#lvj23Yrj-rM7Tn<-jYVmV}ef9_aQOgm(c&WE9+5F1&}=@|~{y|st->;qF9*fSd7vq$GWXJ(&X40{fp zUpVKJsl}FH9;P81A*}0Yo}_e}z#u^gRW37LeAxIZiv8s}2x)%-YrAonyUXahv)C_Z zUT1j_C7s2a`j9NEjxD2j{qtd%FW6`5%hgmgua9Q;*<0xxQiP8(HqBCyI?GdRD35GmZ^18)g*uijM7g3({M_2f$an&e zW=7@#_|P!#{1ET&wnvTdrd-=6Xc=HBZy5!Ksxm_%Yt`&38dwA!A!?P_NQXO{gb-&- z_d1xnQP4yjto@w$DW?N`r~v;KPuJ_Ld;oTo5A${Gi(#?;#T%>xB{&$qK!Y;IP$Ogb zV#csbjq&y>Q`ek>{YB`1bdfayGiesOL2`?PXxM~`3oMfJ08nk(V!i~RH015sl|2~u zMpOIW1qO8)feH*$r+{~Oayg0Z5Uv;XD4sM|AguZX)GR0E*y7!F`BmM*)!r(=m|$JKRsz`D?FqB^78&< z)I-pZdeiqj4@U8WMX-QbVO=u7n-!R3Tj`Z4!XPFM%(Q_xals4i>WAid+_kIZLTwdsY?JPrRt_zj2A1sw-{+QEM} z@Ny61O;t3uo@pvjjsDj0Z#h#~v$NS`GIZbdol9H_P_H!hKtJ|Z_f12Kg=&-H^u-$^ zCTDO-Gu`ew^VsB)@MA0u{GH-59v|0)z%i6BsTPJvh zJsUs+?o^FuevcEL-jN^R1ITti?BC$W<80lWQyrnD<=X$babg@8sySBm!nG&f1t z;j!d-L;2M@g1ug3(P7|T-@9gG4PcdP{ekpl3>hcG2EH@!?s`I(T70{JLm`8uFoxXz zRp{|%?l*u>S|;($j%u+i<4i~xcQeAYNlT#oW^=m5>1lKDN;}!+c#9B6#q|J|)@A33 zx)yGf^d`gWMfJOkDL0k1byyjmYxtyAn&^g~{|X=9Rv`AG))8STOjBI&@o$YA%W9RR zIc_DUDAwUn+z93NBli_`lHi11RNh&{S4zKQuaQ!FSI|7pWf)Dw!ni>`QJSuJJWf`s z*%hJc0KI2(lV<%v=dNv*kdW9#{ImL%P+VGPtI&_U<>%yw3PL{0lsmu*#Vx34W8zi- z_x~kKQNRBbN>9zpvNfVYuAouQ)0)qYl&H*s@mc_GhuHuXsULToW^^TGnZBK}X;U~; zhKd<`85lTCs-jEd00xRHkjh_`9o374CWAK16?YrnUQDIq(6=3KIqYn782rrQRSM(J z0fi-%0{^RnEiS;br`>N*gm;hBFI@^jX59#sh$+rTQ4Aj1e3wJMlxkN$Na{jMLCuKz z+9eekMFj}OAUW|xm#c8cy0no;$4t{iJycuv9=5}kOA8|dK|M4_A8tpC>h=Uv(<(4cb}ki_9yluE(;#+UnvUQWx_XUG#RmF zMiGAqQ(4v0$)cxOVIbYx0*j_~P=(UQ-cJkk|8TE^7~q{r@X7eEN)#5R?9N~j{7-av z)kQd<^VE6Hh$amwG*RWoD;0sxsFfX(SfLO_Zbwe2B~@?``gxMxs~oW_ud3#dVV5P` z7Ln6MQGa5o@D81nf=CyRwY+DhxvN%BoqK!N(9B0Hs@w&oT~nT3!J`6A9|uNed5J`3 zggy2%kVpXC?Bx#Y697OZ;S`pau7m<^Q3!cUw){OUJoE<%S!Im^9T*-Y(khHYygotq zLBGm~@)EwyaqJHpVJS&bK|z6zX1NM?UAR;S{|a=3Z8fY`VNzjc4IR-nbh%Y*g6FyFq>=vshE=JQm#8+UWuXpfD$aQ) z*eCZLPL?b6$Yn+y49js&D561~PNh~+X`2o}PJJzVh#1n{VM(@zjW2QL3U}hq#c8{} z`U{;cLpqj5Sm`K|0@)q<$i3_mz>JDUR5HD^o!MZlr$uU=WgqY(7J*qr$8eYDKZNU? zeD9>nQo#ymDd1gzOZy1ITj$>|^)!>TKhx0)tCW}dY6NY-0=TVY>jw+p9YotugZ8$% zPixa~dxL!%tBljte7Z8eyLkdSx=b%#cNs!o;=Psg#Ct2`w^P+tAz3}SC?uQ&+la-E%^04*G~`Sp|a7X z{g|0DZ(!;PKs9aT?WHIQ?dmXf@h2a*c-f5GNUB@T*K7R(^X0#Andkf|FVgYuun3u3 z&zBuiNOO}9g}k|mVY_+1&!U>8W~?GH{z3*hUA+qCUHr!vP&j690_< ziV0ix0pZ~|x!jf$yNVbQQ!$U?v720yQpq4}T|nX_k=VPN``ho=t(id*5|I6HTSujg znCa>1_jLCtjmnXzh%0aP=sS1!p(stu;_US7Ok6vGvv8)KE5`Qp-t`vVonr@ptXIWN zIIGjLYv;=<^t^>|0s&at4eXg%yEEGt-Sxt9#b9(JzMe7c2X8H=7+MFm2=B2V@aEw+ z%eRF!oqGPvaqmRvVG7f>zYK)s&IGofIicgZf$-)$mx*_2JqqtOv>aDhShK>fd4d9A zh37=D{@jP*>b%jAMAxTYFkRF=|E@lD8@vT5Kcf}n>&{4w`t9+r&7mRiJQ((W>9mZN z==VgkCyLDxMvLN2bJQ7C#jl<5b$>DzfF3q`@jF8mzKLd8a}STyWGcr$SeE(g{k7}TNkTNFFWo*(WvF-Evw zGq6_1w^KcezC(1R5auZgsy>ugsQUn36~g_zDttS6Rp<`kRUypdHN|MYWu@3m8yDjl z9%Q48X_uiguKm`^cy^d9hyR^%aOy3WNbvGx6P+J>NUX z3f&>RDuj8wZU>XJh3*O_fXxXeIaqe`l^0BMaP60Q`#=v|&G$RupnaGh0@qF^NqOx< zy%ETgii;)UUp;3gsCv1#7c0|o=UypM*etDodA_V^DuKP2myb}xtWej5^HTAXE5szQ z?(B1M9N^z47s)?C)h?+FT7`b?(zTX0^75J^USpB%&#kF_3BdBJBpz9PXCu+n#a9W@ zUvc?={>e=tBxJ`yRUFsO{;mlt*6u-Gu~s8&^fYsV)dJlC?l{mOw-xLMCrnV6gUpGL zX{Ih>{4sX>E4m&cwER0etO~n+R~L48fBK()WMF5>6$>A0%SNphm5o#(He?mpK(*JP zqOL);TLa};gNv|6RB3${#iN20VDX&UK@Y{Xr*;rn{-fY>HWJZyUBH5H!4)#8N|``O z7PMP>ugZdVdT;rn0-nCIC8%|g>9B!7uf83weOH{mI?C9NYHYP-B%B}JG_o*wuIYLx zs-xon-kyFj(H1fxZS$+OaAxN1Y;HQU5)oS!C#6_9Uyn8}lQ}taQA%KZav@I3RH_#O zS6cdJ9`b>SJHOf9Jhlp>Wf;`N{o;DxT=Ym-^~XUShQPAIK1wPZT&{;x)U=2i9|Z|YJKftB_3;QuK58)HCR$pD{IPsn>@)$+H*gCNx^8BTRh7;LbN$mm19BU`d%^g2r{gJCF9crlqC&>|7s}O#Aj%l(|@oh+v=sVh| zva+-u*l)=iPpb*7r?o;JM?1WRpKbg?Zm^*(OG+TVT$20LE=g7-7INc?WE<4!c{xP0O01Zc zJ4DM#)Wji?Bqd+F480KQB?ofXOL3v&L8Br7$g{9i7_GqkEgS*S_BY%2=L+}U_g@nSvM@e~gIhXVbT5(AI z(PnHl$4#?0>7u_YqnBRI(o+@|#|v3cBX4BI4Zn4^_!&+2^oZEZkd5#-d2UcYN}Gi8!i+;r`;+K5GQ znWC9P`rNne4cWv8Y(sh%Hk1BP*yaG%a2j17XmFxlCLWsBPVbi{c~pk}!1#3axY@iK zvqa_JVq+F@UO;DB|FyUQWUqR4B<<(?sK9(n#~`ldqh?tLId;PxfsDN3$3vJtjFi**{b4F@A=%cRX~xI6Yolv0r2zIqcEN~mc8avUY#EHs zXKIGBdBiAb;|leUnRqI~9c1B$8}?RqMJ_->mbWy>%j{{W4xK|2V2U(2QY{2(4muZt zWllGIAIwqbpN333<5xi>;M?eC)SP>`62)(c$00|jyS9=86F7Y(P&R4g`1SN@6k(kp zS_vSW-R^X`l4-6i-=Z|V9OYi|y+1mi>+&~OW{6buLGeHoAgSHEq+I3`kzyPj0g94{ zu0lN9i=X=-G#hgqh;Sw_NJ^dA1J*+}sp()=~@?(oV=4Fel*9AS7^~SA-52oJbA)pT|B!7&DuG1eAOeH7|TUC=UytM;cne#2dPl(P^#&iY^b!xkO;=D--zr5P9|;Abykv)+7;bVZJE z$$+wHZN~>3T-QG&29ow!6$}AJpGBss2%ulkn0UHHfn1^tIU)kE%qh`TzV4Wm*`r_E z?ie>Mq>8W{WO*>%sz7R~ZcUr5*3d)&{EpOEVA_Fa1C7m}eWoeZt~fq@zCNeKpf;q=(kPs3O1U2%Xs#3aky=$V9q%_M|5q? zg2zyYZwm7Yn_HCL9C&ɮ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 =3@yv{iS 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

    =RKimLf8pCy$-C9wA179$AHOE0)~Cz1AWuJKXy3 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